Custom Search
Bloggers Activos
El petróleo aarkerio
Un museo mata a una exhibición viva ahuramazdah
Aprovechando el tema. mandrake
We have a menstrual situation here aarkerio
No te muevas!! blacksoul
CRIPTOGRAFÍA EN LA PRESIDENCIA DE PORFIRIO DÍAZ tonathiu
“Yo no tengo que explicarle por qué no: usted debe explicarme por qué sí.” tonathiu
Authors@Google: Noam Chomsky aarkerio
PDF Helper aarkerio
Emacs como IDE para CakePHP aarkerio
Last Download
Segunda Fundación
Segunda Fundación
Pidiendo OpenSolaris 2008.5
vendaval
Sospechosismo
aarkerio
Sistema Infalible
ordbal
Calderón puede ser sujeto a juicio político, sostiene Carrancá
tonathiu
Jaime Maussan da por auténtico video trucado del chupacabras hecho en Blender 3D
asarch
La desnutrición en México
aarkerio
No hay justicia en el mundo
aarkerio
Esperando al cartero
aarkerio
Carta a Felipe Calderón
aarkerio
2004-2007
aarkerio
Google Groups Karamelo
Visit this group
GNU/Linux
GNU/Linux
Hacktivismo
Hacktivismo
Debian
Debian
NetBSD
NetBSD
WWW
WWW
Guia Linux
Guia Linux
Server Side
Server Side
Ofimatica
Ofimatica
Despabilando...
Despabilando...
Mundo Maya
Mundo Maya
Literatura
Literatura
Agora
Agora
Psicologia
Psicologia
Economia
Economia
Ambientalismo
Ambientalismo
Desarrollo
Desarrollo
Biologia
Biologia
Tú. Conocimiento
Tú. Conocimiento

Hacktivism

LinuxChix button

Server Side \ Mi primer CakePHP, mmmmm cakeee
Server Side
Mi primer CakePHP, mmmmm cakeee

Este artículo ha sido consultado en 5,320 ocasiones.

CakePHP

Nota: Este documento es sólo un apoyo al manual principal de CakePHP .

CakePHP es un framework que implementa el patrón de diseño MVC. Para quienes han trabajdo con Ruby on Rails (RoR), muchas cosas de CakePHP les resultarán muy familiares. La Wikipedia señala:

Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes distintos. El patrón MVC se ve frecuentemente en aplicaciones web, donde la vista es la página (X)HTML y el código que provee de datos dinámicos a la página.

  • Modelo: la lógica de la aplicación además del acceso a datos (SQL, LDAP, XML, ActiveRecord, ORM) e integridad de la información.
  • Vista: la interfaz para el usuario: WML para celulares y PDAs, pero más frecuentemente, (X)HTML para los navegadores
  • Controlador: recibe el input del usuario (generalmente un link o un formulario ) y lo pasa, a veces al Modelo, a veces a la Vista Veamos la siguiente gráfica:

CakePHP
http://www.grahambird.co.uk

1) El usuario da click sobre la liga http://server.org/tasks/index
2) El dispatcher (despachador) de CakePHP llama y ejecuta el controlador tasks_controller.php el cual (como se indica en el URL) tiene un método index()
3) Este método index() del controlador llama al modelo Task que hace una consulta a la base de datos SQL
4) El modelo regresa el resultado al controlador
5) El controlador ha concluido su trabajo y le pasa los datos a la vista
6) La vista se integra con el layout HTML
7) El usuario ve el resultado de pinchar sobre http://server.org/tasks/index

Podría parecer complicado, pero no lo es, luego de algunos días de trabajar con CakePHP esta secuencia muestra su bien pensada lógica y uno se empieza a preguntar "¿Cómo pude trabajar de la otra manera durante tanto tiempo?".

Son muchas las ventajas del patrón MVC: sólidez, diseño, coherencia, modularidad, pero quizás las más importante es que hace mucho más fácil el mantenimiento y la cooperación entre varios desarrolladores. Algunas de las características de CakePHP:

  • Compatible con PHP4 y PHP5
  • Buena implementación de ActiveRecord
  • Despachador de clases por URL (mejor apariencia)
  • Plantillas rápidas y flexibles
  • Ayudas (helpers) para AJAX, Javascript, HTML Formas y más (<- hace el trabajo menos tedioso)
  • Trabaja desde cualquier directorio sin moverle a Apache
  • Poderoso y sencillo sistema de validación
  • Andamiaje en el CRUD (Scaffolding)
  • Listas de control de acceso
  • Data Sanitization (para evitar hackeos)
  • Seguridad, Sesiones, y manejo de llamado a componentes
  • Caché en las vistas

Como señalamos en el diagrama, en CakePHP la llamada al controlador, el método y sus variables se activan mediante el URL, por ejemplo, en lugar de un feo:

http://project.myserver.org/index.php?controller=pages&method=show&order=DESC&limit=15

En cakePHP sería:

http://project.myserver.org/pages/show/DESC/15

Este URL quiere decir que hay un controlador "pages", el cual posee un método (o función) "show" y estamos pasándole dos valores, DESC y 15. En CakePHP, esta clase sería así:

Archivo app/controllers/pages_controller.php

class PagesController extends AppController
{
public function show($order = null, $limit = null)
{

$conditions = null;

$fields = array("id", "title", "body", "created");

$ORrder = "Page.created " . $order;

$data = $this->Page->findAll($conditions, $fields, $ORder, $limit, null, 1); // $this->Page es el modelo

$this->set('data', $data); // le paso la variable "$data" a la vista para que muestre el resultado
}
}
?>

Helpers

Los helpers son una solución de CakePHP para dar un formato completo, correcto y válido a las etiquetas (tags) HTML o XHTML, todo ello sin el engorro de escribir todo el tag. Generalmente los helpers comienzan con $html-> o $form-> para los tags normales o $ajax-> en el caso de los helpers de Ajax.

Una de las mejores características de CakePHP es que es fácilmente extendible, es decir, tu puedes crear tus propios helpers, pero eso lo veremos después.

Por ejemplo, para construir una liga de todos los días con el helper $html->link():

$ html ->link('Ir a las frases', '/quotes/index', array('class'=>'small', 'title'=>'Describe liga') ); ?>

Lo que resulta en:

< a href="/quotes/index" title="Describe liga" clas="small"> Ir a las frases < / a >

Para imprimir una imagen:

$ html -> image('ruta/my_image.jpg', array("alt"=>"My Images", "title"=>"My Images"); ?>

Es importante señalar que $html->image() busca las imágenes en app/webroot/img/. Por supuesto estos elementos de liga e imagen se pueden mezclar para construir una liga usando una imagen:

$html ->link(html->image('ruta/myimages.jpg', array("alt"=>"My Images", "title"=>"My Images")),
'/quotes/index', array("class"=>"linksmall"), false, false, null );

Por otro lado, para construir un formulario en una vista de CakePHP:

archivo: app/views/pages/add.thtml

echo $form -> create('Page'); ?>

echo $ html ->div('my_css_class', 'New Page');

echo $html->labelTag('Page/title', 'Title:' );
echo $form->input('Page/title', array("size" => 50, "maxlength" => 120, "class"=>"formas"));
echo $html->tagErrorMsg('Page/title', 'Title is required.');
echo $form->submit('Send', array("class"=>"b_formas"));

Nótese que en este formulario ya estamos considerando el modelo pues se incluye la validación: $html->tagErrorMsg('Page/title', 'Title is required.'); que señala que CakePHP está considerando este campo del formulario como un campo obligatorio. Una vez más los usuarios de Ruby on Rails se sentirán en casa pues es la misma sintaxis.

Notemos también que los tags cortos de PHP, por seguridad, se evitan en el código de CakePHP. Si usamos lo Helpers, es casi seguro que podemos señalar nuestras páginas como páginas bien hechas: Xhtmlvalido

Instalación de CakePHP

La instalación es rápida y muy sencilla:

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

nos cambiamos al usuario www-data, nos vamos al directorio del webserver:

$cd /var/www/

en este directorio debemos descargar CakePHP. En estos días la versión estable es la 1.1.13. Descomprimimos:

$tar -jxvf cake_1.1.13.4205.tar.bz2

Renombramos:

$mv cake_1.1.13.405 project

Veremos dentro de /var/www/project cuatro directorios, app, cake, docs, vendor. El directorio cake nunca lo tocamos pues contiene las librerías estáticas del framework, vendor es donde debemos poner las librerías extras que no son parte de CakePHP, por ejemplo las librerías PEAR. Docs... bueno, son los docs. En realidad, es en app donde trabajaremos. Dentro del directorio app esta el directorio webroot, este es el root de la aplicación, es decir, a partir de aqui es lo que está visible para los internautas. Al ponernos en:

http://myserver.org/project/app/webroot/

ya podemos ver a CakePHP:

CakePHP

No obstante, lo mejor (por comodidad, seguridad y profesionalismo) es hacer que webroot sea realmente el webroot. Para configurar una instancia de CakePHP en Apache2, tecleamos:

$sudo mcedit /etc/apache2/sites-available/project.myserver.org

Y adentro ponemos:


ServerAdmin sergio@myserver.org
ServerName project.myserver.org
DocumentRoot /var/www/project/cake/app/webroot
ErrorLog /var/morg/chipotle/log/apache.log

Options FollowSymLinks
AllowOverride all
Order allow,deny
Allow from all


Lo guardamos y salimos. Creamos la liga simbólica:

$sudo ln -s /etc/apache2/sites-available/project.myserver.org /etc/apache2/sites-enabled/project.myserver.org

Por supuesto hay que crear el directorio para que Apache2 pueda escribir los logs que le corresponden a CakePHP:

$mkdir /var/www/project/logs

Reiniciamos:

$sudo /etc/init.d/apache2 restart

Y ya podemos ver a CakePHP en:

http://project.myserver.org

Ahora, como usuario postgres creamos nuestra base de datos PostgreSQL ( I like pgsql ;-) ):

$createdb -E UNICODE DBCENTAURO

Editamos:

$mcedit app/config/database.php.default

Con F12 salvamos este archivo como database.php, debemos editar para tener algo así:

< ? php
class DATABASE_CONFIG
{
var $default = array('driver' => 'postgres',
'connect' => 'pg_connect',
'host' => 'localhost',
'login' => 'postgres',
'password' => '456TY456x',
'database' => 'DBCENTAURO',
'prefix' => '');

var $test = array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'project_name-test',
'prefix' => '');
}
?>

La base de datos $test no la vamos a utilizar en este momento. El archivo pg_hba.conf de PostgreSQL debe estar configurado para aceptar conexiones del localhost. Ahora el recargar la página debes ver el mensaje "Cake is able to connect to the database".

Mi primer MVC

Ahora crearemos nuestro primer MVC. Primero (dentro de PostgreSQL) crearemos la tabla quotes y le agregaremos algunos registros. Por convención, en CakePHP las tablas tienen nombre en plural:

CREATE TABLE quotes (
id serial PRIMARY KEY,
quote varchar(150) NOT NULL,
author varchar(50) NOT NULL
);

INSERT INTO quotes ("quote", "author") VALUES ('Yo no hablo de venganzas ni perdones, el olvido es la única venganza y el único perdón.', 'Borges');
INSERT INTO quotes ("quote", "author") VALUES ('Uno no es lo que es por lo que escribe, sino por lo que ha leído.', 'Borges');
INSERT INTO quotes ("quote", "author") VALUES ('Creo que parte de mi amor a la vida se lo debo a mi amor a los libros.', 'Bioy Casares');
INSERT INTO quotes ("quote", "author") VALUES ('Ven a dormir conmigo: no haremos el amor, él nos hará.', 'Julio Cortazar');

Ahorea creamos el modelo para esta tabla:

Archivo: app/models/quote.php
< ? php
class Quote extends AppModel
{
public $name = 'Quote';

public $validate = array(
'quote' => VALID_NOT_EMPTY,
'author' => VALID_NOT_EMPTY
); }
?>

Nota: en los siguientes ejemplos usaré especificaciones como "private", "restricted", "public" que, como ya sabes, son exclusivas de la POO de PHP5, si estas programando en PHP4, omítelas.

El array $validate de los modelos (en este caso Quote), indican que campos son obligatorios en la tabla.

Por convención, los archivos del modelo se nombran en singular así como también la clase, en este caso: quote.php y Quote.

Ahora creamos el controlador:

Archivo: app/controllers/quotes_controller.php
class QuotesController extends AppController
{
public function index() {
$this->pageTitle = 'Estas son las frases'; // el titulo de la pagina

$data = $this->Quote->findAll(); // hacemos una consulta a la BD usando el modelo

$this->set('data', $data); // Le paso el resultado de la consulta a la vista
}
}
?>

Esta clase sólo posee un método: index(), si no hay indicación de método en el URL este es el método que CakePHP ejecuta por omisión. Cada método del controlador tiene una vista que presenta el XHTML al usuario, el nombre del método del controlador es el mismo que el de su vista, si el método se llama index(), el archivo de la vista debe llamarse index.thtml, si el método es listado() la vista es listado.thtml, etcétera. En este caso:

archivo: app/views/quotes/index.thtml

Quotes


echo $html->link('Nueva frase', '/quotes/add/')

foreach ($data as $val)
{
echo $html->link('Editar', '/quotes/edit/'.$val['Quote']['id']);
echo $val['Quote']['quote'];
echo $val['Quote']['author'];
echo $html->link('Borrar', '/quotes/delete/'.$val['Quote']['id']);

}

Ya tenemos nuestro MVC. Si ahora con Firefox nos colocamos en http://project.myserver.org/quotes/index veremos el listado de nuestras frases en PostgreSQL. Así de simple y potente es desarrollar con este framework. Al trabajar con CakePHP, debemos acostumbrarnos a consultar constantemente las clases de su API, pues así sabemos exactamente que métodos y atributos tiene cada clase padre, pues en CakePHP sólo creamos y trabajamos con clases hijas.

El layout

El layout es el template general del sitio, el layout por omisión debes colocarlo en app/views/layout/default.thtml, puede ser tan simple como:

Archivo: app/views/layout/default.thtml



"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


css("estilos"); ?>





< ? php echo $content_for_layout ?>

< ? php echo $this->renderElement('footer'); ?>



Nota que la hoja de estilos app/webroot/css/estilos.css se incluye con $html->css("estilos"). La variable $title_for_layout debe ser colocada en el método del controlador:

$this->pageTitle = 'Mi titulo';

La variable $content_for_layout es el resultado de la vista. $this->renderElement() es un método de CakePHP para colocar pequeños bloques dentro del layout, sólo hay que poner el elemento dentro del directorio /app/views/elements/. En este caso yo tengo footer.thtml, que tiene la información típica del footer y que varios layouts comparten.

Puedes tener tantos layouts como te hagan falta, sólo debes indicar en el controlador cuál vas a usar con la variable:

$this->layout = 'ruby';

Pero por omisión CakePHP busca default.thtml.

Siguiente Capítulo >>

Ficha del autor:

manuel_ARRROBA_mononeurona.org
Manuel Montoya estudió neuropsicología en la facultad y en el Instituto de Biomédicas de la UNAM. Trabajó en Compaq de México como diseñador de software, tiene diez años de experiencia en Java, PHP y SQL. Le interesan muchas cosas y neciamente le da por escribir sobre todas ellas. Actualmente trabaja en Chipotle Software, desarrollando Karamelo, una herramienta de e-Learning. Jedit.org y WindowMaker son su editor y escritorio favoritos.
aarkerio
The most effective way to restrict democracy is to transfer decision making from the public arena to unaccountable institutions. Chomsky.
Ver todos los articulos de aarkerio

Última actualización: 2007-04-29 10:57:00-05

Printable version

on 9/7/07 enriqueism wrote:
Tengo una pregunta...que pasa si el nombre de mis tablas estan en singular no en plural. Cambia en algo la definición del modelo.
on 10/7/07 aarkerio wrote:
si, tendrás problemas, renombra tus tablas. En PostgreSQL es con ALTER TABLE user RENAMNE TO users;
on 25/7/07 moises wrote:
Gracias excelente articulo
on 10/12/07 felipe fernandez wrote:
Mas salvao la vida colega.
on 7/4/08 Marta wrote:
Hola quisiera saber si esta herramienta trabaja tambein con mysql y si saben de algun tutorial o pagina que hable de ello
1 week, 2 days ago gabriela wrote:
Hola como estan soy nueva en el uso de cakephp y de verdad no tengo mucho conociemiento en la construccion de formularios en el mismo!!mi pregunta es como puedo hacer para construir formularios para ingresar eliminar y modificar registros en una base de datos

Add comment:



Captcha




Que estas haciendo?
mandrakemandrake está:
esperado a que deje de chatear una chava para cerrar el cyber
7 hours, 41 minutes ago

der_teufelder_teufel está:
terminandome un tarro de chela que le cabe un caguamon :-D, ya estoy alegron :-s
10 hours, 36 minutes ago

saidjosesaidjose está:
aprendiendo python
12 hours, 31 minutes ago

rnstuxrnstux está:
Practicando SQL
12 hours, 36 minutes ago

AlmsxAlmsx está:
Por cierto, esto lo estoy escribiendo desde openSolaris 2008.5. Va de maravilla!!!
15 hours, 21 minutes ago

AlmsxAlmsx está:
Fue el Martes 13 de Mayo, osease ayer jejeje :D
15 hours, 21 minutes ago

Que estuvimos haciendo >>
Chipotle Software

Como mascota prefiero a:
Los perros
Los gatos
Ambos
Soy alérgico
Ninguno
Otro
Rapiditas
Problemas de Lenguaje en niños
10592 lecturas
Sexualidad infantil y juvenil
9321 lecturas
Anticoncepción de Emergencia
8098 lecturas
Rompiendo cualquier clave WEP en unos pocos minutos
7042 lecturas
Sinapsis y exocitosis
6405 lecturas
Mi primer CakePHP, mmmmm cakeee
5320 lecturas
Evolución filética en las hepáticas
4792 lecturas
BASH y Primeros Comandos
4070 lecturas
CakePHP II Active Record
3799 lecturas
Cómo convertirse en hacker
3666 lecturas
Add to Technorati Favorites

ir arriba
Bienaventurados los que no tienen nada que decir, y que resisten la tentación de decirlo. Anónimo

The Queen is here Mozilla Firefox The Best DataBase CakePHP Framework XHTML GNU Hacker Chipotle Software

Too Cool for Internet Explorer