Rodrigo Borrego Bernabé - Software Developer




Filtrando en symfony con un selector los campos de texto

Category : Programación, Symfony · by Dic 16th, 2010

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.

SHARE :

(5) comments

mut3nr01
13 años ago · Responder

Muy interesante. Me ha venido genial!

Gracias!

Randy
12 años ago · Responder

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

    Rodrigo
    12 años ago · Responder

    ¿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/

Randy
12 años ago · Responder

Rodrigo los articulos me fueron super ok!, ya arregle el detalle, si utilizo propel, en ese caso se pone como dices ForeigKey.gracias!!!

Responder a Rodrigo Cancelar la respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.