CakePHP: Foreign key y desplegables

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:
CakePHP
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:
CakePHP
Poco más, un buen tip para despistados como yo. Cada día me gusta más la cocina.
php code

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.