Sufrimientos del programador

noviembre 10, 2010

Symfony admin custom filter propel

Archivado en: desarrollo web — Etiquetas: , , , , — cgcerro @ 12:52 pm

Symfony es un framework cojonudo, yo así lo veo, pero en el caso de admin-generator, esos maravillos CRUD que nos ofrece sin mucho esfuerzo de programación, cuando quieres salirte un poco de lo normal te cuesta dios y ayuda encontar como hacer las cosas. A mi al menos me pasa.

La situación está en cómo poner en un listado de tu admin un filtro específico, como tú quieras.

Como caso practico queremos poner un  filtro que determine si el valor de una columna es null o no (is null, not is null). Como verás, en los filtros que estableces como campos de texto debajo te sale un chekbox is_empty. No parece existir un “not is empty”, pero te recomiendo que en este caso puedes elegir los “no vacios” tal y como lo harías en la sentencia SQL. (Con un guión bajo te saca los que no tienen vacío ese campo). Pero en nuestro caso lo que queremos filtrar es el campo de una clave foranea, ejemplo: facturas corresponden a un usuario y pueden tener usuario o no, queremos poder filtrar las facturas que tienen usuario asociado y cuales no.

Yo lo he resuelto así, igual no es lo mejor, no lo se porque no he encontrado un caso similar en la documentación. Ojo, estoy hablando de symfony 1.3, creo recordar que esto se podía hacer fácilmente en symfony 1.1 usando un partial en el filtro y no se qué más.

1.- Primero en lib/model/Facturas.php vamos a crear el métido que determina si la factura tiene usuario o no. Tengo mis dudas de si esto es estrictamente necesario o no, pero no tengo tiempo para liarme y ademas el método me puede venir bien en otros casos.

public function getHasuser(){
  return $this->getUsers()?true:false;
}

2.- En apps/backend/modules/facturas/config/generator.yml declramos el nuevo filtro (que será un select con tres opciones “indiferente”, “Si”, “No”, pero eso lo vemos luego)

filter:
  display:    [.....,hasuser,....]

3.- En lib/filter/FacturasFormFilterClass.php añadimos en el metodo configure lo siguiente (para definir el filtro)

$this->widgetSchema['hasuser'] =
  new sfWidgetFormChoice(array(
  'choices' => array('' => 'indef', 1 => 'si', 0 => 'no')));

$this->validatorSchema['hasuser'] =
  new sfValidatorChoice(array(
  'required' => false,
'choices' => array('', 1, 0)));

4.- Y por último, si eliges sí o no en el filtro, se debe ver reflejado en la query que se ejecuta al filtrar. Para ello, en el mismo fichero lib/filter/FacturasFormFilterClass.php añadimos el siguiente método:

public function addHasuserColumnCriteria(Criteria $criteria, $field, $values)
{
if (!is_array($values))
{
    $values = array($values);
}

if (!count($values))
{
    return;
}

$value = array_pop($values);

switch($value){
case 1:
    $criterion = $criteria->getNewCriterion(FacturasPeer::ID_USER, null,Criteria::ISNOTNULL);
break;
case 0:
    $criterion = $criteria->getNewCriterion(FacturasPeer::ID_USER, null,Criteria::ISNULL);
break;
}

$criteria->add($criterion);
}

Y con eso hemos terminado. Me gustaría explicar un poco más, pero hoy no hay tiempo para eso. Solo espero que con el ejemplo te sirva para resolver tu caso concreto.

Advertisement

1 comentario »

  1. Cuanta sabiduría mañoextremeñomadrileña !

    Comentario por Dani — noviembre 12, 2010 @ 9:12 am


RSS feed para los comentarios de esta entrada. URI para TrackBack.

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Tema Silver is the New Black. Blog de WordPress.com.

Seguir

Get every new post delivered to your Inbox.