Un
tip muy sencillo y funcional para los que quieren rellenar un desplegable con dos tablas relacionadas en
CakePHP 1.2. En pocas palabras el entorno es el siguiente, dos tablas
Users y
Groups relacionadas entre si por el campo
Users.group_id (sigo la nomenclatura 'oficial' para que tanto
cake como
bake me entiendan. Podríamos resumir la relación en:
Users 1:N Groups
Users belongsTo Groups
Groups hasMany Users
Hablando en código -
dicho de otra forma- sería este el aspecto de ambos modelos:
class User extends AppModel {
var $name = 'User';
var $belongsTo = array(
'Group' => array('className' => 'Group',
'foreignKey' => 'group_id'),
);
}
class Group extends AppModel {
var $name = 'Group';
var $belongsTo = array(
'Group' => array('className' => 'Group',
'foreignKey' => 'group_id'),
);
}
A la hora de generar las vistas que, por defecto,
bake escribe por nosotros me encuentro con un pequeño defecto. Cuando voy a agregar un nuevo usuario, en vez de salir un desplegable con el nombre de los grupos (
Groups[id, group, created, modified]), salen los
id, para muestra un pantallazo:
Gracias a
cakephp-es, -
mbavio y
AldeaCMS en concreto- he conseguido corregir ese pequeño inconveniente, para ello generamos en controlador una variable (
$groupList en este caso) que guarde un array de tuplas id->group para luego rellenar el combo:
$this->set('groupList', $this->User->Group->
generateList(null,null,null,'{n}.Group.id','{n}.Group.group'));
Y ya en la vista (
admin_add.ctp) hacemos referencia a dicha variable para rellenar el
input del formulario -
aquí empieza la magia-:
/* echo $form->input('group_id'); ** Antes */
echo $form->input('group_id', array('options'=>$groupList));
Listo, -
aquí acaba la magia-, muestra:
Poco más, un buen tip para despistados como yo. Cada día me gusta más
la cocina.
Comentarios
Simplemente añade esta linea a cualquier modelo:
var $displayField = 'nombre';
donde nombre es el nombre del campo que quieras que se vea en el desplegable y ya esta.
Asi de facil es cocinar.
Por ejemplo:
class User extends AppModel {
var $name = 'User';
var $displayField = 'nombre'; // o name, titulo, title,...
var $belongsTo = array(
'Group' => array('className' => 'Group',
'foreignKey' => 'group_id'),
);
}
http://book.cakephp.org/view/1031/Saving-Your-Data#Saving-Related-Model-Data-HABTM-1034
Buen trabajo, de todos modos, a pesar de que ahora haya sido incorporada esta solución.
La solución para el belongsTo es esta:
http://book.cakephp.org/view/1031/Saving-Your-Data#Saving-Related-Model-Data-hasOne-hasMany-belongsTo-1032