CakePHP: Foreign key y desplegables

21.nov 2007 Envía un trackback

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.
cake bake foreign desplegable select php desarrollo

Comentarios
Gravatar joan@22.11.2007, 'Re: CakePHP: Foreign key y desplegables'

Es mucho más facil, como te has complicado.
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'),
);
}

Gravatar r0sk@22.11.2007, 'Re: CakePHP: Foreign key y desplegables'

¡Me sonaba un montón esa solución!, pero no acabé de encontrar documentación y no conseguía acordarme de la variable. Es lo malo de CakePHP, la documentación brilla por su ausencia. Mil gracias Joan.


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]