Despabilando la MonoNeurona::Internet es de todos [Inicio] [Regresar]
Server Side \ miniBlog con CakePHP
Server Side
miniBlog con CakePHP

Este artículo ha sido consultado en 950 ocasiones.

Un miniblog en CakePHP 1.2

Paquetes necesarios para el ejercicio:

$sudo apt-get install apache2 libapache2-mod-php5 postgresql php5-pgsql subversion

Nota: en este tutorial utilizo los términos "método" y "acción" de manera indistinta. Con este término me refiero a las acciones del controlador de CakePHP. Es decir: http:/server.org/controller/action/.

Este es un ejemplo de como crear una aplicación con CakePHP 1.2. Para hacer este ejercico se debe haber leído la documentación de CakePHP y la documentación temporal de la versión 1.2 además de este repaso. Se deben tener claros los tipos de relaciones que existen: hasMany, hasOne, belongsTo y HABTM. Se puede consultar este repositorio para ver ejemplos. Es buena idea hacer una conexión básica entre php5 y Postgresql para confirmar que el ambiente de desarrollo funciona de manera correcta.

CakePHP 1.2 está en desarrollo por lo cual lo mejor es tener lo último del repositorio:

$svn co https://svn.cakephp.org/repo/branches/1.2.x.x/ /home/pepe/cake

Debemos editar el archivo /etc/apache2/sites-enabled/000-default y cambiar todo donde dice /var/www/cake/app/webroot/ a /home/pepe/cake/app/webroot. webroot es el direorio público de CakePHP, en este directorio es donde ponemos las imágenes, PDF's o CSS que necesitemos. Debemos asegurarnos que los módulos rewrite y php5 están activados:

#a2enmod rewrite && a2enmod php5 && /etc/init.d/apache2 restart

En Firefox nos ponemos en http://localhost y debemos ver los típicos mensajes de CakePHP 1.2 y tambián veremos la advertencia:

Please change the value of 'Security.salt' in app/config/core.php

Esta cadena es la que genera la sessión de seguridad de la aplicación por lo cual nunca debe haber dos cadenas iguales. Abrimos con nuestro editor favorito ( láase emacs o Jedit ) el archivo app/config/core.php y agregamos algunas letras y nú­meros a la cadena Security.salt.

En el archivo core.php tambián tenemos la variable debug que especifica que tantos mensajes de debug aparecen en pantalla. En aplicaciones en desarrollo se debe tener el debug en 1 (sólo errores) o en 2 (errores y consultas SQL):

Configure::write('debug', 2);

En aplicaciones en producción el debug por seguridad debe estar deshabilitado, es decir: 0.

Creamos la base de datos e ingresamos a ella:

$createdb -E UNICODE DBMYBLOG && psql DBMYBLOG

Editamos el archivo app/config/database.php.default y el array default debe verse así:

public $default = array(
'driver' => 'postgres',
'persistent' => false,
'host' => 'localhost',
'login' => 'postgres',
'password' => 'Xcha5TTales17RT',
'database' => 'DBMYBLOG',
'prefix' => '',
'schema' => 'public',
'encoding' => 'UTF-8'
);

lo salvamos como database.php y al recargar localhost ya debe verse el mensaje: 'Cake is able to connect to the database'.

En este caso vamos a crear un mini-Blog usando la base de datos PostgreSQL, es difícil entender porque la gente usa MySQL voluntariamente. MySQL es una buena base de datos, pero despuás de todo, inferior a PostgreSQL.

Esta aplicación que vamos a crear es sencilla: un usuario agrega y publica noticias en su blog. Las noticias está­n organizadas en categorías que el mismo usuario crea y gestiona.

Necesitamos algunas tablas para guardar la información, corta y pega del navegador a tu consola las tres tablas siguientes:

CREATE TABLE users (
id serial PRIMARY KEY,
username varchar(12) NOT NULL UNIQUE, --login
pwd varchar(50) NOT NULL,
name varchar(50) NOT NULL, -- real name
email varchar(45) NOT NULL UNIQUE,
created timestamp(0) with time zone DEFAULT now() NOT NULL,
blogname varchar(150)
);

--Entries son las entradas del blog
CREATE TABLE entries (
id serial PRIMARY KEY,
written timestamp(0) with time zone DEFAULT now() NOT NULL,
title varchar(250) NOT NULL,
body text NOT NULL,
comments smallint NOT NULL DEFAULT 1, theme_id int NOT NULL REFERENCES themes(id) ON DELETE CASCADE -- esta es una lleva externa (foreign key)
);
-- Tabla "themes" para los temas del blog:
CREATE TABLE themes (
id serial PRIMARY KEY,
title varchar(25) NOT NULL UNIQUE
);

CREATE TABLE comments ( --comments on blogs
id serial PRIMARY KEY,
written timestamp(0) with time zone DEFAULT now() NOT NULL,
comment text NOT NULL,
name varchar(20) NOT NULL,
email varchar(60),
website varchar(150),
entry_id int REFERENCES entries(id) ON DELETE CASCADE
);

Nota que debes crear la tabla themes primero pues la tabla entries depende de ella.

Como se puede notar, seguimos la convención de CakePHP de nombrar las tablas en plural. Tambián es una buena costumbre nombrar las en inglés. Nota que en la tabla "entries" la columna themes_id es una foreign key con la indicación "ON DELETE CASCADE", es decir que si se borra el tema tambián se borrarán las entradas relacionadas a este tema. Esto lo decide el diseñ­o de la BD y el tema está más allá de este tutorial.

INSERT INTO users (id, username, pwd, email, blogname, name) VALUES (1, 'repostero', '3916784b451c011b7ec822fb9bb66cfc3b5dbf0e', 'spam@nojodas.com', 'El rincon del repostero', 'Manuel Montoya'); -- pwd = karamelo

INSERT INTO themes (id, title) VALUES (1, 'Historia de México');
INSERT INTO themes (id, title) VALUES (2, 'Hobbies');
INSERT INTO themes (id, title) VALUES (3, 'Desarrollo de software');
INSERT INTO themes (id, title) VALUES (4, 'La Family');

INSERT INTO entries (title, body, theme_id) VALUES ('La toma de Zacatecas', 'Los militares federales habían estado combatiendo al ejército de Villa por varios meses sin lograr derrotarlo. De hecho...', 1);

INSERT INTO entries (title, body, theme_id) VALUES ('Programando componentes', 'La programación orientada a components (COP) difiere de la clá­sica pragramación orienta a objetos (OOP) en ...', 3);

El modelo sirve entre otras cosas para consultar la información a la BD, asi que ncesitamos crear el modelo Entry para la tabla entries, en CakePHP los modelos son en singular:

< ? p h p

/* El modelo para entries*/

// file: app/models/entry.php
class Entry extends AppModel {
public $name = 'Entry';

public $belongsTo = array('Theme' =>
array('className' => 'Theme',
'conditions' => '',
'order' => '',
'foreignKey' => 'theme_id'
)
);

public $hasMany = array('Comment' =>
array('className' => 'Comment',
'conditions' => null,
'order' => 'Comment.written DESC',
'limit' => null,
'foreignKey' => 'entry_id',
'dependent' => true,
'exclusive' => false,
'finderQuery' => null,
'fields' => null,
'offset' => null,
'counterQuery' => null
)
);

// array de la validación
public $validate = array(
'title' => VALID_NOT_EMPTY,
'theme_id' => VALID_NOT_EMPTY,
'body' => VALID_NOT_EMPTY
);
}
?>

En el modelo reflejamos las asociaciones de la base de datos: por un lado decimos que cada Entry pertenece (belongsTo) a la categoría definida en el modelo Theme y por otro lado declaramos que cada Entry puede tener muchos (hasMany) comentarios en el modelo Comment.

Ahora creamos el controlador, los controlados van en el directorio app/controllers/ en este caso el archivo se llama entries_controller.php:

< ? p h p

/** Mi Nombre, correo y licencia aqui */

// archivo:   app/controllers/entries_controller.php

class EntriesController extends AppController {

public function display()    // mètodo 'display' del controlador 'entries'
{
     $conditions = array('status'=>1); // la condición es: sólo las entradas activas

    $fields = array('Entry.title','Entry.body','Entry.written','Entry.status', 'Entry.comments', 'Theme.id', 'Theme.title');
    // los campos que quiero de las tablas asociadas

    $order = 'id DESC'; // ordena del má­s reciente al m&ás viejo

    $limit = 15; // sólo trae las ú­ltimas 15 entradas

    $data = $this->Entry->findAll($conditions, $fields, $order, $limit); // uso el modelo

    $this->set('data', $data); // pasa el resultado a la vista
}
}
?>

El método findAll() busca todos los registros del modelo Entry, los coloca en la variable $data y esta varaible la pasa a la vista con el método set() del controlador.

Ya solo nos falta crear la vista para el mátodo display() del controlador entries_controller.php, las vistas van en el directorio app/views/controller/method.ctp. La extensión es .ctp por "Cake Template". En este caso: /app/views/entries/display.ctp:

< h 1 >Entradas < / h1 >

< ? p h p
// die( debug($data) ); //data fue puesta aqui por el controlador

foreach( $data as $val)
{
echo $html->div('newtitle', $val['Entry']['title']);
echo $html->div('newtheme', $val['Theme']['title']);
echo $html->div('newdate', $val['Entry']['written']);
echo $html->div('newbody', $val['Entry']['body']);
}
?>

Hay que hacer notar que tanto en el controlador como en la vista o el modelo se puede usar la función debug() para ver algún array. En la vista estoy usando el helper $html->div() que coloca una cadena en en layer. Si tu eres desarrollador web y nunca has usado helpers debo decirte una cosa: los amaras profundamente. Todo el tedio de escribir xHTML morirá si los usas.

Ahora nos colocamos en http://localhost/entries/display y debemos ver esto:

Cakephp

Es decir el controlador ejecuta la función display(), la cual usa el modelo Entry y el resultado lo pasa ala vista donde se procesa apra mostra el resultado.

Routes

Una vez que hemos creado el controlador entries con la acción display: /entries/display, es claro que este controlador/método debería ser la página de inicio de nuestra aplicación. En el archivo app/config/routes.php está definido el controlador/método por default de CakePHP.

Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));

Esta ruta específica que el controlador por default es 'pages/display' con una variable de valor 'home'. Para hacer de entries/display sea ahora nuestro 'index.php' cambiamos esta configuración a:

Router::connect('/', array('controller' => 'entries', 'action' => 'display'));

(No necesitamos la variable 'home'). Ahora al ir a http://localhost con nuestro navegador, CakePHP sabe que lo que debe ejecutar es /entries/display. Cooool!

Colocando nuestro diseño­

CakePHP busca en el directorio app/views/layouts buscando por el layout 'default.ctp' (los layouts también acaban con la extensión .ctp), si CakePHP no encuentra este layout usa uno propio. Vamos a crear nuestro layout para aplicar nuestro diseño. Guardamos este archivo como app/views/layouts/portal.ctp. (Si ya sé que los diseños no se hacen con tablas para este es un ejemplo).

La parte má­s importante es la variable $content_for_layout, que es el que integra el resultado de la vista con el layout. También está echo $html->css("portal");, es decir que debes tener el archivo app/webroot/css/portal.css que es este.

Cada método de un controlador puede tener un layout diferente, debemos modificar dos atributos de nuestro mètodo display debemos agregar:

$ this - > layout = 'portal';
$ this - > pageTitle = 'mi blog en CakePHP';

Una vez hecho esto, al recargar nuestra página debemos ver algo asi:

Cakephp


Continuar con "Auth Component" >>

Última actualización: 2008-03-29 17:57:00-06



ir arriba
The Queen is here Mozilla Firefox The Best DataBase CakePHP Framework CSS GNU Hacker