Symfony: Personalizando Los Filtros Del Generate-admin
posteado por Emiliano, categoría Symfony
4 may2010
Veremos como personalizar los filtros del generate-admin para lograr filtrados más personalizados a nuestras necesidades.
Si alguna vez utilizaste el generate-admin de Symfony habrás advertido que en los listados tenemos la posibilidad de filtrar los datos mostrados. Estos filtros te permiten filtrar por cualquier campo existente en la tabla del objeto que estamos viendo. Ahora veremos como agregar un campo personalizado a los filtros para filtrar según nuestras necesidades.
Supongamos que tenemos un objeto User y otro Phonenumber y que en el listado de teléfonos queremos filtrar por usuario. Para esto modificamos el archivo generator.yml del módulo Phonenumber. Esto es phonenumber/config/generator.yml:
config:
filter:
display: [ another, field, user_by_name]
Además, necesitamos definir el widget y el validator para este nuevo campo en lib/filter/doctrine/PhonenumberFormFilter.class.php:
<?php public function configure() { //... $this->setWidget('user_by_name', new sfWidgetFormFilterInput(array('with_empty' => false)); //... $this->setValidator('user_by_name', new sfValidatorPass(array('required' => false)); } ?>
En la misma clase del formulario necesitamos sobreescribir el método getFields() con el nuevo campo agregado:
<?php public function getFields() { $fields = parent::getFields(); $fields['user_by_name'] = 'custom'; return $fields; } ?>
Y por último, necesitamos agregar el método que realizará el filtrado, el cual siempre sigue esta convención addColumnNameColumnCriteria:
<?php public function addUserByNameColumnQuery($query, $field, $value) { $text = $value['text']; if($text) $query->leftJoin($query->getRootAlias().'.User u')->andWhere('(u.first_name LIKE ? OR u.last_name LIKE ? OR u.username LIKE ?)', array("%$text%", "%$text%", "%$text%")); return $query; } ?>
Listo, ya tenemos un filtro personalizado.


1 Comentario:
alfchee:
01 de Junio de 2011 a las 15:39:22muy buen post! me funciona bien lo que has escrito, pero tengo problemas para cuando quiero filtrar fechas, en lugar de darme una sola fecha me da dia, mes y año por separado, cómo puedo hacer para que sea un solo dato date?? otra cosa que no comprendo es: cuando escribes $value['text'], te refieres sólo a user_by_name? cómo haces para tomar en cuenta los otros campos que te puedan pasar como "field" y "another"???