CakePHP: Mejorar las búsquedas mediante el método find

22/06/2008

He encontrado un artículo muy interesante sobre cómo mejorar el uso del método find para hacer búsquedas más precisas o mejor dicho para extender el uso de find para adecuarlo a nuestras necesidades. Una razón más de por qué es práctico cargar el mayor código posible en los modelos.

No Comments

¿Te gusta HTML5?

12/06/2008

De algunos de los implicados en el 403Day, llega otra iniciativa peregrina. Ahora le toca al HTML5, que según parece no les gusta mucho. Debe ser por que esperaban que el elemento marquee tuviera más protagonismo y tambien se desplazara de arriba a abajo.

Bueno, yo antes de adherirme, me leeré tooooda la especificaciónHTML5 de la W3C

Me gustaría que hubieran hecho una página o en su defecto en las páginas de cada involucrado, que explicara sus razones.

No Comments

CakePHP: Envío de correos a cuentas de gmail

11/06/2008

Me he encontrado con un problema a la hora de enviar correos mediante el component email a cuentas de correo de gmail. Los correos enviados a esas cuentas no interpretan correctamente las cabeceras y éstas se ven luego en el cuerpo del correo y si el correo es en formato html, éste no se interpreta y se ve el código mezclado con el contenido.

El problema se origina en cómo se especifica el salto de linea para las cabeceras de los correos. Cada Sistema Operativo tiene una manera diferente de hacerlo y dependiendo de dónde esté alojado nuestro script, deberemos especificar cómo realizar el salto de linea.
CakePHP usa por defecto: “\r\n”
Y según el S.O debe ser:

  • Para Unix/Linux: “\n”
  • Para Windows: “\r\n”

Así que en mi caso, que mi script corre en un Linux, debí especificarle que usara un “\n”. ¿Cómo y dónde?. En la llamada de envío de correos en el controlador:

$this->Email->_newLine = "\n";

Podéis encontrar más información al respecto en el siguiente hilo del grupo de CakePHP en español.

No Comments

CakePHP: Imágenes dentro de enlaces

9/06/2008

Usando el helper html para crear enlaces, te puedes encontrar en la situación de tener que crear un enlace que engloba una imagen.

El funcionamiento para crear un elemento enlace típico es el siguiente:

echo $html->link('Texto del enlace', array('controller'=>'controlador', 'action'=>'accion'));

y para crear un elemento imagen es:

echo $html->image('ruta/nombre.jpg', array('alt'=>'alternativa'));

Si esto lo juntamos de la siguiente manera:

echo $html->link($html->image('ruta/nombre.jpg', array('alt'=>'alternativa'), array('controller'=>'controlador', 'action'=>'accion'));

No conseguiremos que nos genere un enlace con una imagen en su interior, sino un “bonito” código html. Esto sucede por que el método del helper link, no interpreta el resultado del método image y muestra el código, no la imagen.
Para solventar esto, debemos pasarle false al quinto parámetro al método link, de la siguiente manera:

echo $html->link($html->image('ruta/nombre.jpg', array('alt'=>'alternativa')), array('controller'=>'controlador', 'action'=>'accion'), false, false, false);

Más información en la referencia del helper html de la API de cakePHP 1.2.

No Comments

CakePHP: Form Helper, fechas y horas

16/04/2008

Hace unos días hablé de cómo modificar los rangos de fechas que aparecen en un selector. Tras el uso de este helper en estos días, he descubierto unos cuantos parámetros que pueden ser de utilidad:

label

Opción común para la mayoría de elementos insertados mediante el método input.

Especifica el label que tendrá el elemento.

echo $form->input('fecha', array('label'=>'Fecha de Nacimiento'));

div

Opción común para la mayoría de elementos insertados mediante el método input.

Si le asignamos false, no englobará el elemento y su label dentro de las etiquetas div. Por defecto el valor es true.

echo $form->input('fecha', array('div'=>false));

minYear

En un elemento select que obtiene la información de un campo date o datetime de una Base de Datos, este parámetro especifica el año mínimo en el rango de selección.

Por defecto es 1988.

echo $form->input('fecha', array('minYear' => '1975'));

maxYear

En un elemento select que obtiene la información de un campo date o datetime de una Base de Datos, este parámetro especifica el año máximo en el rango de selección.

Por defecto es 2028.

echo $form->input('fecha', array('maxYear'=>'2010'));

dateFormat

En un elemento select que obtiene la información de un campo date o datetime de una Base de Datos, este parámetro especifica el año máximo en el rango de selección.

echo $form->input('fecha', array('dateFormat' => 'DMY'));

timeFormat

En un elemento select que obtiene la información de un campo hour o time o datetime de una Base de Datos, este parámetro especifica el formato que tendra, 12 o 24 horas.

Valores: 12 o 24.

Por defecto es 12 horas.

echo $form->input('fecha', array('timeFormat' => '24'));

interval

En un elemento select que obtiene la información de un campo time o datetime de una Base de Datos, este parámetro especifica el intérvalo que habrá entre los valores del selector de minutos.

Por defecto es cada minuto.

echo $form->input('fecha', array('interval' => '15'));
No Comments

CakePHP: Buenas prácticas en un MVC

12/04/2008

En un framework de desarrollo basado en el patrón Modelo-Vista-Controlador como es el caso de CakePHP, es muy recomendable conocer cada una de las capas y tratar de ubicar el código necesario en la capa más adecuada.

Conforme más he ido usando este patrón más me he dado cuenta (por lo menos en los desarrollos que me he visto involucrado) que lo más eficiente es lo que denomino “subir el código” (permitirme poner nombre a algo que ya existe, pero me hacía ilusión). El hecho de poner el máximo código posible o mejor dicho, el mayor número de lógica en los Modelos.

Con el siguiente ejemplo espero explicarme mejor:

Pongamos que tenemos que mostrar los registros de una base de datos, por ejemplo, personas. Pero no todas las personas, únicamente las de sexo femenino.

1.- Manera realmente fea

Obtenemos desde el controlador mediante un find(’all’) todos los registros de la tabla y en nuestra vista, dentro del bucle de obtención de datos foreach. Añadimos un if que sólo muestre los registros deseados.

controlador

$this->set('personas', $this->Personas->find('all');

vista

foreach($persona as $persona):
if( $persona['Personas']['sexo'] == 'M' ) {
pr($persona);
}
endforeach;

2.- Manera menos fea

Desde el controlador filtramos en la consulta al modelo los registros que deseamos. Liberando a la vista de la lógica pudiéndose dedicar únicamente a mostrar la información.

controlador

$this->set('personas', $this->Personas->find('all', array('conditions'=>array('sexo'=>'M')));

vista

foreach($persona as $persona):
pr($persona);
endforeach;

3.- Mejor manera

Trasladamos toda la lógica al modelo. El controlador únicamente llama a un método del modelo y la vista únicamente muestra información.

modelo

function getMujeres(){
return $this->find('all', array('conditions'=>array('sexo'=>'M')));
}

controlador

$this->set('personas', $this->Personas->getMujeres());

vista

foreach($persona as $persona):
pr($persona);
endforeach;

De esta última manera, liberamos la vista, haciéndola menor, fácil de mantener y reutilizable. Sobre todo si quien la manipula es un maquetador con no muchos conocimientos de programación.
El controlador únicamente se dedica a realizar la acción pedida, ejecutando si es preciso métodos del modelo para poder proporcionar la información a la vista. Cambiar la fuente de información es tan sencillo como llamar a uno u otro método del modelo.
El modelo ahora tiene toda la lógica de obtención de información. Proporcionando métodos de acceso a la información que pueden ser utilizados por el controlador.

Espero haberme explicado y como no, abierto a aportaciones y comentarios.

2 Comments

CakePHP: Bindable behaviour

9/04/2008

Un behaviour que en mi modesta opinión debería estar integrado en CakePHP, es Bindable behaviour. Desde aquí a parte de recomendar su uso, quiero agradecer a su creador, Mariano Iglesias, que nos haya proporcionado un behaviour que una vez lo conoces te puede hacer ahorrar tiempo de desarrollo y propocionarte mejoras de rendimiento al poder reducir el número de consultas a la Base de Datos.

Para conocer mejor su uso y funcionamiento lo mejor es darse una vuelta por este artículo en Bakery.

No Comments

CakePHP: Rangos en la selección de fechas

27/03/2008

En el artículo anterior hablé de la selección de fechas y cómo modificar su orden de presentación. El siguiente caso con el que me he encontrado es que, por defecto CakePHP en el selector de año, muestra valores desde 1988 hasta el 2028, un rango nada práctico si queremos selecccionar la fecha de nacimiento por ejemplo.

Tras un rato de investigación y búsquedas infructuosas en los grupos de google, tengo la solución gracias a una respuesta que me han hecho en el grupo de google en español (gracias a Guillermo Movia).

Es cuestión de añadir los parámetros minYear y maxYear:

echo $form->input('fecha', array('minYear'=>'1944', 'maxYear'=>'2000'));
2 Comments

CakePHP: Modificación de la selección de fechas

27/03/2008

Por defecto CakePHP pone los selectores de fechas en orden anglosajón, o sea, año/mes/día. Si queremos modificar ese orden para que se muestre por ejemplo, día/mes/año, debemos poner el parámetro dateFormat en nuestras vistas:

echo $form->input('nacimiento', array('label'=>'Fecha de Nacimiento','dateFormat' => 'DMY'));
No Comments

CakePHP: Mostrar un campo específico en un elemento select

5/03/2008

En un mantenimiento de alta o modificación, podemos encontrarnos con que la tabla en la que estamos haciendo el mantenimiento tiene relaciones con otras tablas. Usualmente para rellenar los valores de esas tablas relacionadas,CakePHP nos muestra un elemento select con los valores de la tabla relacionada para elegir. Por defecto los valores que aparecen son los id de los registros.

Para cambiar este comportamiento y elegir el campo que más nos interese mostrar debemos añadir la siguiente linea en el código del modelo de la tabla relacionada:

var $displayField = 'nombre';
No Comments