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'));
05/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';
24/02/2008
El código que implementemos en el método afterSave o en el beforeSave se ejecutará tanto a la hora de realizar un add o un edit. Puede ser necesario diferenciar cuando se está ejecutando una u otra acción.
Ha falta de otra opción, una manera bastante limpia de hacerlo es preguntado por la existencia o no del id en los datos recibidos por las callbacks.
if (empty($this->id)){
// Añadiendo (no modificando)
}
15/02/2008
Mariano Iglesias dio una charla en la CakeFest‘08 sobre los behaviours. Ha puesto en su página web la presentación que utilizó para apoyarse. Una muy buena aproximación para conocer, entender y empezar con los behaviours.
Descargar PDF de la presentación (en inglés).
12/02/2008
Usando el helper Form para mostar un checkbox puede que nos sea necesario mostrarlo activo ya que por defecto no lo está. Para ello en el array de parámetros del método input o checkbox le pasaremos el key checked con el value checked.
En nuestra vista pondremos:
echo $form->input('activo', array('label'=>'¿Activo?', 'checked'=>'checked'));
Más información sobre el Helper Form.
10/02/2008
Es interesante y útil la existencia, en el modelo, de los métodos (callback) beforeSave y afterSave para manipular los datos antes o después de que vayan a ser grabados en la Base de Datos.
Un detalle muy importante a la hora de implementarlos en nuestros modelos es que debemos retornar un true o un false según el resultado del código de nuestra función.
function beforeSave(){
// Código ...
return true;
}
Mirando el código de la clase model, veo que sus métodos beforeSave y afterSave retornan un true por defecto. Ahora me pregunto si en caso de que queramos retornar un true en nuestra implementación, es más correcto retornar una llamada al método padre:
return parent::beforeSave();
De esta manera nos aseguramos que si algún día estos métodos en las clases padre tienen algo más implementado que un simple return true, ese código sea ejecutado. En caso de hacer este tipo de retorno, deberemos estar pendientes de futuras versiones de CakePHP, para ver si añaden nuevo código en estas funciones base.
07/02/2008
Buscando cómo poner el idioma en el que se está navegando la web como parte de la URI, he encontrado un hilo en el google groups de CakePHP dónde explica una manera de conseguirlo.
En nuestro archivo routes.php
Router::connect('/:language/:controller/:action/*', array(), array('language' => '[a-z]{2}'));
Luego en el controlador que queramos, preferiblemente en el app_controller, en el método beforeFilter podemos obtener ese valor de la URI, por si lo necesitamos, mediante:
$this->params['language'];
05/02/2008
En un controlador nos puede interesar tener métodos privados que no sean accesibles desde una URL. Es sencillo, el nombre del método debe empezar por el guión bajo ( _ ), por ejemplo:
function _metodoPrivado(){
// Código del método
}
31/01/2008
Sucede que en algún formulario de nuestras vistas podemos necesitar un elemento HTML select con unos valores que no se obtienen de una tabla de la Base de Datos (como sucede en los formularios de alta o modificación que crea cakePHP cuando existen relaciones belongsTo, por ejemplo) y queremos especificarlos nosotros mismos.
Una manera de conseguirlo es, en el controlador:
$dia = array('Lunes' => 'Lunes', 'Martes' => 'Martes', 'Miercoles' => 'Miercoles', 'Jueves' => 'Jueves', 'Viernes' =>'Viernes', 'Sábado' => 'Sábado', 'Domingo' => 'Domingo');
$this->set(compact('dia'));
Los keys del array $dia serán los values de los options del futuro select. Y el texto que se mostrá, será el value del array. Si el key no se especifica, los values de los options serán valores númericos correlativos empezando desde el 0.
Y en la vista:
echo $form->select('dia', $dia, null, null, false);
Resultado, obtenemos un desplegable con los días de la semana:
<select name="data[Zone][dia]" id="ZoneDia">
<option value="Lunes">Lunes</option>
<option value="Martes">Martes</option>
<option value="Miercoles">Miercoles</option>
<option value="Jueves">Jueves</option>
<option value="Viernes">Viernes</option>
<option value="Sábado">Sábado</option>
<option value="Domingo">Domingo</option>
</select>
Más información sobre FormHelper::select