Archive for agosto, 2008

Mi primera aplicación CakePHP (2)

Continuando con lo visto en la primera parte de la entrada, vamos a solucionar algunas pequeñas pegas de nuestra aplicación.

Primero, vamos a darle nuestro propio diseño (bastante discreto eso sí) a nuestra aplicación. Para ello y como ya comentamos, creamos un layout por defecto (default.thtml) y lo situamos en /app/views/layouts. Su contenido es:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <?php echo $html->charset("iso-8859-1"); ?>
    <title>TCYMU CakePHP Gestión de Enlaces</title>
</head>
<body>
<h1>Tus ceros y mis unos</h1>
<h2>Gestión de enlaces</h2>
<?php echo $content_for_layout ?>
<h3>TCYMU por Miguel Orbegozo</h3>
</body>
</html>

Lo que debemos tener en cuenta es la línea con el echo $content_for_layout, que es la forma en la que le indicamos a CakePHP dónde insertar el contenido de las vistas. He utilizado también el HtmlHelper para añadir una cabecera con el charset.

Una segunda cosita que podemos solucionar, es que ahora para entrar en nuestra aplicación tenemos que añadir en la ruta del navegador /links/, para indicar que queremos ir a la acción 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 línea que empieza por Router::connect('/' dejándola como sigue:

Router::connect(‘/’, array(‘controller’ => ‘links’, ‘action’ => ‘index’));

Por último vamos a añadir algo más de funcionalidad, permitiendo añadir comentarios a los enlaces almacenados. Esto es una relación 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 también 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):

class Comment extends AppModel {
	var $name = 'Comment';

	var $belongsTo = array('Link' => array('className' => 'Link'));

	var $validate = array(
        'comment' => array(
			'rule' => array('maxLength', '200'),
            'required' => true,
			'allowEmpty' => false,
            'message' => 'Menos de 200 caracteres'
		)
    );
}

Como novedad respecto a lo visto anteriormente tenemos la variable $belongsTo, mediante la que indicamos la relación entre un comentario y un enlace (el comentario pertenece a un enlace).

También necesitamos retocar el modelo de enlace ya visto en la primera parte, añadiendo la relación con los comentarios. Se trata sólo de una línea que no precisa demasiada explicación:

var $hasMany = array('Comment' => array('className' => 'Comment'));

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

class CommentsController extends AppController {

	var $name = 'Comments';

	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);
		}
	}
}

Es un controlador más sencillo que el visto para los enlaces, ya que este sólo define el método add. Las únicas novedades respecto al anterior son:

  • En el método 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 añadir un enlace se hace una redirección ($this->redirect('/links/');).

En el controlador de los enlaces no necesitamos añadir 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 versión de Cake que en la primera entrada. Supongo que es lo que tiene no haber sido marcada como estable todavía.

Por último vamos con las vistas. En la vista index de los enlaces (app/views/links/index.thtml) añadimos un segundo bucle en el que recorremos los comentarios de cada enlace para mostrarlos en forma de lista. También añadimos el enlace que nos permite añadir un nuevo comentario (en este caso como último elemento de la lista anterior). Pongo el código completo, aunque sólo cambia la parte entre los <ul>.

<h3>Enlaces disponibles</h3>
<?php foreach ($links as $link): ?>

<a href="<?php echo $link&#91;'Link'&#93;&#91;'url'&#93;; ?>"><?php echo $link&#91;'Link'&#93;&#91;'title'&#93;; ?></a>

Añadido: <?php echo $link&#91;'Link'&#93;&#91;'created'&#93;; ?>
<ul>
<?php foreach ($link&#91;'Comment'&#93; as $comment): ?>
	<li><?php echo $comment&#91;'comment'&#93; . ' (' . $comment&#91;'created'&#93; . ')'; ?></li>
<?php endforeach; ?>
	<li><?php echo $html->link('Añadir comentario', '/comments/add/' . $link['Link']['id']);?></li>
</ul>
<?php endforeach; ?>
<?php echo $html->link('Añadir enlace', '/links/add');?>

Podemos ver que en el enlace para añadir un nuevo comentario se le pasa como parámetro el identificador del enlace (recordemos que luego se lo pasamos a la vista de añadir comentario.

La vista de añadir comentario (app/views/comments/add.thtml)queda así:

Añadir comentario.
<?php
echo $form->create('Comment');
echo $form->hidden('link_id', array('value' => $link_id));
echo $form->textarea('comment', array('label' => 'Comentario'));
echo $form->submit('Añadir',array('escape'=>false));
echo $form->end();
?>

Lo único nuevo respecto a los visto en la primera entrega es la creación de un input hidden mediante $form->hidden.

Ahora si dirigimos nuestro navegador al raíz de nuestro servidor podemos ver lo siguiente:

Ya podemos ver el efecto de nuestro propio diseño y los nuevos enlaces para añadir comentario. Pulsando sobre “Añadir comentario” para uno de nuestros enlaces llegamos a la vista para añadir comentario:

Y si añadimos el comentario volvemos a nuestra página principal en la que se aprecia el comentario recién añadido.

Y con esto hemos llegado al final de la segunda entrada. Por supuesto quedaría 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 estaría mal jeje).

22 agosto 2008 at 10:50 am 27 comentarios


Mi perfil

View Miguel Orbegozo's profile on LinkedIn

Feedjit

Feeds

Otros…

BlogESfera Directorio de Blogs Hispanos - Agrega tu Blog

Bitacoras.com

Add to Technorati Favorites