Está en la página 1de 9

Mi primera aplicacin CakePHP (1)

1 julio 2008 at 9:36 am 38 comentarios Tras hacer una presentacin y ver su instalacin, empezaremos a realizar una aplicacin de ejemplo utilizando CakePHP. Me he decidido a empezar un gestor de enlaces al estilo de delicious o mister wong. No voy a utilizar algunas utilidades de CakePHP como la herramienta de lnea de comando bake (a la que espero dedicar una entrada en el futuro). Lo primero que hacemos es crear una tabla en la base de datos para nuestros enlace. Para ello entramos en phpMyAdmin con el usuario que creamos en el paso de instalacin y creamos una tabla. Nos queda algo as:

Hay que destacar algunas caractersticas en la tabla creada:


El nombre de la tabla no es negociable. Es el plural (en ingls) del modelo al que representa. La clave primaria id es obligatoria. El nombre tampoco es negociable. El campo created tambin es de nombre fijo.

En general estas limitaciones son salvables, pero si seguimos el estndar de CakePHP ser todo ms sencillo y ahorraremos lneas de cdigo. Lo primero creamos el modelo (por convencin lo guardamos en app/models como link.php):
01 class Link extends AppModel { 02 var $name = 'Link'; 03 04 05 06 07 08 09 10 11 12 var $validate = array( 'title' => array( 'rule' => array('maxLength', '30'), 'allowEmpty' => false, 'message' => 'Titulo no valido' ), 'url' => array( 'rule' => 'url', 'required' => true,

13 14 15 16 } );

'message' => 'Debe introducir un email correcto' )

Como podemos ver, un modelo en principio es bastante sencillo. La parte que ms lneas acapara es la validacin, una de las facilidades que nos aporta CakePHP. En este caso, al ttulo le damos una longitud mxima y a la url le forzamos a que sea una url . Ahora vamos con el controlador (igualmente por convencin lo guardamos en app/controllers como links_controller.php):
01 class LinksController extends AppController { 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 } function index() { $this->set('links', $this->Link->findAll()); } } } function add() { if (!empty($this->data)) { if ($this->Link->save($this->data)) { $this->flash('Enlace aadido.','/links'); } var $name = 'Links';

El controlador probablemente sea la parte ms compleja de nuestra aplicacin. En este caso hemos definido dos acciones, una que hemos llamado index (accin por defecto de ese controlador) que nos mostrar todos los enlaces y add que nos permitir aadir un enlace. Destacamos los siguientes puntos:

Con !empty($this->data) comprobamos si hemos recibido el formulario de aadir enlace con informacin. Cuando se hace referencia a $this->Link, estamos haciendo referencia al modelo, y utilizamos sus mtodos, tanto para guardar un nuevo enlace (save) como para recuperar los enlaces existentes (find('all')). Con $this->set() le pasamos informacin a la vista correspondiente. $this->flash() es un mtodo bastante utilizado en CakePHP para hacer una transicin a otra pgina tras mostrar un mensaje.

Por ltimo necesitaremos dos vistas, una por cada accin del controlador. Ambas las pondremos en app/views/links y sern add.thtml e index.thtml. Primero vemos el index:

1 <h1>Enlaces disponibles</h1> 2 <?php foreach ($links as $link): ?> 3 4 5 6 Aadido: <?php echo $link['Link']['created']; ?> 7 <?php endforeach; ?> 8 9 <?php echo $html->link('Aadir enlace', '/links/add');?> <a href="<?php echo $link['Link']['url']; ?>"><?php echo $link['Link']['title']; ?></a>

Destacamos la utilizacin de $links suministrado por el controlador mediante el mtodo set(). Tambin la utilizacin del Helper html, en este caso para crear un enlace ($html->link()). Y finalmente la vista de aadir:
1 Aadir 2 <?php 3 echo $form->create('Link'); 4 echo $form->input('title'); 5 echo $form->input('url'); 6 echo $form->end('Agregar'); 7 ?>

Aqu destacamos la utilizacin del Helper de formularios, para la creacin de todos los elementos del formulario. Si ahora apuntamos nuestro navegador al proyecto CakePHP y aadimos /links/ al final de la ruta (en CakePHP una ruta /controller/action hace referencia al controlador controller mtodo action) nos dirigimos a la accin por defecto del controlador links y obtenemos:

Destacamos algunas cosas:


El diseo de cabecera y pie nos lo ha colocado CakePHP. Esto lo modificaremos creando un layout en /app/views. En la parte inferior nos aparece informacin sobre las querys ejecutadas. Esto se debe al nivel de debug que tenemos seleccionado. Mientras desarrollamos yo aconsejo no cambiarlo. Para un sitio en produccin lgicamente pondremos el nivel a 0. Tenemos un enlace que apunta a la accin add del controlador links (/links/add).

La lista de enlaces est vaca. Claro, CakePHP tampoco hace magia!.

Si pinchamos en el enlace de aadir, vemos nuestro formulario de aadir:

Podemos hacer algunas pruebas de la validacin que CakePHP nos aporta y que nosotros hemos indicado en el modelo (incluido el mensaje que aparece). Cuando finalmente introducimos unos valores vlidos llegamos a:

Esta es la pantalla que nos ha generado el $this->flash() que vimos en el controlador. Su funcionamiento tambin depende del nivel de debug. En el nivel de desarrollo, el mensaje que aportamos es un enlace a la ruta tambin indicada en $this>flash(). Finalmente ya tenemos el listado de enlaces con contenido:

En la siguiente entrada de esta serie, continuaremos con nuestro gestor de favoritos: solucionaremos algunas pegas que han aparecido hasta ahora, aadiremos comentarios sobre los enlaces de la lista y alguna cosa ms

Mi primera aplicacin CakePHP (2)


22 agosto 2008 at 10:50 am 25 comentarios Continuando con lo visto en la primera parte de la entrada, vamos a solucionar algunas pequeas pegas de nuestra aplicacin. Primero, vamos a darle nuestro propio diseo (bastante discreto eso s) a nuestra aplicacin. Para ello y como ya comentamos, creamos un layout por defecto (default.thtml) y lo situamos en /app/views/layouts. Su contenido es:
01 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

02 <html xmlns="http://www.w3.org/1999/xhtml"> 03 04 <head> 05 06 <?php echo $html->charset("iso-8859-1"); ?> <title>TCYMU CakePHP Gestin de Enlaces</title>

07 </head> 08 <body> 09 <h1>Tus ceros y mis unos</h1> 10 <h2>Gestin de enlaces</h2> 11 <?php echo $content_for_layout ?> 12 <h3>TCYMU por Miguel Orbegozo</h3> 13 </body> 14 </html>

Lo que debemos tener en cuenta es la lnea con el echo $content_for_layout, que es la forma en la que le indicamos a CakePHP dnde insertar el contenido de las vistas. He utilizado tambin el HtmlHelper para aadir una cabecera con el charset. Una segunda cosita que podemos solucionar, es que ahora para entrar en nuestra aplicacin tenemos que aadir en la ruta del navegador /links/, para indicar que queremos ir a la accin por defecto del controlador links. Para evitar esto, debemos enrutar la ruta / a dicho controlador. Para ello debemos modificar el archivo /app/config/routes.php modificando la lnea que empieza por Router::connect('/' dejndola como sigue: Router::connect('/', array('controller' => 'links', 'action' => 'index')); Por ltimo vamos a aadir algo ms de funcionalidad, permitiendo aadir comentarios a los enlaces almacenados. Esto es una relacin de uno a muchos (un enlace puede tener varios comentarios). Para llevarlo a cabo lo primero es crear la tabla para los comentarios. Al igual que en la entrada anterior, lo har mediante el PhpMyAdmin.

Destacamos de su estructura lo siguiente:


Puntos ya vistos en la primera parte: el nombre de tabla (plural del modelo), la clave primaria id y el campo created. De nombre fijo es tambin link_id, que es el campo que relaciona un comentario con un enlace en particular.

Vamos con el nuevo modelo, el relativo a los comentarios (app/models/comment.php):


01 class Comment extends AppModel { 02 var $name = 'Comment'; 03 04 05 06 07 08 09 10 11 12 13 14 } ); ) var $validate = array( 'comment' => array( 'rule' => array('maxLength', '200'), 'required' => true, 'allowEmpty' => false, 'message' => 'Menos de 200 caracteres' var $belongsTo = array('Link' => array('className' => 'Link'));

Como novedad respecto a lo visto anteriormente tenemos la variable $belongsTo, mediante la que indicamos la relacin entre un comentario y un enlace (el comentario pertenece a un enlace). Tambin necesitamos retocar el modelo de enlace ya visto en la primera parte, aadiendo la relacin con los comentarios. Se trata slo de una lnea que no precisa demasiada explicacin:
1 var $hasMany = array('Comment' => array('className' => 'Comment'));

Vamos ya con el controlador para los comentarios (app/controllers/comments_controller.php):


01 class CommentsController extends AppController { 02 03 04 05 06 07 08 09 10 11 12 13 14 } } function add($link_id = false) { if (!empty($this->data)) { if ($this->Comment->save($this->data)) { $this->redirect('/links/'); } } else { $this->set('link_id', $link_id); } var $name = 'Comments';

Es un controlador ms sencillo que el visto para los enlaces, ya que este slo define el mtodo add. Las nicas novedades respecto al anterior son:

En el mtodo add diferenciamos dos casos: 1. El caso de recibir el formulario (!empty($this->data)) que es cuando se guarda en la base de datos el comentario. 2. Si no estamos recibiendo el contenido del formulario es que se va a mostrar el mismo y necesitamos pasarle a la vista el identificador del enlace. Tras aadir un enlace se hace una redireccin ($this>redirect('/links/');).

En el controlador de los enlaces no necesitamos aadir nada, ya que al estar relacionados mediante el modelo, al hacer findAll() se recuperan de la base de datos los enlaces junto con todos sus comentarios. Una nota respecto a findAll(), en las ltimas versiones de CakePHP han deprecado findAll(), debiendo ser sustituido por find('all'), aunque no lo voy a cambiar ya que sigo utilizando la misma versin de Cake que en la primera entrada. Supongo que es lo que tiene no haber sido marcada como estable todava. Por ltimo vamos con las vistas. En la vista index de los enlaces (app/views/links/index.thtml) aadimos un segundo bucle en el que recorremos los comentarios de cada enlace para mostrarlos en forma de lista. Tambin aadimos el enlace que nos permite aadir un nuevo comentario (en este caso como ltimo elemento de la lista anterior). Pongo el cdigo completo, aunque slo cambia la parte entre los <ul>.
01 <h3>Enlaces disponibles</h3> 02 <?php foreach ($links as $link): ?> 03 04 05 06 Aadido: <?php echo $link['Link']['created']; ?> 07 <ul> 08 <?php foreach ($link['Comment'] as $comment): ?> <li><?php echo $comment['comment'] . ' (' . $comment['created'] . ')'; ?></li> 10 <?php endforeach; ?> 09 <li><?php echo $html->link('Aadir comentario', '/comments/add/' . $link['Link']['id']);?></li> 12 </ul> 11 13 <?php endforeach; ?> 14 <?php echo $html->link('Aadir enlace', '/links/add');?> <a href="<?php echo $link['Link']['url']; ?>"><?php echo $link['Link']['title']; ?></a>

Podemos ver que en el enlace para aadir un nuevo comentario se le pasa como parmetro el identificador del enlace (recordemos que luego se lo pasamos a la vista de aadir comentario. La vista de aadir comentario (app/views/comments/add.thtml)queda as:

1 Aadir comentario. 2 <?php 3 echo $form->create('Comment'); 4 echo $form->hidden('link_id', array('value' => $link_id)); 5 echo $form->textarea('comment', array('label' => 'Comentario')); 6 echo $form->submit('Aadir',array('escape'=>false)); 7 echo $form->end(); 8 ?>

Lo nico nuevo respecto a los visto en la primera entrega es la creacin de un input hidden mediante $form->hidden. Ahora si dirigimos nuestro navegador al raz de nuestro servidor podemos ver lo siguiente:

Ya podemos ver el efecto de nuestro propio diseo y los nuevos enlaces para aadir comentario. Pulsando sobre Aadir comentario para uno de nuestros enlaces llegamos a la vista para aadir comentario:

Y si aadimos el comentario volvemos a nuestra pgina principal en la que se aprecia el comentario recin aadido.

Y con esto hemos llegado al final de la segunda entrada. Por supuesto quedara mucho trabajo por hacer en nuestro gestor de enlaces, y puede que retome el ejemplo en futuras entradas sobre CakePHP. Espero que os haya gustado (si es el caso un comentario no estara mal jeje).

También podría gustarte