Desarrollando un sencillo blog con cakePHP
Ya fue suficiente de teoria, vamos a poner manos a la obra, que mejor ejemplo que practicar y practicar hasta que todo quede claro y sin preguntas en el aire.
Empezaremos creando una aplicacion, un blog.
Lo primero que necesitamos es crear la estructura de las tablas para nuestra aplicación.
CREATE TABLE IF NOT EXISTS `posts` ( `id` int(11) NOT NULL auto_increment, `titulo` varchar(50) default NULL, `contenido` text, `publicado` tinyint(1) NOT NULL, `created` datetime default NULL, `modified` datetime default NULL, PRIMARY KEY (`id`) );
Insertamos algunos registros.
INSERT INTO `posts` (`titulo`, `contenido`, `publicado`, `created`, `modified`) values ('Buenos dias', 'Este es el saludo de los buenos dias', 1, NOW(), NOW()), ('Buenos tardes', 'Este es el saludo de los buenos tardes', 1, NOW(), NOW()), ('Buenas noches', 'Este es el saludo de las buenas noches', 1, NOW(), NOW());
Lo siguiente va ser configurar nuestra conexion a la base de datos en cakePHP, cuando es una instalacion limpia de cake en la carpeta app/config/ viene un archivo database.php.default, lo renombramos a database.php, para poder configurar la conexión.
/* app/config/database.php */ class DATABASE_CONFIG { // estos datos pueden variar dependiendo de sus datos de conexión. var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'usuario', 'password' => 'contraseña', 'database' => 'blog', 'prefix' => '', ); var $test = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'test_database_name', 'prefix' => '', ); }
El siguiente paso va ser crear nuestro modelo para la tabla posts
<?php // app/models/post.php class Post extends AppModel { var $name = 'Post'; var $validate = array( 'titulo' => array( 'alphaNumeric' => array( 'rule' => 'alphaNumeric', 'required' => true, 'message' => 'Escribe un titulo para el post')), 'contenido' => array( 'alphaNumeric' => array( 'rule' => 'alphaNumeric', 'required' => true, 'message' => 'Escribe algun contenido para el post')) ); } ?>
Como se puede observar desde el modelo validaremos los campos necesarios, existen diferentes reglas, para validar que sea una direccion de mail o una tarjeta de credito, cierta longitud de caracteres, solo numeros, etc.
Ahora vamos a crear el controlador del modelo post
<?php // app/controllers/posts_controller.php class PostsController extends AppController { var $name = 'Posts'; function index() { } function agregar() { } function editar($id = null) { } function eliminar($id = null) { } } ?>
En nuestro controlador definimos los metodos que vamos a utilizar en la aplicación, index() sera el listado de los posts, agregar() como su nombre lo dice para agregar un nuevo post, editar($id = null) es el metodo para modificar un post y recibie como parametro el id del post a modificar, al igual con el metodo eliminar().
En el metodo index() obtendremos todos los posts mediante otro metodo de cake find(’all’), este metodo puede recibir varios parametros (all, first, list)
<?php // app/controllers/posts_controller.php class PostsController extends AppController { var $name = 'Posts'; function index() { $posts = $this->Post->find('all'); $this->set('posts',$posts); } function agregar() { } function editar($id = null) { } function eliminar($id = null) { } } ?>
Siguiente paso va ser crear la vista para nuestro metodo index().
<!-- app/views/posts/index.ctp --> <h1>Posts</h1> <div><?php echo $html->link('Agregar post', array('action' => 'agregar'))?></div> <table cellspacing="0" cellpadding="0"> <tr> <th>Titulo</th> <th>Contenido</th> <th>Estatus</th> <th>Fecha de publicación</th> <th> </th> </tr> <?php foreach($posts as $post):?> <tr> <td><?php echo $post['Post']['titulo']?></td> <td><?php echo $post['Post']['contenido']?></td> <td><?php echo ($post['Post']['publicado'] == 1) ? 'Publicado' : 'No publicado'?></td> <td><?php echo $post['Post']['created']?></td> <td><?php echo $html->link('Editar', array('action' => 'editar', $post['Post']['id']))?></td> </tr> <?php endforeach;?> </table>
En la vista ya tenemos disponible el arreglo $posts, lo unico que hacemos en la vista es recorrer el arreglo y mostrar la información, una liga para agregar un post y otra para editarlo.
La siguiente acción va ser agregar un post y primero haremos la vista.
<!-- app/views/posts/agregar.ctp --> <h1>Agregar un post</h1> <?php echo $form->create('Post', array('action' => 'agregar'))?> <?php echo $form->input('Post.titulo')?> <?php echo $form->input('Post.contenido')?> <?php echo $form->input('Post.publicado')?> <?php echo $form->end('Agregar post')?>
Ya que tenemos nuestra vista lo siguiente va ser modificar el metodo agregar() en posts_controller.php
<?php // app/controllers/posts_controller.php class PostsController extends AppController { var $name = 'Posts'; function index() { $posts = $this->Post->find('all'); $this->set('posts',$posts); } function agregar() { if(!empty($this->data)) { if($this->Post->save($this->data)) { $this->Session->setFlash('El post se guardo correctamente'); $this->redirect(array('action' => 'index')); } } } function editar($id = null) { } function eliminar($id = null) { } } ?>
Ahora cada que tratamos de agregar un post lo primero que va suceder es que la aplicacion validara que los campos titulo y contenido no vengan vacios, despues en el metodo agregar(), validamos que el arreglo $this->data tenga información, y con el metodo save() guardamos la información del post.
Vamos al metodo editar().
<?php // app/controllers/posts_controller.php class PostsController extends AppController { var $name = 'Posts'; function index() { $posts = $this->Post->find('all'); $this->set('posts',$posts); } function agregar() { if(!empty($this->data)) { if($this->Post->save($this->data)) { $this->Session->setFlash('El post se guardo correctamente'); $this->redirect(array('action' => 'index')); } } } function editar($id = null) { if(!empty($this->data)) { if($this->Post->save($this->data)) { $this->Session->setFlash('El post se modifico correctamente'); $this->redirect(array('action' => 'index')); } } $this->Post->id = $id; $this->data = $this->Post->read(); } function eliminar($id = null) { } } ?>
Muy parecido al metodo agregar(), lo unico diferente es el metodo read() de cake, esto nos ayuda en la vista para que autorellene los inputs, veamos la vista para comprender mejor.
<!-- app/views/posts/editar.ctp --> <h1>Editar post</h1> <?php echo $form->create('Post', array('action' => 'editar'))?> <?php echo $form->input('Post.id')?> <?php echo $form->input('Post.titulo')?> <?php echo $form->input('Post.contenido')?> <?php echo $form->input('Post.publicado')?> <?php echo $form->end('Editar post')?>
Al igual que la vista de agregar lo unico diferente es que al momento de enviar la forma se va ir con un campo mas Post.id cuando el controlador ejecute el metodo save() y detecte viene un campo id, verificara y en caso de que ya exista hara un UPDATE en vez de INSERT.
Como ultimo paso va ser el metodo eliminar(), para este metodo no necesitaremos ninguna vista, primero agregamos un boton de eliminar en index.ctp
<!-- app/views/posts/index.ctp --> <h1>Posts</h1> <div><?php echo $html->link('Agregar post', array('action' => 'agregar'))?></div> <table cellspacing="0" cellpadding="0"> <tr> <th>Titulo</th> <th>Contenido</th> <th>Estatus</th> <th>Fecha de publicación</th> <th> </th> </tr> <?php foreach($posts as $post):?> <tr> <td><?php echo $post['Post']['titulo']?></td> <td><?php echo $post['Post']['contenido']?></td> <td><?php echo ($post['Post']['publicado'] == 1) ? 'Publicado' : 'No publicado'?></td> <td><?php echo $post['Post']['created']?></td> <td> <?php echo $html->link('Editar', array('action' => 'editar', $post['Post']['id']))?> <?php echo $html->link('Eliminar', array('action' => 'eliminar', $post['Post']['id']))?> </td> </tr> <?php endforeach;?> </table>
Ahora en nuestro controlador codificamos el metodo eliminar().
<?php // app/controllers/posts_controller.php class PostsController extends AppController { var $name = 'Posts'; function index() { $posts = $this->Post->find('all'); $this->set('posts',$posts); } function agregar() { if(!empty($this->data)) { if($this->Post->save($this->data)) { $this->Session->setFlash('El post se guardo correctamente'); $this->redirect(array('action' => 'index')); } } } function editar($id = null) { if(!empty($this->data)) { if($this->Post->save($this->data)) { $this->Session->setFlash('El post se modifico correctamente'); $this->redirect(array('action' => 'index')); } } $this->Post->id = $id; $this->data = $this->Post->read(); } function eliminar($id = null) { if($this->Post->del($id)) { $this->Session->setFlash('El post se elimino correctamente'); $this->redirect(array('action' => 'index')); } } } ?>
Utilizando el metodo del() de cake es posible eliminar el registro de la base de datos.
En poco tiempo construimos nuestra primera aplicacion en cakePHP, es una aplicacion muy sencilla pero ideal para empezar a comprender como trabajar con cake, demostramos como manipular las operaciones CRUD(Create, Read, Update, Delete) y las validaciones incorporadas de cake.
Para ver la aplicación completa publico la siguiente liga http://cakephp1.com/blog/posts
7 Comentarios to “Desarrollando un sencillo blog con cakePHP”
Dejar un comentario

Hernán on Junio 4th, 2009
Excelente, me funcionó, trate de hacer el mismo ejemplo del manual en español, pero no me funcionó; está mas claro aqui. Muchas gracias
manuonda on Junio 14th, 2009
Hola que tal muy bueno el articulo como podria incorporar o modificar el template para crear un pantel de control con cakephp
Mario on Septiembre 15th, 2009
Hola muy buen tu tutorial, lo segui con atencion , pero me quedo una duda. Como hago para poner la ruta de la applicacion, ya que cuando me voy a la direccion http://localhost/blog/ me sigue aparesiendo la pagina principal de configuracion de Cake. Gracias.
Mario on Septiembre 26th, 2009
otra duda , como podemos migrar nuestra aplicacion de local host a nuestro servido web. Salu2
Daniel on Enero 11th, 2010
@Mario…
Aquí está la respuesta de tu duda http://www.danielfuentes.cl/?p=76
Anonimo on Febrero 14th, 2010
No me funciono