Archivo para la categoría ‘Doctrine’

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.
leer más…
15/09/11

Forzar uso de tablas utf-8 en symfony 1.4 y doctrine 1.2

Hace poco tuve un problema al usar la tarea doctrine:build en symfony 1.4 y doctrine 1.2. Cual fué mi sorpresa al ver que symfony me creaba todas las tablas de mysql con codificación latin1_general_ci en vez de utf8_general_ci.

Indagando un poco por internet encontré una buena manera de poder definir la creación de tablas a utf a nivel global de tu proyecto. Tenemos dos opciones, una a nivel de tablas mysql y otra a nivel de toda tu base de datos.

Para la primera podemos definir en nuestro schema.yml las tablas de la siguiente forma:

User:
  options:
    type: MyISAM
    collate: utf8_unicode_ci
    charset: utf8
  columns:
    username: string(255)
    password: string(255)

La segunda, mucho más cómoda, es definir a nivel global el manager doctrine en nuestro archivo ProjectConfiguration.class.php la siguiente función:

public function configureDoctrine(Doctrine_Manager $manager)
{
  $manager->setCollate('utf8_unicode_ci');
  $manager->setCharset('utf8');
}

No nos olvidemos de realizar un rebuild the nuestros modelos y ya estaremos listos para seguir trabajando.

27/12/10

Tutorial Doctrine DQL , parte 1

Voy a poner un pequeño resumen de como manejarse un poco con las sentencias DQL de Doctrine.
Voy a poner un ejemplo de lo que sería una sentencia DQL my simple por defecto.

$doctrine_collection_object = Doctrine::getTable('usuarios')->findBy('id',453);

Lo primero a tener en cuenta es que DQL no es SQL, si entendemos ésto muy bien tendremos menos problemas y también tener en cuenta que tenemos múltiples maneras de realizar los queries a nuestra base de datos (métodos estáticos, instanciando las clases de las tablas e incluso con SQL nativo).

Disponemos de muchos métodos para realizar consultas, AND, OR, WHERE , ANDWHERE, ORWHERE, etc..

Un ejemplo de realizar un join en Doctrine:
Imaginaros que tenemos las tablas de poblaciones, zonas y tipo_poblacion. Y queremos obtener todas las poblaciones del tipo 2 en el que el nombre esté contenido en el nombre de la población y también en el de la zona.

En la clase poblacionTable creamos el siquiente método:

public static function retrieveByNombre($nombre, $tipo) {
    $query = self::getInstance()->
            createQuery("p")->
            leftJoin("p.tipo t")->
            leftJoin("p.zona z")->
            Where ("t.id_tipo = ".$tipo)->
            andWhere("p.poblacion LIKE '%".$nombre."%' OR z.nombre  LIKE '%".$nombre."%'");
    return $query->execute();
  }

Como vereis es una mezcla entre SQL y las propias clases del squema YML. Las relaciones se basan en las clases y no en las tablas, incluso si son relaciones n to n, doctrine no las diferencia. En nuestro caso tenemos una relacion n-to-n para los tipos y otra 1-to-n para las zonas.

Si queremos depurar la sentencia SQL podemos utilizar el método $query->getSqlQuery(); que nos devuelve la sentencia SQL completa.

Aquí os dejo el link de la documentación de Doctrine Documentación

01/11/10

Doctrine, sobreescribir métodos del padre

Para todos aquellos que estamos acostumbrados al uso de Propel en nuestros proyectos de Symfony y nos hemos pasado a Doctrine, (otro días pondré un post con las principales diferencias / ventajas de doctrine frente a Propel), nos habremos encontrado con la necesidad de sobreescribir un método padre de una clase.

Doctrine usa getter/setter mágicos en vez the parent::setXXX() y parent::getXXX().

public function getTitulo(){
  $titulo = $this->_get('titulo');
  //hacer algo con el titulo
  return $titulo;
}
29/10/10

Usar el método Slug the Doctrine

Doctrine posee un behaviour Slugabble por el cual obtenemos cadenas de texto URL amigable. Éste método es muy util para utilizar en cualquier campo que queramos indexar para atacar la base de datos. Podemos acceder a éste método mediante:

$slug = Doctrine_Inflector::urlize($cadena);