Select Box en CakePHP
25/03/2010Una de las preguntas más comunes que se ven por los grupos de google de cakePHP, es como crear un select box relacionado a un modelo. Sigo viendo que aún mucha gente no entiende el verdadero poder del lema:
“Convención en vez configuración”
En este articulo veras como cakePHP utiliza ese lema en la creacion de select boxes.
Digamos que tenemos dos modelos, ambos relacionados entre si:
El modelo usuario:
class Usuario extends AppModel { $hasOne = array('Perfil'); }
Lo que estamos indicando en la relación de este modelo quiere decir que un usuario tiene o pertenece a un solo perfil, cabe destacar que en la tabla de usuarios tiene que existir un campo llamado perfil_id en caso de no existir nos mostrara un error.
El modelo del perfil:
class Perfil extends AppModel { $belongsTo = array('Usuario'); }
Ahora seguimos con el modelo del perfil, aqui lo que hacemos es la asociación inversa a la de usuario, es decir, un perfil pertence a un usuario.
Para no perder el enfoque de este tutorial, me voy a saltar la creación del controlador y vistas para el modelo perfil, asumo que ya debes tener registros en la tabla perfiles.
Necesitamos agregar un usuario y que este mismo este relacionado a un perfil, la elección del perfil comunmente se hace vía un select box, por lo cual así lo haremos, antes de crear la vista para agregar el usuario es necesario construir el controlador:
class UsuariosController extends AppController { function agregar() { $perfilOpciones = $this->Usuario->Perfil->find('list'); $this->set(compact('perfilOpciones')); ... } }
Utilizamos el encadenamiento hasta llegar al modelo perfil y hacemos una busqueda con el metodo find enviando como parametro list esto nos devolvera un arreglo con la siguiente estructura:
0 => "Administrador", 1 => "Moderador", 2 => "Invitado"
Si la en la estructura que te devuelve el arreglo en el valor de la llave vez un numero probablemente sea el id del registro esto es por la convención de cake, la cual indica que si no existe un campo llamado title en la tabla perfiles, entonces usara el campo id. Esto puede ser rapidamente modificado solo agregando la siguiente linea al modelo del perfil:
var $displayField = 'nombre_del_campo';
De tal manera sobreescribimos el campo predeterminado que es title.
Ahora continuaremos con la vista para el metodo agregar del controlador de usuarios:
<?php echo $form->create('Usuario', array('action' => 'agregar')); echo $form->input('perfil_id', array('type' => 'select', 'options' => $perfilOpciones)); .. ?>
El código anterior funciona, pero no estamos aprovechando las conveciones que cakePHP nos ofrece, para explotarlas al maximo lo primero que debemos hacer es modificar el controlador y hacer un cambio muy sencillo:
$perfiles = $this->Usuario->Perfil->find('list'); $this->set(compact('perfiles'));
La unica modificación que hicimos fue renombrar la variable, noten la convención, estamos nombrando la variable con el plural del modelo es decir, nuestro modelo se llama perfil, por consecuencia el plural seria perfiles, tomen nota que es un plural irregular por lo cual lo tenemos que definir en el archivo inflections.php que viene acompañado con cake.
Lo siguiente es modificar la vista, como estamos siguiendo convenciones la vista quedaria simplificada a lo siguiente:
<?php echo $form->create('Usuario', array('action' => 'agregar')); echo $form->input('perfil_id'); .. ?>
Como pueden observar en el metodo input solo pasamos el nombre del campo, el helper HTML de cakePHP se encargara del resto, como definir de que tipo de elemento utilizara en este caso seria un select por las convenciones que estamos siguiendo, así como tambien rellenara con las opciones para el select.
Comentarios cerrados.