Ejecutar callbacks del modelo en función de acciones del controlador

Una de las cosas que me he encontrado al desarrollar con CakePHP es el poder ejectuar cierto código en las callbacks (afterSave, beforeSave, afterFind, etc.) del modelo en función de la acción realizada desde el controlador. Ciertamente no había pensado en la solución que plantea teknoid al respecto:

Generar una variable y un método en nuestro app_model:

var $controllerAction = null;

function setControllerAction( $action = null ) {
    if($action) {
        $this->controllerAction = $action;
    }
}

Que después podemos utilizar en las callbacks de nuestros modelos:

function afterFind($results, $primary = false) {
    if($this->controllerAction == 'test') {
        // run some code such as $this->_reformatTestData($results);
    }
}

Y desde los controladores para expecificar qué acción está realizando la llamada a la callback:

$this->User->setControllerAction('test');
$this->User->find('all');

Tags: , ,

CakePHP: Métodos privados en el controlador

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
}

Tags: ,

CakePHP: Usar valores específicos en un elemento select

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

Tags: ,