Introducción a Cake PHP Framework

Jomicast 2,367 views 120 slides Apr 21, 2018
Slide 1
Slide 1 of 120
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96
Slide 97
97
Slide 98
98
Slide 99
99
Slide 100
100
Slide 101
101
Slide 102
102
Slide 103
103
Slide 104
104
Slide 105
105
Slide 106
106
Slide 107
107
Slide 108
108
Slide 109
109
Slide 110
110
Slide 111
111
Slide 112
112
Slide 113
113
Slide 114
114
Slide 115
115
Slide 116
116
Slide 117
117
Slide 118
118
Slide 119
119
Slide 120
120

About This Presentation

CakePHP es un marco de desarrollo [framework] rápido para PHP, libre, de código abierto. Se trata
de una estructura que sirve de base a los programadores para que éstos puedan crear aplicaciones
Web. Nuestro principal objetivo es que puedas trabajar de forma estructurada y rápida, sin pérdida...


Slide Content

16
TEMA 14. INTRODUCCIÓN
A CAKE PHP FRAMEWORK.

José M. Castillo Castillo

INTRODUCCIÓN A CAKE PHP FRAMEWORK


1

INDICE DE CONTENIDO TEMA 14. INTRODUCCIÓN A CAKE PHP FRAMEWORK



1. COMENZANDO CON CAKEPHP
1.1 Qué es cakephp y por qué hay que utilizarlo
1.2 Entendiendo modelo-vista-controlador
1.3 Beneficios MVC


2. PRINCIPIOS BÁSICOS DE CAKEPHP
2.1 Estructura de cakephp
2.2 Una petición típica de cakephp
2.3 Estructura de archivos de cakephp
2.4 Convenciones de cakephp


3. DESARROLLANDO CON CAKEPHP
3.1 Requerimientos
3.2 Preparándose para instalar
3.3 Instalación
3.4 Enciéndelo
3.5 Configuración
3.6 Comprensión de las rutas


4. CONTROLADORES
4.1 Introducción
4.2 App controller
4.3 Métodos del controlador


5. MODELOS
5.1 La comprensión de modelos
5.2 Creando tablas de bases de datos
5.3 Recuperando tus datos
5.4 Guardando tus datos
5.5 Borrando datos
5.6 Asociaciones - enlazando modelos
5.7 Datasources (fuentes de datos)


6. VISTAS
6.1 Plantillas de la vista
6.2 Layouts
6.3 Elementos
6.4 Métodos de la vista
6.5 Temas

INTRODUCCIÓN A CAKE PHP FRAMEWORK


2

7. HELPERS
7.1 Usando helpers
7.2 Creando helpers
7.3 Incluyendo otros helpers
7.4 Usando tu helper
7.5 Creando funcionalidad para todos los helpers
7.6 Helpers del core


8. SCAFFOLDING
8.1 Scaffolding
8.2 Constantes y funciones globales


9. TAREAS COMUNES CON CAKEPHP
9.1 Validación de datos
9.2 Reglas simples
9.3 Múltiples reglas por campo
9.4 Reglas de validación incorporadas
9.5 Reglas de validación personalizadas


10. PAGINACIÓN
10.1 Preparación del controlador
10.2 Paginación en views


11. FORMULARIOS
11.1 Creando formularios
11.2 Cerrando formularios
11.3 Form – métodos de elementos específicos


12. HTML
12.1 Introducción
12.2 Inserción de elementos html
12.3 Práctica - blog
12.4 Práctica - tareas
12.5 Cuestionario: html

INTRODUCCIÓN A CAKE PHP FRAMEWORK


3

1. COMENZANDO CON CAKEPHP


1.1. Qué es cakephp y por qué hay que utilizarlo

CakePHP es un marco de desarrollo [framework] rápido para PHP, libre, de código abierto. Se trata
de una estructura que sirve de base a los programadores para que éstos puedan crear aplicaciones
Web. Nuestro principal objetivo es que puedas trabajar de forma estructurada y rápida, sin pérdida
de flexibilidad.

Con CakePHP el desarrollo web ya no es monótono porque ofrecemos las herramientas para que
empieces a escribir el código que realmente necesitas: la lógica específica de tu aplicación. Consigue
una copia de CakePHP, empieza con lo verdaderamente importante y no reinventes la rueda cada vez
que te incorpores a un nuevo proyecto.

CakePHP tiene un equipo de desarrolladores y una comunidad activos, lo que añade valor al
proyecto. Con CakePHP, además de no tener que reinventar la rueda, el núcleo de tu aplicación se
mejora constantemente y está bien probado.

La siguiente lista nos muestra las características de la que disfrutará al utilizar CakePHP:

 Comunidad activa y amistosa.
 Licencia flexible.
 Compatible con PHP4 y PHP5.
 CRUD integrado para la interacción con la base de datos.
 Soporte de aplicación [scaffolding].
 Generación de código.
 Arquitectura Modelo Vista Controlador (MVC).
 Despachador de peticiones [dispatcher], con URLs y rutas personalizadas y limpias.
 Validación integrada.
 Plantillas rápidas y flexibles (sintaxis de PHP, con ayudantes [helpers]).
 Ayudantes para AJAX, Javascript, formularios HTML y más.
 Componentes de Email, Cookie, Seguridad, Sesión y Manejo de solicitudes.
 Listas de control de acceso flexibles.
 Limpieza de datos.
 Caché flexible.
 Localización.
 Funciona en cualquier subdirectorio del sitio web, con poca o ninguna configuración de
Apache.


NOTA: Es necesario montar un servidor de aplicaciones PHP con las librerías propias de Cake PHP.
Para ello, puedes descargar el software (servidor de PHP) y el entorno framework (Cake PHP).

INTRODUCCIÓN A CAKE PHP FRAMEWORK


4

1.2. Entendiendo modelo-vista-controlador

Las aplicaciones CakePHP bien escritas siguen el patrón de diseño de software MVC (Modelo-Vista-
Controlador). Programar utilizando MVC consiste en separar la aplicación en tres partes principales.
El modelo representa los datos de la aplicación, la vista hace una presentación del modelo de datos,
y el controlador maneja y enruta las peticiones [requests] hechas por los usuarios.


Figura 1: Una petición MVC básica

La figura 1 muestra un ejemplo sencillo de una petición [request] MVC en CakePHP. A efectos
ilustrativos, supongamos que un usuario llamado Ricardo acaba de hacer clic en el enlace "¡Comprar
un pastel personalizado ahora!" de la página de inicial de la aplicación.

1. Ricardo hace clic en el enlace apuntando a
http://www.ejemplo.com/pasteles/comprar, y su navegador hace una petición al
servidor web.
2. El despachador comprueba la URL de la petición (/pasteles/comprar), y le pasa la
petición al controlador adecuado.
3. El controlador realiza lógica de aplicación específica. Por ejemplo, puede comprobar
si Ricardo ha iniciado sesión.
4. El controlador también utiliza modelos para acceder a los datos de la aplicación. La
mayoría de las veces los modelos representan tablas de una base de datos, aunque
también pueden representar entradas LDAP, canales RSS, o ficheros en el sistema. En
este ejemplo, el controlador utiliza un modelo para buscar la última compra de
Ricardo en la base de datos.
5. Una vez que el controlador ha hecho su magia en los datos, se los pasa a la vista. La
vista toma los datos y los deja listos para su presentación al usuario. La mayoría de
las veces las vistas en CakePHP vienen en formato HTML, pero una vista puede ser
fácilmente un PDF, un documento XML, o un objeto JSON, dependiendo de tus
necesidades.
6. Una vez que el objeto encargado de procesar vistas en CakePHP ha utilizado los
datos del controlador para construir una vista completa, el contenido se devuelve al
navegador de Ricardo.

Casi todas las peticiones a tu aplicación seguirán este patrón básico. Más adelante, vamos a
completar algunos detalles específicos de Cake, así que, por favor, ten esto en cuenta a medida que
avanzamos.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


5

1.3. Beneficios MVC

¿Por qué utilizar MVC? Porque es un patrón de diseño de software probado y se sabe que funciona.
Con MVC la aplicación se puede desarrollar rápidamente, de forma modular y mantenible. Separar
las funciones de la aplicación en modelos, vistas y controladores hace que la aplicación sea muy
ligera. Estas características nuevas se añaden fácilmente y las antiguas toman automáticamente una
forma nueva.

El diseño modular permite a los diseñadores y a los desarrolladores trabajar conjuntamente, así
como realizar rápidamente el prototipado. Esta separación también permite hacer cambios en una
parte de la aplicación sin que las demás se vean afectadas.

Aunque lleva algún tiempo acostumbrarse a construir aplicaciones así, estamos seguros de que, una
vez construyas tu primera aplicación con CakePHP, no querrás volver a hacerlo de otra forma.








Recuerda…

Los beneficios de usar MVC son:
- Separar la parte visual del código.
- Desarrollo rápido.

CakePhp es compatible con versiones PHP 4 y 5.

La arquitectura que usa CakePHP es el Modelo Vista Controlador.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


6

2. PRINCIPIOS BÁSICOS DE CAKEPHP


2.1. Estructura de cakephp

CakePHP incluye las clases Controlador [Controller], Modelo [Model] y Vista [View], pero también
incluye otras clases y objetos que hacen que el desarrollo en MVC sea un poco más rápido y
agradable. Los Componentes [Components], Comportamientos [Behaviors], y Ayudantes [Helpers]
son clases que proporcionan extensibilidad y reusabilidad; agregan rápidamente funcionalidad a las
clases base MVC de las aplicaciones. Como de momento nos vamos a mantener en este nivel de
dificultad, ve preparando los detalles acerca de cómo usar estas herramientas.


Extensiones de los Controladores ("Componentes")

Un componente es una clase que ayuda a la lógica de un controlador. Si tienes alguna lógica y la
quieres compartir entre varios controladores (o aplicaciones), un componente suele ser una buena
elección. A modo de ejemplo, la clase del núcleo EmailComponent hace que la creación y el envío de
mensajes de correo electrónico sean tan sencillos como coser y cantar. En lugar de escribir lógica en
el método de un controlador, puedes empaquetarla en un componente para poder compartirla.

Los Controladores también están equipados con callbacks (rellamadas). Puedes utilizar estos
callbacks si necesitas insertar alguna lógica en las operaciones del núcleo de CakePHP. Los Callbacks
disponibles incluyen:

 beforeFilter(), se ejecuta antes que cualquier otra acción del controlador.
 beforeRender(), se ejecuta después de la lógica del controlador, pero antes de que la vista se
renderice.
 afterFilter(), se ejecuta después de toda la lógica del controlador, incluido el renderizado de
la vista. Puede que no haya ninguna diferencia entre afterRender() y afterFilter(), a menos
que hayas llamado manualmente a render() en el controlador y hayas incluido alguna lógica
después de esa llamada.


Extensiones de las Vistas

Un ayudante [Helper] es una clase que ayuda a la lógica de una vista. Del mismo modo que varios
controladores utilizan un componente, los ayudantes [helpers] hacen que varias vistas accedan y
compartan lógica presentacional. Con uno de los ayudantes del núcleo, el AjaxHelper, el manejo de
las peticiones Ajax en las vistas es mucho más fácil.

La mayoría de las aplicaciones repiten piezas de código en sus vistas. CakePHP facilita la reutilización
de este código con diseños [layouts] y elementos [elements]. Por defecto, toda vista renderizada por
un controlador se coloca en un diseño [layout]; los elementos entran en juego cuando hay que
reutilizar estos fragmentos pequeños de contenido.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


7

Extensiones de los Modelos

Del mismo modo, los Comportamientos [Behaviors] son formas de añadir funcionalidad común entre
los modelos. Por ejemplo, si almacena datos de los usuarios en una estructura de árbol, puede
especificar que su modelo de usuario se comporte como un árbol, y obtener libre funcionalidad para
eliminar, añadir, y mover nodos en la estructura de árbol subyacente.

Los modelos también cuentan con el apoyo de otra clase llamada DataSource (Origen de datos). Los
DataSources son una abstracción que permite a los modelos manipular diferentes tipos de datos en
forma consistente. Si bien la principal fuente de datos en una aplicación CakePHP es a menudo una
base de datos, puede escribir DataSources adicionales que les permitan a sus modelos representar
canales RSS, archivos CSV, entradas LDAP, o eventos iCal. Los DataSources le permiten asociar
registros de diferentes fuentes: en lugar de limitarse sólo a uniones [joins] SQL, los DataSources le
permiten decirle a su modelo LDAP que está asociado a muchos eventos iCal.

Así como los controladores, los modelos también incluyen callbacks:

 beforeFind()
 afterFind()
 beforeValidate()
 beforeSave()
 afterSave()
 beforeDelete()
 afterDelete()

Los nombres de estos métodos deben ser lo suficientemente descriptivos para que sepa lo que
hacen. Asegúrese de obtener los detalles en el capítulo acerca de los modelos.


Extensiones de la Aplicación

Tanto los controladores como los ayudantes [helpers] y modelos tienen una clase padre que puede
usarse para definir cambios a nivel global de la aplicación. AppController (localizado en
/app/app_controller.php), AppHelper (localizado en /app/app_helper.php) y AppModel (localizado
en /app/app_model.php) son magníficos lugares donde colocar métodos que desee compartir entre
todos los controladores, ayudantes [helpers] o modelos.

Las rutas juegan un rol en las peticiones hechas a CakePHP. Las definiciones de rutas le dicen a
CakePHP cómo mapear URLs a acciones de controladores. El comportamiento por defecto asume
que la URL "/controller/action/var1/var2/" mapea a Controller::action($var1, $var2), pero puede
usar rutas para personalizar URLs y la forma en que éstas son interpretadas por su aplicación.

Algunas características en una aplicación merecen ser empaquetadas como un todo. Un plugin es un
paquete de modelos, controladores y vistas que cumplen un propósito específico que puede abarcar
múltiples aplicaciones. Un sistema de administración de usuarios o un blog simplificado pueden ser
buenos ejemplos para plugins de CakePHP.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


8

2.2. Una petición típica de cakephp

Hemos cubierto los ingredientes básicos de CakePHP, así que echemos un vistazo a cómo los objetos
trabajan juntos para completar una petición básica. Continuando con nuestro ejemplo de petición
original, imaginemos que nuestro amigo Ricardo acaba de hacer clic en el enlace "¡Comprar un pastel
personalizado ahora!" en una página de bienvenida de una aplicación CakePHP.


Figura 2. Petición típica de Cake.
Negro = elemento requerido, Gris = elemento opcional, Azul = callback

 Ricardo hace clic en el enlace apuntando a: http://www.ejemplo.com/tortas/comprar, y su
navegador hace una petición a su servidor Web.
 El enrutador analiza la URL para extraer los parámetros para esta petición: el controlador,
la acción, y cualquier otro argumento(s) que pueda afectar a la lógica de negocio durante
esta petición.
 Usando las rutas, una petición URL es mapeada a una acción de controlador (un método en
una clase de controlador específica). En este caso, es el método comprar() del controlador
PastelesController. El callback beforeFilter() del controlador es llamado antes de que
cualquier acción lógica del controlador sea ejecutada.
 El controlador puede usar modelos para ganar acceso a los datos de la aplicación. En este
ejemplo, el controlador usa un modelo para obtener información de la base de datos de las
últimas compras de Ricardo. Cualquier callback de modelo, comportamiento [behavior], y
orígenes de datos [DataSources] aplicables pueden activarse durante esta operación.
Mientras que el uso del modelo no es requerido, todos los controladores de CakePHP
inicialmente requieren al menos un modelo, salvo que el desarrollador indique lo contrario.
 Después que el modelo ha obtenido toda la información, ésta es devuelta al controlador.
Pueden activarse callbacks del modelo.
 El controlador puede usar componentes para refinar aún más los datos o realizar otras
operaciones (manipulación de sesiones, autenticación, o envíos de email, por ejemplo).
 Una vez que el controlador ha usado modelos y comp onentes para preparar
suficientemente la información, ésta es entregada a la vista usando el método set() del
controlador. Los callbacks de controlador pueden ser aplicados antes de que la información
sea enviada. La lógica de vista es ejecutada, la cual puede incluir el uso de elementos y/o
ayudantes [helpers]. Por defecto, la vista es creada dentro del diseño [layout].
 Callbacks del controlador adicionales (como afterFilter) pueden ser aplicados. El código
completo creado por la vista es enviado al navegador de Ricardo.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


9

2.3. Estructura de archivos de cakephp

Tras descargar y extraer CakePHP, estos serán los ficheros y carpetas que deberías ver:

 app
 cake
 vendors
 .htaccess
 index.php
 README

Observarás 3 carpetas principales:

 La carpeta app será donde haremos nuestra magia: es donde se ubicarán los ficheros de tu
aplicación.
 La carpeta cake es donde nosotros hemos hecho nuestra magia. Comprométete a no
modificar los ficheros de esta carpeta. No podremos ayudarte si has modificado el núcleo.
 Finalmente, la carpeta vendors es donde ubicarás las librerías PHP de terceros que
necesites usar con tus aplicaciones en CakePHP.


La carpeta app

La carpeta app de CakePHP es donde realizarás la mayor parte del desarrollo de tu aplicación.
Veamos un poco más de cerca las carpetas dentro de app.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


10

2.4. Convenciones de cakephp

Con las convenciones de CakePHP, usted ahorrará tiempo sobre la marcha: siguiendo las
convenciones, obtendrá libre funcionalidad, y también se libera de la pesadilla del mantenimiento
del seguimiento de los archivos de configuración. Las convenciones también hacen un sistema de
desarrollo muy uniforme, permitiendo a otros desarrolladores ayudar más fácilmente.

Las convenciones de CakePHP han sido destiladas de años de experiencia en desarrollo web y
mejores prácticas. Mientras que le sugerimos el uso de estas convenciones durante el desarrollo con
CakePHP, deberíamos mencionar que muchos de estos postulados pueden ser anulados, esto es
especialmente útil cuando se trabaja con sistemas heredados.


Convenciones de los nombres de archivos y clases

En general, los nombres de archivo llevan el símbolo guion bajo (underscore) "_", mientras que los
nombres de las clases usan Mayúsculas de primera palabra (CamelCase). La clase MyNiftyClass puede
ser encontrada en el archivo my_nifty_class.php, por ejemplo.

Sin embargo, el nombre de la clase que contiene un archivo puede no necesariamente ser
encontrada en el nombre de archivo. La clase EmailComponent es encontrada en un archivo llamado
email.php, y la clase HtmlHelper es encontrada en un archivo llamado html.php.


Convenciones de Modelo y de la Base de datos

Los nombres de las clases de modelos están en singular y en formato CamelCase. Persona,
PersonaGrande, y PersonaMuyGrande son todos ejemplos de nombres de modelos convencionales.

Los nombres de las tablas correspondientes a modelos de CakePHP están en plural y usando guion
bajo. Las tablas subyacentes para los modelos arriba mencionados serían: personas,
personas_grandes, y personas_muy_grandes respectivamente.

Los nombres de los campos con dos o más palabras se definen con guiones bajos:
nombre_y_apellidos.

El nombre por defecto de las claves foráneas en relaciones hasMany, belongsTo o hasOne, es el
nombre de la tabla relacionada (en singular) seguido de _id. Así, si Panadero hasMany Tarta, la tabla
tartas referenciará la tabla panaderos mediante la clave foránea panadero_id. Para una tabla
compuesta por varias palabras como tipos_categorias, la clave foránea sería tipo_categoria_id.

El nombre de las tablas de unión entre modelos, usadas en relaciones hasAndBelongToMany
(HABTM), debería estar formado por el nombre de las tablas que une puestos en orden alfabético
(cebras_manzanas en vez de manzanas_cebras).

Todas las tablas con las que interaccionan los modelos de CakePHP (con excepción de las de unión de
tablas) necesitan una clave primaria simple que identifique inequívocamente cada fila. Si deseas
modelar una tabla que no tiene una clave primaria de un sólo campo, como por ejemplo las filas de
una tabla de unión posts_tags, la convención de CakePHP dicta que se añada una clave primaria de
un solo campo a la tabla.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


11

CakePHP no soporta claves primarias compuestas. Si deseas manipular directamente los datos de tu
tabla de unión, usa llamadas directas a query o añade una clave primaria para que actuara como un
modelo normal. Por ejemplo:


CREATE TABLE posts_tags
(
id INT(10) NOT NULLAUTO_INCREMENT,
post_idINT(10) NOT NULL,
tag_idINT(10) NOT NULL,
PRIMARY KEY(id)
);


En vez de utilizar una clave autoincremental como clave primaria, puedes utilizar char(36). De este
modo CakePHP utilizará un uuid(String::uuid) único de 36 caracteres siempre que grabes un nuevo
registro utilizando el método Model::save.


Convenciones de Controladores

Los nombres de las clases de los controladores son en plural, con formato CamelCased, y Terminan
en Controller. PersonasController y UltimosArticulosController son ejemplos de nombres
convencionales de controladores.

El primer método que escribas para un controlador debe de ser el método index(). Cuando la
petición especifica un controlador pero no una acción, el comportamiento por defecto de CakePHP
es ejecutar el método index() de dicho controlador. Por ejemplo, una petición de
http://www.example.com/apples/ se corresponde con la llama al método index() del controlador
ApplesController, mientras que http://www.example.com/apples/view se corresponde con una
llamada al método view() del controlador ApplesController.

También puedes cambiar la visibilidad de los métodos de los controladores en CakePHP
anteponiendo al nombre del método guiones bajos. Si un método de un controlador comienza por
un guion bajo, el método no será accesible directamente desde la web, sino que estará disponible
sólo para uso interno. Por ejemplo:

<?php class NoticiasController extends AppController
{
function ultimas()
{
$this->_buscaNuevosArticulos();
}
function _buscaNuevosArticulos()
{
//Lógica para encontrar los nuevos artículos.
}
}
?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


12

Mientras que la página http://www.example.com/noticias/ultimas/ está accesible de manera
normal, si alguien intenta acceder a la página
http://www.example.com/noticias/_buscaNuevosArticulos/ obtendrá un error porque el nombre del
método está precedido por un guion bajo.


Consideraciones de URL para nombres de controladores

Como se puede ver, los controladores con un nombre simple (de una sola palabra) pueden ser
fácilmente mapeados a una url en minúsculas. Por ejemplo, ApplesController (que se define en el
archivo 'apples_controller.php') y accedido desde http://example.com/apples.

Por otro lado múltiples combinaciones de palabras pueden ser transformadas automáticamente en
un mismo nombre de controlador:

 /redApples
 /RedApples
 /Red_apples
 /red_apples

Todas resuelven la acción index de controlador RedApples. Sin embargo, la convención es que las urls
sean en minúsculas y separadas con guion bajo, por lo tanto /red_apples/go_pick es la forma
correcta de acceder a la acción. RedApplesController::go_pick.


Convenciones de Vistas

Los archivos de plantillas de Vistas (Views) deben ser nombradas después de las funciones de los
controladores con guion bajo "_". La función getReady() del controlador PeopleController se
visualizara con la plantilla de vista en /app/views/people/get_ready.ctp por ejemplo.

El patrón básico es: /app/views/controller/underscored_function_name.ctp

Al nombrar las piezas de su aplicación utilizando las convenciones de CakePHP, usted adquiere
funcionalidad sin mucho mantenimiento de la configuración. Aquí encontramos un ejemplo final de
convenciones:
 Tabla de Base de Datos: ‘people’.
 Clase de Modelo: ‘Person’, encontrada en /app/models/person.php.
 Clase de Controlador: ‘PeopleController’, encontrada en
/app/controllers/people_controller.php.
 Plantilla de Vista, encontrada en /app/views/people/index.ctp.

Usando estas convenciones, CakePHP entiende que la petición http://example.com/people/ apunta a
la llamada de funciónindex() en el controlador, PeopleController, donde el modelo Person está
disponible automáticamente (y apunta automáticamente a la tabla ‘people’ en la base de datos), y se
renderiza en el archivo. Ninguna de estas relaciones ha sido configurada por otra razón que crear
clases y archivos que usted necesita crear.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


13




Recuerda…

CakePHP no soporta claves primarias compuestas.

Si quiero tener una aplicación multi-idioma, tengo que alojar los ficheros en Locale.

La estructura de CakePhp se basa en:
- Modelos y aplicaciones.
- Controladores y Vistas.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


14

3. DESARROLLANDO CON CAKEPHP


3.1. Requerimientos


 Servidor HTTP. Por ejemplo: Apache. Preferiblemente con mod_rewrite, pero no requerido.
 PHP 4.3.2 o superior. Si, CakePHP funciona genial en PHP 4 y 5.

Técnicamente no se requiere un motor de base de datos, pero nos imaginamos que la mayoría de las
aplicaciones usarán uno.

CakePHP soporta una gran variedad de motores de almacenamiento:
 MySQL (4 o superior)
 PostgreSQL
 Firebird DB2
 Microsoft SQL Server
 Oracle
 SQLite
 ODBC
 ADOdb


3.2. Preparándose para instalar

CakePHP es rápido y fácil de instalar. Los requisitos mínimos son un servidor web y una copia de
Cake, ¡solo eso! Aunque este manual se enfoca primariamente en la configuración sobre Apache
(porque es el usado comúnmente), Tu puedes configurar Cake para correr sobre la mayoría de
servidores web, tales como, LightHTTPD o bien Microsoft IIS. Preparar la instalación consta de los
siguientes pasos:

 Descargue CakePHP.
 Configure su servidor para manejar php si es necesario.
 Chequee los permisos de los archivos.


Obteniendo CakePHP

Hay dos principales maneras de obtener una copia limpia de CakePHP. Puedes descargar una copia
comprimida (zip/tar.gz/tar.bz2) de la página web principal, o puedes obtener el código desde el
repositorio git.

Para descargar la última release principal de CakePHP, dirígete a la página web
http://www.cakephp.org … y haz clic en el enlace “Download Now”.

Todas las releases actuales están alojadas en CakeForge. Este site también contiene enlaces a
muchos otros proyectos en CakePHP, incluyendo plugins y aplicaciones para CakePHP. Las releases
de CakePHP están disponibles en http://cakeforge.org/projects/cakephp.

Se crean nightlybuilds alternativas que incluyen parches y mejoras al minuto (bueno, al día).

INTRODUCCIÓN A CAKE PHP FRAMEWORK


15

Permisos

CakePHP usa el directorio /app/tmp para diferentes operaciones, como almacenar descripciones de
los modelos, vistas en cache, información de sesiones, entre otros.

Por ello, asegúrate que el directorio /app/tmp de tu instalación de Cake tenga permisos de escritura
por el usuario del servidor web.


NOTA: Es necesario montar un servidor de aplicaciones PHP con las librerías propias de Cake PHP.
Para ello, puedes descargar el software (servidor de PHP) y el entorno framework (Cake PHP).



3.3. Instalación

Instalar CakePHP puede ser tan simple como colocar el directorio en el servidor, o tan complejo y
flexible como necesites. Esta sección cubrirá los tres tipos principales de instalación para CakePHP:
desarrollo, producción y avanzado.

 Desarrollo: fácil para iniciar, los URL de la aplicación incluyen el nombre del directorio, y es
menos seguro.
 Producción: Requiere la capacidad de configurar el servidor web para definir el "document
root", muy seguro.
 Avanzado: Con cierta configuración, permite ubicar los directorios clave de CakePHP en
diferentes partes del sistema de archivos, para compartir una misma instalación de CakePHP
para varias aplicaciones.


Desarrollo

Usar una instalación de desarrollo es el método más rápido para montar Cake. Este ejemplo te
ayudará a instalar una aplicación de CakePHP y hacerla disponible en
http://www.ejemplo.com/cake_1_2/. Asumimos para el fin de este ejemplo que tu raíz de
documentos está establecido a /var/www/html.

Descomprime los contenidos del archivo Cake en /var/www/html. Ahora tienes una carpeta en tu
raíz de documentos con un nombre dependiente de la versión que te has descargado (p.ej.
cake_1.2.0.7962). Renombra esta carpeta a cake_1_2. Tu configuración de desarrollo será como la
siguiente en el sistema de archivos:

 /var/www/html
 cake_1_2
 /app
 /cake
 /vendors
 .htaccess
 /index.php
 README

INTRODUCCIÓN A CAKE PHP FRAMEWORK


16

Producción

Una instalación de producción es una manera más flexible de instalar Cake. Usar este método
permite que un dominio entero se comporte como una aplicación CakePHP única. Este ejemplo te
ayudará a instalar Cake en cualquier sitio de tu sistema de ficheros y ponerlo disponible en
http://www.ejemplo.com. Tener en cuenta que esta instalación puede requerir los privilegios para
cambiar el DocumentRoot (raíz de documentos) en servidores web Apache.

Descomprime los contenidos del archivo Cake en un directorio a tu elección. Por motivos de ejemplo,
asumimos que escoges instalar Cake en /cake_install. Tu configuración de producción se verá de la
siguiente manera en el sistema de ficheros:

 /cake_install/
 /app
 /webroot (este directorio es el establecido con la directiva DocumentRoot)
 /cake
 /vendors
 /.htaccess
 /index.php
 /README

Los desarrolladores que usan Apache deberán establecer la directiva DocumentRoot para el dominio
a: DocumentRoot /cake_install/app/webroot.

Si tu servidor web está configurado correctamente, deberías encontrar tu aplicación Cake accesible
en http://www.ejemplo.com.


Apache y mod_rewrite (y .htaccess )

A pesar de que CakePHP está hecho para funcionar con mod_rewrite sin tocar nada, y normalmente
así es, hemos notado que algunos usuarios tienen dificultades para lograr que todo funcione
correctamente en sus sistemas.

Aquí hay unas cuantas cosas que puedes probar para conseguir que funcione correctamente.
Primero mira en tu httpd.conf (asegúrate de estar editando el httpd.conf del sistema y que no es
httpd.conf específico de un usuario o del site).

Asegúrate que la reescritura .htaccess esté permitida y que AllowOverride esté establecido a All para
el DocumentRoot adecuado. Deberías ver algo similar a:


# desactivadas en dicho directorio (y sus subdirectorios).

#

# Primero, configuramos "por defecto" para que sea un conjunto de

# características muy generales.

#

INTRODUCCIÓN A CAKE PHP FRAMEWORK


17

<Directory />

OptionsFollowSymLinks

AllowOverrideAll

# Orderdeny,allow

# Denyfromall

</Directory>


Asegúrate de estar cargando el módulo mod_rewrite correctamente. Debes ver algo como:


LoadModulerewrite_modulelibexec/apache2/mod_rewrite.


En muchos sistemas esto estará comentado (comenzando la línea con #) por defecto, así que sólo
tendrás que quitar los símbolos # del principio.

Tras realizar los cambios reinicia Apache para estar seguro de que las opciones de configuración
están activas.

Asegúrate de que tus ficheros .htaccess están en los directorios correctos. Esto puede pasar durante
la copia porque algunos sistemas operativos consideran los archivos que comienzan por '.' como
ocultos y por lo tanto no los copian.

Asegúrate de que tu copia de CakePHP es de las sección de descargas de nuestro site o nuestro
repositorio GIT, y que ha sido desempaquetado correctamente verificando que existen los ficheros
.htaccess.

En el directorio raíz de Cake (necesita ser copiado al directorio, esto redirige todo a tu aplicación de
Cake):


<IfModulemod_rewrite.c>

RewriteEngine on

RewriteRule ^$ app/webroot/ [L]

RewriteRule (.*) app/webroot/$1 [L]

</IfModule>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


18

En el directorio app de Cake (será copiado por bake):


<IfModulemod_rewrite.c>

RewriteEngine on

RewriteRule ^$ webroot/ [L]

RewriteRule (.*) webroot/$1 [L]

</IfModule>


En el directorio webroot de Cake (será copiado a tu webroot de la aplicación por bake):


<IfModulemod_rewrite.c>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule^(.*)$ index.php?url=$1 [QSA,L]

</IfModule>


En muchos servicios de hosting (GoDaddy, 1and1), tu servidor web está realmente siendo servido
desde un directorio de usuario que ya utiliza mod_rewrite. Si estás instalando CakePHP en un
directorio de usuario (http://ejemplo.com/~nombreusuario/cakephp), o en cualquier otra estructura
que ya utilice mod_rewrite necesitarás añadir sentencias RewriteBase a los archivos .htaccess que
utiliza CakePHP (/.htaccess, /app/.htaccess, /app/webroot/.htaccess).

Esto puede ser añadido a la misma sección con la directiva RewriteEngine, así, por ejemplo, tu
archivo .htaccess en el webroot debería ser así:


<IfModulemod_rewrite.c>

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule^(.*)$ index.php?url=$1 [QSA,L]

</IfModule>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


19


<IfModulemod_rewrite.c>

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule^(.*)$ index.php?url=$1 [QSA,L]

</IfModule>


Los detalles de esos cambios dependen de tu configuración, y pueden incluir cosas adicionales que
no están relacionadas con Cake. Consulta la documentación online de Apache para más información.


# desactivadas en dicho directorio (y sus subdirectorios).

#

# Primero, configuramos "por defecto" para que sea un conjunto de

# características muy generales.

#

<Directory />

OptionsFollowSymLinks

AllowOverrideAll

# Orderdeny,allow

# Denyfromall

</Directory>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


20

3.4. Enciéndelo

Muy bien, ahora veamos a CakePHP en acción. Dependiendo de la configuración que hayas usado,
deberías apuntar tu navegador a http://example.com/ o http://example.com/mi_aplicacion/. En este
punto, se te presentará la vista de bienvenida de CakePHP por omisión, y un mensaje que indica el
estado de conexión con la base de datos.

¡Felicidades! Ya estás listo para crear tu primera aplicación CakePHP.


3.5. Configuración

Configurar aplicaciones CakePHP es pan comido. Después de instalar CakePHP, crear una aplicación
web básica sólo requiere aplicar la configuración de una base de datos. Existen, otras configuraciones
opcionales, que puedes realizar con el objetivo de aprovechar las ventajas de la arquitectura flexible
de CakePHP. Puedes agregar fácilmente elementos al núcleo de CakePHP, configurar URL
personalizadas y definir inflexiones.


Configuración de Base de Datos

CakePHP espera que los detalles de configuración de la base de datos estén en
app/config/database.php. Un ejemplo de configuración puede encontrarse en el archivo
app/config/database.php.default. Esta configuración deberá verse como sigue:

var $default = array('driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'cakephpuser',
'password' => 'c4k3roxx!',
'database' => 'mi_proyecto',
'prefix' => ''
) ;

El arreglo de configuración $default es el utilizado a menos que se especifique algún otro en la
propiedad $usDbConfig de los modelos. Por ejemplo, si mi aplicación tiene aplicaciones legadas
adicionales a la que se va a utilizar por defecto, podría utilizarla en mis modelos creando un nuevo
arreglo de configuración $legada que sea similar a $default, y asignado var $useDbConfig = 'legada';
en los modelos correspondientes.

Rellena cada para clave/valor en el arreglo de configuración, como mejor se ajuste a tus necesidades:

INTRODUCCIÓN A CAKE PHP FRAMEWORK


21





Nota que los prefijos son para las tablas, no para los modelos. Por ejemplo, si creaste una tabla join
para tus modelos Torta y Sabor, esta debe llamarse prefijo_sabor_torta ( no
prefijo_sabor_prefijo_torta), y asignar la clave prefix con ‘prefijo_’.

Nombrar correctamente tus tablas (y algunas columnas) según las convenciones pueden librarte de
mucho trabajo de configuración. Por ejemplo, si nombras una tabla como tortas, el modelo Torta y el
controller TortasController, todo funcionará automáticamente si necesidad de tu intervención. Por
convención, utiliza guiones bajos, minúsculas, y nombres en plural para los nombres de tus tablas -
por ejemplo: reposteros, reposterias, sabores.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


22

Configuración del Core

La configuración de la aplicación en CakePHP se encuentra en /app/config/core.php. Este archivo es
una colección de definiciones de variables Configure y definiciones de constantes que determinan
como ha de comportarse la aplicación. Descripción de cada variable y cómo afecta tu aplicación
CakePHP:




NOTA: La configuración de Cache también puede ser encontrada en el archivo core.php.

La clase Configure puede ser utilizada para leer y escribir valores durante la ejecución del programa.
Esto puede ser especialmente útil si desea deshabilitar el nivel de depuración ("debug") para una
sección limita de lógica en tu aplicación.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


23

3.6. Comprensión de las rutas

El enrutamiento permite hacer una relación entre URLs y acciones de los controller. Fue añadido a
CakePHP para hacer más bonitos los URLs, más configurables, y más flexibles. Usar el mod_rewrite
de Apache no es un requisito para utilizar el enrutamiento, pero hará lucir mucho mejor tu barra de
direcciones.


Enrutamiento por Defecto

CakePHP viene configurado con un conjunto de rutas por defecto. Estas rutas te llevarán bastante
lejos en cualquier aplicación. Puedes acceder a una acción directamente desde el URL colocando su
nombre en la petición. También puedes pasar parámetros a las acciones de tus controladores usando
el URL.

Patrón URL de las rutas por defecto:

http://example.com/controlador/accion/param1/param2/param3

El URL /articulos/ver dirige a la acciónver() action del ArticulosController, y /productos/listaCompleta
dirige a la acciónalista_completa() de ProductosController. Si no se especifica ninguna acción en el
URL, se asume que se trata de la acción index().

La configuración inicial de enrutamiento permite pasar parámetros a tus acciones usando el URL. Una
petición para /articulos/ver/25 sería equivalente a llamar ver(25) en el ArticulosController, por
ejemplo.


Parámetros con Nombre

Algo novedoso en CakePHP 1.2 es la habilidad de usar parámetros con nombre (namedparameters).
Puedes nombrar parámetros y enviar sus valores usando el URL. Una petición para
/articulos/ver/titulo:primer+articulo/categoria:general resultaría en una llamada a la accion view() de
ArticulosController. En dicha acción, puedes encontrar los valores del título y la categoría dentro de
$this->passedArgs['titulo'] and $this->passedArgs['categoria'] respectivamente.

Algunos ejemplos que resuman las rutas por defecto pueden resultar útil.

 URL: /monos/saltar Dirige a: MonosController->saltar() ;
 URL: /productos Dirige a: ProductosController->index() ;
 URL: /tareas/ver/45 Dirige a: TareasController->ver(45) ;
 URL: /donaciones/ver/recientes/2001
Dirige a: DonacionesController->ver('recientes', '2001') ;
 URL: /contenidos/ver/capitulo:modelos/seccion:asociaciones
Dirige a: ContenidosController->ver() ;
 $this->passedArgs['capitulo'] = 'modelos';
 $this->passedArgs['seccion'] = 'asociaciones';

INTRODUCCIÓN A CAKE PHP FRAMEWORK


24

Recuerda…

El fichero de configuración de base de datos es Database.php.

Si el Framework no llega a funcionar completamente, debes revisar:
- .htaccess
- Apache y mod_rewrite.

Si una aplicación no funciona inicialmente, con apenas código en el controlador y funcionando el
framework de manera correcta, puede deberse a los Permisos.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


25

4. CONTROLADORES


4.1. Introducción

Un controlador (Controller) se usa para manejar la lógica de cierta sección de su aplicación.
Comúnmente, los controladores (Controllers) son usados para manejar la lógica de un solo modelo
(Model). Por ejemplo, si estás construyendo un sitio de una pastelería, podrías tener un
RecetasController y un IngredientesController para manejar las recetas y sus ingredientes. En
CakePHP, los controladores se nombran según el modelo que manejan, y se ponen siempre en plural.

El modelo Receta es manejado por el RecetasController, el modelo Producto es manejado por el
ProductosController, y así sucesivamente.

Los controladores de su aplicación son sub-clases de la clase AppController de CakePHP, que a su vez
extiende la clase principal Controller. La clase AppController puede ser definida en
/app/app_controller.php y debe contener métodos que son compartidos entre todos los
controladores de su aplicación. AppController es una sub-clase de Controller que es una clase de la
biblioteca estándar de Cake.

Los controladores pueden tener cualquier cantidad de métodos a los que normalmente se les llama
acciones. Las acciones son métodos de controladores en tu aplicación web para mostrar vistas. Una
acción es un único método de un controlador. El Dispatcher de CakePHP ejecuta acciones cuando
una solicitud entrante contiene en su URL el nombre de una acción del controlador. El controlador
estaría ubicado en /app/controllers/recetas_controller.php con el siguiente contenido:


<?php
# /app/controllers/recetas_controller.php
classRecetasController extends AppController
{
function ver($id)

{
//la lógica de la acción va aquí...
}
function compartir($cliente_id, $receta_id)
{
//la lógica de la acción va aquí...
}
function buscar($query)
{
//la lógica de la acción va aquí...
}
}
?>

Para que puedas usar un controlador de manera productiva en tu propia aplicación, repasaremos
algunos de los atributos y métodos provistos por los controladores de CakePHP.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


26

4.2. App controller

La clase AppController es la clase superior a todos los controladores de tu aplicación. AppController
extiende la clase Controller incluida en la librería base de CakePHP. Así, AppController es definida en
/app/app_controller.php como:

<?php class AppController extends Controller

{

}

?>


Las propiedades y métodos creados en tu AppController estarán disponibles para todos los
controladores de tu aplicación. Es el sitio ideal para poner el código que será común a todos los
controladores de tu aplicación. Los Componentes (los cuales veremos después) son lo más utilizado
para el código que se utiliza en la mayoría (pero no necesariamente en todos) los controladores.

Cuando se aplica la herencia a los objetos, CakePHP también realiza un trabajo extra cuando existen
atributos especiales en el controlador, como una lista de componentes o ayudantes utilizados por un
controlador. En estos casos, los arrays del AppControler son combinados con los arrays de la clase
hijo.


Atributos del Controlador

Para ver la lista completa de atributos visite la API de CakePHP.


$name

Los usuarios de PHP4 deberían empezar la definición de sus controladores con el atributo $name.
Este atributo debería ser asignado con el nombre del controlador. Usualmente este es simplemente
el plural del modelo principal al que el controlador está asociado. Esto previene algunos problemas
de distinción de mayúsculas que tiene PHP4 para los nombres de las clases.


<?php

# $name Ejemplo de uso del atributo $name
classRecetasController extends AppController

{
var $name = 'Recetas';
}
?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


27

$components, $helpers y $uses

Los siguientes atributos más comúnmente utilizados del controlador indican a CakePHP qué
ayudantes (helpers), componentes (components), y modelos (models) utilizarás en conjunción con el
controlador actual. Utilizar esos atributos hace que las clases MVC estén disponibles al controlador
como variable de clase($this->ModelName, por ejemplo).

Los controladores tienen acceso a su modelo primario disponible por defecto. Nuestro
RecipesController tendrá disponible la clase modelo Recipe en $this->Recipe, y nuestro
ProductsController también posee el modelo Product en $this->Product.

Los ayudantes (Helpers) Html, Form, y Session están siempre disponibles por defecto, como lo es
SessionComponent.

Veamos cómo decirle a un controlador de CakePHP que planeas utilizar clases MVC adicionales.


<?php class RecipesController extends AppController

{

var $name = 'Recipes';

var $uses = array('Recipe', 'User') ;

var $helpers = array('Ajax') ;

var $components = array('Email') ;

}

?>

Cada una de estas variables es fusionada con sus valores heredados, por lo tanto no es necesario por
ejemplo) declarar le ayudante (helper) Form, o cualquier cosa que es declarada en tu controlador
App.


Atributos Relacionados con la Página: "$layout" y "$pageTitle"

Existen unos pocos atributos en los controladores de CakePHP que te dan control sobre cómo se
colocan tus vistas (views) dentro del diseño (layout).

Al atributo $layout se le puede asignar el nombre de un diseño (layout) guardado en
/app/views/layouts. Especificas un diseño al igualar $layout al nombre del archivo con el diseño
excluyendo la extensión .ctp. Si este atributo no ha sido definido, CakePHP renderiza el diseño por
defecto, default.ctp. Si no has definido un diseño en /app/views/layouts/default.ctp, el diseño por
defecto del núcleo de CakePHP’s será renderizado.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


28

<?php

// Usando <em>$layout</em> para definir un diseño alternativo

class RecipesController extends AppController
{

functionquickSave()
{

$this->layout = 'ajax';
}
}

?>

También puedes cambiar el título de la página (que está localizado en la barra en la parte superior de
tu navegador) utilizando $pageTitle. Para que esto funcione apropiadamente, tu diseño (layout)
necesita incluir la variable $title_for_layout como mínimo entre las etiquetas en la cabecera del
documento HTML.

<?php

// Usando <em>$pageTitle</em> para definir el título de la página

class RecipesController extends AppController

{
functionquickSave()

{
$this->pageTitle = 'Mi título del motor de búsquedas optimizado';
}
}

?>

También puedes establecer el título desde la vista (view) usando $this->pageTitle (Has de incluir la
parte $this->; se recomienda, ya que separa la lógica del diseño y el contenido). Para una página
estática has de usar $this->pageTitle en la vista si quieres un título personalizado.

Si $this->pageTitle no está establecido, se generará automáticamente un título basado en el nombre
del controlador, o el nombre del fichero de la vista en el caso de una página estática.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


29

El Atributo de Parámetros ("$params")

Los parámetros del controlador están disponibles en $this->params en tu controlador de CakePHP.
Esta variable es usada para proporcionar acceso a la información sobre la petición actual. El uso más
común de $this->params es obtener acceso a información que ha sido entregada al controlador a
través de las operaciones POST o GET.


Form

$this->params['form']

Cualquier dato POST de cualquier formulario se almacena aquí, incluyendo información también
hallada en $_FILES.


admin

$this->params['admin']

Almacena un 1 si el diseño (layout) actual está vacío; 0 si no.


isAjax

$this->params['ajax']

Almacena un 1 si la petición actual es una llamada ajax; 0 si no. Esta variable sólo se establece si el
componente RequestHandler es usado en el controlador.


controller

$this->params['controller']

Almacena el nombre del controlador actual que está sirviendo la petición. Por ejemplo, si fue pedida
la URL /posts/view/1, $this->params['controller'] será igual a "posts".


action

$this->params['action']


pass

$this->params['pass']

Almacena la cadena de consulta GET enviada con la petición actual. Por ejemplo, si fue pedida la URL
/posts/view/?var1=3&var2=4, entonces $this->params['pass'] será igual a "?var1=3&var2=4".

INTRODUCCIÓN A CAKE PHP FRAMEWORK


30

url

$this->params['url']

Almacena la URL actual pedida, junto con los pares clave-valor de variables get. Por ejemplo, si se
llamó a la URL /posts/view/?var1=3&var2=4, entonces $this->params['url'] debería contener:


[url] => Array

(

[url] =>posts/view

[var1] => 3


[var2] => 4

)



data


$this->data

Usado para manejar datos POST enviados desde los formularios de FormHelper al controlador.


// El helper FormHelper es usado para crear un elemento de formulario:

$form->text('User.first_name') ;

El cual al ser renderizado, se ve parecido a:

<input name="data[User][first_name]" value="" type="text" />

Cuando el formulario es enviado al controlador mediante POST, los datos aparecen en this->data


// El valor first_name enviado se puede encontrar aquí:

$this->data['User']['first_name'] ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


31

prefix

$this->params['prefix']

Establecido al prefijo de enrutado. Por ejemplo, este atributo contendría la cadena "admin" durante
una petición a /admin/posts/someaction.


named

$this->params['named']

Almacena cualquier parámetro con nombre /clave:valor/ de la cadena de petición de la URL. Por
ejemplo, si se pidió la URL /posts/view/var1:3/var2:4, entonces $this>params['named'] debería
contener el array:


[named] => Array

(

[var1] => 3

[var2] => 4
)


Otros Atributos

Aunque puedes ojear todos los detalles para todos los atributos del controlador en el API, hay otros
atributos del controlador que merecen sus propias secciones en el manual.

El atributo $cacheAction ayuda en el "cacheado" (caching) de vistas (views), y el atributo $paginate
es usado para establecer las opciones por defecto de paginado para el controlador. Para más
información sobre cómo utilizar esos atributos.


persistModel

Usado para crear instancias almacenadas en caché de modelos (Models) un uso de Controlador
(Controller). Cuando se coloca en verdadero (true), todos los modelos relacionados con el
controlador (Controller) se almacenan en caché. Esto puede incrementar el desempeño en muchos
casos.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


32

4.3. Métodos del controlador

Para una lista completa de los métodos del controlador y sus descripciones visita el API de CakePHP.


Interactuando con Vistas

Set(string $variable, mixed $valor)

El método set() es la principal manera de enviar datos desde tu controlador a tu vista (view). Una vez
que has utilizado set(), la variable puede ser accedida en tu vista.


<?php

// Primero pasas datos desde el controlador:

$this->set('color', 'azul') ;

// Después, en la vista, puedes utilizar el dato:

?>

Has seleccionado <?php echo $color; ?>de la tarta.

El método set() también toma una array asociativo como primer parámetro. A menudo, esto puede
ser una manera rápida de asignar un conjunto de información a la vista.

Las claves (keys) serán flexionadas (inflected) antes de ser asignadas a la vista ('clave_con_subrayado'
se convierte en 'claveConSubrayado', etc. ):

<?php

$data = array(

'color' => 'pink',

'type' => 'sugar',

'base_price' => 23.95

) ;

// hace que $color, $type, y $basePrice // estén disponibles a la vista:

$this->set($data);

?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


33

Control de Flujo

Redirect (string $url, integer $status, boolean $exit)

El método de control de flujo que más frecuentemente utilizarás es redirect(). Este método toma su
primer parámetro en forma de URL relativa de CakePHP. Por ejemplo, cuando un usuario ha hecho
un pedido satisfactoriamente, probablemente desearás redirigirle a una ventana de recibo.

functionrealizarPedidos()

{
// La lógina para finalizar el pedido va aquí
if($satisfactorio)
{
$this->redirect(array('controller' => 'pedidos', 'action' => 'gracias')) ;
} else {
$this->redirect(array('controller' => 'pedidos', 'action' => 'confirmar')) ;
}
}

El segundo parámetro de redirect() te permite definir un código de estado HTTP que acompañe la
redirección. Puede que desees usar 301 (movido permanentemente) o 303 (mirar otro),
dependiendo de la naturaleza de la redirección.

El método ejecutará exit() tras la redirección a menos que establezcas el tercer parámetro a false.

Flash (string $message, string $url, integer $pause)

Igualmente, el método flash() es usado para redirigir un usuario a una nueva página tras una
operación. El método flash() es diferente en cuanto que muestra un mensaje antes de enviar al
usuario a otra URL.

El primer parámetro debería contener el mensaje a mostrar, y el segundo parámetro es una URL
relativa a CakePHP. CakePHP mostrará el mensaje en $message durante el número de segundos en
$pause antes de reenviar al usuario a otra página.

Para mensajes flash en la página, cerciórate de echarle un ojo al método setFlash() del componente
SessionComponent.


Recuerda…

Un controlador se usa para manejar la lógica de cierta sección de la aplicación.

Los métodos de los controladores son también llamados Acciones.

El Modelo es:
- Manejado por un controlador.
- Llamado en singular por un controlador denominado en plural.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


34

5. MODELOS


5.1. La comprensión de modelos

Un Modelo representa tu modelo de datos y, en programación orientada a objetos, es un objeto que
representa una "cosa", como un coche, una persona, o una casa. Un blog, por ejemplo, puede
contener varios artículos (posts) y cada artículo puede contener varios comentarios. Los objetos Blog,
Artículo (Post) y Comentario son ejemplos de modelos, cada uno asociado con el otro.

Aquí presentamos un ejemplo simple de definición de modelo en CakePHP:


<?php

classIngredient extends AppModel { var $name = 'Ingredient'; }

?>

Simplemente con esta declaración, se le otorga al modelo Ingredient toda la funcionalidad que
necesitarás para crear consultas junto con guardado y borrado de datos. Estos métodos mágicos
provienen del modelo de herencia de CakePHP. El modelo Ingredient extiende el modelo de
aplicación AppModel, el cual extiende la clase Model, interna de CakePHP. Es esta clase Model
interna la que otorga la funcionalidad a nuestro modelo personalizado, Ingredient.

La clase intermedia AppModel está vacía y reside por defecto dentro de la carpeta /cake/. Redefinir
AppModel te permitirá definir funcionalidad que debería estar disponible a todos los modelos dentro
de tu aplicación. Para hacer eso, necesitas crear tu propio fichero app_model.php que reside en la
raíz de la carpeta /app/.

Crea tu fichero modelo en PHP en el directorio /app/models/ o en un subdirectorio de /app/models/.
CakePHP lo encontrará en cualquier lugar en el directorio. Por convención, debería tener el mismo
nombre que la clase; para este ejemplo, ingredient.php.

CakePHP creará dinámicamente un objeto modelo por ti si no puede encontrar un archivo
correspondiente en /app/models. Esto también significa que si, accidentalmente, nombras tu archivo
de manera errónea (p.ej. Ingredient.php o ingredients.php) CakePHP utilizará AppModel en lugar de
tu archivo de modelo con nombre incorrecto. Si estás tratando de utilizar un método de un modelo
personalizado y estás obteniendo errores SQL, normalmente es porque CakePHP no puede encontrar
tu modelo.

La propiedad $name es necesaria para PHP4 pero opcional para PHP5.

Con tu modelo definido, este puede ser accedido dentro de tu Controlador. CakePHP
automáticamente hará que se pueda acceder al modelo cuando su nombre concuerde con el del
controlador. Por ejemplo, un controlador llamado IngredientsController automáticamente inicializará
el modelo Ingredient y será accesible por el controlador mediante $this->Ingredient.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


35

<?php
classIngredientsController extends AppController

{
function index()
{
//obtiene todos los ingredientes y los pasa a la vista:
$ingredients = $this->Ingredient->find('all') ;
$this->set('ingredients', $ingredients) ;
}
}
?>

Están disponibles los modelos asociados a través del modelo principal. En el siguiente ejemplo, el
modelo Receta (Recipe) tiene una asociación con el modelo Ingrediente (Ingredient).

$this->Recipe->Ingredient->find('all') ;


Como podrás ver en Controllers, puedes atar múltiples modelos al controlador y acceder
directamente desde él. En el siguiente ejemplo, ambos modelos Recipe y User son accesibles desde
el controlador actual.


<?php
classRecipeController extends AppController
{
var $uses = array('Recipe', 'User') ;
function index()
{
$this->Recipe->find('all') ;
$this->User->find('all') ;
}
}
?>

Si no has añadido el modelo a través de la propiedad $uses entonces necesitarás importar el modelo
manualmente e instanciarlo dentro de la acción.

<?php
classRecipeController extends AppController
{
var $uses = array('Recipe') ;
function index()
{
$this->Recipe->find('all') ;
App::import('Model', 'User') ;
$user = new User() ;
$user->find('all') ;
}
}
?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


36

5.2. Creando tablas de bases de datos

A pesar de que CakePHP puede tener orígenes de datos (datasources) que no son manejadas por
sistemas de gestión de bases de datos, la mayoría de las veces lo son. CakePHP está diseñado para
ser agnóstico y funcionará con MySQL, MSSQL, Oracle, PostgreSQL y otros. Puedes crear tus tablas de
base de datos como lo harías normalmente. Cuando creas tus clases del Modelo, automáticamente
se mapean a las tablas que has creado.

Los nombres de las tablas son, por convención, en minúsculas y en plural, con las palabras de los
nombres de tablas de varias palabras separadas por guiones de subrayado (_). Por ejemplo, un
nombre de Modelo de Ingredient espera el nombre de tabla ingredients. Un nombre de Modelo de
EventRegistration debería esperar un nombre de tabla event_registrations. CakePHP inspeccionará
tus tablas para determinar el tipo de dato de cada campo y utiliza esta información para automatizar
varias características como la salida de campos de formulario en la vista.

Los nombres de los campos son, por convención, en minúscula y separados por guiones de
subrayado (_).

Las asociaciones del modelo con el nombre de la tabla pueden ser anuladas con el atributo useTable
del modelo, explicado más adelante en este capítulo.

En el resto de esta sección verás cómo CakePHP "mapea" tipos de campos de bases de datos en tipos
de datos PHP y cómo CakePHP puede automatizar tareas basandose en cómo tus campos están
definidos.

Asociaciones de Tipo de Dato por Base de Datos

Todo RDMS define tipos de datos de manera ligeramente diferente. Dentro de la clase de origen de
datos (o "fuente de datos", datasource) para cada sistema de base de datos, CakePHP "mapea"
dichos tipos a algo que reconoce y crea una interfaz unificada sin importar en qué sistema de bases
de datos necesitas ejecutarlo.
El siguiente desglose describe cómo está "mapeado" cada uno:
MySQL

Un campo de tipo tinyint(1) es considerado booleano por CakePHP.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


37

MySQLi



ADOdb

INTRODUCCIÓN A CAKE PHP FRAMEWORK


38


ORACLE



SQLite

INTRODUCCIÓN A CAKE PHP FRAMEWORK


39

Títulos

Un objeto, en sentido físico, a menudo tiene un nombre o un título con el que referirse. Una persona
tiene un nombre como Juan o Ambrosio o Colega. Una entrada de un blog tiene un título. Una
categoría tiene un nombre.

Al especificar el campo title (título) o name (nombre), CakePHP automáticamente utilizará esta
etiqueta en varias circunstancias:

 Scaffolding — títulos de páginas, etiquetas de fieldset.

 Listas - normalmente utilizado para los desplegables <select>.

 TreeBehavior — reordenación, vistas de árbol.

Si tienes un campo titley un campo name en tu tabla, el campo title será el utilizado.


Creado y modificado ("created" y "modified" )

Al definir un campo created (creado) o modified (modificado) en tu tabla de la base de datos como
campo de tipo datetime, CakePHP reconocerá esos campos y los rellenará automáticamente cuando
un registro sea creado o grabado en la base de datos.

Los campos created y modified serán establecidos a la fecha y hora actuales cuando el registro es
inicialmente añadido. El campo modified será actualizado con la fecha y hora actuales cuando el
registro existente sea grabado.

NOTA: Un campo llamado updated (actualizado) exhibirá el mismo comportamiento que modified.
Estos campos necesitan ser del tipo datetime con el valor por defecto establecido a NULL para ser
reconocidos por CakePHP.



Utilizando UUIDs como Claves Primarias

Las claves primarias son normalmente definidas como campos INT. La base de datos incrementará
automáticamente el campo, comenzando en 1, para cada nuevo registro que se añade.
Alternativamente, si especificas tu clave primaria como CHAR(36), CakePHP generará
automáticamente UUIDs( Identificadores Únicos Universales) cuando son creados nuevos registros.

Un UUID es una cadena de 32 bytes separada por guiones, con un total de 36 caracteres. Por
ejemplo:

550e8400-e29b-41d4-a716-446655440000

Los UUIDs están diseñados para ser únicos, no sólo dentro de una tabla dada, sino también a través
de tablas y bases de datos. Si necesitas que un campo permanezca único a través de sistemas, los
UUIDs son un genial enfoque

INTRODUCCIÓN A CAKE PHP FRAMEWORK


40

5.3. Recuperando tus datos


Find($tipo, $parametros)

find('first', $params)

find('count', $params)

find('all', $params)

find('list', $params)

findAllBy<nombreCampo>(string $valor)

findBy<nombreCampo>(string $valor)

query(string $consulta)

field(string $nombre, string $condiciones, string $orden)

read($fields, $id)


5.4. Guardando tus datos

CakePHP hace que el salvado de los datos del modelo sea instantáneo. Los datos listos para ser
salvados deberán ser pasados al método save() del modelo usando el formato básico siguiente:

Array
(
[NombreModelo] => Array
(
[nombrecampo1] => 'valor'
[nombrecampo2] => 'valor'
)
)

La mayoría de las veces no necesitarás preocuparte por este formato: los ayudantes de CakePHP
HtmlHelper, FormHelper, y métodos de búsqueda empaquetan los datos en este formato. Si estás
usando alguno de los ayudantes, los datos también están convenientemente disponibles en
$this>data para su uso rápido.

En el siguiente ejemplo rápido se muestra una acción de un controlador que usa un modelo de
CakePHP para salvar datos en una tabla de una base de datos:

INTRODUCCIÓN A CAKE PHP FRAMEWORK


41

functionedit($id) {
// Ha POSTeado algún dormulario datos?
if(!empty($this->data))
{
// Si el formulario puede ser validado y salvado...
if($this->Receta->save($this->data)) { // Establede un mensaje flash y redirige.
$this->Session->setFlash("Receta guardada!") ;

$this->redirect('/recetas') ;
}
}
// Si no hay datos de formulario, busca la receta a editar y pásala a la vista
$this->set('receta', $this->Receta->findById($id)) ;
}

Una nota adicional: cuando se llama a save(), los datos pasados a la función como primer parámetro
son validados usando el mecanismo de validación de CakePHP. Si por alguna razón tus datos no se
graban, comprueba si alguna regla de validación se está incumpliendo.

Hay unos pocos métodos relacionados con el salvado que encontrarás útiles:

save(array $datos = null, boolean $validar = true, array $listaCampos = array())

Mostrado arriba, este método graba datos formateados en array. El segundo parámetro ($validar) te
permite eludir la validación, y el tercero ($listaCampos) te permite proveer una lista de campos del
modelo a ser grabados. Como seguridad añadida, puedes limitar los campos grabados a aquellos
listados en $listaCampos.

Una vez que un salvado ha sido completado, el identificador ID del objeto se encuentra en el atributo
$id del objeto del modelo (algo especialmente útil cuando se crean nuevos objetos).

$this->Ingrediente->save($datosNuevos) ;

$nuevoIngredienteId = $this->Ingrediente->id;
Cuando se llama a save() en un bucle, no olvides llamar a create().

create(array $datos = array())

Este método resetea el estado del modelo para grabar nueva información.

Si se pasa el parámetro $datos (usando el formato de array descrito arriba), la instancia del modelo
estará lista para salvar con esos datos (accesibles en $this->data).

saveField(string $nombreCampo, string $valorCampo, $validar = false)

Usado para salvar un único valor de un campo. Establece el ID del modelo ($this>nombreModelo->id
= $id) antes de llamar a saveField(). Cuando usas este método, $nombreCampo debería contener
sólo el nombre del campo, no el nombre del modelo y campo.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


42

Por ejemplo, para actualizar el título de una entrada de un blog, la llamada a saveField desde un
controlador debería parecerse a esto:

$this->Entrada->saveField('titulo', 'Un Nuevo Título para un Nuevo Día') ;

updateAll(array $campos, array $condiciones)
saveAll(array $datos = null, array $opciones = array())
Guardando Datos de Modelos Relacionados (hasOne, hasMany, belongsTo)
Guardando Datos de Modelos Relacionados (HABTM )


5.5. Borrando datos


del(int $id = null, boolean $cascada = true)

Borra el registro identificado por $id. Por defecto, también borra los registros dependientes del
registro especificado a ser borrado.

Por ejemplo, cuando se borra un registro Usuario que está ligado a varios registros Receta:

Si $cascada está establecido a true, los registros Receta relacionados también son borrados si el
valor de dependent en el modelo está establecida a true.

Si $cascada está establecido a false, los registros Receta permanecerán después de que el Usuario
haya sido borrado.

deleteAll(mixed $condiciones, $cascada = true)

De la misma manera que del() y remove(), excepto que deleteAll() borra todos los registros que
cumplen las condiciones dadas. El array $condiciones debería ser pasado como un fragmento SQL o
array.


5.6. Asociaciones - enlazando modelos

Una de las características más potentes de CakePHP es la habilidad para enlazar el mapeado
relacional proporcionado por el modelo. En CakePHP, los enlaces entre modelos son manejados
mediante asociaciones.

Definir relaciones entre diferentes objetos en tu aplicación debería ser un proceso natural. Por
ejemplo, en una base de datos de recetas, una receta puede tener varias revisiones, las revisiones
tienen un único autor, y los autores pueden tener varias recetas. El definir la manera en que
funcionan estas relaciones te permite acceder a tus datos de manera intuitiva y potente.

El propósito de esta sección es mostrarte cómo diseñar, definir y utilizar asociaciones entre modelos
en CakePHP.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


43

Mientras que los datos pueden provenir de una variedad de orígenes, la formá más común de
almacenamiento en aplicaciones web es una base de datos relacional. La mayoría de cosas que cubre
esta sección estará en ese contexto.

Tipos de Relaciones

hasOne

belongsTo

hasMany

hasAndBelongsToMany (HABTM)




5.7. Datasources (fuentes de datos)

DataSources son el enlace entre los modelos y la fuente de datos que cada modelo representa. En
muchos casos, los datos son recuperados de una base de datos relacional, como MySQL, PostgreSQL
o MSSQL. CakePHP se distribuye con varias datasources específicas para varias bases de datos
(consulta los archivos de clases dbo_* class files en cake/libs/model/datasources/dbo/), aquí se lista
un resumen de los mismos para tu comodidad:

 dbo_adodb.php
 dbo_db2.php
 dbo_firebird.php
 dbo_mssql.php
 dbo_mysql.php
 dbo_mysqli.php
 dbo_odbc.php
 dbo_oracle.php
 dbo_postgres.php
 dbo_sqlite.php
 dbo_sybase.php

Cuando se especifica una configuración de conexión a base de datos en app/config/database.php,
CakePHP usa de forma transparente la datasource correspondiente a la base de datos para todas las
operaciones con modelos. Por eso, aunque creas que no sabes nada de datasources, ya las has
estado usando desde siempre.

Todas las fuentes de datos indicadas arriba derivan de una clase base DboSource la cual añade
alguna lógica común a la mayoría de bases de datos relaciones. Si decides crear una datasource
RDBMS, tu mejor apuesta es trabajar a partir de una de ellas (por ejemeplo: dbo_mysql.php o
dbo_mssql.php) La mayor parte de la gente, sin embargo, está interesada en escribir datasources
para fuentes de datos externas, como APIs REST remotas o incluso servidores LDAP. Así que eso es lo
que vamos a examinar en adelante.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


44


Recuerda…

La propiedad $name del modelo es necesaria en PHP4.

Un tipo de relación HABTM significa:
- Tiene y pertenece a muchos.
- Relación de muchos a muchos.

Para hacer llamadas SQL personalizadas usamos el método: Query().

INTRODUCCIÓN A CAKE PHP FRAMEWORK


45

6. VISTAS


6.1. Plantillas de la vista

La capa vista de CakePHP es cómo hablas a tus usuarios. La mayor parte del tiempo tu vista estará
mostrando documentos (X)HTML a los navegadores, pero tal vez necesites servir datos AMF a un
objeto Flash, responder a una aplicación remota mediante SOAP o producir un fichero CSV para un
usuario.

Los ficheros de vista de CakePHP están escritos en PHP plano y tienen la extensión .ctp (CakePHP
Template) por defecto. Estos ficheros contienen toda la lógica de representación necesaria para
obtener los datos recibidos del controlador en un formato que está preparado para la audiencia a la
que estás atendiendo.

Los ficheros de vista se almacenan en /app/views/, en una carpeta nombrada tras el controlador que
usa los ficheros, y nombrada tras la acción a la que corresponde. Por ejemplo, el fichero de vista para
la acción view() del controlador Productos, normalmente, se encontraría en
/app/views/productos/view.ctp.

La capa vista en CakePHP puede estar formada por un número diferentes de partes. Cada parte tiene
usos diferentes, y será tratado en este capítulo:

 layouts (diseños): ficheros de vista que contienen el código de presentación que se
encuentra envolviendo muchas interfaces en tu aplicación. La mayoría de vistas son
'renderizadas' (presentadas) dentro de un layout (diseño).

 elements (elementos): trozo de código de vista más pequeño y reutilizable. Los elementos
generalmente son renderizados dentro de vistas.

 helpers (ayudantes): estas clases encapsulan lógica de vista que es necesaria en muchas
partes en la capa vista. Además de otras cosas, los ayudantes en CakePHP pueden ayudarte a
construir formularios, construir funcionalidad AJAX, paginar los datos del modelo o servir
feeds RSS.


6.2. Layouts

Un diseño contiene el código de presentación que envuelve una vista. Cualquier cosa que quieras ver
en todas tus vistas debería estar situada en un layout.

Los ficheros de diseño deberían situarse en /app/views/layouts. El diseño por defecto de CakePHP
puede ser sustituido creando un nuevo diseño por defecto en /app/views/layouts/default.ctp. Una
vez que ha sido creado un nuevo diseño, el código de la vista renderizado por el controlador se
coloca dentro del diseño por defecto cuando la página es renderizada.

Cuando creas un diseño, necesitas decirle a CakePHP dónde colocar el código para tus vistas. Para
hacer eso, estate seguro que tu diseño incluye un lugar para $content_for_layout (y opcionalmente,
$title_for_layout).

INTRODUCCIÓN A CAKE PHP FRAMEWORK


46

Aquí está un ejemplo de a lo que debería parecerse un diseño por defecto:

<!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">

<head>
<title><?php echo$title_for_layout?></title>
<linkrel="shortcuticon"href="Temario/1755/favicon.ico"type="image/x-icon">
<!-- Incluir ficheros y scripts externos aquí (Mirar el ayudante HTML para más
información -->
<?phpecho$scripts_for_layout ?>
</head>
<body>
<!-- Si quieres algún tipo de menú que mostrar en todas tus vistas,incluyelo aquí -->
<divid="cabecera">
<divid="menu">...</div>
</div>
<!-- Aquí es donde quiero que se vean mis vistas --><?php echo$content_for_layout ?>
<!--Añadir un pie de página a cada página mostrada -->
<divid="pie">...</div>
</body>
</html>


$scripts_for_layout contiene cualquier fichero externo y scripts incluidos con el ayudante HTML
incrustado. Es últil para incluir ficheros javascript y CSS de las vistas.

Cuando uses $html->css() o $javascript->link() en los ficheros de vista, especifica false en el
argumento 'in-line' para colocar el fuente html en $scripts_for_layout. (Mirar API para más detalles
de uso).

$content_for_layout contiene la vista. Aquí es donde será colocado el código de la vista.

$title_for_layout contiene el título de la página.

Para establecer el título para el diseño, es fácil hacerlo en el controlador, estableciendo el valor de la
variable $title_for_layout.

<?php
classUsuariosControllerextends AppController
{
functionverActivos()
{
$this->set('title_for_layout', 'Ver Usuarios Activos') ;
}
}
?>

Puedes crear tantos diseños como desees: simplemente colócalos en el directorio app/views/layouts
e intercambialos dentro de tus acciones del controlador usando la variable $layout del cotrolador, o
la función setLayout().

INTRODUCCIÓN A CAKE PHP FRAMEWORK


47

Por ejemplo, si una sección de mi site incluye un espacio menor con banner de publicidad, debería
crear un nuevo diseño (layout) con el espacio publicitario menor, especificándolo como el diseño
para todas las acciones del controlador haciendo algo como: var$layout=
'publicidad_pequena_pordefecto'.

<?php
classUsuariosControllerextends AppController
{
functionverActivos()
{
$this->set('title_for_layout', 'Ver Usuarios Activos') ;
$this->layout = 'publicidad_pequena_pordefecto';
}
functionverImagen()
{
$this->layout = 'imagen';
//mostrar la imagen del usuario
}
}
?>

CakePHP ofrece dos diseños comunes (además del diseño por defecto de CakePHP) que puedes usar
en tus propias aplicaciones: 'ajax' y 'flash'. El diseño Ajax es útil para contruir las respuestas Ajax; es
un diseño vacío (la mayoría de las llamadas ajax sólo requiren una pocas etiquetas como respuesta,
más que una interfaz completa). El diseño flash es usado por mensajes mostrados por el método
flash() del controlador.

Existen otros tres diseños: xml, js y rss en el núcleo como una manera rápida y fácil de servir
contenido que no sea text/html.


6.3. Elementos

Muchas aplicaciones tienen pequeños bloques de código de presentación que necesita ser repetido
de página en página, algunas veces en diferentes lugares del diseño. CakePHP puede ayudarte a
repetir partes de tu website que necesitan ser reutilizadas. Estar partes reutilizadas son llamadas
Elementos. Anuncios, cajas de ayuda, controles de navegación, menús extras, formularios de login y
llamadas están a menudo implementadas en CakePHP en forma de elementos. Un elemento es
básicamente una minivista que puede ser incluido en otras vistas, en diseños, e incluso dentro de
otros elementos. Los elementos pueden ser usados para hacer una vista más legible, situando el
renderizado de elementos que se repiten en sus propios ficheros. Pueden también ayudarte a
reutilizar fragmentos de contenido en tus aplicaciones.

Los elementos están en la carpeta /app/views/elements/ y tienen la extensión de archivo .ctp. Son
mostrados usando el método element() de la vista.


<?php echo$this->element('cajaayuda'); ?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


48

6.4. Métodos de la vista

Los métodos de la Vista están disponibles para todos los archivos de vistas, elementos y plantillas.
Para llamar a cualquier método de la vista utilice: $this->method()


set(string $var,mixed$value)

Las Vistas tienen un metodoset() que es análogo al set() encontrado en los objetos Controller. Te
permite agregar variables al viewVars. Usando set() desde tu archivo de vista, agregará las variables a
la capa (layout) y elementos (elements) que luego serán renderizados.

En tu archivo vista puedes hacer:

$this->set('activeMenuButton', 'posts') ;


getVar(string $var)

Obtiene el valor de la viewVar con el nombre $var

getVars ()

Obtiene una lista con todas las variables disponibles en el ámbito de la vista actual. Devuelve un
arreglo con los nombres de las variables.

error(int $code, string $name, string $message)

Muestra una página de error al usuario. Usa layouts/error.ctppara renderizar la página.

$this->error(404, 'Notfound', 'This page wasnotfound, sorry') ;


6.5. Temas

Puedes aprovechar los temas (themes), haciendo sencillo el cambio de la apariencia de tu página de
una forma rápida y fácil.

Para usar los temas, necesitas decirle a tu controlador que use la clase ThemeView en lugar de la
clase por defecto View.

classExampleControllerextends AppController
{
var$view= 'Theme';
}
Para declarar qué tema usar por defecto, especifica el nombre del tema en tu controlador.
classExampleControllerextends AppController
{
var$view= 'Theme';
var$theme= 'ejemplo';
}

INTRODUCCIÓN A CAKE PHP FRAMEWORK


49

Los archivos de vista de los temas deben estar dentro de la carpeta /app/views/themed/. Dentro de
la carpeta themed, crea una carpeta usando el nombre de tu tema. Después de eso, la estructura de
carpetas dentro de /app/views/themed/example/ es exactamente igual a /app/views/.

Por ejemplo, el archivo de vista de una acción de edición de un controlador de Posts estaría ubicado
en /app/views/themed/example/posts/edit.ctp. Los archivos de Layout estarían en
/app/views/themed/example/layouts/.

Si un archivo de vista no puede ser encontrado en el tema, CakePHP tratará de localizarlo en la
carpeta /app/views/. De esta forma, puedes crear archivos de vista maestros y simplemente
sobreescribirlos según cada caso dentro de la carpeta de tu tema.

Si tienes archivos CSS o JavaScript que son específicos para tu tema, puedes almacenarlos en una
carpeta de tema dentro de la carpetawebroot/. Por ejemplo, tus hojas de estilo serían almacenadas
en /app/webroot/themed/example/css/ y tus archivos JavaScript estarían en
/app/webroot/themed/example/js/.

Todos los helpers de CakePHP son conscientes de los temas y crearán las rutas correctas
automáticamente. Como con los archivos de vistas, si un archivo no está en la carpeta del tema, se
ubicará por defecto en la carpeta webroot principal.





Recuerda…
Se podría decir que una vista es lo que el usuario ve.
Un layout de CakePhp soporta:
- CSS.
- Javascript.
Es compatible CakePhp con Ajax y Flash.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


50

7. HELPERS


7.1. Usando helpers

Usas helpers en CakePHP haciendo que un controlador sepa de su existencia. Cada controlador tiene
una propiedad $helpers que lista los helpers que estarán disponibles en la vista. Para habilitar un
helper en tu vista, agrega el nombre del helper en el arreglo $helpers del controlador.

<?php
classBakeriesControllerextends AppController
{
var$helpers=array('Form', 'Html', 'Javascript', 'Time') ;
}
?>

También pueden agregar helpers desde dentro de una acción, de esta forma sólo estarán disponibles
para esa acción y no para las demás acciones que permanezcan a ese controlador. Esto ahorra poder
de procesamiento para las demás acciones que no usan el helper, y mantienen al controlador mejor
organizado.

<?php
classBakeriesControllerextends AppController
{
Functionbake
{
$this->helpers[]= 'Time';
}
function mix
{
// El helper Time no es cargado aquí, no estará disponible.
}
}
?>


7.2. Creando helpers

Si un helper del coreno se ajusta a tus necesidades, los helpers son fáciles de crear.

Digamos que quisiéramos crear un helper que pudiera ser usado para mostrar como salida un link
específicamente creado con CSS que lo necesitas en diferentes partes de tu aplicación. Para poder
ajustar tu lógica dentro de la estructura existente de helpers de CakePHP, necesitarás crear una
nueva clase en /app/views/helpers. Llamemos a nuestro helperLinkHelper. El archivo de clase se verá
algo como esto:

<?php
/* /app/views/helpers/link.php */
classLinkHelperextends AppHelper
{
functionmakeEdit($title,$url)
{
// Lógica para crear un link con un formato específico va aqui...

INTRODUCCIÓN A CAKE PHP FRAMEWORK


51

}
}
?>

Existen algunos métodos incluidos en la clase de Helper en CakePHP de la cual quisieras sacar
ventaja:

output(string $string)

Usa esta función para enviar cualquier información de regreso a tu vista.

<?php

functionmakeEdit($title,$url)

{

// Usa la función de salida del helper para enviar

// datos con formato de regreso a la vista:

return$this->output("<div class=\"editOuter\"><a href=\"$url\" class=\"edit\"> $title</a >
</div>") ;
}
?>


7.3. Incluyendo otros helpers

Es posible que necesites usar alguna funcionalidad existente en otro helper. Para hacerlo, puedes
especificar los helpers que deseas utilizar con un arreglo $helpers, con el formato que usarías en un
controlador.

<?php

/* /app/views/helpers/link.php (usando otros helpers) */
classLinkHelperextendsAppHelper

{
var$helpers=array('Html') ;
functionmakeEdit($title,$url)
{
// Usa el helper de HTML para mostrar

// información con formato:

$link=$this->Html->link($title,$url,array('class'=> 'edit')) ;

return$this->output("<div class=\"editOuter\">$link</div>") ;
}
}
?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


52

7.4. Usando tu helper

Una vez hayas creado tu helper y de haberlo colocado dentro de /app/views/helpers/, podrás
incluirlo dentro de tus controllers usando la variable especial $helpers.

Una vez tu controller se haya dado cuenta de esta nueva clase, podrás usarla en los views accediendo
mediante una variable llamada por ese helper:

<!-- crear un link usando el nuevo helper-->

<?phpecho$link->makeEdit('Change this Recipe', '/recipes/edit/5') ?>

Recuerda incluir el FormHelper en el array de $helpers si es apropiado. Los ayudantes HTML y
Session (si esta activa una sesión) siempre estarán disponibles.


7.5. Creando funcionalidad para todos los helpers

Todos los helpers extienden a una clase especial, AppHelper (así como los modelos extienden
AppModel y los controladores extienden AppController). Para crear funcionalidad que podría estar
disponible para todos los helpers, crea /app/app_helper.php.

<?php
class AppHelper extends Helper
{
functioncustomMethod()
{
}
}
?>



7.6. Helpers del core

CakePHP contiene un buen número de helpers que ayudan en la creación de la vista. Ellos asisten en
crear notación (markup) con buen formato (incluyendo formas), ayudan a dar formato a texto,
tiempo y números, y también pueden acelerar la funcionalidad de Ajax.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


53

Aquí está un resumen de los helpers disponibles por defecto.











Recuerda…
El Helper que ayuda a crear paginaciones de datos es Paginator.

El Helper que crea formularios es Form.

Un Helper puede ser compatible con XML, mediante el helper XML.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


54

8. SCAFFOLDING


8.1. Scaffolding

El scaffolding (creación de plataformas temporales) en aplicaciones es una técnica que permite a un
desarrollador definir y crear aplicaciones básicas que pueden crear, retirar, actualizar y borrar
objetos. El scaffolding en CakePHP también permite a los desarrolladores definir cómo los objetos
están relacionados unos con otros, y para crear y romper estos enlaces.

Todo lo que se necesita para crear un scaffold (plataforma temporal) es un modelo y su controlador.
Una vez que se declare la variable $scaffold en el controlador, ya estás listo y corriendo.

El scaffolding de CakePHP es bastante agradable. Te permite tener una aplicación CRUD básica
funcional en minutos. Es tan agradable, que querrás usarla en aplicaciones de producción. Ahora,
nosotros pensamos que es agradable también, pero por favor, ese cuenta lo que el scaffoldding
(plataforma temporal) es... bueno... es solo una plataforma temporal. Su estructura flexible la
deshaces rápidamente al inicio de un proyecto para poder iniciar. No fue pensada para ser
completamente flexible, fue pensada como una manera temporal de iniciar un proyecto
rápidamente. Si usted se encuentra realmente tratando de personalizar la lógica en sus vistas, es
momento de derrumbar su scaffolding para poder escribir más código.

Scaffolding es una gran manera de iniciar las primeras partes de una aplicación web iniciada. Los
esquemas de bases de datos tempranos son sujetos a cambios, lo cual es perfectamente normal en
una parte temprana del proceso de diseño. Esto tiene su inconveniente: un desarrollador web
detesta formas que nunca serán utilizadas.

Para reducir el estrés en el desarrollador, el scaffolding ha sido incluido en CakePHP. El scaffolding
analiza sus tablas en la base de datos y crea listas estándar con botones de agregar, borrar y editar,
forms estándar para editar y vistas estándar para inspeccionar un único elemento en la base de
datos.

Para agregar scaffolding a tu aplicación, en el controlador, agrega la variable $scaffold:

<?php
classCategoriesControllerextends AppController

{
var$scaffold;

}
?>

Si has creado la clase básica del modelo Category en el archivo /app/models/category.php, ya estás
listo para comenzar!. Visita http://example.com/categories para ver tu nuevo scaffold.

El crear métodos en controladores que se hayan sido "scaffoldeados" puede causar resultados no
deseados. Por ejemplo, si crea un método index() en un controlador "scaffoldeado", su método index
será mostrado en lugar que la funcionalidad de scaffoling.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


55

El scaffolding es reconocido por sus asociaciones de modelos, así que si tu modelo Category
pertenece a un User ["belongsTo" User], usted verá las IDs del modelo User relacionadas en el listado
del modelo Category. Si usted quisiera ver algo aparte de un ID (como el apellido del usuario), lo
logrará activando la variable $displayField en el modelo.

Inicializaremos la variable $displayField en nuestra clase de User para que los usuarios relacionados
con categorías serán mostrados por el primer nombre en lugar de solo el ID en el scaffolding. Esta
característica hace el scaffolding más leíble en muchas instancias.

<?php
class User extends AppModel

{
var$name= 'User';

var$displayField= 'first_name';
}
?>



Creando un simple interface Admin con scaffolding

Debes tener habilitada el enruta del admin en app/config/core.php, con
Configure::write('Routing.prefixes', array('admin'));una vez habilitada, podrás usar scaffolding para
generar el interface Admin.

Una vez habilitado asigne su prefijo a una variable scaffolding.

var$scaffold= 'admin';

Ahora tendrás acceso a acciones adminscafoldeadas:

 http://example.com/admin/controller/index
 http://example.com/admin/controller/view
 http://example.com/admin/controller/edit
 http://example.com/admin/controller/add
 http://example.com/admin/controller/delete

Esta una manera fácil de crear un simple interface “backend” de manera rápida. Tenga en cuenta que
no podrás tener admins creados con scaffolding y sin esta técnica, de manera simultánea. Aun así,
puedes usar un scaffolding sin interface Admin e incluir métodos individuales y/o reemplazarlos por
sus propios.

functionadmin_view($id=null)
{

//customcodehere
}

INTRODUCCIÓN A CAKE PHP FRAMEWORK


56

Una vez hayas reemplazado a una acción scafoldeada necesitarás crear un fichero View para tal
acción.


Personalizando Vistas Scaffold

Si estás buscando para algo un poco diferente a tus vistas scaffolded, puedes crear templates.
Nosotros aún no recomendamos esta técnica para aplicaciones de producción, pero semejante
personalización puede ser muy útil durante el desarrollo de prototipos.

La personalización se hace creando templates de vistas:

Vistas personalizadas para un controlador específico (para este ejemplo PostsController) debe ser
colocado como lo siguiente:

 /app/views/posts/scaffold.index.ctp
 /app/views/posts/scaffold.show.ctp
 /app/views/posts/scaffold.edit.ctp
 /app/views/posts/scaffold.new.ctp

Las vistas scaffolding personalizadas para todos los controladores deberían ser colocadas como las
siguientes:

 /app/views/scaffolds/index.ctp
 /app/views/scaffolds/show.ctp
 /app/views/scaffolds/edit.ctp
 /app/views/scaffolds/new.ctp
 /app/views/scaffolds/add.ctp



8.2. Constantes y funciones globales

Aunque en la mayor parte de nuestro trabajo diario en CakePHP utilizaremos clases y métodos
nativos, es útil conocer una serie de funciones globales que ofrece CakePHP. Muchas de ellas están
orientadas al trabajo con las clases de CakePHP (cargando las clases de modelo o componente), pero
muchas otras hacen más sencillo trabajar con matrices o cadenas.

También veremos en esta sección algunas de las constantes disponibles en las aplicaciones CakePHP.
Usarlas ayuda a realizar actualizaciones menos complicadas, además de ser útiles a la hora de
referenciar ciertos archivos o directorios en nuestras aplicaciones CakePHP.

Funciones globales

Éstas son las funciones globales disponibles en CakePHP. Muchas de ellas simplemente facilitan la
llamada a funciones de PHP con nombres largos, pero otras (como vendor() y uses()) se pueden usar
para incluir código o realizar otras funciones útiles. Lo más probable es que si estás buscando una
función para realizar una tarea con mucha frecuencia, la encuentres aquí.

(string$string_id, boolean $return=false)

INTRODUCCIÓN A CAKE PHP FRAMEWORK


57

Esta función gestiona la localización en las aplicaciones CakePHP. El parámetro $string_ididentifica la
ID de una traducción, mientras que el segundo parámetro indica si se debe mostrar
automáticamente la cadena (por defecto), o devolverla para su procesamiento (pasar el valor true
para que esto suceda).

a(mixed$uno,$dos,$tres...)

Devuelve un array con los parámetros pasados a la función.

print_r(a('foo', 'bar'));
// salida:
array(
=> 'foo',
=> 'bar'
)

aa(array$uno,$dos,$tres...)

Crea arrays asociativos a partir de los parámetros enviados a la función.

// salida:

array( 'a'=> 'b' )

am(array$uno,$dos,$tres...)

Combina todos los arrays pasados como parámetros y devuelve el array resultante


config

Puede ser usado para cargar archivos desde el directorio config mediante include_once. La función
comprueba si existe el archivo antes de incluir y regresa un booleano. Toma un número opcional de
argumento.

Ejemplo:config('some_file', 'myconfig') ;


convertSlash(string $cadena)
Sustituye las barras ("/") por subrayados ("_") y elimina el primer y el último subrayados en una
cadena. Devuelve la cadena convertida.

debug(mixed$var, boolean $showHtml=false)
Si el nivel de depuración, variable de configuración DEBUG, es distinto de cero, se muestra $var. Si
$showHTML es true, los datos se formatean para mostrarlos adecuadamente en los navegadores
web.

e(mixed$datos)
Simplifica la llamada a la función echo().

INTRODUCCIÓN A CAKE PHP FRAMEWORK


58

env(string $key)
Obtiene una variable de entorno a partir de las fuentes disponibles. Alternativa si las variables
$_SERVER o $_ENV están deshabilitadas.

También permite emular las variables PHP_SELF y DOCUMENT_ROOT en los servidores que no
permitan su uso. De hecho, es una buena práctica usar env() en lugar de $_SERVER o getenv() (sobre
todo si pensamos distribuir el código), ya que ofrece la misma funcionalidad y es totalmente
compatible.

fileExistsInPath(string $archivo)
Comprueba que el fichero $archivo está en el include_path actual de PHP. Devuelve un valor
booleano.

h(string $texto, string $charset)
Alias de la función htmlspecialchars().

ife($condicion,$siNoVacia,$siVacia)
Útil en operaciones ternarias. Si $condicion no es vacía, devuelve $siNoVacia; si no, devuelve
$siVacia.

low(string $cadena)
Alias de la función strtolower().

pr(mixed$var)
Alias de la función print_r(), añadiendo la etiqueta <pre> a la salida.

r(string $cadena_buscada, string $cadena_sustituta, string $cadena_original)
Alias de la función str_replace().

up(string $cadena)
Alias de la función strtoupper().

uses(string $lib1,$lib2,$lib3...)
Permite cargar las librerías nativas de CakePHP (localizadas en cake/libs/). Pasar como parámetro el
nombre de la librería sin la extensión '.php'.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


59

Constantes predefinidas





Recuerda…
El térmico CRUD es usado para referirse a las funciones básicas en bases de datos.

El significado de CRUD es Create, Read, Update y Delete.

Scaffolding está ideado:
- Para arrancar un proyecto temporalmente.
- Para crear rápidamente una estructura de proyecto.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


60

9. TAREAS COMUNES CON CAKEPHP



9.1. Validación de datos

La validación de los datos es una parte importante de cualquier aplicación, ya que asegura que los
datos en un modelo están conformes a las reglas de negocio de la aplicación. Por ejemplo, podrías
querer que los passwords tengan a lo menos un largo de ocho caracteres, o asegurar que los
username sean únicos. Definir reglas de validación hace que el manejo de los formularios sea
muchísimo más fácil.

Hay muchos diferentes aspectos del proceso de validación. En esta sección cubriremos el lado del
modelo, es decir, lo que ocurre cuando tu llamas al método save() de tu modelo. Para más
información acerca de cómo manejar el despliegue de errores de validación, revisa la sección que
cubre el FormHelper.

El primer paso en la validación de datos es la creación de las reglas de validación en el Modelo.

Para hacer eso, usa el arreglo Model::validate en la definición del Modelo, por ejemplo:

<?php

class User extends AppModel

{

var $name = 'User';

var $validate = array() ;

}

?>

En el ejemplo de arriba, el arreglo $validate se agrega al modelo User, pero el arreglo no contiene
reglas de validación. Asumiendo que la tabla users tiene los campos login, password, email y born, el
ejemplo de abajo muestra algunas simples reglas de validación que se aplican a esos campos:


<?php
class User extends AppModel
{
var $name = 'User';
var $validate = array('login' => 'alphaNumeric',
'email' => 'email',
'born' => 'date'
) ;
}
?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


61

El ejemplo muestra cómo se pueden agregar reglas de validación a los campos de un modelo. Para el
campo login serán aceptadas sólo letras y números, el email debe ser válido, y born debe ser una
fecha válida. La definición de reglas de validación habilitan en CakePHP el despliegue automático de
mensajes de error en formularos si los datos enviados no cumplen las reglas de validación.

CakePHP incluye muchas reglas de validación y usarlas puede ser bastante simple. Algunas de las
reglas incluidas permiten verificar el formato de los emails, URLs, y números de tarjeta de crédito -
las cubriremos en detalle más adelante.

Acá tenemos un ejemplo de validación más complejo que aprovecha algunas de las reglas incluidas:

<?php class User extends AppModel {
var $name = 'User';
var $validate = array(
'login' =>array(
'alphaNumeric' =>array(
'rule' => 'alphaNumeric',
'required' => true,
'message' => 'Sólo letras y números'
) ,
'between' =>array(

'rule' =>array('between', 5, 15) ,

'message' => 'Entre 5 y 15 caracteres'
)
) ,
'password' =>array(
'rule' =>array('minLength', '8') ,
'message' => 'Largo mínimo de 8 caracteres'
) ,
'email' => 'email',

'born' =>array(

'rule' => 'date',

'message' => 'Ingrese una fecha válida',

'allowEmpty' => true
)
) ;
}
?>

Dos reglas de validación son definidas para login: debería contener sólo letras y números, y su largo
debe ser de 5 a 15. El campo password debe tener un largo mínimo de 8 caracteres. El email debe
contener una dirección de correo válida, y born debe ser una fecha válida. Además, notar que puedes
agregar mensajes de error propios que CakePHP mostrará cuando estas reglas de validación no se
cumplan.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


62

Como lo muestra el ejemplo de arriba, un único campo puede tener múltiples reglas de validación. Y
si las reglas incluidas no coinciden con lo que necesitas, puedes agregar tus propias reglas de
validación según tus requerimientos.

Ahora que viste a grandes rasgos cómo funciona la validación, veamos cómo estas reglas son
definidas en el modelo. Hay tres diferentes maneras para definir reglas de validación: arreglos
simples, una única regla por campo, y múltiples reglas por campo.



9.2. Reglas simples

Tal como el nombre lo sugiere, esta es la manera más simple de definir una regla de validación.

La sintaxis para la definición de reglas usando esta manera es:

var $validate = array('fieldName' => 'ruleName');

Donde, 'fieldName' es el nombre del campo para el cual se está definiendo una regla, y 'ruleName' es
el nombre de una regla pre-definida.

Una regla por campo

Ésta técnica de definición permite un mejor control del funcionamiento de las reglas de validación.
Pero antes de su discusión, veamos el patrón de uso general para agregar una regla a un solo campo:


var $validate = array( 'fieldName1' => array(

'rule' => 'ruleName', // ó: array('ruleName', 'param1', 'param2' ...)

'required' => true,

'allowEmpty' => false,

'on' => 'create', // ó: 'update'

'message' => 'Su mensaje de error'

)

) ;

El índice 'rule' es requerido. Si sólo se setea 'required' => true la validación del formulario no
funcionará correctamente. Esto debido a que 'required' no es en realidad una regla.

Como puedes ver, cada campo (arriba se está mostrando sólo un campo) es asociado con un arreglo
que contiene cinco índice: ‘rule’, ‘required’, ‘allowEmpty’, ‘on’ y ‘message’. Veamos con más detalle
cada uno de estos índices.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


63

rule

El índice ‘rule’ define el método de validación y acepta un sólo valor o un arreglo. El valor para ‘rule’
especificado puede ser el nombre de un método en tu modelo, un método de la clase coreValidation,
o una expresión regular. Para un completo listado de todas las reglas incorporadas ver la sección
llamada "Reglas de Validación Incorporadas".

Si la regla no requiere parámetros, ‘rule’ puede ser un sólo valor, por ejemplo:

var $validate = array(

'login' =>array(

'rule' => 'alphaNumeric'

)

) ;

Si la regla requiere algunos parámetros (como max, min o range), entonces ‘rule’ debería ser un
arreglo:

var $validate = array(

'password' =>array(

'rule' =>array('minLength', 8)

)

) ;

Recuerda, el índice ‘rule’ es requerido para la definición de reglas basadas en arreglos.


required

Este índice debería tener asignado un valor booleano. Si ‘required’ es true, el campo debe estar
presente en el arreglo de datos. Por ejemplo, si la regla de validación ha sido definida de la siguiente
manera:

var $validate = array(

'login' =>array(

'rule' => 'alphaNumeric',

'required' => true

) ) ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


64


Los datos enviados al método save() del modelo deben contener un valor para el campo login. Si no
es así, la validación falla (la regla no se cumple). El valor por defecto para este índice es un false
booleano.

Si el índice login está presente pero no tiene un valor asignado, la validación será exitosa.

Setear ‘required’ a true sólo verifica que el índice del campo este presente.


allowEmpty

Al índice allowEmpty se le debería asignar un valor booleano. Si allowEmpty es false, los datos
pasados al método save() del modelo deben incluir el campo a un valor no-vacío para ese campo.
Cuando se deja en true, un campo vacío pasará exitosamente la validación de ese campo.

El valor por defecto de allowEmpty es null. Esto significa que el campo siempre procesará las reglas
de validación incluyendo la ejecución de funciones de validación propias.


on

El índice ‘on’ puede ser seteado con uno de los siguientes valores: ‘update’ o ‘create’. Esto provee un
mecanismo que permite que cierta regla sea aplicada ya sea durante la creación de un nuevo
registro, o durante la actualización de un registro.

Si la regla fue definida como ‘on’ => ‘create’, entonces la regla sólo será verificada durante la
creación de un nuevo registro. De igual manera, si es definida como ‘on’ => ‘update’, la regla sólo
será verificada durante la actualización de un registro.

El valor por defecto de ‘on’ es null. Cuando ‘on’ es null, la regla será verificada durante la creación y
actualización de un registro.


message

El índice ‘message’ permite definir un mensaje de error de validación para la regla:


password' =>array(

'rule' =>array('minLength', 8) ,

'message' => 'Password debe tener a lo menos 8 caracteres'
)

) ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


65

9.3. Múltiples reglas por campo

La técnica descrita anteriormente nos entrega mayor flexibilidad que la asignación de reglas simples,
pero hay un paso adicional que podemos tomar para lograr un control más fino de la validación de
datos. La siguiente técnica que revisaremos nos permite asignar múltiples reglas de validación por
cada campo de un modelo.

Si quieres asignar múltiples reglas de validación a un sólo campo, básicamente así es cómo se verá:

var $validate = array(

'nombreCampo' =>array(

'nombreRegla' =>array(

'rule' => 'nombreRegla',

// aquí van índices extra como on, required, etc.

) ,

'nombreRegla2' =>array(

'rule' => 'nombreRegla2',

// aquí van índices extra como on, required, etc.

)

)

) ;

Como puedes ver, esto es bastante similar a lo que hicimos en la sección previa. Anteriormente, por
cada campo teníamos un sólo arreglo con parámetros de validación. En este caso, cada
‘nombreCampo’ consiste en un arreglo de índices de reglas. Cada ‘nombreRegla’ contiene un arreglo
distinto con parámetros de validación.

Esto se entiende mejor con un ejemplo práctico:

&login' =>array(

'alphanumeric' =>array(

'rule' => 'alphaNumeric',

'message' => 'Se permiten sólo letras y números',

'last' => true

) ,

'minlength' =>array(

INTRODUCCIÓN A CAKE PHP FRAMEWORK


66


'rule' =>array('minLength', '8'),

'message' => 'Largo mínimo de 8 caracteres'

),

)

) ;

El ejemplo de arriba define dos reglas para el campo login: alphanumeric y minLength. Como puedes
ver, cada regla se identifica con un nombre de índice. En este caso particular, los nombres de índice
son similares a las reglas que usan, pero el nombre de índice puede ser cualquier nombre.

Por defecto CakePHP trata de validar un campo usando todas las reglas de validación declaradas para
él y retorna un mensaje de error para la última regla no satisfecha. Pero si el índice last es dejado
como true y la regla no es satisfecha, entonces se mostrará el mensaje de error para esa regla y no se
validará ninguna regla adicional. Así que si prefieres mostrar un mensaje de error para la primera
regla no satisfecha entonces debes dejar 'last' => true por cada regla.

Si vas a usar mensajes de error internacionalizados podrías especificar los mensajes de error en las
vistas:

echo $form->input('login', array('label' => __('Login', true),

'error' =>array(

'alphanumeric' => __('Se permiten sólo letras y números', true) ,

'minlength' => __('Largo mínimo de 8 caracteres', true)

)

) ) ;

El campo ahora está totalmente internacionalizado, y puedes eliminar los mensajes del modelo.



9.4. Reglas de validación incorporadas

La clase Validation de CakePHP contiene muchas reglas de validación incorporadas que pueden hacer
mucho más fácil la validación de datos. Esta clase contiene muchas técnicas de validación
frecuentemente usadas que no necesitarás escribir por tu cuenta. A continuación encontrarás una
lista completa de todas las reglas, junto ejemplos de uso.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


67


alphaNumeric

Los datos para el campo deben contener sólo letras y números.

var $validate = array(

'login' =>array(

'rule' => 'alphaNumeric',

'message' => 'Los nombres de usuario deben contener sólo letras y números.'
)
) ;


between

El largo de los datos para el campo debe estar dentro de un rango numérico específico. Se debe
indicar un valor mínimo y máximo.

var $validate = array(

'password' =>array(

'rule' =>array('between', 5, 15) ,

'message' => 'Las contraseñas deben tener un largo entre 5 y 15 caracteres.'
)
) ;



blank

Esta regla es usada para asegurar que el campo es dejado en blanco o con sólo espacios en blanco
como su valor. Los espacios en blanco incluyen los caracteres de la barra espaciadora, tabulador,
retorno de carro y nueva línea.

var $validate = array(

'id' =>array(

'rule' => 'blank',

'on' => 'create'
)
) ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


68

boolean

El campo debe contener un valor booleano. Los valores aceptados son “true” o “false”, los enteros 0
o 1 y las cadenas "0" o "1".


var $validate = array(

'myCheckbox' =>array(

'rule' =>array('boolean') ,

'message' => 'Valor incorrecto en myCheckbox'
)

) ;


cc

Esta regla es usada para verificar si los datos corresponden a un número de tarjeta de crédito válido.
Acepta tres parámetros: ‘type’, ‘deep’ y ‘regex’.

El ‘type’ puede ser ‘fast’, ‘all’ o cualquiera de los siguientes:

 bankcard
 diners
 disc
 electron
 enroute
 jcb
 maestro
 mc
 solo
 switch
 visa
 voyager

Si ‘type’ es dejado en ‘fast’, se validan los datos contra el formato numérico de las principales tarjetas
de crédito. También se puede dejar ‘type’ como un arreglo con todos los tipos de validaciones que se
quiere satisfacer.

El índice ‘deep’ debería dejarse con un valor booleano. Si es verdadero, la validación usará el
algoritmo de Luhn para tarjetas de crédito (http://en.wikipedia.org/wiki/Luhn_algorithm). Por
defecto el valor se asume como falso.

El índice ‘regex’ permite indicar una expresión regular propia que será usada para validar el número
de tarjeta de crédito.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


69

var $validate = array(

'ccnumber' =>array(

'rule' =>array('cc', array('visa', 'maestro'), false, null) ,

'message' => 'El número de tarjeta de crédito que ha suministrado no es válido.'
)
) ;



comparison

Esta regla es usada para comparar valores numéricos. Soporta “is greater”, “is less”,
“greaterorequal”, “lessorequal”, “is less”, “equalto”, y “notequal”. A continuación algunos ejemplos:

var $validate = array(

'age' =>array(

'rule' =>array('comparison', '>=', 18) ,

'message' => 'Debe tener al menos 18 años para calificar.'
) ) ;
var $validate = array(

'age' =>array(

'rule' =>array('comparison', 'greaterorequal', 18) ,

'message' => 'Debe tener al menos 18 años para calificar.'
)
) ;


date

Esta regla asegura que los datos enviados estén en un formato de fecha válido. Un único parámetro
(que puede ser un arreglo) puede ser pasado y que será usado para verificar el formato de la fecha
indicada. El valor del parámetro puede ser uno de los siguientes formatos:

‘dmy’ por ejemplo 27-12-2006 o 27-12-06 (los separadores pueden ser espacio, punto, guion,
slash).

‘mdy’ por ejemplo 12-27-2006 or 12-27-06 (los separadores pueden ser espacio, punto, guion,
slash).

‘ymd’ por ejemplo 2006-12-27 or 06-12-27 (los separadores pueden ser espacio, punto, guion,
slash).

‘dMy’ por ejemplo 27 December 2006 o 27 Dec 2006.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


70


‘Mdy’ por ejemplo December 27, 2006 o Dec 27, 2006 (la coma es opcional).

‘My’ por ejemplo (December 2006 o Dec 2006).

‘my’ por ejemplo 12/2006 o 12/06 (los separadores pueden ser espacio, punto, guion, slash).

Si no especifica ningún índice, se usará el índice por defecto ‘ymd’.

var $validate = array(

'born' =>array(

'rule' => 'date',

'message' => 'Ingrese una fecha válida usando el formato AA-MM-DD.',

'allowEmpty' => true

)
) ;

Mientras que muchos almacenes de datos (motores de bases de datos) requieren cierto formato de
datos, podrías considerar aceptar una amplia variedad de formatos de fechas y luego convertirlos, en
vez de forzar a los usuarios a ingresar cierto formato. Entre más trabajo puedas hacer por tus
usuarios, mejor.


decimal

Esta regla asegura que el dato es un número decimal válido. Se puede pasar un parámetro para
especificar la cantidad de dígitos requeridos después del punto decimal. Si no se pasa ningún
parámetro, el dato será validado como un número de punto flotante científico, que causará que la
validación no sea satisfecha si es que no se encuentra ningún dígito después del punto decimal.

var $validate = array(

'price' =>array(

'rule' =>array('decimal', 2)

)
);

INTRODUCCIÓN A CAKE PHP FRAMEWORK


71

email

Esta regla verifica que el dato sea una dirección de correo electrónico válida. Al pasar un valor
booleano verdadero como segundo parámetro se tratará también de verificar que el host de la
dirección sea válido.

var $validate = array('email' => array('rule' => 'email')) ;

var $validate = array(

'email' =>array(

'rule' =>array('email', true) ,

'message' => 'Por favor indique una dirección de correo electrónico válida.'

)

) ;


equalTo

Esta regla asegura que el valor sea equivalente a, y del mismo tipo que el valor indicado.

var $validate = array(

'food' =>array(

'rule' =>array('equalTo', 'cake'),

'message' => 'El valor debe ser el string cake'

)

) ;


extension

Esta regla verifica que la extensión de archivo sea como .jpg o .png. Para permitir múltiples
extensiones estas se deben pasar dentro de un arreglo.

var $validate = array(
'image' =>array(

'rule' =>array('extension', array('gif', 'jpeg', 'png', 'jpg') ,

'message' => 'Por favor indique una imágen válida.'

)
) ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


72

ip

Esta regla asegura que haya sido ingresada una dirección IPv4 válida.

var $validate = array(

'clientip' =>array(

'rule' => 'ip',

'message' => 'Por favor ingrese una dirección IP válida.'

)

) ;


isUnique

El dato para este campo debe ser único, no puede ser usado por ningún otro registro.

var $validate = array(

'login' =>array(

'rule' => 'isUnique',

'message' => 'Este nombre de usuario ya ha sido asignado.'

)

) ;

minLength

Esta regla asegura que el dato cumple con un requisito de largo mínimo.

var $validate = array(

'login' =>array(

'rule' =>array('minLength', '8'),

'message' => 'Los nombres de usuario deben tener un largo de al menos 8 caracteres.'
)
);

INTRODUCCIÓN A CAKE PHP FRAMEWORK


73

maxLength

Esta regla asegura que el dato siempre esté dentro del requisito de largo máximo.


var $validate = array(

'login' =>array(

'rule' =>array('maxLength', '15'),

'message' => 'Los nombres de usuario no pueden tener un largo mayor a 15 caracteres.'
)
);


money

Esta regla asegura que el valor sea una cantidad en formato monetario válido.

El segundo parámetro define dónde se ubica el símbolo: left/right (izquierda/derecha).

var $validate = array(

'salary' =>array(

'rule' =>array('money', 'left') ,

'message' => 'Por favor ingrere una cantidad monetaria válida.'
)
) ;


multiple

Empleado para validar campos input selectmultiple. Soporta los paramentros "in", "max" y "min".

var $validate = array(

'multiple' =>array(

'rule' =>array('multiple', array('in' => array('foo', 'bar'), 'min' => 1, 'max' => 3)) ,

'message' => 'Por favor seleccione una, dos o tres opciones'
)
) ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


74

inList

Esta regla asegura que el valor está dentro de un conjunto dado. Necesita de un arreglo de valores. El
valor es válido si coincide con uno de los valores del arreglo indicado.

var $validate = array('function' => array(

'allowedChoice' =>array(

'rule' =>array('inList', array('Foo', 'Bar')) ,

'message' => 'Ingreso Foo o ingrese Bar.'
)
)
) ;


numeric

Verifica si el dato ingresado es un número válido.

var $validate = array(

'cars' =>array(

'rule' => 'numeric',

'message' => 'Por favor indique la cantidad de vehículos.'
)
) ;


notEmpty

Regla básica para asegurar que un campo no este vacío.

var $validate = array(

'title' =>array(

'rule' => 'notEmpty',

'message' => 'Este campo no puede quedar vacío.'
)
) ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


75

range

Esta regla asegura que el valor esté dentro de un rango dado. Si no se indica un rango, la regla va a
verificar si el valor es un número finito válido en la actual plataforma.

var $validate = array(

'number' =>array(

'rule' =>array('range', 0, 10) ,

'message' => 'Por favor ingrese un número entre 0 y 10'

)

) ;

El ejemplo de arriba aceptará cualquier valor mayor a 0 (por ejemplo 0.01) y menor a 10 (por
ejemplo 9.99).


url

Esta regla verifica formatos de URL válidos. Soporta los protocolos http(s), ftp(s), file, news, y gopher.

var $validate = array(

'website' =>array('rule' => 'url')

) ;


9.5. Reglas de validación personalizadas

Si hasta el momento no has encontrado lo que buscabas, siempre podrás crear tus propias reglas de
validación personalizadas. Hay dos maneras de hacer esto: definiendo expresiones regulares
personalizadas, o creando métodos de validación personalizados.

Validación Personalizada Mediante Expresiones Regulares

Si la técnica de validación que necesitas usar puede ser completada usando expresiones regulares,
puedes definir una expresión personalizada como una regla de validación de un campo.

var $validate = array(

'login' =>array(

'rule' =>array('custom', '/^[a-z0-9]{3,}$/i'),

'message' => 'Sólo letras y enteros, mínimo 3 caracteres'
)
) ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


76

El ejemplo de arriba verifica si login contiene sólo letras y enteros, con un largo mínimo de tres
caracteres.

Validación Mediante Métodos Personalizados

Algunas veces revisar los datos usando expresiones regulares no es suficiente. Por ejemplo, si quieres
asegurar que un código promocional sólo pueda ser usado 25 veces, necesitas agregar una función
de validación personalizada, como se muestra más abajo:

<?php

class User extends AppModel

{
var $name = 'User';
var $validate = array('promotion_code' => array(
'rule' =>array('limitDuplicates', 25) ,
'message' => 'Este código ha sido usado demasiadas veces.'
)
) ;
functionlimitDuplicates($data, $limit)
{
$existing_promo_count = $this->find( 'count', array('conditions' => $data, 'recursive' => -1)) ;
return $existing_promo_count< $limit;
}
}
?>

Si quieres pasar parámetros a tu función de validación personalizada, agrega elementos extra al
arreglo ‘rule’ y trátalos como parámetros extra (después del parámetro principal $data) en tu función
personalizada.

Tu función de validación personalizada puede estar en el modelo (como en el ejemplo de arriba), o
en un behavior implementado por el modelo. Esto incluye los modelos mapeados.

Notar que los métodos del model/behavior son verificados primero, antes de buscar un método en la
clase Validation. Esto significa que puedes sobreescribir métodos de validación existentes (como por
ejemplo alphaNumeric()) en el nivel de aplicación (agregando el método a AppModel) , o en el nivel
de modelo.

Validando datos desde el Controlador

Mientras que normalmente sólo usarás el método save del modelo, habrá veces que te gustaría
validar los datos sin guardarlos. Por ejemplo, podrías querer mostrar algo de información adicional al
usuario antes de guardar los datos a la base de datos. Validar datos requiere de un proceso
ligeramente distinto al de sólo guardar los datos.

Primero, debes resetear los datos al modelo:

$this->ModelName->set( $this->data ) ;

INTRODUCCIÓN A CAKE PHP FRAMEWORK


77

Luego, para verificar si los datos se validan correctamente, usa el método validates del modelo, que
retornará true si es que se valida y false si es que no:


if ($this->ModelName->validates())

{ // paso la lógica de validación

} else {

// no paso la lógica de validadición

}

El método validates invoca el método invalidFields que le asignará un valor a la propiedad
validationErrors del modelo. El método invalidFields también retorna los datos como su resultado.


$errors = $this->ModelName->invalidFields(); // contiene el arregovalidationErrors

Es importante notar que los datos se deben primero setear al modelo antes de poder validarlos. Esto
es diferente al método save que permite pasar los datos como un parámetro. También, ten en
cuenta que no es necesario llamar a validates antes de llamar a save ya que save validará
automáticamente los datos antes realmente de guardarlos.


Recuerda…

RULE define el método de validación.

El índice MESSAGE permite definir un mensaje de error de validación.

La regla DATE con el modificador dMy da el resultado de: 27 December 2006

INTRODUCCIÓN A CAKE PHP FRAMEWORK


78

10. PAGINACIÓN


10.1. Preparación del controlador

En el controlador comenzamos definiendo los valores de paginación por defecto en la variable
$paginate. Es importante señalar que la clave 'order' debe estar definida en la estructura de array
dada.

class RecipesController extends AppController

{

var$paginate=array('limit'=>25,

'order'=>array(

'Post.title'=> 'asc'

)

) ;

}

También puedes incluir otras opciones para find(), como fields

class RecipesController extends AppController

{

var$paginate=array(

'fields'=>array('Post.id', 'Post.created') ,

'limit'=>25,

'order'=>array(

'Post.title'=> 'asc'

)

) ;

}

INTRODUCCIÓN A CAKE PHP FRAMEWORK


79

Pueden incluirse otras claves en el array $paginate similares a los parámetros del método
Model>find('all'), esto es: conditons, fields, order, limit, page, contain y recursive. De hecho, puedes
definir más de un conjunto de valores de paginación por defecto en el controlador, simplemente
nombra cada parte del array según el modelo que desees configurar:


class RecipesController extends AppController
{
var$paginate=array('Recipe'=>array(...) ,
'Author'=>array(...)
) ;
}

Ejemplo de sintaxis usando Containable Behavior:

class RecipesController extends AppController
{
var$paginate=array(
'limit'=>25,
'contain'=>array('Article')
) ;
}

Una vez que la variable $paginate ha sido definida, podemos llamar al método paginate() en las
acciones del controlador. Este método devuelve los resultados de find('all') del modelo (aplicándoles
los parámetros de la paginación), y obtiene algunas estadísticas de paginación adicionales, que son
pasadas a la Vista de forma invisible. Este método también añade PaginatorHelper a la lista de
helpers en tu controlador, si es que no estaba ya.


functionlist_recipes()
{
// similartofindAll(), butfetchespagedresults
$data=$this->paginate('Recipe') ;
$this->set(compact('data')) ;
}

Puedes filtrar los registros pasando condiciones como segundo parámetro al método paginate()

$data=$this->paginate('Recipe',array('Recipe.title LIKE'=> 'a%')) ;

O también puedes ajustar la clave conditions en la variable paginate.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


80

10.2. Paginación en views

Es cosa tuya decidir cómo mostrar los registros al usuario, aunque lo más habitual es hacerlo
mediante tablas HTML. Los ejemplos que siguen asumen una disposición tabular, pero el
PaginatorHelper, disponible en las vistas, no siempre necesita restringirse de ese modo.

Como ya se ha dicho, PaginatorHelper ofrece capacidades para ordenación que pueden integrarse
fácilmente en las cabeceras de las columnas de tus tablas:

// app/views/recipes/list_recipes.ctp

<table>

<tr>

<th><?php echo$paginator->sort('ID', 'id'); ?></th>

<th><?php echo$paginator->sort('Title', 'title'); ?></th>

</tr>

<?phpforeach($dataas$recipe): ?>

<tr>

<td><?php echo$recipe['Recipe']['id']; ?></td>

<td><?php echo$recipe['Recipe']['title']; ?></td>

</tr>

<?phpendforeach; ?>

</table>


Los enlaces generados por el método sort() de PaginatorHelper permiten a los usuarios hacer clic en
las cabeceras de las tablas y alternar la ordenación de los datos por un campo dado.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


81

También es posible ordenar una columna en base a asociaciones:

<table>

<tr>

<th><?php echo$paginator->sort('Title', 'title'); ?></th>

<th><?php echo$paginator->sort('Author', 'Author.name'); ?></th>

</tr>

<?phpforeach($dataas$recipe): ?>

<tr>

<td><?php echo$recipe['Recipe']['title']; ?></td>

<td><?php echo$recipe['Author']['name']; ?></td>

</tr>

<?phpendforeach; ?>

</table>

El ingrediente final de la paginación en las vistas es añadir la navegación de páginas, que también
viene proporcionada por PaginationHelper.


<!-- Muestra los números de página -->

<?phpecho$paginator->numbers(); ?>

<!-- Muestra los enlaces para Anterior y Siguiente -->

<?php

echo$paginator->prev('« Previous ',null,null,array('class'=>'disabled')) ;

echo$paginator->next(' Next »',null,null,array('class'=>'disabled')) ;

?>

<!-- Muestra X de Y, donde X es la página actual e Y el total del páginas -->

<?phpecho$paginator->counter();?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


82

El texto generado por el método counter() puede personalizarse usando marcadores especiales:

<?php

echo$paginator->counter(array(

'format'=> 'Page %page% of %pages%, showing %current% records out of

%count% total, starting on record %start%, ending on %end%'));

?>

Para pasar todos los argumentos de la URL a las funciones del paginador, añade lo siguiente a tu
vista:

$paginator->options(array('url'=>$this->passedArgs)) ;

También puedes especificar qué parámetros pasar manualmente:

$paginator->options(array('url'=>array("0","1"))) ;









Recuerda…

La paginación sirve para visualizar un número razonables de registros.

El Helper Paginator ayuda a crear paginaciones de datos.

El array por defecto de paginación es $paginate

INTRODUCCIÓN A CAKE PHP FRAMEWORK


83

11. FORMULARIOS


11.1. Creando formularios

El primer método que necesitarás para poder aprovechar el FormHelper es create(). Este método se
encarga de escribir la etiqueta de apertura del formulario.


create(string $modelo = null, array $opciones = array())


Todos los parámetros son opcionales. Si create() es llamado sin parámetros, asume que estás
construyendo un formulario que será enviado al controlador actual, ya sea vía la acción add() o edit().
El método por omisión para el envío es POST. El elemento form es regresado con un ID DOM. El ID es
generado usando el nombre del modelo y el nombre de la acción del controlador en formato
CamelCased. Si fuera a llamar create() dentro de una vista de UsersController, vería algo como lo
siguiente en la vista:


<form id="UserAddForm" method="post" action="/users/add">


Puedes también pasar false para el parámetro $modelo. Esto pondrá los datos de tu formulario en el
array: $this->data (en lugar de ponerlos en un sub-array: $this>data['Model']). Esto puede ser muy
útil para formularios cortos que quizá no representen nada en tu base de datos.

<?php echo $form->create('Recipe'); ?>

//Output:

<form id="RecipeAddForm" method="post" action="/recipes/add">



11.2. Cerrando formularios

El FormHelpertambién incluye un método end() que completa el código del formulario. A menudo, el
método end() solo escribe la etiqueta de cierre del formulario, pero el usar end() también hace que
el FormHelper inserte los elementos hidden necesarios en el formulario para los métodos que
dependen de este.


<?php echo $form->create(); ?>

<!-- Form elements gohere -->

<?php echo $form->end(); ?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


84

Si una cadena es colocada como primer parámetro del end(), el FormHelper agregará un botón
submit llamado de esa manera además de la etiqueta de cierre del formulario.

<?php echo $form->end('Finish'); ?>

Output:

<div class="submit">

<input type="submit" value="Finish" />

</div>

</form>



11.3. Form – métodos de elementos específicos



checkbox(string $fieldName, array $options)

Crea un elemento checkbox.


<?php echo $this->Form->checkbox('done'); ?>

Salida:

<input type="hidden" name="data[User][done]" value="0" id="UserDone_" />

<input type="checkbox" name="data[User][done]" value="1" id="UserDone" />


button(string $title, array $options = array())

Crea un botón HTML. Configurando$options['type']generará uno de los tres tipos de botones:

 submit: botón por defecto$this->Form->submit.

 reset: crear el botón reset.

 button: crea un botón estándar.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


85

<?php

echo $this->Form->button('A Button') ;

echo $this->Form->button('Another Button', array('type'=>'button'));

echo $this->Form->button('Resetthe Form', array('type'=>'reset'));

echo $this->Form->button('Submit Form', array('type'=>'submit')) ; ?>


Salida:

<buttontype="submit">A Button</button>

<buttontype="button">Another Button</button>

<buttontype="reset">Resetthe Form</button>

<buttontype="submit">Submit Form</button>



year(string $fieldName, int $minYear, int $maxYear, mixed $selected, array $attributes)

Genera un rango de valores seleccionables con años desde$minYeara$maxYear.


<?php echo $this->Form->year('purchased',2000,date('Y')) ; ?>

Salida:

<select name="data[User][purchased][year]" id="UserPurchasedYear">

<optionvalue=""></option>

<optionvalue="2009">2009</option>

<optionvalue="2008">2008</option>

<optionvalue="2007">2007</option>

<optionvalue="2006">2006</option>

<optionvalue="2005">2005</option>

<optionvalue="2004">2004</option>

<optionvalue="2003">2003</option>

<optionvalue="2002">2002</option>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


86

<optionvalue="2001">2001v/option>

<optionvalue="2000">2000</option>

</select>

month(string $fieldName, mixed $selected, array $attributes, boolean $showEmpty)

dateTime($fieldName, $dateFormat = 'DMY', $timeFormat = '12', $selected = null, $attributes =
array())

day(string $fieldName, mixed $selected, array $attributes, boolean $showEmpty)

hour(string $fieldName, boolean $format24Hours, mixed $selected, array $attributes, boolean
$showEmpty)

minute(string $fieldName, mixed $selected, array $attributes, boolean $showEmpty)

meridian(string $fieldName, mixed $selected, array $attributes, boolean $showEmpty)

hidden(string $fieldName, array $options)

isFieldError(string $fieldName)

password(string $fieldName, array $options)

radio(string $fieldName, array $options, array $attributes)

select(string $fieldName, array $options, mixed $selected, array $attributes)

submit(string $caption, array $options)

ext(string $fieldName, array $options)

textarea(string $fieldName, array $options)




Recuerda…

El Helper que crea formularios es Form.

Para crear un botón que limpie el formulario, utilizo el Reset.

En un formulario necesitamos añadir un campo de texto (extenso), para ello usamos Textarea().

INTRODUCCIÓN A CAKE PHP FRAMEWORK


87

12. HTML


12.1. Introducción

Antes de dar un vistazo a los métodos de HtmlHelper, vas a necesitar conocimientos sobre
configuración y usos en las situaciones que te puede ayudar esta clase. En primer lugar, en un
esfuerzo para aliviar a aquellos que usan las etiquetas cortas (< ?= ?>) de forma intensiva o muchas
llamadas a echo() en el código de sus vistas que todos los métodos del HtmlHelper son pasados por
el método output(). Si deseas activar automáticamente la salida para generar HTML con el ayudante
simplemente implementa output() en tu AppHelper.

function output($cadena)

{

echo$cadena;

}

Haciendo esto no necesitarás agregar llamadas a echo en el código de tus vistas.

Muchos métodos HtmlHelper incluyen parámetros $htmlAttributes, esto te permite hilvanar
cualquier atributo extra en tus tags. Aquí hay algunos ejemplos de cómo se usan los parámetros
$htmlAttributes:

Atributos Deseados:

<tagclass="algunaClase"/>

Arreglo de Parámetros:

array('class'=>'algunaClase') Atributos Deseados:<tag name="foo"value="bar"/>

Arreglo de Parámetros:

array('name'=> 'foo', 'value'=> 'bar')

El HtmlHelper está disponible en todas las vistas de forma predeterminada. Si usted está recibiendo
un error que le informa que no está ahí, es por lo general debido a su nombre que está faltando y
puede configurarlo manualmente en la variable $helpers del controlador.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


88

12.2. Inserción de elementos html

Lo más importante de usar HtmlHelper es la correcta creación de marcas perfectamente
estructuradas; así como mejoras en la caché ahorrando muchos ciclos de CPU en las vistas. En ésta
sección veremos algunos métodos de HtmlHelper y cómo usarlos.

charset(string $charset=null)

Usada para crear metadatos que especificarán la codificación de los caracteres del documento.

El valor por defecto es UTF-8.

<?php echo$html->charset();?>

Generará como salida:

<meta http-equiv="Content-Type"content="text/html; charset=utf-8"/>

O sino también:

<?php echo$html->charset('ISO-8859-1'); ?>

Generará como salida:

<meta http-equiv="Content-Type"content="text/html; charset=ISO-8859-1"/>


css(mixed$path, string $rel=null,array$htmlAttributes=array(), boolean $inline=true)

Crea un enlace a una o más hojas de estilos CSS. Si $inline está en false, los tags de enlace son
agregados en la variable $scripts para vistas, la cual puedes imprimir dentro del taghead del
documento.

Este método de inclusión de CSS asume que el archivo CSS especificado esté en el directorio
/app/webroot/css.


<?php echo$html->css('forms'); ?>

Hará la salida:

<link rel="stylesheet"type="text/css"href="/es/css/forms.css"/>

El primer parámetro puede ser un arreglo para incluir varios archivos.

<?php echo$html->css(array('forms','tables','menu')); ?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


89


Hará la salida:

<link rel="stylesheet"type="text/css"href="/es/css/forms.css"/>

<link rel="stylesheet"type="text/css"href="/es/css/tables.css"/>

<link rel="stylesheet"type="text/css"href="/es/css/menu.css"/>


meta(string $type, string $url=null,array$attributes=array(), boolean $inline=true)

Este método es útil para vincular a los recursos externos como los feeds RSS / Atom y favicons. Como
CSS (), puede especificar si desea o no que esta etiqueta a aparezca en la línea o en la etiqueta de la
cabecera con el cuarto parámetro.

Si establece el atributo "type" usando el parámetro $htmlAttributes, CakePHP contiene algunos
atajos:

<?php echo$html->meta( 'favicon.ico', '/favicon.ico', array('type'=> 'icon'));?>

//Salida (saltos de linea añadidos) </p>

<link href="http://example.com/favicon.ico" title="favicon.ico"type="image/x-icon"
rel="alternate"/>

<?php echo$html->meta('Comments', '/comments/index.rss', array('type'=> 'rss')) ;?>

//Salida (saltos de linea añadidos)

<link href="http://example.com/comments/index.rss" title="Comments" type="application/rss+xml"
rel="alternate"/>

Este método también puede utilizarse para agregar las etiquetas "meta" para las palabras claves y las
descripciones. Ejemplo:

<?php echo$html->meta(

'keywords',
'ingrese las palabas claves aquí'

);?>

//Salida <meta name="keywords" content="ingrese las palabas claves aquí"/> //

<?php echo$html->meta(

'description',
'ingrese alguna descripcion meta aquí' );?>
//Salida <meta name="description" content="ingrese alguna descripción meta aquí"/>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


90

Si deseas añadir una etiqueta meta personalizada en el primer parámetro se debe establecer una
matriz. Para una salida de la etiqueta "robots noindex" debe utilizar el siguiente código:

echo $html->meta(array('name' => 'robots', 'content' => 'noindex'));


docType(string $type= 'xhtml-strict')


<?php echo$this->Html->docType(); ?>

<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Strict//EN"

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

<?php echo$this->Html->docType('html4-trans'); ?>

<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">


style(array$data, boolean $oneline=true)

Construye una definición de estilo CSS basada en las claves y valores del vector pasado al método.
Especialmente útil si tu archivo CSS es dinámico.

<?php echo$html->style(array(

'background'=> '#633',

'border-bottom'=> '1px solid #000',

'padding'=> '10px'

)); ?>

Mostrará:

background:#633; border-bottom:1px solid #000; padding:10px;


image(string $path,array$htmlAttributes=array())

Crea una etiqueta de imagen, la ruta especificada será relativa a /app/webroot/img/.


<?php echo$html->image('cake_logo.png',array('alt'=> 'CakePHP'))?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


91

Mostrará:

<img src="/img/cake_logo.png"alt="CakePHP"/>

Si desea crear un link asociado a la imagen especifique el link de destino usando la opción url option
en $htmlAttributes.

<?php echo$html->image("recipes/6.jpg",array(

"alt"=>"Bizcochos",

'url'=>array('controller'=> 'recipes', 'action'=> 'view',6) )); ?>

Mostrará:

<a href="/es/recipes/view/6">

<img src="/img/recipes/6.jpg"alt="Bizcochos"/>

</a>


link(string $title,mixed$url=null,array$options=array(), string$confirmMessage=false)

Método de uso general para crear links HTML. Use $optionspara especificar atributos para mostrar o
no $title.

<?php echo$this->Html->link('Enter', '/pages/home', array('class'=>'button','target'=>'_blank')); ?>

Salida:

<a href="/es/pages/home"class="button"target="_blank">Enter</a>

Especifique $confirmMessagepara mostrar un mensaje en un cuadro de dialogojavascriptconfirm().


<?php echo$this->Html->link(

'Delete', array('controller'=>'recipes', 'action'=>'delete',6) , array() ,

"Are you sure you wish to delete this recipe?"

);?>

Saldrá:


<a href="/es/recipes/delete/6"onclick="return confirm('Are yousureyouwishto delete this
recipe?');">Delete</a>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


92

script(mixed$url,mixed$options)

Crea enlaces a ficherosjavascript.

Éste método asume que los ficheros javascripts residen dentro de /app/webroot/jsdirectory.


<?php echo$this->Html->script('scripts'); ?>

Salida:

<script type="text/javascript"href="/es/js/scripts.js"></script>


tableHeaders(array$names,array$trOptions=null,array$thOptions=null)

Crea una fila de encabezados de tabla para ser usados dentro de la etiqueta <table>.

<?php echo$html->tableHeaders(array('Fecha','Nombre','Activo'));?>

//Salida

<tr>

<th>Fecha</th>

<th>Nombre</th>

<th>Activo</th>

</tr>

<?php echo$html->tableHeaders( array('Fecha','Nombre','Activo') , array('class'=> 'estado') ,
array('class'=> 'tabla_productos')

);?>

//Salida

<tr class="estado">

<th class="tabla_productos">Fecha</th>

<th class="tabla_productos">Nombre</th>

<th class="tabla_productos">Activo</th>

</tr>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


93

tableCells(array$data,array$oddTrOptions=null,array$evenTrOptions=null,
$useCount=false,$continueOddEven=true)

Crea celdas de tablas en filas.

<?php echo$this->Html->tableCells(array( array('Jul 7th, 2007', 'BestBrownies', 'Yes') , array('Jun 21st,
2007', 'Smart Cookies', 'Yes') , array('Aug 1st, 2006', 'Anti-Java Cake', 'No') ,
)) ;
?>
//salida
<tr><td>Jul 7th,2007</td><td>BestBrownies</td><td>Yes</td></tr>
<tr><td>Jun 21st,2007</td><td>Smart Cookies</td><td>Yes</td></tr>
<tr><td>Aug 1st,2006</td><td>Anti-Java Cake</td><td>No</td></tr>
<?php echo$this ->Html->tableCells(array( array('Jul 7th,
2007',array('BestBrownies',array('class'=>'highlight')),
'Yes') ,array('Jun 21st, 2007', 'Smart Cookies', 'Yes') , array('Aug 1st, 2006', 'Anti-Java
Cake',array('No',array('id'=>'special'))) ,
)) ;
?>
//Salida
<tr><td>Jul 7th,2007</td><tdclass="highlight">Best
Brownies</td><td>Yes</td></tr>
<tr><td>Jun 21st,2007</td><td>Smart Cookies</td><td>Yes</td></tr>
<tr><td>Aug 1st,2006</td><td>Anti-Java Cake</td><td id="special">No</td></tr>
<?php echo$this->Html->tableCells( array( array('Red', 'Apple') , array('Orange', 'Orange') ,
array('Yellow', 'Banana') ,
) , array('class'=> 'darker')
) ;
?>
//Salida
<tr class="darker"><td>Red</td><td>Apple</td></tr>
<tr><td>Orange</td><td>Orange</td></tr>
<tr class="darker"><td>Yellow</td><td>Banana</td></tr>


url(mixed$url=NULL, boolean $full=false)

Devuelve un URL que apunta a alguna combinación de controlador y acción. Si $url está vacío
devuelve el valor de REQUEST_URI, en caso contrario genera el URL para la combinación de
controlador y acción. Si $full es true, se antepondrá el URL base del sitio al resultado.

<?php echo$html->url(array( "controller"=>"posts",

"action"=>"view",

"bar"));?>

// Salida/posts/view/bar

INTRODUCCIÓN A CAKE PHP FRAMEWORK


94

Enseguida más ejemplos de uso:

URL con parámetros nombrados (namedparameters)

<?php echo$html->url(array( "controller"=>"posts",

"action"=>"view",

"foo"=>"bar")) ;

?>

// Salida/posts/view/foo:bar

URL con extensión

<?php echo$html->url(array( "controller"=>"posts",

"action"=>"list",

"ext"=>"rss")) ;

?>

// Salida/posts/list.rss

URL (empezando con '/') con el URL completo del sitio agregado al inicio.

<?php echo$html->url('/posts',true); ?>

//Salidahttp://www.example.com/posts

URL con parámetros GET y ancla nombrada (named anchor)

<?php echo$html->url(array( "controller"=>"posts",

"action"=>"buscar",

"?"=>array("foo"=>"bar") ,

"#"=>"primero")) ;
?>
//Salida/posts/buscar?foo=bar#primero

INTRODUCCIÓN A CAKE PHP FRAMEWORK


95

12.3. Práctica - blog

En esta sección podrás ver cómo se unen todas las piezas en una aplicación de CakePHP típica.

Este tema te guiará para que puedas crear un blog simple. Una vez funcionando Cake, iremos
creando la base de datos y configurándola, y creando luego la lógica necesaria para mostrar, añadir,
editar y borrar posts del blog.

Esto es lo que necesitas:

Un servidor web. Aquí asumiremos que estás usando Apache, aunque las instrucciones para
utilizar otros servidores deberían ser similares. Tal vez necesitemos jugar un poco con la
configuración del servidor, pero la mayoría de pueden obtener y poner en marcha Cake sin modificar
la configuración para nada.

 Un servidor de base de datos. Nosotros utilizaremos MySQL es este tutorial. Deberás saber lo
suficiente de SQL como para crear una base de datos: Cake se encarga del resto a partir de
ahí.
 Conocimiento básico de PHP. Cuanto más programación orientada a objetos hayas hecho,
mejor, pero no tengas miedo si eres un fan de la programación procedural.
 Finalmente, necesitarás un conocimiento básico del patrón MVC.

¡Comencemos!

Creando la Base de Datos del Blog

A continuación debemos crear la base de datos en la que se basará nuestro blog. Lo primero que
haremos será crear una tabla para almacenar nuestros posts. También insertaremos algunos posts
para poder utilizarlos de testeo. Ejecuta el siguiente código SQL en tu base de datos:

/* Primero, crear la tabla para los posts: */

CREATE TABLE posts ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(50) ,
body TEXT, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL);

/* Luego insertar algunos posts de ejemplo: */

INSERT INTO posts (title,body,created) VALUES ('El título', 'Este es el cuerpo del post.', NOW());

INSERT INTO posts (title,body,created) VALUES ('Un título otra vez', 'Y el cuerpo del post a
continuación.', NOW());

INSERT INTO posts (title,body,created) VALUES ('Título ataca de nuevo', 'Esto es realmente
exitante! No.', NOW());

La elección de los nombres de la tabla y las columnas no es arbitrario. Si sigues las convenciones de
Cake relacionadas a la base de datos, y las convenciones relacionadas a los nombres de las clases,
tendrás la posibilidad de aprovechar muchas ventajas y evitar la configuración. Cake es lo
suficientemente flexible como para acomodarse inclusive al peor esquema de base de datos de
aplicaciones antiguas, sin embargo, si utilizas las convenciones ahorrarás mucho tiempo de
desarrollo.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


96

Es suficiente con decir que al llamar a la tabla 'posts' automáticamente estará asociada con el
modelo Post, y al tener los campos 'modified' y 'created', éstos serán manejados automáticamente
por Cake.


Configuración de la Base de Datos en Cake

Vamos a decirle a Cake dónde está nuestra base de datos y cómo conectarse a ella. Para muchos,
esta será la primera y última vez que configuren algo.

Una copia del archivo de configuración de la base de datos se encuentra en
/app/config/database.php.default. Haz una copia en el mismo directorio, pero nombrándola
database.php.

El archivo de configuración debería ser fácil de seguir: sólo debes reemplazar los valores en el arreglo
$default con la información que se corresponda a tu configuración. Un ejemplo completo debería
verse como el siguiente:

var $default = array(

'driver' => 'mysql',

'persistent' => false,

'host' => 'localhost',

'login' => 'root',

'password' => '',

'database' => 'caketest',

'prefix' => '',

);

Una vez que hayas guardado el nuevo database.php, deberías poder abrir el navegador en la página
de inicio de Cake y ver que puede conectarse a la base de datos sin problemas.

Configuración Opcional

Hay dos ítems más que pueden ser configurados. La mayoría de los desarrolladores realiza estos
pasos, pero para este tutorial no son necesarios. El primero es definir una cadena (o "salt") para darle
más seguridad a los hash. El segundo ítem es darle acceso de escritura a Cake, a su directorio tmp.

La cadena de seguridad (o "salt") es usada para generar hashes. Puedes cambiarla editando el
archivo /app/config/core.php. No importan tanto cuál es el nuevo valor del salt, siempre y cuando no
sea fácil de adivinar.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


97

<?php
/**
* Una cadena aleatoria usada en los métodos de hashing de seguridad.
*/
Configure::write('Security.salt', 'pl345e-P45s_7h3*S@l7!') ;
?>

La segunda tarea es darle al servidor web permisos de escritura sobre el directorio app/tmp.

Si por alguna razón CakePHP no puede escribir en ese directorio, podrás ver un aviso cuando te
encuentres navegando la aplicación en modo debug.

Una aclaración para mod_rewrite

Es muy probable que los usuarios novatos tengan problemas con mod_rewrite, así que haremos una
mención aquí. Si la página de bienvenida de CakePHP se ve un poco rara (sin imágenes o estilos CSS),
probablemente no tengas funcionando el módulo mod_rewrite en tu sistema. Algunos consejos para
que hacerlo funcionar:

1. Asegúrate que la sobreescritura (override) esté permitida (allowed): en tu httpd.conf,
deberías tener una sección en la que se definen los permisos sobre cada Directorio en tu
servidor. Asegúrate que AllowOverride esté puesto en All para el Directorio correcto. Por
razones de seguridad y de performance, noseteesAllowOverride en All dentro de <Directory
/>. A su vez, busca el bloque <Directory> que haga referencia al directorio de tu sitio web.

2. Asegúrate que estás editando el httpd.conf correcto en vez de un httpd.conf específico de
usuario o sitio web.

3. Por una u otra razón, puedes haber conseguido una copia de CakePHP sin los archivos
.htaccess necesarios. Esto a veces sucede porque algunos sistemas operativos tratan a los
archivos cuyo nombre comienza con '.' como ocultos, y no los copia. Asegúrate que tu copia
de CakePHP proviene de la sección de descargas del sitio o desde nuestro repositorio SVN.

4. Asegúrate que Apache esté cargando mod_rewrite correctamente. Deberías ver algo como
LoadModulerewrite_module libexec/httpd/mod_rewrite.so o (en Apache 1.3)
AddModulemod_rewrite.c en tu httpd.conf.

Si no quieres o no puedes hacer funcionar mod_rewrite (o algún otro módulo compatible),
necesitarás usar las 'pretty' URLs proporcionadas por CakePHP. En /app/config/core.php,
descomenta la línea que diga algo como:

Configure::write('App.baseUrl', env('SCRIPT_NAME')) ;

También puedes borrar los ficheros.htaccess:
/.htaccess
/app/.htaccess
/app/webroot/.htaccess

Esto haráque tus URLs se vean de la forma:

www.example.com/index.php/controllername/actionname/param
en vez de: www.example.com/controllername/actionname/param.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


98

Crear un modelo Post

La clase Model es el pan y manteca de las aplicaciones CakePHP. Creando un modelo CakePHP que
interactúe con nuestra base de datos, tendremos la base para poder hacer luego nuestras acciones
de vista, agregar, editar, y eliminar.

Los archivos de clases de modelo de CakePHP van en la carpeta /app/models, y el archivo que
crearemos lo grabaremos en /app/models/post.php. El archivo completo debería verse así:

<?php

class Post extends AppModel

{

var $name = 'Post';

}

?>

La convención en la nomenclatura es muy importante en CakePHP. Nombrando nuestro modelo
como Post, CakePHP puede automáticamente inferir que este modelo será usado en el controlador
PostsController, y será atado a la tabla de la base de datos llamada posts.

CakePHP dinámicamente creará un objeto de modelo por ti, si no puede encontrar el archivo
correspondiente en /app/models. Esto también dice que si nombras incorrectamente tu archivo (i.e.
Post.phporposts.php) CakePHP no reconocerá ninguna de tus configuraciones y usará las opciones
por defecto.

Siempre es una buena idea agregar la variable $name, y suele ahorrarnos problemas con los nombres
de las clases en PHP4.


Crear un controlador para Post

A continuación, crearemos un controlador para nuestros posts. El controlador es donde existe toda la
lógica del negocio para la interacción con los posts. En pocas palabras, es el lugar en el que juegas
con los modelos y realizas el trabajo con los posts. Ubicaremos este nuevo controlador en un archivo
llamado posts_controller.php dentro del directorio /app/controllers. Así es como debe verse un
controlador básico:


<?php
classPostsController extends AppController
{
var $name = 'Posts';
}
?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


99

Ahora, agreguemos una acción a nuestro controlador. Las acciones a menudo representan una
función o una interface en una aplicación. Por ejemplo, cuando los usuarios ingresan
www.example.com/posts/index (que es lo mismo que www.example.com/posts/), esperan ver un
listado de posts. El código para esa acción se vería como esto:

<?php
classPostsController extends AppController
{
var $name = 'Posts';

function index()
{
$this->set('posts', $this->Post->find('all')) ;

}
}
?>

Déjenme explicar un poquito la acción. Definiendo la función index() en nuestro PostsController, los
usuarios pueden ahora acceder a la lógica ubicada en www.example.com/posts/index. De forma
similar, si definimos una función llamada foobar(), los usuarios podrían acceder a ella en
www.example.com/posts/foobar.

Puede tentarte querer nombrar a tus controladores y acciones de cierta forma para obtener cierto
URL. Resiste la tentación. Sigue las convenciones de CakePHP (nombres en plural para los
controladores, etc.) y crea nombres legibles y entendibles para las acciones. Puedes mapear luego
URLs a tu código usando "routes".

La única instrucción en la acción usa set() para pasar datos desde el controlador a la vista (que
crearemos a continuación). La línea iguala la variable de vista llamada 'posts' al valor retornado por el
método del modelo Post find('all'). Nuestro modelo Post está disponible automáticamente en $this-
>Post porque hemos seguido la convención de nombres de Cake.


Creando las Vistas (Views) de los Post

Ahora que tenemos los datos que fluyen a nuestro modelo y la lógica de nuestra aplicación y el flujo
definido por nuestro controlador, vamos a crear una vista (view) para la acción “index” que hemos
creado anteriormente.

Cake view(vistas) son solo fragmentos de presentaciones que se adaptan dentro de las aplicaciones
diseñadas. Para la mayoría de las aplicaciones estaremos mezclando HTML con PHP, pero puede
terminar usando XML, CSV, o incluso de datos binarios.

Los Diseños (Layouts) de presentación son el código que se envuelve alrededor de las vista (views), y
pueden ser definidas y modificadas, pero por ahora, vamos a usar el valor por defecto.

¿Recuerda que en la última sección la forma en que asigno la variable "posts" a de la vista fue usando
método set()? La forma que transmite datos a la vista sería algo como esto:

INTRODUCCIÓN A CAKE PHP FRAMEWORK


100

// print_r($posts) output:
Array
(
=> Array
(
[Post] => Array
(
[id] => 1

[title] =>Thetitle

[body] => This is the post body.

[created] => 2008-02-13 18:34:55

[modified] =>
)
)
=> Array
(
[Post] => Array
(
[id] => 2
[title] => A title once again

[body] => And the post bodyfollows.

[created] => 2008-02-13 18:34:56

[modified] =>
)
)
=> Array
(
[Post] => Array
(
[id] => 3

[title] => Title strikes back

[body] => This is reallyexciting! Not.

[created] => 2008-02-13 18:34:57

[modified] =>
)
)
)

INTRODUCCIÓN A CAKE PHP FRAMEWORK


101

Los archivos de las Cake’s views (vistas de cake) se almacenan en /app/views dentro de una carpeta
con el nombre del controlador que corresponden (tendremos que crear una carpeta llamada "posts"
en este caso). Para dar formato a los datos de los posts en un cuadro lindo, el código de nuestra vista
podría ser algo como esto:


<!-- Archivo: /app/views/posts/index.ctp -->
<h1>Blog posts</h1>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
</tr>
<!-- Aqui se hace el ciclo que recorre nuestros arreglo $posts , imprimiendo la información de cada
post-->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $html->link($post['Post']['title'], "/posts/view/".$post['Post']['id']); ?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>

Creemos que esto debería ser algo sencillo.

Usted puede haber notado el uso de un objeto llamado $html. Esta es una instancia de la clase
CakePHP HtmlHelper. CakePHP viene con un conjunto de "view helpers" (vistas de ayuda) que hacen
cosas como la vinculación, la forma de salida, manejo JavaScript y Ajax. Lo que es importante señalar
aquí es que el método link() generará un vínculo HTML con un título determinado (el primer
parámetro) y la URL (la segunda parámetro).

Al especificar las URL en Cake, sólo tiene que dar una ruta relativa de la base de la aplicación, y cake
llena en el resto. Es así, que las URL se suelen quedar de la forma de
/controlador/acción/parametro1/parametro2 (/controller/action/param1/param2).

En este punto, usted debería ser capaz de escribir en el navegador
http://www.example.com/posts/index. Usted debe observar en la vista, el formato correcto con el
título y la lista de los posts.

Si le sucedió que hizo click en uno de los enlaces que hemos creado en esta vista (que vinculan el
título de un post a una URL /posts/view/some_id), probablemente ha sido informado por CakePHP
que la acción aún no ha sido definida. Si no recibió el informe, es que algo ha ido mal, o que
realmente ya la ha definido, en cuyo caso es muy astuto. De lo contrario, la vamos a crear ahora en el
PostsController:

INTRODUCCIÓN A CAKE PHP FRAMEWORK


102



<?php
classPostsController extends AppController
{
var $name = 'Posts';
function index()
{
$this->set('posts', $this->Post->find('all')) ;
}
function view($id = null)
{
$this->Post->id = $id;
$this->set('post', $this->Post->read()) ;
}
}
?>

La llamada set() les debe lucir familiar. Informamos de que estamos usando read() en lugar de
find('all') porque realmente solo queremos la información de un único post.

Tenga en cuenta que la acción de nuestra vista toma un parámetro: la ID del post que nos gustaría
ver. Este parámetro se entrega a la acción a través de la URL solicitada. Si un usuario solicita
/posts/view/3, entonces el valor '3' es pasado como $id.

Ahora vamos a crear la vista para las “view” de nuestra nueva acción y lo colocaremos en
/app/views/posts/view.ctp.

<!-- archivo: /app/views/posts/view.ctp -->

<h1><?php echo $post['Post']['title']?></h1>

<p><small>Created: <?php echo $post['Post']['created']?></small></p>

<p><?php echo $post['Post']['body']?></p>


Verifique que esto está funcionando en los vínculos de /posts/index o manualmente solicitando un
post accediendo a /posts/view/1.


Agregando Posts

Leer y mostrar de la base de datos nuestros post’s es un gran comienzo, pero debe habilitarse para
agregar nuevos post’s.

En primer lugar, empezar por crear la acción add() controlador PostsController:

INTRODUCCIÓN A CAKE PHP FRAMEWORK


103

<?php

classPostsController extends AppController

{

var $name = 'Posts';

function index()

{

$this->set('posts', $this->Post->find('all')) ;

}

function view($id)

{

$this->Post->id = $id;

$this->set('post', $this->Post->read()) ;

}

function add()

{

if (!empty($this->data))

{ if ($this->Post->save($this->data)) {

$this->Session->setFlash('Your post has beensaved.') ;

$this->redirect(array('action' => 'index')) ;

}

}

}

}

?>

Lo que esta acción add() hace es lo siguiente: si los datos del formulario presentado no están vacíos,
trate de guardar los datos utilizando el modelo Post. Si por alguna razón, no guarda, simplemente
hacer que se quede en la vista. Esto nos da la oportunidad de mostrar los errores de validación de
usuario u otras advertencias.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


104

Cuando un usuario utiliza un formulario de datos POST en su aplicación, esta información está
disponible en $this->data.

Usamos la función del componente SessionsetFlash() para adjuntar un mensaje a una variable de
sesión que se mostrará en la página después de la redirección. En el diseño tenemos $session-
>flash() , que muestra el mensaje y borra la variable de sesión correspondiente. La función
redirectdel controlador redirige a otra dirección URL. El parámetro array('action'=>'index) se traduce
en la URL /posts es decir, la acción index del controlador posts. Puede referirse a Router::url en
función de la API para ver los formatos en los que se puede especificar una dirección URL para
diversas funciones de cake.

Llamando al método save() haremos comprobación de errores de validación y abortar el guardado si
algo ocurre. Hablaremos de cómo se manejan los errores en las siguientes secciones.


Validación de Datos

Cake lleva un largo camino recogiendo la monotonía de la validación de formularios de entrada. Todo
el mundo odia a la codificación de sus infinitos formularios y rutinas de validación. CakePHP hace que
sea más fácil y más rápido.

Para aprovechar las características de la validación, tendrás que utilizar FormHelper de Cake en tus
vistas. El FormHelper está disponible por defecto en todas las vista en $form.

Esta es nuestra Vista Agregar(add view):

<!-- File: /app/views/posts/add.ctp -->

<h1>Add Post</h1>

<?php

echo $form->create('Post') ; echo $form->input('title') ; echo $form->input('body', array('rows' =>
'3')) ;

echo $form->end('Guardar - Post') ;

?>

Aquí, nosotros usamos el FormHelper para generar la etiqueta de apertura de un formulario HTML.
Aquí está el código HTML que genera $form->create() :

<form id="PostAddForm" method="post" action="/posts/add">

Si create() es llamado sin suministrarle parámetros, este supone que está construyendo un
formulario que suministra datos a la acción add() (o a la acción edit() cuando el parámetro id esta
incluído en los datos del formulario ($form->data)), a través del metodo POST.

El método $form->input() es utilizado para crear elementos de formulario del mismo nombre. El
primer parámetro le dice a CakePHP a que campo corresponden, y el segundo parámetro le permite
especificar una amplia gama de opciones - en este caso, el número de filas para el textarea. Hay un
poco de introspección y automatización aquí: input() es la salida de diferentes elementos basados en
el modelo del campo especificado.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


105


El $form->end() genera una llamada al botón de enviar y termina el formulario. Si una cadena se
suministra como el primer parámetro a end(), FormHelper producirá un botón de enviar con ese
nombre seguido del cierre de la etiqueta.

Ahora vamos a volver y actualizar nuestro /app/views/posts/index.ctp para incluir un nuevo enlace
"Añadir entrada". Antes del <table>, añada la siguiente línea:


<?php echo $html->link('Add Post',array('controller' => 'posts', 'action' => 'add'))?>

Puede estar preguntarse: ¿cómo le digo a mi CakePHP sobre los requisitos de validación? Reglas de
validación se definen en el modelo. Vamos a mirar hacia atrás en nuestro modelo y después haremos
algunos ajustes:

<?php

class Post extends AppModel

{

var $name = 'Post';

var $validate = array( 'title' => array(

'rule' => 'notEmpty'

) ,

'body' =>array(

'rule' => 'notEmpty'

)

) ;

}

?>

El arreglo $validate le dice a CakePHP cómo validar sus datos cuando se llama el método save() .
Aquí, he especificado que tanto el campos cuerpo y el título no deben estar vacía. El motor de
validación de CakePHP es fuerte, con una serie de normas pre-construidas (números de tarjetas de
crédito, direcciones de correo electrónico, etc) y la flexibilidad para añadir sus propias reglas de
validación.

Ahora que tiene las reglas de validación en su lugar, utilice la aplicación para tratar de añadir un post
con un título o el cuerpo vacío para ver cómo funciona. Como hemos utilizado el método input() del
componente FormHelper para crear elementos de nuestro formulario, nuestros mensajes de error de
validación se mostrará automáticamente.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


106

Borrando Posts

A continuación, vamos a crear un medio para que los usuarios eliminen post’s. Comenzaremos con la
acción delete() en el PostsController:

function delete($id)

{

$this->Post->delete($id) ;

$this->Session->setFlash('The post with id: '.$id.' has beendeleted.') ;

$this->redirect(array('action'=>'index')) ;

}

Esta lógica es eliminar el post por $ id, y utiliza $this->Session->setFlash() para mostrar al usuario un
mensaje de confirmación después de la reorientación a /posts.

Porque estamos sólo ejecutando una lógica y redireccionando, esta acción no tiene ninguna vista. Es
posible que desee actualizar su vista de índice (index) con vínculos que permitan a los usuarios
eliminar posts, entonces:

/app/views/posts/index.ctp

<h1>Blog posts</h1>

<p><?php echo $html->link('Add Post', array('action' => 'add')); ?></p>

<table>

<tr>

<th>Id</th>

<th>Title</th>

<th>Actions</th>

<th>Created</th>

</tr>

<!-- Aquí esta el ciclo que muestra $posts a través de nuestro arreglo, imprimiendo la información de
los posts -->

<?php foreach ($posts as $post): ?>

<tr>

<td><?php echo $post['Post']['id']; ?></td>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


107

<td>

<?php echo $html->link($post['Post']['title'], array('action' => 'view', 'id' => $post['Post']['id']));?>

</td>

<td>

<?php echo $html->link('Delete', array('action' => 'delete', $post['Post']['id']), null, 'Are yousure?' )?>

</td>

<td><?php echo $post['Post']['created']; ?></td>

</tr>

<?phpendforeach; ?>

</table>

El código de esta vista también utiliza HtmlHelper para que pregunte al usuario con un diálogo de
confirmación JavaScript de antes de intentar borrar un post.


Editando Posts

Editando Post: ¡aquí vamos! Eres un CakePHP pro por ahora, por lo que deberías haber adoptado un
patrón. Hacer la acción, luego la vista. Aquí está la acción edit() del PostsController que se vería
como:

functionedit($id) {

$this->Post->id = $id;

if (empty($this->data))

{

$this->data = $this->Post->read() ;

} else {

if ($this->Post->save($this->data)) {

$this->Session->setFlash('Your post has beenupdated.') ;

$this->redirect(array('action' => 'index')) ;

}

}

}

INTRODUCCIÓN A CAKE PHP FRAMEWORK


108

Esta acción primero chequea los datos del formulario para enviarlos. Si no fue enviado, este busca el
post y se lo pasa a la vista. Si algunos datos se han enviado, intenta guardar los datos utilizando el
modelo Post (o los rechazará y mostrara al usuario los errores de validación).

La vista de edición puede tener un aspecto parecido a este:

/app/views/posts/edit.ctp

<h1>Edit Post</h1>

<?php

echo $form->create('Post', array('action' => 'edit')) ;

echo $form->input('title') ;

echo $form->input('body', array('rows' => '3')) ;

echo $form->input('id', array('type'=>'hidden'));

echo $form->end('Save Post') ;

?>

Esta vista muestra el formulario de edición (con los valores de publicados), junto con los mensajes de
errores de validación necesarios.

Cabe destacar aquí: que CakePHP asumirá que usted está editando un registro si el campo 'id' está
presente en el arreglo de datos. Si 'id' no está presente (mirar hacia atrás en nuestra opinión de
añadir), Cake asumirá que usted está añadiendo un nuevo registro para llamar a save().

Ahora puede actualizar su vista de índice, con enlaces para ir a editar posts específicos:

/app/views/posts/index.ctp (edit links added)

<h1>Blog posts</h1>

<p><?php echo $html->link("Add Post", array('action'=>'add')); ?>

<table>

<tr>

<th>Id</th>

<th>Title</th>

<th>Action</th>

<th>Created</th>

</tr>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


109

<!-- Aqui se hace el ciclo que recorre nuestros arreglo $posts , imprimiendo la información de cada
post -->

<?phpforeach ($posts as $post): ?>

<tr>

<td><?php echo $post['Post']['id']; ?></td>

<td>

<?php echo $html->link($post['Post']['title'],array('action'=>'view', 'id'=>$post['Post']['id']));?>

</td>

<td>

<?php echo $html->link('Delete', array('action'=>'delete', 'id'=>$post['Post']

['id']), null, 'Are yousure?')?>

<?php echo $html->link('Edit', array('action'=>'edit', 'id'=>$post['Post']['id']));?>

</td>

<td><?php echo $post['Post']['created']; ?></td>

</tr>

<?php end foreach; ?>

</table>



El posts_controller.php definitivo con todo el código junto:


<ficha>
<?php

classPostsController extends AppController

{
var $name = 'Posts';
function index()
{
//manda a index.ctp todos los datos de la tabla Post, cada vez que aparece Post
estamos realizando algo con la BD

$this->set('posts', $this->Post->find('all'));

$this->pageTitle = 'Mi título del motor de búsquedas optimizado';

INTRODUCCIÓN A CAKE PHP FRAMEWORK


110

}
function view($id = null)
{
$this->Post->id = $id;
$this->set('post', $this->Post->read());
//Equivalente en una sola línea: $this->set('post', $this->Post->read(null,$id));
}
function add()
{
if (!empty($this->data))
{
if ($this->Post->save($this->data))
{
$this->Session->setFlash('Your post has beensaved.');

$this->redirect(array('action' => 'index'));
}
}
}
function delete($id)
{
$this->Post->delete($id);
$this->Session->setFlash('The post with id: '.$id.' has beendeleted.');
$this->redirect(array('action'=>'index'));
}
functionedit($id)
{
$this->Post->id = $id;
if (empty($this->data))
{
$this->data = $this->Post->read();
}
else
{
if ($this->Post->save($this->data))
{
$this->Session->setFlash('Your post has beenupdated.');
$this->redirect(array('action' => 'index'));
}
}
}
}
?>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


111

12.4. Práctica - tareas

Esto es lo que necesitas:

1. Un servidor web. Aquí asumiremos que estás usando Apache, aunque las instrucciones para
utilizar otros servidores deberían ser similares. Tal vez necesitemos jugar un poco con la
configuración del servidor, pero la mayoría de pueden obtener y poner en marcha Cake sin
modificar la configuración para nada.

2. Un servidor de base de datos. Nosotros utilizaremos MySQL es este tutorial. Deberás saber lo
suficiente de SQL como para crear una base de datos: Cake se encarga del resto a partir de
ahí.

3. Conocimiento básico de PHP. Cuanto más programación orientada a objetos hayas hecho,
mejor, pero no tengas miedo si eres un fan de la programación procedural.

4. Finalmente, necesitarás un conocimiento básico del patrón MVC.

¡Comencemos!

Creando la Base de Datos de la Lista de Tareas

A continuación debemos crear la base de datos en la que se basará nuestra Lista de Tareas. Lo
primero que haremos será crear una tabla para almacenar nuestras tareas. Ejecuta el siguiente
código SQL en tu base de datos:

USE listatareas;

CREATE TABLE tareas (

id int(10) unsigned NOT NULL auto_increment,

titulovarchar(255) NOT NULL,

hechatinyint(1) default NULL,

creadodatetime default NULL,

modificadodatetime default NULL,

PRIMARY KEY (id)

);

La elección de los nombres de la tabla y las columnas no es arbitrario. Si sigues las convenciones de
Cake relacionadas a la base de datos, y las convenciones relacionadas a los nombres de las clases,
tendrás la posibilidad de aprovechar muchas ventajas y evitar la configuración. Cake es lo
suficientemente flexible como para acomodarse inclusive al peor esquema de base de datos de
aplicaciones antiguas, sin embargo, si utilizas las convenciones ahorrarás mucho tiempo de
desarrollo.

INTRODUCCIÓN A CAKE PHP FRAMEWORK


112

Es suficiente con decir que al llamar a la tabla 'tareas' automáticamente estará asociada con el
modelo Tarea.

Configuración de la Base de Datos en Cake

Vamos a decirle a Cake dónde está nuestra base de datos y cómo conectarse a ella. Para muchos,
esta será la primera y última vez que configuren algo.

Una copia del archivo de configuración de la base de datos se encuentra en
/app/config/database.php.default. Haz una copia en el mismo directorio, pero nombrándola
database.php.

El archivo de configuración debería ser fácil de seguir: sólo debes reemplazar los valores en el arreglo
$default con la información que se corresponda a tu configuración. Un ejemplo completo debería
verse como el siguiente:

var $default = array(

'driver' => 'mysql',

'persistent' => false,

'host' => 'localhost',

'login' => 'root',

'password' => '',

'database' => 'listatareas',

'prefix' => '',

);

Una vez que hayas guardado el nuevo database.php, deberías poder abrir el navegador en la página
de inicio de Cake y ver que puede conectarse a la base de datos sin problemas.


Configuración Opcional

Hay dos ítems más que pueden ser configurados. La mayoría de los desarrolladores realiza estos
pasos, pero para este tutorial no son necesarios. El primero es definir una cadena (o "salt") para darle
más seguridad a los hash. El segundo ítem es darle acceso de escritura a Cake, a su directorio tmp.

La cadena de seguridad (o "salt") es usada para generar hashes. Puedes cambiarla editando el
archivo /app/config/core.php. No importan tanto cuál es el nuevo valor del salt, siempre y cuando no
sea fácil de adivinar.

<?php

/**

INTRODUCCIÓN A CAKE PHP FRAMEWORK


113

* Una cadena aleatoria usada en los métodos de hashing de seguridad.

*/

Configure::write('Security.salt', 'pl345e-P45s_7h3*S@l7!') ;

?>

La segunda tarea es darle al servidor web permisos de escritura sobre el directorio app/tmp.

Si por alguna razón CakePHP no puede escribir en ese directorio, podrás ver un aviso cuando te
encuentres navegando la aplicación en modo debug.

Una aclaración para mod_rewrite

Es muy probable que los usuarios novatos tengan problemas con mod_rewrite, así que haremos una
mención aquí. Si la página de bienvenida de CakePHP se ve un poco rara (sin imágenes o estilos CSS),
probablemente no tengas funcionando el módulo mod_rewrite en tu sistema. Algunos consejos para
que hacerlo funcionar:

1. Asegúrate que la sobreescritura (override) esté permitida (allowed): en tu httpd.conf,
deberías tener una sección en la que se definen los permisos sobre cada Directorio en tu
servidor. Asegúrate que AllowOverride esté puesto en All para el Directorio correcto. Por
razones de seguridad y de performance, noseteesAllowOverride en All dentro de <Directory
/>. A su vez, busca el bloque <Directory> que haga referencia al directorio de tu sitio web.

2. Asegúrate que estás editando el httpd.conf correcto en vez de un httpd.conf específico de
usuario o sitio web.

3. Por una u otra razón, puedes haber conseguido una copia de CakePHP sin los archivos
.htaccess necesarios. Esto a veces sucede porque algunos sistemas operativos tratan a los
archivos cuyo nombre comienza con '.' como ocultos, y no los copia. Asegúrate que tu copia
de CakePHP proviene de la sección de descargas del sitio o desde nuestro repositorio SVN.

4. Asegúrate que Apache esté cargando mod_rewrite correctamente. Deberías ver algo como
LoadModulerewrite_module libexec/httpd/mod_rewrite.so o (en Apache 1.3)
AddModulemod_rewrite.c en tu httpd.conf.

Si no quieres o no puedes hacer funcionar mod_rewrite (o algún otro módulo compatible),
necesitarás usar las 'pretty' URLs proporcionadas por CakePHP. En /app/config/core.php,
descomenta la línea que diga algo como:

Configure::write('App.baseUrl', env('SCRIPT_NAME')) ;

También puedes borrar los ficheros.htaccess:

/.htaccess

/app/.htaccess

/app/webroot/.htaccess

INTRODUCCIÓN A CAKE PHP FRAMEWORK


114

Esto haráque tus URLs se vean de la forma:

www.example.com/index.php/controllername/actionname/param
en vez de www.example.com/controllername/actionname/param.


Crear un modelo Tarea

La clase Model es el pan y manteca de las aplicaciones CakePHP. Creando un modelo CakePHP que
interactúe con nuestra base de datos, tendremos la base para poder hacer luego nuestras acciones
de vista, agregar, editar, y eliminar.

Los archivos de clases de modelo de CakePHP van en la carpeta /app/models, y el archivo que
crearemos lo grabaremos en /app/models/tarea.php. El archivo completo debería verse así:

<?php
class Tarea extends AppModel
{
var $name = 'Tarea';
var $validate = array('titulo' => array('rule' => 'VALID_NOT_EMPTY','message' => 'Tienes
que cubrir campo Titulo'));
}
?>

La convención en la nomenclatura es muy importante en CakePHP. Nombrando nuestro modelo
como Tarea, CakePHP puede automáticamente inferir que este modelo será usado en el controlador
TareasController, y será atado a la tabla de la base de datos llamada tareas.

CakePHP dinámicamente creará un objeto de modelo por ti, si no puede encontrar el archivo
correspondiente en /app/models.

Siempre es una buena idea agregar la variable $name, y suele ahorrarnos problemas con los nombres
de las clases en PHP4.

Crear un controlador para Tarea

A continuación, crearemos un controlador para nuestras tareas. El controlador es donde existe toda
la lógica del negocio para la interacción con las tareas. En pocas palabras, es el lugar en el que juegas
con los modelos y realizas el trabajo con las tareas. Ubicaremos este nuevo controlador en un archivo
llamado tareas_controller.php dentro del directorio /app/controllers. Así es como debe verse el
controlador (CRUD) completo:


<?php
classTareasController extends AppController
{
var $name = 'Tareas';
var $helpers = array('Html', 'Form', 'Time');

function index($status=null)
{

INTRODUCCIÓN A CAKE PHP FRAMEWORK


115

if($status == 'hecha')

{

$this->set('tareas', $this->Tarea-
>find('all',array('conditions'=>array('Tarea.hecha'=>'1'))));

}
elseif($status == 'pendiente')

{

$this->set('tareas', $this->Tarea-
>find('all',array('conditions'=>array('Tarea.hecha'=>'0'))));

}

else
{
$tareas = $this->Tarea->find('all');

$this->set('tareas', $tareas);

$this->set('status', $status);
}
}
functionedit($id = null)

{
if (!$id)
{
$this->Session->setFlash('Tarea Inválida');
$this->redirect(array('action'=>'index'), null, true);
}
if (empty($this->data))
{
$this->data = $this->Tarea->find(array('id' => $id));
}
else
{
if ($this->Tarea->save($this->data))

{
$this->Session->setFlash('La Tarea ha sido salvada');
$this->redirect(array('action'=>'index'), null, true);
}
else
{
$this->Session->setFlash('La Tarea no ha podido ser salvada. Inténtalo de
nuevo.');
}
}
}

INTRODUCCIÓN A CAKE PHP FRAMEWORK


116

function delete($id = null)
{

if (!$id)
{
$this->Session->setFlash('id Invalida para Tarea');

$this->redirect(array('action'=>'index'), null, true);

}

if ($this->Tarea->del($id))

{

$this->Session->setFlash('Tarea #'.$id.' borrada');

$this->redirect(array('action'=>'index'), null, true);

}

}

function add()

{

if (!empty($this->data))

{

$this->Tarea->create();

if ($this->Tarea->save($this->data))

{

$this->Session->setFlash('La Tarea ha sido salvada');

$this->redirect(array('action'=>'index'), null, true);

}

else

{

$this->Session->setFlash('Tarea no salvada. Prueba de nuevo.');

}

}

INTRODUCCIÓN A CAKE PHP FRAMEWORK


117

}

}

?>



Creando las Vistas (Views) de las Tareas

Ahora que tenemos los datos que fluyen a nuestro modelo y la lógica de nuestra aplicación y el flujo
definido por nuestro controlador, vamos a crear una vista (view) para la acción “index” que hemos
creado anteriormente.

Cake view(vistas) son solo fragmentos de presentaciones que se adaptan dentro de las aplicaciones
diseñadas. Para la mayoría de las aplicaciones estaremos mezclando HTML con PHP, pero puede
terminar usando XML, CSV, o incluso de datos binarios.


Los Diseños (Layouts) de presentación son el código que se envuelve alrededor de las vista (views), y
pueden ser definidas y modificadas, pero por ahora, vamos a usar el valor por defecto.

Los archivos de las Cake’s views (vistas de cake) se almacenan en /app/views dentro de una carpeta
con el nombre del controlador que corresponden (tendremos que crear una carpeta llamada "tareas"
en este caso).

Véase el código de nuestra vista principal (index.ctp) podría ser algo como esto:

<h2>Tareas</h2>
<?phpif(empty($tareas)): ?>
No hay tareas en esta lista
<?phpelse: ?>
<table>
<tr>
<th>Título</th>

<th>Estatus</th>

<th>Creado</th>

<th>Modificado</th>

<th>Acciones</th>
</tr>
<?phpforeach ($tareas as $tarea): ?>
<tr>
<td>

<?php echo $tarea['Tarea']['titulo'] ?>

</td>

<td>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


118


<?phpif($tarea['Tarea']['hecha']) echo "Hecha";

else echo "Pendiente";?>

</td>

<td>

<?php echo $time->niceShort($tarea['Tarea']['created']) ?>

</td>

<td>

<?php echo $time->niceShort($tarea['Tarea']['modified']) ?>

</td>

<td>

<?php echo $html->link('Editar', array('action'=>'edit',$tarea['Tarea']['id'])); ?>

<?php echo $html->link('Borrar', array('action'=>'delete', $tarea['Tarea']['id']),
null, '¿Estás Seguro?'); ?>

</td>

</tr>

<?phpendforeach; ?>

</table>

<?phpendif; ?>

<?php echo $html->link('Agregar Tarea', array('action'=>'add')); ?><br />

<?php echo $html->link('Listar Todas las Tareas', array('action'=>'index')); ?><br />

<?php echo $html->link('Listar Tareas Hechas',array('action'=>'index', 'hecha'));?><br />

<?php echo $html->link('Listar Tareas Pendientes',array('action'=>'index', 'pendiente'));?><br
/>

El código de la vista para editar una tarea (edit.ctp):

<?php echo $form->create('Tarea');?>

<fieldset>
<legend>Edita Tarea</legend>

INTRODUCCIÓN A CAKE PHP FRAMEWORK


119



Recuerda…

Para construir una definición de estilo en CakePhp, se usa el método Style.

El método que puede usar para incorporar Javascript en Cake es HTML  script();

Los beneficios que tienen usar HtmlHelper en CakePhp son:
- Mejoras de caché ahorrando ciclos de CPU.
- Creación de marcas estructuradas.