Lista de checkbox...

Hola soy nuevo en YII, apenas tengo si acaso una semana en él y ando solicitando ayuda para saber como puedo generar una lista de checkbox ó un arreglo del mismo, estoy tratando de realizar un módulo para generar permisos a “X” usuario, escogieno el usuario de un combobox y luego los permisos para que pueda acceder a ciertos menús desde un checkbox, el combo funciona correctamente desde base de datos, pero el check, me genera dos veces el checkbox y el texto que le corresponde al check solo lo indica una sola vez, pero en el value sigue teniendo el mismo valor osease value=‘id_modulo’ esa referencia me la indica en base a el arreglo que quiero realizar.

---------- Código del combobox funcionando correctamente -----------

<?php echo $form->labelEx($model,‘Usuario’); ?>

<?php

 &#036;command		=	&#036;connection-&gt;createCommand(&quot;select id_usuario, usuario from usuarios&quot;);


 &#036;dataReader	 	= 	&#036;command-&gt;query();


 &#036;arreglo 	=	array();


 &#036;arreglo[0] 	=	&quot;-- Seleccione --&quot;;


     foreach(&#036;dataReader as &#036;row)


 {


    &#036;arreglo[&#036;row['id_usuario']] =	&#036;row['usuario'];


 }			   		   	


echo &#036;form-&gt;dropDownList(&#036;model,'id_usuario',&#036;arreglo);

?>

<?php echo $form->error($model,‘id_usuario’); ?>


---------- Código donde necesito ayuda para generar un checkBoxList en base a un arreglo ----------

<?php

&#036;command	=	&#036;connection-&gt;createCommand(&quot;select id_modulo, modulo from modulos&quot;);


&#036;dataReader = &#036;command-&gt;query();


   foreach(&#036;dataReader as &#036;row)


   {		   	


        echo &#036;form-&gt;checkBoxList(&#036;model,&#036;row['id_modulo'],&#036;row); 


   }


   echo &#036;form-&gt;error(&#036;model,'id_modulo'); 

?>


Notése que en la parte de $row[‘id_modulo’] pretendo sacar el valor de cada check si le indico un var_dump($row[‘id_modulo’]); si me muestra que estoy sacando los id correspondientes de cada uno para indicarlos en el value, pero si lo dejo asi como esta me pone dos checkBoxList mi arreglo son 6 registros por el momento para los permisos y en vez de ponerme 6 me pone 12 pero el value dice el mismo texto en todos… en vez de estar indicado el ID.

El código que me muestra de error es el siguiente marcando error en la linea 110:

Property "modulo_detalle.1" is not defined.

public function __get($name)

100 {

101 if(isset($this->_attributes[$name]))

102 return $this->_attributes[$name];

103 else if(isset($this->getMetaData()->columns[$name]))

104 return null;

105 else if(isset($this->_related[$name]))

106 return $this->_related[$name];

107 else if(isset($this->getMetaData()->relations[$name]))

108 return $this->getRelated($name);

109 else

110 return parent::__get($name);

111 }

Les agradaceria muchisimo de su ayuda… ya que soy nuevo en este framework.

Deberias de hecharle un vistazo a este enlace

http://www.yiiframework.com/wiki/48/by-example-chtml/

Y no es necesario que generes la consulta, si ya tienes un model de usuarios haciendo un Usuarios::model()->findAll(); dara el mismo resultado…

Estoy leyendo de a poco tu post…

Este arreglo




$command	 =	$connection->createCommand("select id_usuario, usuario from usuarios");

$dataReader	 = $command->query();

$arreglo =	array();

$arreglo[0] =	"-- Seleccione --";

foreach($dataReader as $row)

{

$arreglo[$row['id_usuario']] =	$row['usuario'];

}	

echo $form->dropDownList($model,'id_usuario',$arreglo);



en el caso de que tengas un Model Usuarios (no se qué modelo edita tu tabla usuarios) se podria hacer de la siguiente manera:

nota: lo del arreglo seleccione es un $arreglo = array_merge(array(‘0’=>’-- Seleccione --’), CHtml::listData(Usuarios::model()->findAll(),‘id_usuario’,'usuario));, lo digo por si lo quieres hacer. El ejemplo es ‘sin arreglo’.

REF: http://www.yiiframework.com/doc/api/1.1/CHtml#listData-detail




echo $form->dropDownList($model,'id_usuario',CHtml::listData(Usuarios::model()->findAll(), 'id_usuario','usuario'));



Y en lo que se refiere al checkbox list, es mas o menos lo mismo, con una sola linea lo puedes hacer:

REF: http://www.yiiframework.com/doc/api/1.1/CHtml#activeCheckBoxList-detail




<?php echo $form->checkBoxList($model,'id_modulo', CHtml::listData(Modulos::model()->findAll(),'id_modulo','modulo'));



Muchisimas gracias por la explicación estoy analizando el código que me enviaste… funciona correctamente, solo que no veo porque no me pone el seleccione pero en eso ando y gracias de nuevo por tu comentario…

Para que aparezca en el combo un item mas que diga "-- Seleccione --", dropDownList tiene un parametro mas que es el HtmlOptions que en realidad es un arreglo de atributos, este arreglo tiene una clave llamada "empty" la cual puedes utilizar para escribir un texto en caso de que el combobox no tenga ningun valor seleccionado


$form->dropDownList(

   $model, // el modelo

   'id_usuario', // el atributo

   CHtml::listData(Usuarios::model()->findAll(), 'id_usuario','usuario'), // las opciones

   array('empty'=>'-- Seleccione --') // los atributos html

);

Gracias de nuevo por la contestación, pero es que no me había fijado que yo le había borrado algo del código por estar haciendo mis pruebas de estar viendo como arroja los datos… ahora solo que tengo duda que ya tengo generados mi lista de checkbox y el combo de la manera que antonio me lo especifico que es mucho mas fácil y menos código, entonces al guardarlo, me indica que no puede ir mi lista de checkbox en blanco, y yo necesito que si selecciona por decir el usuario "prueba" y selecciono tres check me guarde en la base de datos el usuario y un check y luego guarde otro asi hasta llegar a guardar los tres checkbox que seleccione con el usuario en diferentes registros ejemplo:

Usuario "prueba" = 3 en mi ID, el id_detalle es un dato tipo serial

id_detalle – id_usuario – id_modulo

 1     --     3      --    1


 2     --     3      --    3


 3     --     3      --    6

el mensaje de error que me sale es:

Please fix the following input errors:

Id Modulo must be an integer.

El código que tengo es:

En mi combobox:

echo $form->dropDownList($model,‘id_usuario’,CHtml::listData(Usuarios::model()->findAll(), ‘id_usuario’,‘usuario’));

En mi checboxlist

echo $form->checkBoxList($model,‘id_modulo’, CHtml::listData(Modulos::model()->findAll(),‘id_modulo’,‘modulo’));

Como me recomiendan solucionar ese problema…??

Se me olvido agregarles mi arreglo para que así se den mas una idea de cuantos checkbox estoy seleccionando lo que me aparece cuando los selecciono y le indico el usuario y al enviarlos los datos me aparece esto.

array(2) {

["id_usuario"]=>

string(1) "3"

["id_modulo"]=>

array(3) {

[0]=&gt;


string(1) &quot;1&quot;


[1]=&gt;


string(1) &quot;2&quot;


[2]=&gt;


string(1) &quot;6&quot;

}

}

Un apunte:




echo CHtml::dropDownList('datos_cuota_id_datos_cuota','',$ld_datos_cuota,array('prompt'=>'Elige un pago...','empty'=>array('-1'=>'Todas bajas','-2'=>'Todas jubilaciones')));



Promt es para que salga por defecto esa opción como la primera, sin embargo Empty se usa para poner elementos y darles un value.

Shaolin, el error que dices te lo da en la acción del controlador al intentar guardar los registor, me imagino, ¿no?.

En esa acción, ¿recorres los elementos que te llegan para verificar ciertas condiciones antes de guardar? Me refiero que el id_modulo que estás enviando es un array. Me parece que tienes que recorrer el array id_modulo y entonces realizar un insert en cada elemento del array.

Podrías también usar una transacción para asegurarte que hace todos los inserts que necesitas.

Yo tengo en mí código algo parecido a lo que dices:

Primero realizo un insert de un registro general y luego tengo que recorrer los demás para hacer varios inserts relacionados con el general. Lo hago por ajax por eso creo un fichero Json y luego lo envío como respuesta, simplemente usa la parte que te interese. Verás que hago uso de 2 funciones para realizar el insert real. Te las pongo debajo de la acción general:




public function actionRegistrarPagos() {

        

        $responce=new FormJson();


        if(isset($_POST))

        {           

            $model=new DatosCuota();

            

            $transaction=$model->dbConnection->beginTransaction();

            

            $error=false;

            

            //Primero grabamos los datos generales del pago

            $concepto=$_POST['concepto'];

            $fecha=$_POST['fecha'];

            $id_pago=$_POST['id_pago'];

            

            $id_datos_cuota=$this->actionCreateDatosCuota($concepto, $fecha, $id_pago, $model);

            

            if ($id_datos_cuota==-1) {

                $error=true;             

            } else {

            

                //Segundo guardamos el pago de cada asociado

                $estados_pagado=$_POST['estado_pagado'];

                $ids_asociados=$_POST['id_asociado'];


                foreach ($ids_asociados as $n=>$registro) {


                    $id_asociado=$registro;

                    $id_estado_pago=$estados_pagado[$registro];

                    

                    $id_cuota=$this->actionCreateCuota($id_asociado, $id_datos_cuota, $id_estado_pago);


                    if($id_cuota==-1) {

                        $error=true;

                        break;

                    }


                }//foreach

                

            }

            

            if(!$error) {

                $transaction->commit();

                $responce->result="OK";

                $responce->rows[0]['descripcion']="Se ha creado el registro correctamente.";

            } else {

                $transaction->rollBack();


                $arr_errores=$model->getErrors();


                $responce->result="KO";


                $i=0;

                foreach ($arr_errores as $errores=>$error) {

                    foreach ($error as $key=>$value) {

                        $responce->rows[$i]['campo']=$errores;

                        $responce->rows[$i]['descripcion']=$value;

                    }

                    $i++;

                }

            }


        } else {

            $responce->result="KO";

            $responce->rows[0]['descripcion']="No se han pasado datos para grabar.";

        }

        

        echo json_encode($responce);

    }






public function actionCreateDatosCuota($concepto, $fecha, $id_pago, $model) {

        //$model=new DatosCuota();

        $model->setScenario('create');

        

        $model->concepto=$concepto;

        $model->fecha=$fecha;

        $model->id_pago=$id_pago;       


        if($model->save(true)) {

            return $model->getPrimaryKey();;

        } else {

            return -1;

        }


    }

    

    public function actionCreateCuota($id_asociado, $id_datos_cuota, $id_estado_pago) {

        $model=new Cuotas();

        $model->setScenario('create');

        

        $model->id_asociado=$id_asociado;

        $model->id_datos_cuota=$id_datos_cuota;

        $model->id_estado_pago=$id_estado_pago;


        if($model->save(true)) {

            return $model->getPrimaryKey();;

        } else {

            return -1;

        }


    }



Espero que te sirva de algo.

Saludos.

Hola perdona la tardanza por contestar ya que en el trabajo según había dicho que me cambiara a java pero ya me hicieron regresarme a PHP, bueno sobre lo que me comentas gracias por tu código me sirvío de mucho ya pude hacer mis inserciones, solo cree el formulario como me lo plantearon para mi combo y mi checkbox, y ya dentro de la carpeta controllers del mismo archivo donde lo cree en el método actionCreate() le agregue el siguiente código.




public function actionCreate()

	{

		$model = new modulo_detalle;

		if(isset($_POST['modulo_detalle']))

		{	   

			$model->attributes = $_POST['modulo_detalle'];

			$usuario = $_POST['modulo_detalle']["id_usuario"];

			$modulo  = $_POST['modulo_detalle']["id_modulo"];

			foreach ($modulo as $valor)

			{

				$id_detalle = $this->actionCreateModDetalle((int)$usuario, (int)$valor);

			}

				$this->redirect(array('view','id'=>$id_detalle));

		}

		$this->render('create',array(

			'model'=>$model,

		));

	}



Y dentro de ese código cree un método que hago referencia dentro del foreach.




public function actionCreateModDetalle($id_usuario, $id_modulo)

	{

		$model = new modulo_detalle();

        $model->id_usuario = $id_usuario;

        $model->id_modulo  = $id_modulo;

        if($model->save()) 

            return $model->getPrimaryKey();

        else 

            return -1;

	}



Solo me quedé con la duda de si en este método que cree deseo recibir el $model como parámetro, para ya no hacer sobre carga del mismo objeto me marca un error sabrán el porque hace esto??.

Y otra pregunta dentro del combobox necesito poner un seleccione, pero el problema es que cuando lo especifico dentro del arreglo y deseo actualizar en vez de traerme el nombre del usuario me aparece "Seleccione", en vez del nombre de usuario, el combobox lo hago de la siguiente manera:




echo $form->dropDownList($model,'id_usuario',CHtml::listData(Usuarios::model()->findAll(), 'id_usuario','usuario'));



Pero si lo hago de la siguiente manera al darle en actualizar para que me traiga los datos del formulario si me trae todos excepto en el combo el nombre del usuario solo me pone seleccione.




echo $form->dropDownList($model,'id_usuario',array_merge(array('0'=>'-- Seleccione --'), CHtml::listData(Usuarios::model()->findAll(),'id_usuario','usuario')));



Alguien me podría explicar como hacerle para poder hacer eso…??, gracias por sus mensajes.

Se me olvido especificar que si en mi base de datos tengo un consecutivo de usuarios, si me trae el nombre del usuario al que le pertenece, pero si en la misma base de datos modifico el ID de un usuario en vez del nombre me aparece Seleccione.

¿Y así?:




echo $form->dropDownList($model,'id_usuario',CHtml::listData(Usuarios::model()->findAll(), 'id_usuario','usuario'),array('empty'=>array('0'=>'-- Seleccione --'));



Mírate las opciones de empty y prompt que te comentaba arriba en otra respuesta.

Saludos.

Ya funciono de esa manera como me lo dijiste… y si había utilizado el promt y el empty solo que me acabo de dar cuenta que si pongo el arreglo con cualquiera de esas dos opciones antes que saque los datos de la base de datos en el create si aparece seleccione, en el update aparece igual seleccione, pero si pongo el arreglo de seleccione al final si funciona ejemplo:

Si se pone de esta manera por lógica entiendo que primero busca si ya hay un dato almacenado si es asi lo muestra en listData, pero si no existe algún dato almacenado se pasa al siguiente arreglo y pone seleccione.




echo $form->dropDownList($model,'id_usuario',CHtml::listData(Usuarios::model()->findAll(), 'id_usuario','usuario'),array('empty'=>array('0'=>'-- Seleccione --')));



Pero en dado caso que se ponga de esta manera siempre estará entrando primero el arreglo de selecciona y no verificará el arreglo que obtiene listData.




echo $form->dropDownList($model,'id_usuario',array('empty'=>array('0'=>'-- Seleccione --')),CHtml::listData(Usuarios::model()->findAll(), 'id_usuario','usuario'));



No se si este bien mi lógica pero me fije que eso hace… pero muchas gracias por la respuesta saggita cuidate… creo nos veremos por aquí con mas preguntas mías y gracias.