Recursos de documentación sobre CakePHP

En un artículo anterior, comenté la reciente “publicación” de un libro sobre trucos para CakePHP.

Ahora me gustaría ampliar esa información con un listado de recursos de documentación sobre este Framework de desarrollo en PHP:

Libros

Enlaces

Tags: ,

Libro gratuito de consejos avanzados sobre CakePHP

A la cada vez mayor oferta (hasta no hace mucho era todo lo contrario) de documentación sobre CakePHP, ahora le podemos sumar el libro (pdf) gratuito que ha elaborado Matt Curry de pseudocoder.com, llamado Super Awesome Advanced CakePHP Tips.

Tags:

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: , ,

Subir archivos en CakePHP

Esa tarea tediosa que es la subida de archivos desde una aplicación web, en el caso de usar CakePHP, se facilita mucho gracias al behavior MeioUpload de Vinicius Mendes.

Este behavior, claramente, debería formar parte del core de CakePHP, como en su momento pasó con Bindable / Containable

Tags: ,

Paginación númerica parcial en CakePHP

La paginación en CakePHP tiene una serie de helpers que hacen muy fácil su uso. Mediante los métodos del helper pagination, prev y next avanzamos o retrocedemos páginas y con el método numbers, nos apareceran números para ir directamente a las páginas que deseemos y avanzar o retroceder más rápido.

Sucede el caso que tengamos un listado muy largo donde la cantidad de números que pueden aparecersean excesivos. Para que sólo nos muestre cierta cantidad de números (al estilo de la paginación de resultados de Google) y que vayan cambiando según nos acercamos al final o al principio, tenemos un parámetro para el método numbers que se llama, modulus.

No hay mejor ejemplo que probarlo uno mismo y más que leerse la documentación (que en este caso es nula) mirarse la API en cuestión.

Tags: ,

Formato de los números en PHP y CakePHP

A veces, en vez de pasar el rato mirando la televisión, debería pasar más tiempo mirando la documentación de PHP y es que por cosas de estas te puede pasar desapercibidas cosas como la función number_format. De lo más útil para tratar las malditas diferencias entre los separadores de miles o de decimales.

A demás, CakePHP tiene el helper Number para manejar números ampliando la funcionalidad de la number_format.

Creación automática de slugs con CakePHP

Slug a parte de babosa hace referencia a las cadenas de texto “saneadas” que se suelen usar para poner el título de un artículo en las Friendly URL.

En CakePHP, gracias a Mariano Iglesias (creador de Bindable Behavior) hace tiempo disponemos de Sluggable Behavior, ideal para la creación automática de slugs partiendo de un campo del modelo.

Tags: ,

Múltiples esquemas de conexión a Base de Datos en CakePHP

A la hora de pasar una web de desarrollo a producción o para “testearla” en el servidor final hemos de modificar algún valor en nuestro archivo core.php y poner los valores específicos del servidor en el database.php.

Existen muchas maneras de conseguir agilizar un poco este proceso y una de ellas que me ha gustado a la hora de no tener que modificar el archivo database.php es añadiendo un contructor a la clase DATABASE_CONFIG (dentro de database.php) que en función de algún parámetro haga que nuestra aplicación use una o otra conexión:

function __construct() {
    switch(Configure::read('WebApp.mode')) {
        case "Production":
            $this->default = $this->production;
            break;
        default:
        case "Develop":
            $this->default = $this->develop;
            break;
        }
}

El siguiente paso será definir $this->develop y $this->production en la clase y asignar $this->default a null, quedando nuestra clase de la siguiente manera:

class DATABASE_CONFIG {
    var $default = null;
    var $production = array(
        'driver' => 'mysql',
        'persistent' => false,
        'host' => '',
        'login' => '',
        'password' => '',
        'database' => '',
        'prefix' => '',
        );
    var $develop = array(
        'driver' => 'mysql',
        'persistent' => false,
        'host' => '',
        'login' => '',
        'password' => '',
        'database' => '',
        'prefix' => '',
        );

    function __construct() {
        switch(Configure::read('WebApp.mode')) {
            case "Production":
                $this->default = $this->production;
                break;
            default:
            case "Develop":
                $this->default = $this->develop;
                break;
         }
    }
}

Sólo nos queda declarar la variable de configuración WebApp.mode en nuestro archivo core.php o en bootstrap.php, tal que así:

Configure::write('WebApp.mode','Develop'); //'Production'

Tags:

Añadir CSS y Javascript en función de las vistas en CakePHP

Por defecto las hojas de estilo CSS y los scripts en Javascript se incluyen mediante los helpers oportunos (html y Javascript) en el layout que usemos para nuestra aplicación web. Sucede que hay momentos que ciertos estilos o scripts queremos que sólo se carguen cuando se ejecuta una vista en particular.

Para conseguir esto o podemos hacer una serie de condicionales en el layout, técnica que “ensucia” bastante nuestro código. O aprovechar la posibilidad que oferece CakePHP de incluir esa carga en una vista específica.

Supongamos que tenemos una vista y al principio de la misma añadimos lo siguiente:

echo $javascript->link('jquery-1.3.1.min', false);
echo $html->css('estilos', null, null, false);

En el primer caso, gracias al parámetro false del método link del helper javascript y en el segundo caso gracias al parámetro false del método css del helper html. Conseguimos que la CSS y el JS se nos cargue dentro de las etiquetas head de nuestro layout a la hora de renderizar la página.

Más información en la documentación de la API para el el helper HTML y para el Javascript.

Tags: , ,

Paginación numérica en una lista con CakePHP

Por defecto la páginacció numérica en CakePHP muestra una serie de elementos span con enlaces a cada una de las páginas de un listado.

Si queremos un HTML más semántico y mejor estructurado, es necesario que en vez de mostrar elementos span tengamos elementos de lista, li.

Pese que tras un primer vistazo a la documentación, parece que no es posible, mirando la API, descubro que mediante las opciones que se pasan al método numbers(), es posible especificar que elemento se mostrará antes y después de cada enlace numérico.

$this->numbers( array('tag'=>'li') );

Tags: , ,