Mostrando entradas con la etiqueta bake. Mostrar todas las entradas
Mostrando entradas con la etiqueta bake. Mostrar todas las entradas

jueves, 20 de agosto de 2009

Plantillas para generar vistas con Bake

Una de las estrategias que puede ayudar más en agilizar el desarrollo con CakePHP es hacer un uso intensivo del shell Bake.

A poco que conozcas Cake habrás oído hablar de esta utilidad capaz de generar modelos, controladores y vistas, prefabricados, proporcionándote así una buena base para trabajar, tanto que a veces no necesitas mucho más para disponer de un "backend" suficiente.

Sin embargo, es posible que no te guste de todo el código generado, o que no se adapte completamente a lo que necesitas o a los requisitos del proyecto. ¿No sería estupendo poder personalizar ese código?

En este post voy a intentar explicar las bases de cómo crear plantillas para las vistas generadas con Bake.

Las plantillas

Es una buena idea echar un vistazo a las que vienen de serie, que se encuentran en la carpeta cake/console/libs/templates/views. Parece un galimatías, ¿verdad? Bueno, no es tan complicado una vez que comprendes como va.

Para comenzar a modificar estas plantillas lo mejor es que las copies a la carpeta de la aplicación. Las debes poner en app/vendors/shells/templates/views.

Hay cuatro plantillas:

form.ctp: para generar las vistas add.ctp, admin_add.ctp, edit.ctp y admin_edit.ctp.
home.ctp: para generar la vista home.ctp
index.ctp: para generar las vistas index.ctp y admin_index.ctp
view.ctp: para generar las vistas view.ctp y admin_view.ctp

¿Cómo se escriben estas plantillas?

El HTML se escribe directamente, como si fuese una vista normal.

Puedes usar código CakePHP para generar partes de la vista. Dispones de varias variables que hacen referencia al modelo y los datos que el controlador pasará a la vista. Se asumen varias convenciones que intentaré esplicar:

$action: contiene la acción que será llamada (ejemplo "add"). Puedes chequearla para incluir o no elementos según sea una acción de crear o editar el registro.
$fields: contiene un array con los campos del modelo.
$associations: un array que contiene las asociaciones del modelo, con las cuatro claves (hasAndBelongsToMany, belongsTo, hasMany y hasOne).
$singularHumanName y $plurarHumanName: el nombre del modelo en formato legible por humanos.
$modelClass: la clase del modelo
$displayField: el campo que esté definido como tal en el modelo, o el que Cake toma por defecto (normalmente title).
$pluralVar: el nombre del modelo en plural en formato de variable. Se asume que una acción index pasas los resultados del find o del paginate a la vista en una variable con el nombre del modelo en plural. Por ejemplo, si el modelo es Post, la variable en la vista sería $posts.
$schema: nada menos que el schema o definición de la tabla en la base de datos.

El código PHP que quieras que tenga la vista se tiene que escribir indirectamente a través de PHP, habitualmente usando algo así como:

<div id="view_title">
<h1><?php echo "<?php __('Admin $pluralHumanName'); ?>" ?></h1>
<p><?php echo "<?php __('Manage $pluralHumanName records'); ?>" ?></p>
</div>
Fíjate que los prefijos $ de las variables "reales" deben ser escapados con \ para evitar un error de variable inexistente en la generación. Aparte de eso, puedes usar las variables de la plantilla a tu gusto.

En fin, quizá sea mejor que veas algunos ejemplos. En particular, las vistas edit e index, que son las que yo he modificado.


¿Personalizar modelos y controladores?

No he entrado en este tema, pero básicamente consiste en modificar las tasks que los generan, trabajo que parece más tedioso que difícil. Echa un vistazo en cake/console/libs/tasks/. Puedes copiar las tasks en app/vendors/shells/tasks para modificarlas.

El código es bastante claro, por lo que no parece difícil adaptarlo a tus preferencias concretas.

jueves, 21 de agosto de 2008

Cocinando Plugins: usando Bake para crear un plugin

No he sido capaz de encontrar mucha información sobre el cocinado de Plugins con Bake (aparte de la creación de la estructura del plugin), pero resumo aquí mis hallazgos:

Estructura del Plugin

Bueno, para esto llega con:

cake bake plugin nombre


Siendo "nombre" el nombre del Plugin.

Lo que nos creará una estructura de partida sobre la que trabajar, con las carpetas para models, controllers y views y subcarpetas adecuadas (behaviors, componentes y helpers).

Models, Controllers, y demás

Pues se hace básicamente igual que con sus equivalentes no plugin, sólo hay que especificar que se trata de un plugin y decir de cuál:

cake bake plugin nombre model


Con el comando anterior se entra a la generación interactiva de modelo, pudiendo elegir como es habitual la conexión de base de datos, el modelo, si le añadimos validación, etc.

Si especificamos un nombre de modelo, se crea de forma directa.

Para generar Controllers y Views se hace exactamente lo mismo:

cake bake plugin nombre controller


cake bake plugin nombre view


Actualización

Dos minutos después de publicar la entrada me encuentro con que estaba todo aquí

Baking pulgins (de Cakebaker, claro)

lunes, 3 de septiembre de 2007

Cake Bake y MAMP

Llevaba un tiempo bastante molesto para mi incapacidad para usar las herramientas de generación de CakePHP, la antigua utilidad Bake (actualmente cake bake). El problema es que siempre me salía con un error de conexión con la base de datos.

Yo utilizo en mi máquina de trabajo el paquete MAMP (Apache-MySQL-PHP para Mac OS X), instalado tal como viene por defecto.

El caso es que he podido entender el problema y solucionarlo.

bake busca comunicarse con la base de datos a través del socket

/var/mysql/mysql.sock

Pero si instalamos MAMP sin tocar su configuración para nada, el socket está en:

/Applications/MAMP/tmp/mysql/mysql.sock

La solución es crear un enlace simbólico:

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

Pero hay un par de requisitos previos. Primero tenemos que crear un directorio mysql bajo var:

cd /var
sudo mkdir mysql

y luego crear el enlace

sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

Y listo.

Nota final

Una cosilla... uso sudo porque al menos en Mac OS X mi usuario de trabajo no tiene permisos sobre la carpeta var para crear el directorio y el enlace simbólico, sin embargo, éste funciona sin ningún problema.