Monday, September 28, 2009

Modificación de filtros en Symfony para un modulo de administración. Ejemplo sobre el módulo sfGuardUser del sfDoctrineGuardPlugin(Doctrine)

Dada la poca documentación al respecto, decidí publicar un ejemplo sobre modificación de los filtros para un módulo de administración en una aplicación de symfony. El ejemplo en concreto es sobre el plugin sfDoctrineGuardPlugin y su módulo sf_guard_user.

El detalle importante en este caso es que de los filtros que el módulo genera por default, probablemente sólo los de username, permissions y fechas son útiles, pero dado que el resto de campos que completan el perfil de un usuario van en otra tabla (Customize sfDoctrineGuardPlugin), se hace necesario crear nuevos filtros para los atributos del perfil que sean necesarios.


Ejemplo de schema del perfil:

Perfil:
  columns:
    codigo:
      type: string(10)
      primary: true
      notnull: true
    sf_guard_user_id:
      type: integer
    apellidos:
      type: string(40)
      notnull: true
    nombres:
      type: string(40)
      notnull: true
    sexo:
      type: string(1)
      notnull: true
    email:
      type: string(45)

    #La relación sfGuardUser fue creada manualmente para acoplar esta tabla al
    #plugin de manejo de usuarios sfDoctrineGuardPlugin.
  relations:
    sfGuardUser:
      local: sf_guard_user_id
      foreign: id
      foreignType: one
      onDelete: CASCADE



Agreguemos entonces un filtro para los nombres de los usuarios:

Debemos ubicar la clase sfGuardUserFormFilter.class.php dentro del directorio /lib/filter/doctrine/sfDoctrineGuardPlugin. Ahí agregaremos lo siguiente dentro de la función configure:

public function configure()
{
  //...

  //Widget para el filtro de nombres
  $this->widgetSchema['nombres'] = new sfWidgetFormFilterInput(array(
        'with_empty' => false
  ));
  $this->validatorSchema['nombres'] = new sfValidatorPass(array(
        'required' => false
  ));
}


Con esto hemos creado un widget para el atributo 'nombres' con su respectivo validator. El widget es un simple campo de entrada (sfWidgetFormFilterInput), en donde hemos desactivado con "'with_empty' => false", el checkbox 'is_empty'.

Posteriormente agregaremos la función para consultar sobre la base de datos los atributos que deben ser cargado desde la tabla perfil.

public function addNombresColumnQuery(Doctrine_Query $query, $field, $values)
{
  //Se comprueba que no sea nulo el valor del campo del filtro
  if ($values['text'] != '') {
    $query->from('sfGuardUser u')
      ->innerJoin('u.Perfil us')
      ->andWhere("us.nombres LIKE ?", '%'.$values['text'].'%');
  }

}


El nombre de la función debe ser addCampocualquieraColumnQuery.

En este caso se hace un Join interno entre las tablas sfGuardUser y perfil, agregando un WHERE para filtrar los registros que coincidan con el valor introducido en el campo de input. El valor es $values['text'] y los porcentajes a los lados son sintaxis de doctrine para permitir que la búsqueda no requiera la palabra exacta, y permita devolver resultados con sólo una parte de ella (Documentación doctrine)

Finalmente, se añade el nuevo atributo de filtro a la función getFields, que devuelve todos los campos por los que es posible filtrar:

public function getFields()
{
  return parent::getFields() + array(
      'nombres' => 'Text'

);


Se añade al array ya existente desde parent::getFields() en la clase autogenerada BasesfGuardUserFormFilter.class.php, el nuevo campo de tipo text.


Con esto sólo resta activar el nuevo campo de filtro en el archivo generator.yml del módulo sfGuardUser:

filter:
  display: [username, permissions_list, nombres]


Luego:

$ ./symfony cc

El filtro debería funcionar

Wednesday, September 9, 2009

Jail Break para Ipod/Iphone

Estuve hace un par de semanas en USA y compré un Ipod Touch 2da Generación.

Después de usarlo un poco decidí hacer el JailBreak para poder instalar otras aplicaciones fuera del appStore...
Luego de googlear encontré una guía en español que está excelente.
Te explica como actualizar el firmware a la versión 3.0, hacer el jailBreak e instalar otros paquetes necesarios.
Se hace sin mayor dificultad y no se necesita mucho tiempo.

Acá la dejo:
http://ipodlibre.blogspot.com/