Bueno, mucha gente desconoce el potencial que tenemos a la hora de crear nuestros propios filtros personalizados para el admin.
Podemos referenciar objetos y tablas externas desde otras para ofrecerle al usuario una experiencia de usuario mucho más confortable a la hora de utilizar nuetra aplicación.
Listado de pasos a seguir para crear un filtro personalizado:
- Añadir el nombre de nuestro widget de filtro personalizado al archivo generator.yml.
- Añadir nuestro widget al archivo [modelo]FormFilter.class.php.
- Crear nuestro query en el archivo [modelo]Table.class.php.
filter:
display: [id, nombre, apellidos, activo]
Despúes editamos el archivo [modelo]FormFilter.class.php:
Voy a poner varios tipos de filtros con distintos widgets para que veais lo versatil que resulta.
$this->setWidget('activo', new sfWidgetFormChoice(array(
'choices' => array( '' => 'sí o no', 1 => 'sí', 0 => 'no'),
)));
$this->setValidator('activo', new sfValidatorChoice(array(
'required' => false, 'choices' => array('', 1, 0),
)));
ó
$this->setWidget('nombre', new sfWidgetFormFilterInput(array('with_empty' => false)));
$this->setValidator('nombre', new sfValidatorPass(array('required' => false)));
Añadimos la llamada a la function table para que modifique el query y actualizamos la función getFields():
public function addActivoColumnQuery($query, $field, $value) {
Doctrine::getTable([modelo])->applyActivoFilter($query, $value);
}
public function addNombreColumnQuery($query, $field, $value) {
Doctrine::getTable([modelo])->applyNombreFilter($query, $value);
}
public function getFields() {
$fields = parent::getFields();
$fields['activo'] = 'custom';
$fields['nombre'] = 'custom';
return $fields;
}
por último solo nos falta crear nuestras funciones para modificar el query en el archivo [modelo]Table.class.php.
public static function applyActivoFilter(Doctrine_Query $query, $value) {
$value = $value['text'];
$alias = $query->getRootAlias();
switch ($value) {
case '0':
$query->addWhere("$alias.activo = 0");
break;
case '1':
$query->addWhere("$alias.activo = 1");
break;
}
return $query;
}
También podemos realizar filtros que utilicen un join para filtrar por campos relacionados en otras tablas.
public static function applyNombreFilter(Doctrine_Query $query, $value) {
$value = $value['text'];
$alias = $query->getRootAlias();
if ($value <> '') return $query->leftJoin("$alias.usuario u")->addWhere("u.nombre LIKE '%$value%'");
}
Tags: admin generator, Doctrine, filtro, symfony
Información Bitacoras.com…
Valora en Bitacoras.com: No hay resumen disponible para esta anotación…
Muchas gracias por el artículo, me ayudó mucho. Saludos desde Argentina.