Hola lula, te recomienda que analices la instrucción "listData" si es que lo deseas utilizarla de esa manera y con esa misma lo podrás crear ese resultado como lo deseas, solo es indicar tu checkbox, luego indicar el arreglo de donde tomaras los datos y generes un ciclo dentro de controller en el actionCreate y update el ciclo es para que obtengan los valores y los insertes o actualices las veces que lo desees
De la manera que te pondre de ejemplo no es con listData pero al igual la necesitas de esa manera de este ejemplo puedes desarrollador tu módulo, cabe mencionar que para esto tengo tres tablas una donde guardo los datos del módulo correspondiente, otra tabla de donde genero los checkbox dinámicos osea si en la tabla Requisito en mi caso es la principal y tengo otra tabla que se llama etapa y otra donde hago la relación de los dos etapa_requisito, si indico un registro en etapa, este se mostrará como check en requisito, si vuelvo a meter otro registro en etapa, ahora en vez de mostrar un check box mostrare dos para que el usuario los pueda seleccionar, espero me haya dado a entender con esto y en otra tabla almacenas los datos al mismo tiempo de estas dos tablas nombrada etapa_requisito, sino deja te pongo un ejemplo:
tabla Requisito //Toma en cuenta que me faltan mas campos por indicar pero con estos es mas que suficiente para tu ejemplo.
id_requisito, nombre_requisito, descripcion, usuario_alta, fecha_alta
tabla etapa
id_etapa, nombre_etapa, usuario_alta, fecha
tabla etapa_requisito
id_requisito, id_etapa, usuario_alta, fecha
Nota que hago una relación de estas tres tablas asi te darás una idea mejor y el código es el siguiente:
echo CHtml::checkBoxList(
'Requisito[etapa]',
$checkEtapa,
$etapasRequisito,
array('template' => '<li class="checkLDoc">{label}</li><li class="checkIDoc">{input}</li>',
'separator' => '',
// 'checkAll'=>'Seleccionar todos',
)
);
$checkEtapa, $etapasRequisito, son dos variables que extraigo de mi archivo de controller, dentro de ese archivo indico:
//Aquí nota que obtengo los valores de etapa.
$model->attributes=$_POST['Requisito'];
if(isset($_POST['Requisito']['etapa']))
$etapaSeleccion = $_POST['Requisito']['etapa'];
//Genero una transaccion para que si existe un error en etapa no me guarde no haga nada y lo regrece como si no hubiera pasado nada
$this->_db = Yii::app()->db;
$txn = $this->_db->beginTransaction();
//genero un try para el manejo de errores
try{
if($model->save()){
if(isset($etapaSeleccion))
foreach($etapaSeleccion as $idEtapa)
$this->actionCreateEtapaRequisito($model->id_requisito, $idEtapa, 1);
$txn->commit();
Yii::app()->clientScript->registerScript(1, 'alert("Registro almacenado correctamente")');
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=index.php?r=requisito/view&id=".$model->id_requisito."\">";
}
}
//Si te fijas envio un mensaje hardcodeado de javascript he indico un meta para que me regrece a tal página.
catch (CDbException $e){
$txn->rollback();
$model = new Requisito('search');
$this->render('admin',array(
'model'=>$model,
));
}
//Todo esto va dentro del primer if donde se indica el post del modelo. Acabando esa llave se genera esto
$etapasRequisito = array();
$checkEtapa = array();
$etapasRequisito = CHtml::listData(Etapa::model()->findAll('activo=:activo', array(':activo'=>TRUE)),'id_etapa', 'nombre_etapa');
$this->render('create',array(
'model'=>$model,
'etapasRequisito' => $etapasRequisito,
'checkEtapa' => $checkEtapa,
));
//envio las variables con render de etapa, y etapa requisito pero nota que hago referencia a un método este es el método.
public function actionCreateEtapaRequisito($idRequisito, $idEtapa, $valor, $fecha_alta = NULL, $usuario_alta = NULL)
{
$model = new EtapaRequisito();
$model->id_requisito = $idRequisito;
$model->id_etapa = $idEtapa;
$model->fecha_alta = new CDbExpression("date_trunc('SECOND', TIMESTAMP 'now')");
$model->usuario_alta = Yii::app()->user->id;
if($model->save())
return true;
else
return false;
}
//y con esto podrás almacenar en la otra tabla.
Espero que te sirva de ayuda lula recuerda analizar con calma no te desesperes, porque en ocaciones nos bloqueamos o metimos código cochino… cuidate. Saludos…
P.D. no te vayas a desesperar si no funcionan varias cosas, por si se me fueron cosas que no iban ya que solo te puse el código con uno check tengo mas y mas controles, como ejemplo en el método actionCreateEtapaRequisito en el parámetro idEtapa yo tengo que cuando es 1 va a insertar cuando es 0 va a actualizar, le kite muchas cosas que no necesitabas por eso te explico esa parte si tu no lo acomodas con if’s kitalas, solo agarra lo que necesitas…