15/09/11

Creación de filtros personalizados en el admin con doctrine

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:

  1. Añadir el nombre de nuestro widget de filtro personalizado al archivo generator.yml.
  2. Añadir nuestro widget al archivo [modelo]FormFilter.class.php.
  3. Crear nuestro query en el archivo [modelo]Table.class.php.

Añadimos el nuevo widget personalizado, al que llamaremos activo, a nuestro generator.yml
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: , , ,

2 Respuestas to “Creación de filtros personalizados en el admin con doctrine”

  1. Información Bitacoras.com…

    Valora en Bitacoras.com: No hay resumen disponible para esta anotación…

  2. Luis Arizaga dice:

    Muchas gracias por el artículo, me ayudó mucho. Saludos desde Argentina.

Deja un comentario