Como trasponer una lista creada con CHtml::checkBoxList

You are viewing revision #2 of this wiki article.
This is the latest version of this article.
You may want to see the changes made in this revision.

« previous (#1)

En ciertas ocasiones tenemos que lidiar con el tema de colocar una lista de checkboxes para hacer una seleccion especifica como es el caso de los dias de la semana para un calendario, para esta labor tenemos el comando CHtml::checkBoxList(), revisando un poco el funcionamiento de este temos los siguientes parametros:

CHtml::checkBoxList(name,value,array(data),array(htmlParams));

desglosando un poco tenemos los parametros:

  • name: el nombre del objeto, recuerden que este nombre es la base para el arreglo de objetos de tipo "name[]" el cual pueden llamar desde $_POST
  • value: es el valor seleccionado, pueden usarlo o dejarlo vacio
  • array(data): este arreglo contiene los datos que se van a mostrar de la forma index=>data donde index es el valor que pasa a "name[]"
  • array(htmlParams): este parametro contiene las opciones de la lista, permitiendo modificar algunas cosas como la plantilla ("template" en la lista de parametros) por ejemplo.

Para ilustrar un poco nuestro caso generaremos la lista de dias de la semana, al ejecutar el comando:

CHtml::checBoxList("weekdays","",array(
"0"=>"Domingo",
"1"=>"Lunes",
"2"=>"Martes",
"3"=>"Miercoles",
"4"=>"Jueves",
"5"=>"Viernes",
"6"=>"Sabado",
))

el sistema genera una lista en vertical similar a esta:

La idea es que esta lista se pueda mostrar en forma de tabla, con unos encabezados usando th y los checkbox como filas, para esto vamos a realizar algunos pasos

  • Crear dos variables de texto, una que contenga el encabezado y la otra el cuerpo, pueden ser:
$header="";
$body="";
  • Luego van a crear el fragmento de codigo para generar la lista de checkboxes de esta forma:
$var=CHtml::checkBoxList("days","",array(
"0"=>"Domingo",
"1"=>"Lunes",
"2"=>"Martes",
"3"=>"Miercoles",
"4"=>"Jueves",
"5"=>"Viernes",
"6"=>"Sabado",
),array(
"template"=>"\$header.='<th>{label}</th>';\$body.='<td>{input}</td>;'",
"separator" => "",// es necesario eliminar el separador
//Estos parametros son opcionales
"checkAll"=>"T",
"style" => "width: 10px;",
));

Como puede ver en vez de enviar con un echo la construccion del checkBoxList, lo enviamos a una variable para evaluar el resultado

  • Teniendo la construccion de la lista debe evaluar la variable para que ejecute el resultado de la generacion como codigo, de esta forma se llenan los dos bloques de codigo que se necesitan para la tabla
eval($var);

Con este paso se asegura que las variables definidas anteriomente sean rellenadas con la informacion de la lista

  • ahora debe construir la tabla que va a contener los dos bloques de codigo de esta forma:
<table>
<tr><?php echo $header?></tr>
<tr><?php echo $body?></tr>
</table>

Listo, la construccion deberia generar los valores de forma horizontal en vez de vertical. En sintesis este es todo el codigo:

$header = "";
 $body = "";
     $var = CHtml::checkBoxList("fieldoptions", "", array(
                    "0" => "D",
                    "1" => "L",
                    "2" => "M",
                    "3" => "M",
                    "4" => "J",
                    "5" => "V",
                    "6" => "S",
                        ), array("template" => "\$header.='<td>{label}</td>';
                            \$body.='<td>{input}</td>';",
                    "separator" => "",
                    "checkAll" => "T",
                    "style" => "width: 10px;",
                ));
        eval($var);
<table>
<tr><?php echo $header?></tr>
<tr><?php echo $body?></tr>
</table>

Y listo, de esta manera tiene una lista de checkboxes en forma de tabla y horizaontalmente, si quiere dividir la informacion en dos grupos podria en vez de usar una variable de texto reemplazarlo por arreglos para cargar de forma indovidual los resultados de cada checkbox y por ciclos ubicarlos donde desee y como desee.