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.
2. 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
3. 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
4. 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).
5. 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.
6. 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.
7. 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.
8. 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.
9. 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 componentes 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.
10. 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.
11. 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.
12. 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.
}
}
?>
13. 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.
14. 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.
15. 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).
16. 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
17. 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.
#
18. 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>
19. 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>
20. 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>
21. 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:
22. 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.
23. 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.
24. 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';
25. 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.
26. 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.
27. 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';
}
?>
28. 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.
29. 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.
30. 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".
31. 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'] ;
32. 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.
33. 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);
?>
34. 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.
35. 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.
36. 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') ;
}
}
?>
37. 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.
40. 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
41. 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:
42. 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.
43. 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.
44. 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.
45. 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().
46. 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).
47. 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().
48. 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'); ?>
49. 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';
}
50. 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.
51. 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...
52. 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>") ;
}
}
?>
53. 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.
54. 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.
55. 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.
56. 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
}
57. 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)
58. 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().
59. 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'.
60. 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.
61. 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'
) ;
}
?>
62. 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.
63. 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.
64. 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
) ) ;