Validación y mensajes de error en CakePHP
2008-08-07 22:26:31-05
Desarrollo
Una de las cosas más chidas de CakePHP es que hace la validación del lado del servidor supersencilla, validar es de las cosas que me dan más hueva en los desarrollos. Sin embargo tenía la duda de porque había dos mensajes de error, uno en el helper (en la vista) y otro en el array $validate del modelo.
Googleando un poco veo que en realidad el mensaje de error del helper no es necesario, sólo hay que poner el mensaje en el modelo.
1) En la función beforeFilter() del archivo APP/app_controller.php debemos indicar el lenguaje que queremos:
Configure::write('Config.language', 'es'); // <-- para mensajes en español
2) En el formulario dela vista agregamos el helper a la entrada del formualrio que queremos validar, en este caso el campo title del modelo Entry:
echo $form->error('Entry.title');
3) En nuestro modelo definimos la regla de validación:
public $validate = array(
'title' => array(
'rule' => array('minLength', 4),
'message' => 'Title must be at least four characters long',
'allowEmpty' => false,
'required' => true
)
);
4) Ahora la traducción al español en el archivo APP/locale/spa/LC_MESSAGE/default.po, notese que el msgid debe ser idéntico al mensaje puesto en el array validate.
msgid "Title must be at least four characters long"
msgstr "El título debe tener al menos cuatro letras"
5) Y por último hacemos un overriding del método invalidate() del modelo y ponemos este método en APP/app_model.php:
public function invalidate($field, $value = true)
{
return parent::invalidate($field, __($value, true));
}
Y con eso ya tenemos los mensajes de validación en español en toda nuestra aplicación.
Googleando un poco veo que en realidad el mensaje de error del helper no es necesario, sólo hay que poner el mensaje en el modelo.
1) En la función beforeFilter() del archivo APP/app_controller.php debemos indicar el lenguaje que queremos:
Configure::write('Config.language', 'es'); // <-- para mensajes en español
2) En el formulario dela vista agregamos el helper a la entrada del formualrio que queremos validar, en este caso el campo title del modelo Entry:
echo $form->error('Entry.title');
3) En nuestro modelo definimos la regla de validación:
public $validate = array(
'title' => array(
'rule' => array('minLength', 4),
'message' => 'Title must be at least four characters long',
'allowEmpty' => false,
'required' => true
)
);
4) Ahora la traducción al español en el archivo APP/locale/spa/LC_MESSAGE/default.po, notese que el msgid debe ser idéntico al mensaje puesto en el array validate.
msgid "Title must be at least four characters long"
msgstr "El título debe tener al menos cuatro letras"
5) Y por último hacemos un overriding del método invalidate() del modelo y ponemos este método en APP/app_model.php:
public function invalidate($field, $value = true)
{
return parent::invalidate($field, __($value, true));
}
Y con eso ya tenemos los mensajes de validación en español en toda nuestra aplicación.
Permalink: http://mononeurona.org/users/entry/aarkerio/1486
Una amante del detalle
2008-06-16 16:55:03-05
Tuttifrutti

Permalink: http://mononeurona.org/users/entry/aarkerio/1384
Quick Karamelo
2008-05-18 14:50:19-05
Desarrollo
Instalación rápida de Karamelo
Creamos el directorio tmp en $HOME/tmp
$mkdir $HOME/tmp && cd $HOME/tmp
Instalamos los paquetes:
$sudo apt-get install php5 php5-pgsql subversion postgresql cakeph-instaweb
Vamos por las fuentes de CakePHP con subversion:
$svn co https://svn.cakephp.org/repo/branches/1.2.x.x/cake/ cake
Vamos por Karamelo:
$wget ftp://mononeurona.org/pub/karamelo/karamelo-0.2rc1.tar.gz
$tar -zxvf karamelo-0.2rc1.tar.gz
Editamos el archivo pg_hba.conf:
$sudo gedit /etc/postgresql/8.3/pg_hba.conf
En donde diga "user ident" o "md5" cambiar a "trust", guardar y reiniciar postgresql:
$sudo /etc/init.d/postgresql-8.3 restart
Es buena idea leer la documentación de PostgreSQL sobre este punto. Cambiamos el password del usuario postgres a "mexiko08":
$sudo passwd postgres
Nos cambiamos al usuario postgres:
$su postgres
Creamos la base de datos:
$createdb -E UNICODE DBKARAMELO
Nos cambiamos de directorio:
$cd $HOME/tmp/karamelo/config/sql/postgresql/
Cargamos las tablas:
$psql DBKARAMELO < karamelo.sql
como usuario normal editamos el archivo config/database.php.default, lo guardamos como datbase.php y el array $default debe quedar como sigue:
public $default = array(
'driver' => 'postgres',
'persistent' => false,
'host' => 'localhost',
'port' => 5432,
'login' => 'postgres',
'password' => 'mexiko08',
'database' => 'DBKARAMELO',
'schema' => 'public',
'prefix' => '',
'encoding' => 'UTF-8'
);
Nos colocamos en $HOME/tmp/karamelo/ y e iniciamos instaweb:
$cakephp-instaweb
En el navegador nos colocamos en http://localhost:3000 y podemo ver el portal, nos logeamos como john@site.edu, el password es "karamelo".
Creamos el directorio tmp en $HOME/tmp
$mkdir $HOME/tmp && cd $HOME/tmp
Instalamos los paquetes:
$sudo apt-get install php5 php5-pgsql subversion postgresql cakeph-instaweb
Vamos por las fuentes de CakePHP con subversion:
$svn co https://svn.cakephp.org/repo/branches/1.2.x.x/cake/ cake
Vamos por Karamelo:
$wget ftp://mononeurona.org/pub/karamelo/karamelo-0.2rc1.tar.gz
$tar -zxvf karamelo-0.2rc1.tar.gz
Editamos el archivo pg_hba.conf:
$sudo gedit /etc/postgresql/8.3/pg_hba.conf
En donde diga "user ident" o "md5" cambiar a "trust", guardar y reiniciar postgresql:
$sudo /etc/init.d/postgresql-8.3 restart
Es buena idea leer la documentación de PostgreSQL sobre este punto. Cambiamos el password del usuario postgres a "mexiko08":
$sudo passwd postgres
Nos cambiamos al usuario postgres:
$su postgres
Creamos la base de datos:
$createdb -E UNICODE DBKARAMELO
Nos cambiamos de directorio:
$cd $HOME/tmp/karamelo/config/sql/postgresql/
Cargamos las tablas:
$psql DBKARAMELO < karamelo.sql
como usuario normal editamos el archivo config/database.php.default, lo guardamos como datbase.php y el array $default debe quedar como sigue:
public $default = array(
'driver' => 'postgres',
'persistent' => false,
'host' => 'localhost',
'port' => 5432,
'login' => 'postgres',
'password' => 'mexiko08',
'database' => 'DBKARAMELO',
'schema' => 'public',
'prefix' => '',
'encoding' => 'UTF-8'
);
Nos colocamos en $HOME/tmp/karamelo/ y e iniciamos instaweb:
$cakephp-instaweb
En el navegador nos colocamos en http://localhost:3000 y podemo ver el portal, nos logeamos como john@site.edu, el password es "karamelo".
Permalink: http://mononeurona.org/users/entry/aarkerio/1344
El petróleo
2008-05-14 16:52:09-05
PolÃtica
Tanto "discuten" y hablan de reforma energética que al final lograrán que todos los ciudadanos estemos hasta la madre y simplemente lleguemos al punto de decir "hagan lo que quieren pero ya dejen de estar chingando".
Todo este asunto del petróleo en lo personal me parece patético y sólo pone en evidencia algo que salta a la vista: estamos gobernados por una bola de mediocres: el presidente chaparrito pelón de lentes, el PEJE, el PAN, PRI el PRD , todo son unos pendejos que se la pasan babeando y mirándose el ombligo mientreas la India lanza satélites, China construye aviones civiles y militares y Brasil vende alta tecnología en petróleo y biocombustibles.
En toda la discusión del petróleo se exponen los mismos y previsibles argumentos, todo es un un show sin ideas donde las divas y vedettes de la derecha y de la izquieda se pasean, solo algo está claro, ningún partido ni el gobienro quieren saber nada de la sociedad civil, en ningún lado se habla de un órgano ciudadano que monitore a Pemex, el cual, supuestamente, es de todos los mexicanos.
Al final se impondrá la dupla PAN-PRI y los grandes interéses a las que sirven, al final del sexenio, en 2012, Calderón y Mouriño y Beltrones se irán a trabajar a Repsol, Shell o Telmex con sueldos de 600 mil pesos mensuales mientras el PRD suelta su choro de 1970 de la igualdad social sin tener idea de cómo conseguirla.
Otra vez será lo mismo.
Todo este asunto del petróleo en lo personal me parece patético y sólo pone en evidencia algo que salta a la vista: estamos gobernados por una bola de mediocres: el presidente chaparrito pelón de lentes, el PEJE, el PAN, PRI el PRD , todo son unos pendejos que se la pasan babeando y mirándose el ombligo mientreas la India lanza satélites, China construye aviones civiles y militares y Brasil vende alta tecnología en petróleo y biocombustibles.
En toda la discusión del petróleo se exponen los mismos y previsibles argumentos, todo es un un show sin ideas donde las divas y vedettes de la derecha y de la izquieda se pasean, solo algo está claro, ningún partido ni el gobienro quieren saber nada de la sociedad civil, en ningún lado se habla de un órgano ciudadano que monitore a Pemex, el cual, supuestamente, es de todos los mexicanos.
Al final se impondrá la dupla PAN-PRI y los grandes interéses a las que sirven, al final del sexenio, en 2012, Calderón y Mouriño y Beltrones se irán a trabajar a Repsol, Shell o Telmex con sueldos de 600 mil pesos mensuales mientras el PRD suelta su choro de 1970 de la igualdad social sin tener idea de cómo conseguirla.
Otra vez será lo mismo.
Permalink: http://mononeurona.org/users/entry/aarkerio/1339
We have a menstrual situation here
2008-05-13 17:50:23-05
Life
Permalink: http://mononeurona.org/users/entry/aarkerio/1336
Authors@Google: Noam Chomsky
2008-05-12 15:06:45-05
Literatura
Permalink: http://mononeurona.org/users/entry/aarkerio/1332
PDF Helper
2008-05-12 14:13:33-05
Desarrollo
Necesito exportar reportes de la base de datos en PDF, buscando en la pastelería encuentro un helper de Sam Devore que usa la librería fpdf.org, pero este helper es para CakepHP 1.1 y para PHP4.
Lo he reescrito para CakePHP 1.2 y para PHP5.
Aunque FPDF está en Debian lo mejor es bajarlo de su sitio y poner la librería en el directorio 'vendors', además se necesita el layout pdf.ctp. El helper se usa asi en la vista:
$ fpdf->newPage();
$ fpdf->setData('Group: ' . $group ['Vclassroom']['name'] . ' Created '.$group ['Vclassroom']['created']);
$ fpdf->setData('Student '. $u ['User']['name'] . ' '. $u ['User']['email']);
Quizás le faltan parámetros al método setData() para hacerlo más fléxible.
Lo he reescrito para CakePHP 1.2 y para PHP5.
Aunque FPDF está en Debian lo mejor es bajarlo de su sitio y poner la librería en el directorio 'vendors', además se necesita el layout pdf.ctp. El helper se usa asi en la vista:
$ fpdf->newPage();
$ fpdf->setData('Group: ' . $group ['Vclassroom']['name'] . ' Created '.$group ['Vclassroom']['created']);
$ fpdf->setData('Student '. $u ['User']['name'] . ' '. $u ['User']['email']);
Quizás le faltan parámetros al método setData() para hacerlo más fléxible.
Permalink: http://mononeurona.org/users/entry/aarkerio/1331
Emacs como IDE para CakePHP
2008-05-10 16:02:47-05
Desarrollo
Durante ocho años evité a Emacs, lo use un par de días allá en el siglo pasado y con eso me bastó para decirle adiós, se me hacía algo demasiado críptico, grande y a la vez rudimentario para lo que yo necesitaba. Por lo tanto mi editor de todos los días fue por años Jedit.org, un excelente editor.
Una de las razones por las que decidí intentar con Emacs fue una conferencia en el Hotel Sheraton del Centro Histórico que organizó Sun, el ponente era un alemán desarrollador de Java que a todas luces se veía que era un chingón, toda la conferencia sobre Hibernate y J2EE la dió usando Emacs, editaba y compilaba código Java, XML, CSS, HTML y todo sin salirse el editor. Pensé que alguien tan bueno debía usarlo por alguna razón.
Luego en el foro de #rubyonrails inició una discusión sobre TextMate y editores y entonces me dí cuenta que muchos de los mejores desarrolladores del channel usaban emacs.
De modo que emacs ha sido mi editor los últimos cinco meses, aunque sé que apenas aprovecho el 20% de esta multiherramienta , ya me empiezo a dar cuenta porque la gente lo recomienda tanto, es un editor super-potente, super-estable y super-fléxible y ¡va en la versión 22!.
El tema de la combinación de teclas, que a tanta gente desespera, sólo dura un par de semanas, luego uno se acostumbra.
Lo primero que hay que hacer es instalar emacs y algunas extensiones:
$ sudo apt-get install emacs22-nox php-elisp emacs22-el
Yo prefiero la versión "nox" es decir sin soporte de X, pura consola. Emacs se manej através de combinaciones de teclas, la tecla Control (Ctrl) se represneta con una C mientras la tecla Meta con una M, la tecla Meta en los teclados que no la poseen nativamente, es la tecla Alt en el lado izquierdo del teclado. Por ejempo:
C-v scroll-up ctrl más tecla v simúltaneamente
M-v scroll-down alt más tecla v simúltaneamente
En el caso de:
C-x C-s save-buffer ctrl más tecla x simúltaneamente, soltar y luego ctrl más tecla s simúltaneamente
Estos son algunos de los comandos más usados. Para seleccionar una sección que queramos copiar o cortar hay que usar C-Space, es decir Ctrl más la barra espaciadora.
Ahora necesitamos crear el archivo .emacs con nuestra configuración, este es el mio:
;;Colores
(global-font-lock-mode 1)
;;Colores para la seleccion (mark region)
(setq transient-mark-mode t)
;;Activar el wheel del mouse
(mouse-wheel-mode)
;; Mostrar el numero de columna
(setq column-number-mode t)
;; associate ruby-mode with .rb files
(add-to-list 'auto-mode-alist '(".rb$" . ruby-mode))
;;php and CakePHP
(add-to-list 'auto-mode-alist '(".thtml$" . php-mode))
(add-to-list 'auto-mode-alist '(".ctp$" . php-mode))
(autoload 'cyclebuffer-forward "cyclebuffer" "cycle forward" t)
(autoload 'cyclebuffer-backward "cyclebuffer" "cycle backward" t)
(global-set-key "\M-N" 'cyclebuffer-forward)
(global-set-key "\M-P" 'cyclebuffer-backward)
;;;;;;;;;;;;;;;;;;;;
;; set up unicode
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(put 'set-goal-column 'disabled nil)
Asi ya tenemos soporte para PHP en las vistas de CakePHP con extensión .ctp pera además tenemos otras ventajas como hacer switch entre buffers con C-M-n y como mostrar la selección de texto para copiar o cortar:

Una de las cosas padres de emacs es que podemos tener un buffer en el sistema con M-x-shell.
Una de las razones por las que decidí intentar con Emacs fue una conferencia en el Hotel Sheraton del Centro Histórico que organizó Sun, el ponente era un alemán desarrollador de Java que a todas luces se veía que era un chingón, toda la conferencia sobre Hibernate y J2EE la dió usando Emacs, editaba y compilaba código Java, XML, CSS, HTML y todo sin salirse el editor. Pensé que alguien tan bueno debía usarlo por alguna razón.
Luego en el foro de #rubyonrails inició una discusión sobre TextMate y editores y entonces me dí cuenta que muchos de los mejores desarrolladores del channel usaban emacs.
De modo que emacs ha sido mi editor los últimos cinco meses, aunque sé que apenas aprovecho el 20% de esta multiherramienta , ya me empiezo a dar cuenta porque la gente lo recomienda tanto, es un editor super-potente, super-estable y super-fléxible y ¡va en la versión 22!.
El tema de la combinación de teclas, que a tanta gente desespera, sólo dura un par de semanas, luego uno se acostumbra.
Lo primero que hay que hacer es instalar emacs y algunas extensiones:
$ sudo apt-get install emacs22-nox php-elisp emacs22-el
Yo prefiero la versión "nox" es decir sin soporte de X, pura consola. Emacs se manej através de combinaciones de teclas, la tecla Control (Ctrl) se represneta con una C mientras la tecla Meta con una M, la tecla Meta en los teclados que no la poseen nativamente, es la tecla Alt en el lado izquierdo del teclado. Por ejempo:
C-v scroll-up ctrl más tecla v simúltaneamente
M-v scroll-down alt más tecla v simúltaneamente
En el caso de:
C-x C-s save-buffer ctrl más tecla x simúltaneamente, soltar y luego ctrl más tecla s simúltaneamente
Estos son algunos de los comandos más usados. Para seleccionar una sección que queramos copiar o cortar hay que usar C-Space, es decir Ctrl más la barra espaciadora.
Ahora necesitamos crear el archivo .emacs con nuestra configuración, este es el mio:
;;Colores
(global-font-lock-mode 1)
;;Colores para la seleccion (mark region)
(setq transient-mark-mode t)
;;Activar el wheel del mouse
(mouse-wheel-mode)
;; Mostrar el numero de columna
(setq column-number-mode t)
;; associate ruby-mode with .rb files
(add-to-list 'auto-mode-alist '(".rb$" . ruby-mode))
;;php and CakePHP
(add-to-list 'auto-mode-alist '(".thtml$" . php-mode))
(add-to-list 'auto-mode-alist '(".ctp$" . php-mode))
(autoload 'cyclebuffer-forward "cyclebuffer" "cycle forward" t)
(autoload 'cyclebuffer-backward "cyclebuffer" "cycle backward" t)
(global-set-key "\M-N" 'cyclebuffer-forward)
(global-set-key "\M-P" 'cyclebuffer-backward)
;;;;;;;;;;;;;;;;;;;;
;; set up unicode
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(put 'set-goal-column 'disabled nil)
Asi ya tenemos soporte para PHP en las vistas de CakePHP con extensión .ctp pera además tenemos otras ventajas como hacer switch entre buffers con C-M-n y como mostrar la selección de texto para copiar o cortar:

Una de las cosas padres de emacs es que podemos tener un buffer en el sistema con M-x-shell.
Permalink: http://mononeurona.org/users/entry/aarkerio/1330
Elementos en CakePHP
2008-05-03 00:27:07-05
Desarrollo
CakeHP es una framework que sigue el patrón de diseño Modelo-Vista-Controlador.
La Vista es la interfase al usuario, es decir en el URL http://myserver.com/news/display quiere decir que hay un controlador app/controllers/news_controller.php con un método display() que se procesa y pasa el resultado a la vista que está en app/views/news/display.ctp, todo este proceso genera una variable llamada $content_for_layout que se integra al layout, casi siempre en la parte central de la página.
No obstante un sitio de internet por lo general tiene muchos elementos laterales: cajas de búsquedas, los útimos diez comentarios, los últimos posts, la publicidad, las noticias más votadas, encuestas, una pequeña aplicación con el clima, etcétera, etcétera.
Estos elementos pueden ir integrados directamente en el layout, pero ese crearía un problema: supongamos que tenemos cinco diseños de layouts entre los cuales el usuario puede elegir. Si más adelante queremos cambiar algo en la encuesta o en alguna parte del sitio tendríamos que abrir los cinco layouts para cambiarlo. Como CakePHP motiva mucho el DRY (don't repeat yourself), esta no sería una buena aproximación. Lo mejor sería "desmenuzar" el sitio en partes, para eso son los elementos.
Un elemento es simplemente una mini-vista que se coloca en el directorio app/views/elements/ con la extensión .ctp , por ejemplo suponiendo que tuviese un elemento podcasts.ctp, se renderiza asi en los cinco diseños de layout:
echo $ this -> renderElement('podcasts');
Los elementos pueden estar conformados por puros helpers, es decir, producir xhtml estático, pero también podemos pasarle un array para hacer loops dentro de ellos:
echo $ this -> renderElement('podcast's, $ data["Podcast"]);
En la mononeurona, en la portada y en los blogs, hay un montón de elementos para mostrar las secciones:
En CakePHP los elementos se usan en conjunción con los componentes para crear secciones dinámicas en el sitio. Es importante usar el archivo .css del layout para definir el diseño dentro de los elementos, nunca hay que poner diseño directamente dentro de los elementos.
La Vista es la interfase al usuario, es decir en el URL http://myserver.com/news/display quiere decir que hay un controlador app/controllers/news_controller.php con un método display() que se procesa y pasa el resultado a la vista que está en app/views/news/display.ctp, todo este proceso genera una variable llamada $content_for_layout que se integra al layout, casi siempre en la parte central de la página.
No obstante un sitio de internet por lo general tiene muchos elementos laterales: cajas de búsquedas, los útimos diez comentarios, los últimos posts, la publicidad, las noticias más votadas, encuestas, una pequeña aplicación con el clima, etcétera, etcétera.
Estos elementos pueden ir integrados directamente en el layout, pero ese crearía un problema: supongamos que tenemos cinco diseños de layouts entre los cuales el usuario puede elegir. Si más adelante queremos cambiar algo en la encuesta o en alguna parte del sitio tendríamos que abrir los cinco layouts para cambiarlo. Como CakePHP motiva mucho el DRY (don't repeat yourself), esta no sería una buena aproximación. Lo mejor sería "desmenuzar" el sitio en partes, para eso son los elementos.
Un elemento es simplemente una mini-vista que se coloca en el directorio app/views/elements/ con la extensión .ctp , por ejemplo suponiendo que tuviese un elemento podcasts.ctp, se renderiza asi en los cinco diseños de layout:
echo $ this -> renderElement('podcasts');
Los elementos pueden estar conformados por puros helpers, es decir, producir xhtml estático, pero también podemos pasarle un array para hacer loops dentro de ellos:
echo $ this -> renderElement('podcast's, $ data["Podcast"]);
En la mononeurona, en la portada y en los blogs, hay un montón de elementos para mostrar las secciones:

En CakePHP los elementos se usan en conjunción con los componentes para crear secciones dinámicas en el sitio. Es importante usar el archivo .css del layout para definir el diseño dentro de los elementos, nunca hay que poner diseño directamente dentro de los elementos.
Permalink: http://mononeurona.org/users/entry/aarkerio/1315
Layouts en CakePHP
2008-04-25 21:24:25-05
Desarrollo
Para cambiar la apariencia general de nuestra aplicación CakePHP usa layouts, los cuales están colocados en el directorio app/views/layouts/. Un layout mínimo sería como este:
< ? php
echo $html->docType();
echo '< html>< head >';
echo $html->css('styles'); // carga los estilos CSS
echo '< title >'. $title_for_layout . '< /title >';
?>
< /head >
< body >
< ? php echo $content_for_layout; ?>
< /body >
< /html >
Este archivo lo guardamos como app/views/layouts/portal.ctp, la extensión ctp es por "cake template". La variable más importante aquí es $content_for_layout, que contiene el resultado de la vista. En este caso, como se indica, debe existir un archivo /app/webroot/css/styles.css con el diseño del layout.
Si queremos usar este layout debemos indicarlo en la acción del controlador:
$this->layout = 'portal';
por omisión el valor de $this->layout es 'default' y por eso ese es el layout que CakePHP busca por default, pero yo prefiero tener un layout default.ctp simple y sin mucho CSS porque cuando CakePHP manda errores el default.ctp muchas veces tiene demasiadas cosas.
Este es un ejemplo elemental, por supuesto los layouts de la vida real son más complejos, como éste.
< ? php
echo $html->docType();
echo '< html>< head >';
echo $html->css('styles'); // carga los estilos CSS
echo '< title >'. $title_for_layout . '< /title >';
?>
< /head >
< body >
< ? php echo $content_for_layout; ?>
< /body >
< /html >
Este archivo lo guardamos como app/views/layouts/portal.ctp, la extensión ctp es por "cake template". La variable más importante aquí es $content_for_layout, que contiene el resultado de la vista. En este caso, como se indica, debe existir un archivo /app/webroot/css/styles.css con el diseño del layout.
Si queremos usar este layout debemos indicarlo en la acción del controlador:
$this->layout = 'portal';
por omisión el valor de $this->layout es 'default' y por eso ese es el layout que CakePHP busca por default, pero yo prefiero tener un layout default.ctp simple y sin mucho CSS porque cuando CakePHP manda errores el default.ctp muchas veces tiene demasiadas cosas.
Este es un ejemplo elemental, por supuesto los layouts de la vida real son más complejos, como éste.
Permalink: http://mononeurona.org/users/entry/aarkerio/1300












