A menudo se declara en el esquema un campo como string (texto) cuando en la práctica va a ser una clave de un conjunto de valores. ¿Por qué no lo ponemos en el esquema como ‘type: Enum’? Por ejemplo porque no sabemos, en principio, cuales son los valores que se van a guardar ahí.
En ese caso el filtro no pondrá un desplegable con los valores, lógicamente, sino un input[type=text].
Si posteriormente queremos que en el filtro aparezcan los valores en forma de desplegable hacemos algo como esto:
$choices = array_merge(array('' => ''), <array_con_valores>); $this->widgetSchema['myField'] = new sfWidgetFormSelect(array('choices' => $choices, 'multiple' => false));
Pues bien, esto mostrará el filtro tal y como lo queremos, pero no funcionará. ¿Qué falta? Pues que le digamos al filtro que tiene que filtrar por un conjunto de claves:
public function getFields() { return array('myField' => 'Enum') + parent::getFields(); }
Es importante el orden, porque al existir ya ‘myField’ en el esquema, si hacemos la unión de los arrays al revés el valor recibido en el padre pisará el nuestro.
14 años ago ·
Muy interesante. Me ha venido genial!
Gracias!
13 años ago ·
Hola Rodrigo interesante tu post, estoy en este preciso instante teniendo problemas con lo mismo que planteas, aqui te paso mi clase filtro
class FrmXXXFormFilter extends BaseFrmXXXFormFilter
{
public function configure()
{
$this->setWidgets(array(
‘field1’ => new sfWidgetFormSelect(array(‘label’=>’x’, ‘choices’=>Field1Peer::getMarcas())),
‘field2’ => new sfWidgetFormSelect(array(‘label’=>’x’, ‘choices’=>Field2Peer::getXX())),
‘field3’ => new sfWidgetFormSelect(array(‘label’=>’x’, ‘choices’=>Field3Peer::getXX())),
));
$this->widgetSchema->setNameFormat(‘frm_xxx_filters[%s]’);
}
public function getFields() {
return array(‘field1’ => ‘Enum’, ‘field2’=> ‘Enum’, ‘field3’=>’Enum’) + parent::getFields();
}
}
sin embargo cuando trato de filtrar, me lanza la excepcioin de logica
Unable to filter for the «Enum» type.
pudieras decirme que estoy haciendo mal? te lo agradeceria mucho, realmente he invertido ya bastante tiempo en esto. Gracias
13 años ago ·
¿Estás usando Doctrine o Propel? «Enum» solo lo soporta Doctrine. ¿Puedes probar poniendo:
public function getFields() {
return array(‘field1′ => ‘ForeignKey’, ‘field2′=> ‘ForeignKey’, ‘field3′=>’ForeignKey’) + parent::getFields();
}
O quizás tengas que añadir algo más, no conozco mucho Propel. Mira este enlace: http://oldforum.symfony-project.org/index.php/m/70084/
13 años ago ·
O quizás este otro: http://stackoverflow.com/questions/5461703/symfony-admin-filter-with-join
13 años ago ·
Rodrigo los articulos me fueron super ok!, ya arregle el detalle, si utilizo propel, en ese caso se pone como dices ForeigKey.gracias!!!