SlideShare una empresa de Scribd logo
1 de 120
Descargar para leer sin conexión
16
TEMA 14. INTRODUCCIÓN
A CAKE PHP FRAMEWORK.
José M. Castillo Castillo
INTRODUCCIÓN A CAKE PHP FRAMEWORK
1
INDICE DE CONTENIDO TEMA 14. INTRODUCCIÓN A CAKE PHP FRAMEWORK
1. COMENZANDO CON CAKEPHP
1.1 Qué es cakephp y por qué hay que utilizarlo
1.2 Entendiendo modelo-vista-controlador
1.3 Beneficios MVC
2. PRINCIPIOS BÁSICOS DE CAKEPHP
2.1 Estructura de cakephp
2.2 Una petición típica de cakephp
2.3 Estructura de archivos de cakephp
2.4 Convenciones de cakephp
3. DESARROLLANDO CON CAKEPHP
3.1 Requerimientos
3.2 Preparándose para instalar
3.3 Instalación
3.4 Enciéndelo
3.5 Configuración
3.6 Comprensión de las rutas
4. CONTROLADORES
4.1 Introducción
4.2 App controller
4.3 Métodos del controlador
5. MODELOS
5.1 La comprensión de modelos
5.2 Creando tablas de bases de datos
5.3 Recuperando tus datos
5.4 Guardando tus datos
5.5 Borrando datos
5.6 Asociaciones - enlazando modelos
5.7 Datasources (fuentes de datos)
6. VISTAS
6.1 Plantillas de la vista
6.2 Layouts
6.3 Elementos
6.4 Métodos de la vista
6.5 Temas
INTRODUCCIÓN A CAKE PHP FRAMEWORK
2
7. HELPERS
7.1 Usando helpers
7.2 Creando helpers
7.3 Incluyendo otros helpers
7.4 Usando tu helper
7.5 Creando funcionalidad para todos los helpers
7.6 Helpers del core
8. SCAFFOLDING
8.1 Scaffolding
8.2 Constantes y funciones globales
9. TAREAS COMUNES CON CAKEPHP
9.1 Validación de datos
9.2 Reglas simples
9.3 Múltiples reglas por campo
9.4 Reglas de validación incorporadas
9.5 Reglas de validación personalizadas
10. PAGINACIÓN
10.1 Preparación del controlador
10.2 Paginación en views
11. FORMULARIOS
11.1 Creando formularios
11.2 Cerrando formularios
11.3 Form – métodos de elementos específicos
12. HTML
12.1 Introducción
12.2 Inserción de elementos html
12.3 Práctica - blog
12.4 Práctica - tareas
12.5 Cuestionario: html
INTRODUCCIÓN A CAKE PHP FRAMEWORK
3
1. COMENZANDO CON CAKEPHP
1.1. Qué es cakephp y por qué hay que utilizarlo
CakePHP es un marco de desarrollo [framework] rápido para PHP, libre, de código abierto. Se trata
de una estructura que sirve de base a los programadores para que éstos puedan crear aplicaciones
Web. Nuestro principal objetivo es que puedas trabajar de forma estructurada y rápida, sin pérdida
de flexibilidad.
Con CakePHP el desarrollo web ya no es monótono porque ofrecemos las herramientas para que
empieces a escribir el código que realmente necesitas: la lógica específica de tu aplicación. Consigue
una copia de CakePHP, empieza con lo verdaderamente importante y no reinventes la rueda cada vez
que te incorpores a un nuevo proyecto.
CakePHP tiene un equipo de desarrolladores y una comunidad activos, lo que añade valor al
proyecto. Con CakePHP, además de no tener que reinventar la rueda, el núcleo de tu aplicación se
mejora constantemente y está bien probado.
La siguiente lista nos muestra las características de la que disfrutará al utilizar CakePHP:
 Comunidad activa y amistosa.
 Licencia flexible.
 Compatible con PHP4 y PHP5.
 CRUD integrado para la interacción con la base de datos.
 Soporte de aplicación [scaffolding].
 Generación de código.
 Arquitectura Modelo Vista Controlador (MVC).
 Despachador de peticiones [dispatcher], con URLs y rutas personalizadas y limpias.
 Validación integrada.
 Plantillas rápidas y flexibles (sintaxis de PHP, con ayudantes [helpers]).
 Ayudantes para AJAX, Javascript, formularios HTML y más.
 Componentes de Email, Cookie, Seguridad, Sesión y Manejo de solicitudes.
 Listas de control de acceso flexibles.
 Limpieza de datos.
 Caché flexible.
 Localización.
 Funciona en cualquier subdirectorio del sitio web, con poca o ninguna configuración de
Apache.
NOTA: Es necesario montar un servidor de aplicaciones PHP con las librerías propias de Cake PHP.
Para ello, puedes descargar el software (servidor de PHP) y el entorno framework (Cake PHP).
INTRODUCCIÓN A CAKE PHP FRAMEWORK
4
1.2. Entendiendo modelo-vista-controlador
Las aplicaciones CakePHP bien escritas siguen el patrón de diseño de software MVC (Modelo-Vista-
Controlador). Programar utilizando MVC consiste en separar la aplicación en tres partes principales.
El modelo representa los datos de la aplicación, la vista hace una presentación del modelo de datos,
y el controlador maneja y enruta las peticiones [requests] hechas por los usuarios.
Figura 1: Una petición MVC básica
La figura 1 muestra un ejemplo sencillo de una petición [request] MVC en CakePHP. A efectos
ilustrativos, supongamos que un usuario llamado Ricardo acaba de hacer clic en el enlace "¡Comprar
un pastel personalizado ahora!" de la página de inicial de la aplicación.
1. Ricardo hace clic en el enlace apuntando a
http://www.ejemplo.com/pasteles/comprar, y su navegador hace una petición al
servidor web.
2. El despachador comprueba la URL de la petición (/pasteles/comprar), y le pasa la
petición al controlador adecuado.
3. El controlador realiza lógica de aplicación específica. Por ejemplo, puede comprobar
si Ricardo ha iniciado sesión.
4. El controlador también utiliza modelos para acceder a los datos de la aplicación. La
mayoría de las veces los modelos representan tablas de una base de datos, aunque
también pueden representar entradas LDAP, canales RSS, o ficheros en el sistema. En
este ejemplo, el controlador utiliza un modelo para buscar la última compra de
Ricardo en la base de datos.
5. Una vez que el controlador ha hecho su magia en los datos, se los pasa a la vista. La
vista toma los datos y los deja listos para su presentación al usuario. La mayoría de
las veces las vistas en CakePHP vienen en formato HTML, pero una vista puede ser
fácilmente un PDF, un documento XML, o un objeto JSON, dependiendo de tus
necesidades.
6. Una vez que el objeto encargado de procesar vistas en CakePHP ha utilizado los
datos del controlador para construir una vista completa, el contenido se devuelve al
navegador de Ricardo.
Casi todas las peticiones a tu aplicación seguirán este patrón básico. Más adelante, vamos a
completar algunos detalles específicos de Cake, así que, por favor, ten esto en cuenta a medida que
avanzamos.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
5
1.3. Beneficios MVC
¿Por qué utilizar MVC? Porque es un patrón de diseño de software probado y se sabe que funciona.
Con MVC la aplicación se puede desarrollar rápidamente, de forma modular y mantenible. Separar
las funciones de la aplicación en modelos, vistas y controladores hace que la aplicación sea muy
ligera. Estas características nuevas se añaden fácilmente y las antiguas toman automáticamente una
forma nueva.
El diseño modular permite a los diseñadores y a los desarrolladores trabajar conjuntamente, así
como realizar rápidamente el prototipado. Esta separación también permite hacer cambios en una
parte de la aplicación sin que las demás se vean afectadas.
Aunque lleva algún tiempo acostumbrarse a construir aplicaciones así, estamos seguros de que, una
vez construyas tu primera aplicación con CakePHP, no querrás volver a hacerlo de otra forma.
Recuerda…
Los beneficios de usar MVC son:
- Separar la parte visual del código.
- Desarrollo rápido.
CakePhp es compatible con versiones PHP 4 y 5.
La arquitectura que usa CakePHP es el Modelo Vista Controlador.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
6
2. PRINCIPIOS BÁSICOS DE CAKEPHP
2.1. Estructura de cakephp
CakePHP incluye las clases Controlador [Controller], Modelo [Model] y Vista [View], pero también
incluye otras clases y objetos que hacen que el desarrollo en MVC sea un poco más rápido y
agradable. Los Componentes [Components], Comportamientos [Behaviors], y Ayudantes [Helpers]
son clases que proporcionan extensibilidad y reusabilidad; agregan rápidamente funcionalidad a las
clases base MVC de las aplicaciones. Como de momento nos vamos a mantener en este nivel de
dificultad, ve preparando los detalles acerca de cómo usar estas herramientas.
Extensiones de los Controladores ("Componentes")
Un componente es una clase que ayuda a la lógica de un controlador. Si tienes alguna lógica y la
quieres compartir entre varios controladores (o aplicaciones), un componente suele ser una buena
elección. A modo de ejemplo, la clase del núcleo EmailComponent hace que la creación y el envío de
mensajes de correo electrónico sean tan sencillos como coser y cantar. En lugar de escribir lógica en
el método de un controlador, puedes empaquetarla en un componente para poder compartirla.
Los Controladores también están equipados con callbacks (rellamadas). Puedes utilizar estos
callbacks si necesitas insertar alguna lógica en las operaciones del núcleo de CakePHP. Los Callbacks
disponibles incluyen:
 beforeFilter(), se ejecuta antes que cualquier otra acción del controlador.
 beforeRender(), se ejecuta después de la lógica del controlador, pero antes de que la vista se
renderice.
 afterFilter(), se ejecuta después de toda la lógica del controlador, incluido el renderizado de
la vista. Puede que no haya ninguna diferencia entre afterRender() y afterFilter(), a menos
que hayas llamado manualmente a render() en el controlador y hayas incluido alguna lógica
después de esa llamada.
Extensiones de las Vistas
Un ayudante [Helper] es una clase que ayuda a la lógica de una vista. Del mismo modo que varios
controladores utilizan un componente, los ayudantes [helpers] hacen que varias vistas accedan y
compartan lógica presentacional. Con uno de los ayudantes del núcleo, el AjaxHelper, el manejo de
las peticiones Ajax en las vistas es mucho más fácil.
La mayoría de las aplicaciones repiten piezas de código en sus vistas. CakePHP facilita la reutilización
de este código con diseños [layouts] y elementos [elements]. Por defecto, toda vista renderizada por
un controlador se coloca en un diseño [layout]; los elementos entran en juego cuando hay que
reutilizar estos fragmentos pequeños de contenido.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
7
Extensiones de los Modelos
Del mismo modo, los Comportamientos [Behaviors] son formas de añadir funcionalidad común entre
los modelos. Por ejemplo, si almacena datos de los usuarios en una estructura de árbol, puede
especificar que su modelo de usuario se comporte como un árbol, y obtener libre funcionalidad para
eliminar, añadir, y mover nodos en la estructura de árbol subyacente.
Los modelos también cuentan con el apoyo de otra clase llamada DataSource (Origen de datos). Los
DataSources son una abstracción que permite a los modelos manipular diferentes tipos de datos en
forma consistente. Si bien la principal fuente de datos en una aplicación CakePHP es a menudo una
base de datos, puede escribir DataSources adicionales que les permitan a sus modelos representar
canales RSS, archivos CSV, entradas LDAP, o eventos iCal. Los DataSources le permiten asociar
registros de diferentes fuentes: en lugar de limitarse sólo a uniones [joins] SQL, los DataSources le
permiten decirle a su modelo LDAP que está asociado a muchos eventos iCal.
Así como los controladores, los modelos también incluyen callbacks:
 beforeFind()
 afterFind()
 beforeValidate()
 beforeSave()
 afterSave()
 beforeDelete()
 afterDelete()
Los nombres de estos métodos deben ser lo suficientemente descriptivos para que sepa lo que
hacen. Asegúrese de obtener los detalles en el capítulo acerca de los modelos.
Extensiones de la Aplicación
Tanto los controladores como los ayudantes [helpers] y modelos tienen una clase padre que puede
usarse para definir cambios a nivel global de la aplicación. AppController (localizado en
/app/app_controller.php), AppHelper (localizado en /app/app_helper.php) y AppModel (localizado
en /app/app_model.php) son magníficos lugares donde colocar métodos que desee compartir entre
todos los controladores, ayudantes [helpers] o modelos.
Las rutas juegan un rol en las peticiones hechas a CakePHP. Las definiciones de rutas le dicen a
CakePHP cómo mapear URLs a acciones de controladores. El comportamiento por defecto asume
que la URL "/controller/action/var1/var2/" mapea a Controller::action($var1, $var2), pero puede
usar rutas para personalizar URLs y la forma en que éstas son interpretadas por su aplicación.
Algunas características en una aplicación merecen ser empaquetadas como un todo. Un plugin es un
paquete de modelos, controladores y vistas que cumplen un propósito específico que puede abarcar
múltiples aplicaciones. Un sistema de administración de usuarios o un blog simplificado pueden ser
buenos ejemplos para plugins de CakePHP.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
8
2.2. Una petición típica de cakephp
Hemos cubierto los ingredientes básicos de CakePHP, así que echemos un vistazo a cómo los objetos
trabajan juntos para completar una petición básica. Continuando con nuestro ejemplo de petición
original, imaginemos que nuestro amigo Ricardo acaba de hacer clic en el enlace "¡Comprar un pastel
personalizado ahora!" en una página de bienvenida de una aplicación CakePHP.
Figura 2. Petición típica de Cake.
Negro = elemento requerido, Gris = elemento opcional, Azul = callback
 Ricardo hace clic en el enlace apuntando a: http://www.ejemplo.com/tortas/comprar, y su
navegador hace una petición a su servidor Web.
 El enrutador analiza la URL para extraer los parámetros para esta petición: el controlador,
la acción, y cualquier otro argumento(s) que pueda afectar a la lógica de negocio durante
esta petición.
 Usando las rutas, una petición URL es mapeada a una acción de controlador (un método en
una clase de controlador específica). En este caso, es el método comprar() del controlador
PastelesController. El callback beforeFilter() del controlador es llamado antes de que
cualquier acción lógica del controlador sea ejecutada.
 El controlador puede usar modelos para ganar acceso a los datos de la aplicación. En este
ejemplo, el controlador usa un modelo para obtener información de la base de datos de las
últimas compras de Ricardo. Cualquier callback de modelo, comportamiento [behavior], y
orígenes de datos [DataSources] aplicables pueden activarse durante esta operación.
Mientras que el uso del modelo no es requerido, todos los controladores de CakePHP
inicialmente requieren al menos un modelo, salvo que el desarrollador indique lo contrario.
 Después que el modelo ha obtenido toda la información, ésta es devuelta al controlador.
Pueden activarse callbacks del modelo.
 El controlador puede usar componentes para refinar aún más los datos o realizar otras
operaciones (manipulación de sesiones, autenticación, o envíos de email, por ejemplo).
 Una vez que el controlador ha usado modelos y 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.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
9
2.3. Estructura de archivos de cakephp
Tras descargar y extraer CakePHP, estos serán los ficheros y carpetas que deberías ver:
 app
 cake
 vendors
 .htaccess
 index.php
 README
Observarás 3 carpetas principales:
 La carpeta app será donde haremos nuestra magia: es donde se ubicarán los ficheros de tu
aplicación.
 La carpeta cake es donde nosotros hemos hecho nuestra magia. Comprométete a no
modificar los ficheros de esta carpeta. No podremos ayudarte si has modificado el núcleo.
 Finalmente, la carpeta vendors es donde ubicarás las librerías PHP de terceros que
necesites usar con tus aplicaciones en CakePHP.
La carpeta app
La carpeta app de CakePHP es donde realizarás la mayor parte del desarrollo de tu aplicación.
Veamos un poco más de cerca las carpetas dentro de app.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
10
2.4. Convenciones de cakephp
Con las convenciones de CakePHP, usted ahorrará tiempo sobre la marcha: siguiendo las
convenciones, obtendrá libre funcionalidad, y también se libera de la pesadilla del mantenimiento
del seguimiento de los archivos de configuración. Las convenciones también hacen un sistema de
desarrollo muy uniforme, permitiendo a otros desarrolladores ayudar más fácilmente.
Las convenciones de CakePHP han sido destiladas de años de experiencia en desarrollo web y
mejores prácticas. Mientras que le sugerimos el uso de estas convenciones durante el desarrollo con
CakePHP, deberíamos mencionar que muchos de estos postulados pueden ser anulados, esto es
especialmente útil cuando se trabaja con sistemas heredados.
Convenciones de los nombres de archivos y clases
En general, los nombres de archivo llevan el símbolo guion bajo (underscore) "_", mientras que los
nombres de las clases usan Mayúsculas de primera palabra (CamelCase). La clase MyNiftyClass puede
ser encontrada en el archivo my_nifty_class.php, por ejemplo.
Sin embargo, el nombre de la clase que contiene un archivo puede no necesariamente ser
encontrada en el nombre de archivo. La clase EmailComponent es encontrada en un archivo llamado
email.php, y la clase HtmlHelper es encontrada en un archivo llamado html.php.
Convenciones de Modelo y de la Base de datos
Los nombres de las clases de modelos están en singular y en formato CamelCase. Persona,
PersonaGrande, y PersonaMuyGrande son todos ejemplos de nombres de modelos convencionales.
Los nombres de las tablas correspondientes a modelos de CakePHP están en plural y usando guion
bajo. Las tablas subyacentes para los modelos arriba mencionados serían: personas,
personas_grandes, y personas_muy_grandes respectivamente.
Los nombres de los campos con dos o más palabras se definen con guiones bajos:
nombre_y_apellidos.
El nombre por defecto de las claves foráneas en relaciones hasMany, belongsTo o hasOne, es el
nombre de la tabla relacionada (en singular) seguido de _id. Así, si Panadero hasMany Tarta, la tabla
tartas referenciará la tabla panaderos mediante la clave foránea panadero_id. Para una tabla
compuesta por varias palabras como tipos_categorias, la clave foránea sería tipo_categoria_id.
El nombre de las tablas de unión entre modelos, usadas en relaciones hasAndBelongToMany
(HABTM), debería estar formado por el nombre de las tablas que une puestos en orden alfabético
(cebras_manzanas en vez de manzanas_cebras).
Todas las tablas con las que interaccionan los modelos de CakePHP (con excepción de las de unión de
tablas) necesitan una clave primaria simple que identifique inequívocamente cada fila. Si deseas
modelar una tabla que no tiene una clave primaria de un sólo campo, como por ejemplo las filas de
una tabla de unión posts_tags, la convención de CakePHP dicta que se añada una clave primaria de
un solo campo a la tabla.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
11
CakePHP no soporta claves primarias compuestas. Si deseas manipular directamente los datos de tu
tabla de unión, usa llamadas directas a query o añade una clave primaria para que actuara como un
modelo normal. Por ejemplo:
CREATE TABLE posts_tags
(
id INT(10) NOT NULLAUTO_INCREMENT,
post_idINT(10) NOT NULL,
tag_idINT(10) NOT NULL,
PRIMARY KEY(id)
);
En vez de utilizar una clave autoincremental como clave primaria, puedes utilizar char(36). De este
modo CakePHP utilizará un uuid(String::uuid) único de 36 caracteres siempre que grabes un nuevo
registro utilizando el método Model::save.
Convenciones de Controladores
Los nombres de las clases de los controladores son en plural, con formato CamelCased, y Terminan
en Controller. PersonasController y UltimosArticulosController son ejemplos de nombres
convencionales de controladores.
El primer método que escribas para un controlador debe de ser el método index(). Cuando la
petición especifica un controlador pero no una acción, el comportamiento por defecto de CakePHP
es ejecutar el método index() de dicho controlador. Por ejemplo, una petición de
http://www.example.com/apples/ se corresponde con la llama al método index() del controlador
ApplesController, mientras que http://www.example.com/apples/view se corresponde con una
llamada al método view() del controlador ApplesController.
También puedes cambiar la visibilidad de los métodos de los controladores en CakePHP
anteponiendo al nombre del método guiones bajos. Si un método de un controlador comienza por
un guion bajo, el método no será accesible directamente desde la web, sino que estará disponible
sólo para uso interno. Por ejemplo:
<?php class NoticiasController extends AppController
{
function ultimas()
{
$this->_buscaNuevosArticulos();
}
function _buscaNuevosArticulos()
{
//Lógica para encontrar los nuevos artículos.
}
}
?>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
12
Mientras que la página http://www.example.com/noticias/ultimas/ está accesible de manera
normal, si alguien intenta acceder a la página
http://www.example.com/noticias/_buscaNuevosArticulos/ obtendrá un error porque el nombre del
método está precedido por un guion bajo.
Consideraciones de URL para nombres de controladores
Como se puede ver, los controladores con un nombre simple (de una sola palabra) pueden ser
fácilmente mapeados a una url en minúsculas. Por ejemplo, ApplesController (que se define en el
archivo 'apples_controller.php') y accedido desde http://example.com/apples.
Por otro lado múltiples combinaciones de palabras pueden ser transformadas automáticamente en
un mismo nombre de controlador:
 /redApples
 /RedApples
 /Red_apples
 /red_apples
Todas resuelven la acción index de controlador RedApples. Sin embargo, la convención es que las urls
sean en minúsculas y separadas con guion bajo, por lo tanto /red_apples/go_pick es la forma
correcta de acceder a la acción. RedApplesController::go_pick.
Convenciones de Vistas
Los archivos de plantillas de Vistas (Views) deben ser nombradas después de las funciones de los
controladores con guion bajo "_". La función getReady() del controlador PeopleController se
visualizara con la plantilla de vista en /app/views/people/get_ready.ctp por ejemplo.
El patrón básico es: /app/views/controller/underscored_function_name.ctp
Al nombrar las piezas de su aplicación utilizando las convenciones de CakePHP, usted adquiere
funcionalidad sin mucho mantenimiento de la configuración. Aquí encontramos un ejemplo final de
convenciones:
 Tabla de Base de Datos: ‘people’.
 Clase de Modelo: ‘Person’, encontrada en /app/models/person.php.
 Clase de Controlador: ‘PeopleController’, encontrada en
/app/controllers/people_controller.php.
 Plantilla de Vista, encontrada en /app/views/people/index.ctp.
Usando estas convenciones, CakePHP entiende que la petición http://example.com/people/ apunta a
la llamada de funciónindex() en el controlador, PeopleController, donde el modelo Person está
disponible automáticamente (y apunta automáticamente a la tabla ‘people’ en la base de datos), y se
renderiza en el archivo. Ninguna de estas relaciones ha sido configurada por otra razón que crear
clases y archivos que usted necesita crear.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
13
Recuerda…
CakePHP no soporta claves primarias compuestas.
Si quiero tener una aplicación multi-idioma, tengo que alojar los ficheros en Locale.
La estructura de CakePhp se basa en:
- Modelos y aplicaciones.
- Controladores y Vistas.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
14
3. DESARROLLANDO CON CAKEPHP
3.1. Requerimientos
 Servidor HTTP. Por ejemplo: Apache. Preferiblemente con mod_rewrite, pero no requerido.
 PHP 4.3.2 o superior. Si, CakePHP funciona genial en PHP 4 y 5.
Técnicamente no se requiere un motor de base de datos, pero nos imaginamos que la mayoría de las
aplicaciones usarán uno.
CakePHP soporta una gran variedad de motores de almacenamiento:
 MySQL (4 o superior)
 PostgreSQL
 Firebird DB2
 Microsoft SQL Server
 Oracle
 SQLite
 ODBC
 ADOdb
3.2. Preparándose para instalar
CakePHP es rápido y fácil de instalar. Los requisitos mínimos son un servidor web y una copia de
Cake, ¡solo eso! Aunque este manual se enfoca primariamente en la configuración sobre Apache
(porque es el usado comúnmente), Tu puedes configurar Cake para correr sobre la mayoría de
servidores web, tales como, LightHTTPD o bien Microsoft IIS. Preparar la instalación consta de los
siguientes pasos:
 Descargue CakePHP.
 Configure su servidor para manejar php si es necesario.
 Chequee los permisos de los archivos.
Obteniendo CakePHP
Hay dos principales maneras de obtener una copia limpia de CakePHP. Puedes descargar una copia
comprimida (zip/tar.gz/tar.bz2) de la página web principal, o puedes obtener el código desde el
repositorio git.
Para descargar la última release principal de CakePHP, dirígete a la página web
http://www.cakephp.org … y haz clic en el enlace “Download Now”.
Todas las releases actuales están alojadas en CakeForge. Este site también contiene enlaces a
muchos otros proyectos en CakePHP, incluyendo plugins y aplicaciones para CakePHP. Las releases
de CakePHP están disponibles en http://cakeforge.org/projects/cakephp.
Se crean nightlybuilds alternativas que incluyen parches y mejoras al minuto (bueno, al día).
INTRODUCCIÓN A CAKE PHP FRAMEWORK
15
Permisos
CakePHP usa el directorio /app/tmp para diferentes operaciones, como almacenar descripciones de
los modelos, vistas en cache, información de sesiones, entre otros.
Por ello, asegúrate que el directorio /app/tmp de tu instalación de Cake tenga permisos de escritura
por el usuario del servidor web.
NOTA: Es necesario montar un servidor de aplicaciones PHP con las librerías propias de Cake PHP.
Para ello, puedes descargar el software (servidor de PHP) y el entorno framework (Cake PHP).
3.3. Instalación
Instalar CakePHP puede ser tan simple como colocar el directorio en el servidor, o tan complejo y
flexible como necesites. Esta sección cubrirá los tres tipos principales de instalación para CakePHP:
desarrollo, producción y avanzado.
 Desarrollo: fácil para iniciar, los URL de la aplicación incluyen el nombre del directorio, y es
menos seguro.
 Producción: Requiere la capacidad de configurar el servidor web para definir el "document
root", muy seguro.
 Avanzado: Con cierta configuración, permite ubicar los directorios clave de CakePHP en
diferentes partes del sistema de archivos, para compartir una misma instalación de CakePHP
para varias aplicaciones.
Desarrollo
Usar una instalación de desarrollo es el método más rápido para montar Cake. Este ejemplo te
ayudará a instalar una aplicación de CakePHP y hacerla disponible en
http://www.ejemplo.com/cake_1_2/. Asumimos para el fin de este ejemplo que tu raíz de
documentos está establecido a /var/www/html.
Descomprime los contenidos del archivo Cake en /var/www/html. Ahora tienes una carpeta en tu
raíz de documentos con un nombre dependiente de la versión que te has descargado (p.ej.
cake_1.2.0.7962). Renombra esta carpeta a cake_1_2. Tu configuración de desarrollo será como la
siguiente en el sistema de archivos:
 /var/www/html
 cake_1_2
 /app
 /cake
 /vendors
 .htaccess
 /index.php
 README
INTRODUCCIÓN A CAKE PHP FRAMEWORK
16
Producción
Una instalación de producción es una manera más flexible de instalar Cake. Usar este método
permite que un dominio entero se comporte como una aplicación CakePHP única. Este ejemplo te
ayudará a instalar Cake en cualquier sitio de tu sistema de ficheros y ponerlo disponible en
http://www.ejemplo.com. Tener en cuenta que esta instalación puede requerir los privilegios para
cambiar el DocumentRoot (raíz de documentos) en servidores web Apache.
Descomprime los contenidos del archivo Cake en un directorio a tu elección. Por motivos de ejemplo,
asumimos que escoges instalar Cake en /cake_install. Tu configuración de producción se verá de la
siguiente manera en el sistema de ficheros:
 /cake_install/
 /app
 /webroot (este directorio es el establecido con la directiva DocumentRoot)
 /cake
 /vendors
 /.htaccess
 /index.php
 /README
Los desarrolladores que usan Apache deberán establecer la directiva DocumentRoot para el dominio
a: DocumentRoot /cake_install/app/webroot.
Si tu servidor web está configurado correctamente, deberías encontrar tu aplicación Cake accesible
en http://www.ejemplo.com.
Apache y mod_rewrite (y .htaccess )
A pesar de que CakePHP está hecho para funcionar con mod_rewrite sin tocar nada, y normalmente
así es, hemos notado que algunos usuarios tienen dificultades para lograr que todo funcione
correctamente en sus sistemas.
Aquí hay unas cuantas cosas que puedes probar para conseguir que funcione correctamente.
Primero mira en tu httpd.conf (asegúrate de estar editando el httpd.conf del sistema y que no es
httpd.conf específico de un usuario o del site).
Asegúrate que la reescritura .htaccess esté permitida y que AllowOverride esté establecido a All para
el DocumentRoot adecuado. Deberías ver algo similar a:
# desactivadas en dicho directorio (y sus subdirectorios).
#
# Primero, configuramos "por defecto" para que sea un conjunto de
# características muy generales.
#
INTRODUCCIÓN A CAKE PHP FRAMEWORK
17
<Directory />
OptionsFollowSymLinks
AllowOverrideAll
# Orderdeny,allow
# Denyfromall
</Directory>
Asegúrate de estar cargando el módulo mod_rewrite correctamente. Debes ver algo como:
LoadModulerewrite_modulelibexec/apache2/mod_rewrite.
En muchos sistemas esto estará comentado (comenzando la línea con #) por defecto, así que sólo
tendrás que quitar los símbolos # del principio.
Tras realizar los cambios reinicia Apache para estar seguro de que las opciones de configuración
están activas.
Asegúrate de que tus ficheros .htaccess están en los directorios correctos. Esto puede pasar durante
la copia porque algunos sistemas operativos consideran los archivos que comienzan por '.' como
ocultos y por lo tanto no los copian.
Asegúrate de que tu copia de CakePHP es de las sección de descargas de nuestro site o nuestro
repositorio GIT, y que ha sido desempaquetado correctamente verificando que existen los ficheros
.htaccess.
En el directorio raíz de Cake (necesita ser copiado al directorio, esto redirige todo a tu aplicación de
Cake):
<IfModulemod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
18
En el directorio app de Cake (será copiado por bake):
<IfModulemod_rewrite.c>
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>
En el directorio webroot de Cake (será copiado a tu webroot de la aplicación por bake):
<IfModulemod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
En muchos servicios de hosting (GoDaddy, 1and1), tu servidor web está realmente siendo servido
desde un directorio de usuario que ya utiliza mod_rewrite. Si estás instalando CakePHP en un
directorio de usuario (http://ejemplo.com/~nombreusuario/cakephp), o en cualquier otra estructura
que ya utilice mod_rewrite necesitarás añadir sentencias RewriteBase a los archivos .htaccess que
utiliza CakePHP (/.htaccess, /app/.htaccess, /app/webroot/.htaccess).
Esto puede ser añadido a la misma sección con la directiva RewriteEngine, así, por ejemplo, tu
archivo .htaccess en el webroot debería ser así:
<IfModulemod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
19
<IfModulemod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
Los detalles de esos cambios dependen de tu configuración, y pueden incluir cosas adicionales que
no están relacionadas con Cake. Consulta la documentación online de Apache para más información.
# desactivadas en dicho directorio (y sus subdirectorios).
#
# Primero, configuramos "por defecto" para que sea un conjunto de
# características muy generales.
#
<Directory />
OptionsFollowSymLinks
AllowOverrideAll
# Orderdeny,allow
# Denyfromall
</Directory>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
20
3.4. Enciéndelo
Muy bien, ahora veamos a CakePHP en acción. Dependiendo de la configuración que hayas usado,
deberías apuntar tu navegador a http://example.com/ o http://example.com/mi_aplicacion/. En este
punto, se te presentará la vista de bienvenida de CakePHP por omisión, y un mensaje que indica el
estado de conexión con la base de datos.
¡Felicidades! Ya estás listo para crear tu primera aplicación CakePHP.
3.5. Configuración
Configurar aplicaciones CakePHP es pan comido. Después de instalar CakePHP, crear una aplicación
web básica sólo requiere aplicar la configuración de una base de datos. Existen, otras configuraciones
opcionales, que puedes realizar con el objetivo de aprovechar las ventajas de la arquitectura flexible
de CakePHP. Puedes agregar fácilmente elementos al núcleo de CakePHP, configurar URL
personalizadas y definir inflexiones.
Configuración de Base de Datos
CakePHP espera que los detalles de configuración de la base de datos estén en
app/config/database.php. Un ejemplo de configuración puede encontrarse en el archivo
app/config/database.php.default. Esta configuración deberá verse como sigue:
var $default = array('driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'cakephpuser',
'password' => 'c4k3roxx!',
'database' => 'mi_proyecto',
'prefix' => ''
) ;
El arreglo de configuración $default es el utilizado a menos que se especifique algún otro en la
propiedad $usDbConfig de los modelos. Por ejemplo, si mi aplicación tiene aplicaciones legadas
adicionales a la que se va a utilizar por defecto, podría utilizarla en mis modelos creando un nuevo
arreglo de configuración $legada que sea similar a $default, y asignado var $useDbConfig = 'legada';
en los modelos correspondientes.
Rellena cada para clave/valor en el arreglo de configuración, como mejor se ajuste a tus necesidades:
INTRODUCCIÓN A CAKE PHP FRAMEWORK
21
Nota que los prefijos son para las tablas, no para los modelos. Por ejemplo, si creaste una tabla join
para tus modelos Torta y Sabor, esta debe llamarse prefijo_sabor_torta (no
prefijo_sabor_prefijo_torta), y asignar la clave prefix con ‘prefijo_’.
Nombrar correctamente tus tablas (y algunas columnas) según las convenciones pueden librarte de
mucho trabajo de configuración. Por ejemplo, si nombras una tabla como tortas, el modelo Torta y el
controller TortasController, todo funcionará automáticamente si necesidad de tu intervención. Por
convención, utiliza guiones bajos, minúsculas, y nombres en plural para los nombres de tus tablas -
por ejemplo: reposteros, reposterias, sabores.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
22
Configuración del Core
La configuración de la aplicación en CakePHP se encuentra en /app/config/core.php. Este archivo es
una colección de definiciones de variables Configure y definiciones de constantes que determinan
como ha de comportarse la aplicación. Descripción de cada variable y cómo afecta tu aplicación
CakePHP:
NOTA: La configuración de Cache también puede ser encontrada en el archivo core.php.
La clase Configure puede ser utilizada para leer y escribir valores durante la ejecución del programa.
Esto puede ser especialmente útil si desea deshabilitar el nivel de depuración ("debug") para una
sección limita de lógica en tu aplicación.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
23
3.6. Comprensión de las rutas
El enrutamiento permite hacer una relación entre URLs y acciones de los controller. Fue añadido a
CakePHP para hacer más bonitos los URLs, más configurables, y más flexibles. Usar el mod_rewrite
de Apache no es un requisito para utilizar el enrutamiento, pero hará lucir mucho mejor tu barra de
direcciones.
Enrutamiento por Defecto
CakePHP viene configurado con un conjunto de rutas por defecto. Estas rutas te llevarán bastante
lejos en cualquier aplicación. Puedes acceder a una acción directamente desde el URL colocando su
nombre en la petición. También puedes pasar parámetros a las acciones de tus controladores usando
el URL.
Patrón URL de las rutas por defecto:
http://example.com/controlador/accion/param1/param2/param3
El URL /articulos/ver dirige a la acciónver() action del ArticulosController, y /productos/listaCompleta
dirige a la acciónalista_completa() de ProductosController. Si no se especifica ninguna acción en el
URL, se asume que se trata de la acción index().
La configuración inicial de enrutamiento permite pasar parámetros a tus acciones usando el URL. Una
petición para /articulos/ver/25 sería equivalente a llamar ver(25) en el ArticulosController, por
ejemplo.
Parámetros con Nombre
Algo novedoso en CakePHP 1.2 es la habilidad de usar parámetros con nombre (namedparameters).
Puedes nombrar parámetros y enviar sus valores usando el URL. Una petición para
/articulos/ver/titulo:primer+articulo/categoria:general resultaría en una llamada a la accion view() de
ArticulosController. En dicha acción, puedes encontrar los valores del título y la categoría dentro de
$this->passedArgs['titulo'] and $this->passedArgs['categoria'] respectivamente.
Algunos ejemplos que resuman las rutas por defecto pueden resultar útil.
 URL: /monos/saltar Dirige a: MonosController->saltar() ;
 URL: /productos Dirige a: ProductosController->index() ;
 URL: /tareas/ver/45 Dirige a: TareasController->ver(45) ;
 URL: /donaciones/ver/recientes/2001
Dirige a: DonacionesController->ver('recientes', '2001') ;
 URL: /contenidos/ver/capitulo:modelos/seccion:asociaciones
Dirige a: ContenidosController->ver() ;
 $this->passedArgs['capitulo'] = 'modelos';
 $this->passedArgs['seccion'] = 'asociaciones';
INTRODUCCIÓN A CAKE PHP FRAMEWORK
24
Recuerda…
El fichero de configuración de base de datos es Database.php.
Si el Framework no llega a funcionar completamente, debes revisar:
- .htaccess
- Apache y mod_rewrite.
Si una aplicación no funciona inicialmente, con apenas código en el controlador y funcionando el
framework de manera correcta, puede deberse a los Permisos.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
25
4. CONTROLADORES
4.1. Introducción
Un controlador (Controller) se usa para manejar la lógica de cierta sección de su aplicación.
Comúnmente, los controladores (Controllers) son usados para manejar la lógica de un solo modelo
(Model). Por ejemplo, si estás construyendo un sitio de una pastelería, podrías tener un
RecetasController y un IngredientesController para manejar las recetas y sus ingredientes. En
CakePHP, los controladores se nombran según el modelo que manejan, y se ponen siempre en plural.
El modelo Receta es manejado por el RecetasController, el modelo Producto es manejado por el
ProductosController, y así sucesivamente.
Los controladores de su aplicación son sub-clases de la clase AppController de CakePHP, que a su vez
extiende la clase principal Controller. La clase AppController puede ser definida en
/app/app_controller.php y debe contener métodos que son compartidos entre todos los
controladores de su aplicación. AppController es una sub-clase de Controller que es una clase de la
biblioteca estándar de Cake.
Los controladores pueden tener cualquier cantidad de métodos a los que normalmente se les llama
acciones. Las acciones son métodos de controladores en tu aplicación web para mostrar vistas. Una
acción es un único método de un controlador. El Dispatcher de CakePHP ejecuta acciones cuando
una solicitud entrante contiene en su URL el nombre de una acción del controlador. El controlador
estaría ubicado en /app/controllers/recetas_controller.php con el siguiente contenido:
<?php
# /app/controllers/recetas_controller.php
classRecetasController extends AppController
{
function ver($id)
{
//la lógica de la acción va aquí...
}
function compartir($cliente_id, $receta_id)
{
//la lógica de la acción va aquí...
}
function buscar($query)
{
//la lógica de la acción va aquí...
}
}
?>
Para que puedas usar un controlador de manera productiva en tu propia aplicación, repasaremos
algunos de los atributos y métodos provistos por los controladores de CakePHP.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
26
4.2. App controller
La clase AppController es la clase superior a todos los controladores de tu aplicación. AppController
extiende la clase Controller incluida en la librería base de CakePHP. Así, AppController es definida en
/app/app_controller.php como:
<?php class AppController extends Controller
{
}
?>
Las propiedades y métodos creados en tu AppController estarán disponibles para todos los
controladores de tu aplicación. Es el sitio ideal para poner el código que será común a todos los
controladores de tu aplicación. Los Componentes (los cuales veremos después) son lo más utilizado
para el código que se utiliza en la mayoría (pero no necesariamente en todos) los controladores.
Cuando se aplica la herencia a los objetos, CakePHP también realiza un trabajo extra cuando existen
atributos especiales en el controlador, como una lista de componentes o ayudantes utilizados por un
controlador. En estos casos, los arrays del AppControler son combinados con los arrays de la clase
hijo.
Atributos del Controlador
Para ver la lista completa de atributos visite la API de CakePHP.
$name
Los usuarios de PHP4 deberían empezar la definición de sus controladores con el atributo $name.
Este atributo debería ser asignado con el nombre del controlador. Usualmente este es simplemente
el plural del modelo principal al que el controlador está asociado. Esto previene algunos problemas
de distinción de mayúsculas que tiene PHP4 para los nombres de las clases.
<?php
# $name Ejemplo de uso del atributo $name
classRecetasController extends AppController
{
var $name = 'Recetas';
}
?>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
27
$components, $helpers y $uses
Los siguientes atributos más comúnmente utilizados del controlador indican a CakePHP qué
ayudantes (helpers), componentes (components), y modelos (models) utilizarás en conjunción con el
controlador actual. Utilizar esos atributos hace que las clases MVC estén disponibles al controlador
como variable de clase($this->ModelName, por ejemplo).
Los controladores tienen acceso a su modelo primario disponible por defecto. Nuestro
RecipesController tendrá disponible la clase modelo Recipe en $this->Recipe, y nuestro
ProductsController también posee el modelo Product en $this->Product.
Los ayudantes (Helpers) Html, Form, y Session están siempre disponibles por defecto, como lo es
SessionComponent.
Veamos cómo decirle a un controlador de CakePHP que planeas utilizar clases MVC adicionales.
<?php class RecipesController extends AppController
{
var $name = 'Recipes';
var $uses = array('Recipe', 'User') ;
var $helpers = array('Ajax') ;
var $components = array('Email') ;
}
?>
Cada una de estas variables es fusionada con sus valores heredados, por lo tanto no es necesario por
ejemplo) declarar le ayudante (helper) Form, o cualquier cosa que es declarada en tu controlador
App.
Atributos Relacionados con la Página: "$layout" y "$pageTitle"
Existen unos pocos atributos en los controladores de CakePHP que te dan control sobre cómo se
colocan tus vistas (views) dentro del diseño (layout).
Al atributo $layout se le puede asignar el nombre de un diseño (layout) guardado en
/app/views/layouts. Especificas un diseño al igualar $layout al nombre del archivo con el diseño
excluyendo la extensión .ctp. Si este atributo no ha sido definido, CakePHP renderiza el diseño por
defecto, default.ctp. Si no has definido un diseño en /app/views/layouts/default.ctp, el diseño por
defecto del núcleo de CakePHP’s será renderizado.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
28
<?php
// Usando <em>$layout</em> para definir un diseño alternativo
class RecipesController extends AppController
{
functionquickSave()
{
$this->layout = 'ajax';
}
}
?>
También puedes cambiar el título de la página (que está localizado en la barra en la parte superior de
tu navegador) utilizando $pageTitle. Para que esto funcione apropiadamente, tu diseño (layout)
necesita incluir la variable $title_for_layout como mínimo entre las etiquetas en la cabecera del
documento HTML.
<?php
// Usando <em>$pageTitle</em> para definir el título de la página
class RecipesController extends AppController
{
functionquickSave()
{
$this->pageTitle = 'Mi título del motor de búsquedas optimizado';
}
}
?>
También puedes establecer el título desde la vista (view) usando $this->pageTitle (Has de incluir la
parte $this->; se recomienda, ya que separa la lógica del diseño y el contenido). Para una página
estática has de usar $this->pageTitle en la vista si quieres un título personalizado.
Si $this->pageTitle no está establecido, se generará automáticamente un título basado en el nombre
del controlador, o el nombre del fichero de la vista en el caso de una página estática.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
29
El Atributo de Parámetros ("$params")
Los parámetros del controlador están disponibles en $this->params en tu controlador de CakePHP.
Esta variable es usada para proporcionar acceso a la información sobre la petición actual. El uso más
común de $this->params es obtener acceso a información que ha sido entregada al controlador a
través de las operaciones POST o GET.
Form
$this->params['form']
Cualquier dato POST de cualquier formulario se almacena aquí, incluyendo información también
hallada en $_FILES.
admin
$this->params['admin']
Almacena un 1 si el diseño (layout) actual está vacío; 0 si no.
isAjax
$this->params['ajax']
Almacena un 1 si la petición actual es una llamada ajax; 0 si no. Esta variable sólo se establece si el
componente RequestHandler es usado en el controlador.
controller
$this->params['controller']
Almacena el nombre del controlador actual que está sirviendo la petición. Por ejemplo, si fue pedida
la URL /posts/view/1, $this->params['controller'] será igual a "posts".
action
$this->params['action']
pass
$this->params['pass']
Almacena la cadena de consulta GET enviada con la petición actual. Por ejemplo, si fue pedida la URL
/posts/view/?var1=3&var2=4, entonces $this->params['pass'] será igual a "?var1=3&var2=4".
INTRODUCCIÓN A CAKE PHP FRAMEWORK
30
url
$this->params['url']
Almacena la URL actual pedida, junto con los pares clave-valor de variables get. Por ejemplo, si se
llamó a la URL /posts/view/?var1=3&var2=4, entonces $this->params['url'] debería contener:
[url] => Array
(
[url] =>posts/view
[var1] => 3
[var2] => 4
)
data
$this->data
Usado para manejar datos POST enviados desde los formularios de FormHelper al controlador.
// El helper FormHelper es usado para crear un elemento de formulario:
$form->text('User.first_name') ;
El cual al ser renderizado, se ve parecido a:
<input name="data[User][first_name]" value="" type="text" />
Cuando el formulario es enviado al controlador mediante POST, los datos aparecen en this->data
// El valor first_name enviado se puede encontrar aquí:
$this->data['User']['first_name'] ;
INTRODUCCIÓN A CAKE PHP FRAMEWORK
31
prefix
$this->params['prefix']
Establecido al prefijo de enrutado. Por ejemplo, este atributo contendría la cadena "admin" durante
una petición a /admin/posts/someaction.
named
$this->params['named']
Almacena cualquier parámetro con nombre /clave:valor/ de la cadena de petición de la URL. Por
ejemplo, si se pidió la URL /posts/view/var1:3/var2:4, entonces $this>params['named'] debería
contener el array:
[named] => Array
(
[var1] => 3
[var2] => 4
)
Otros Atributos
Aunque puedes ojear todos los detalles para todos los atributos del controlador en el API, hay otros
atributos del controlador que merecen sus propias secciones en el manual.
El atributo $cacheAction ayuda en el "cacheado" (caching) de vistas (views), y el atributo $paginate
es usado para establecer las opciones por defecto de paginado para el controlador. Para más
información sobre cómo utilizar esos atributos.
persistModel
Usado para crear instancias almacenadas en caché de modelos (Models) un uso de Controlador
(Controller). Cuando se coloca en verdadero (true), todos los modelos relacionados con el
controlador (Controller) se almacenan en caché. Esto puede incrementar el desempeño en muchos
casos.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
32
4.3. Métodos del controlador
Para una lista completa de los métodos del controlador y sus descripciones visita el API de CakePHP.
Interactuando con Vistas
Set(string $variable, mixed $valor)
El método set() es la principal manera de enviar datos desde tu controlador a tu vista (view). Una vez
que has utilizado set(), la variable puede ser accedida en tu vista.
<?php
// Primero pasas datos desde el controlador:
$this->set('color', 'azul') ;
// Después, en la vista, puedes utilizar el dato:
?>
Has seleccionado <?php echo $color; ?>de la tarta.
El método set() también toma una array asociativo como primer parámetro. A menudo, esto puede
ser una manera rápida de asignar un conjunto de información a la vista.
Las claves (keys) serán flexionadas (inflected) antes de ser asignadas a la vista ('clave_con_subrayado'
se convierte en 'claveConSubrayado', etc. ):
<?php
$data = array(
'color' => 'pink',
'type' => 'sugar',
'base_price' => 23.95
) ;
// hace que $color, $type, y $basePrice // estén disponibles a la vista:
$this->set($data);
?>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
33
Control de Flujo
Redirect (string $url, integer $status, boolean $exit)
El método de control de flujo que más frecuentemente utilizarás es redirect(). Este método toma su
primer parámetro en forma de URL relativa de CakePHP. Por ejemplo, cuando un usuario ha hecho
un pedido satisfactoriamente, probablemente desearás redirigirle a una ventana de recibo.
functionrealizarPedidos()
{
// La lógina para finalizar el pedido va aquí
if($satisfactorio)
{
$this->redirect(array('controller' => 'pedidos', 'action' => 'gracias')) ;
} else {
$this->redirect(array('controller' => 'pedidos', 'action' => 'confirmar')) ;
}
}
El segundo parámetro de redirect() te permite definir un código de estado HTTP que acompañe la
redirección. Puede que desees usar 301 (movido permanentemente) o 303 (mirar otro),
dependiendo de la naturaleza de la redirección.
El método ejecutará exit() tras la redirección a menos que establezcas el tercer parámetro a false.
Flash (string $message, string $url, integer $pause)
Igualmente, el método flash() es usado para redirigir un usuario a una nueva página tras una
operación. El método flash() es diferente en cuanto que muestra un mensaje antes de enviar al
usuario a otra URL.
El primer parámetro debería contener el mensaje a mostrar, y el segundo parámetro es una URL
relativa a CakePHP. CakePHP mostrará el mensaje en $message durante el número de segundos en
$pause antes de reenviar al usuario a otra página.
Para mensajes flash en la página, cerciórate de echarle un ojo al método setFlash() del componente
SessionComponent.
Recuerda…
Un controlador se usa para manejar la lógica de cierta sección de la aplicación.
Los métodos de los controladores son también llamados Acciones.
El Modelo es:
- Manejado por un controlador.
- Llamado en singular por un controlador denominado en plural.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
34
5. MODELOS
5.1. La comprensión de modelos
Un Modelo representa tu modelo de datos y, en programación orientada a objetos, es un objeto que
representa una "cosa", como un coche, una persona, o una casa. Un blog, por ejemplo, puede
contener varios artículos (posts) y cada artículo puede contener varios comentarios. Los objetos Blog,
Artículo (Post) y Comentario son ejemplos de modelos, cada uno asociado con el otro.
Aquí presentamos un ejemplo simple de definición de modelo en CakePHP:
<?php
classIngredient extends AppModel { var $name = 'Ingredient'; }
?>
Simplemente con esta declaración, se le otorga al modelo Ingredient toda la funcionalidad que
necesitarás para crear consultas junto con guardado y borrado de datos. Estos métodos mágicos
provienen del modelo de herencia de CakePHP. El modelo Ingredient extiende el modelo de
aplicación AppModel, el cual extiende la clase Model, interna de CakePHP. Es esta clase Model
interna la que otorga la funcionalidad a nuestro modelo personalizado, Ingredient.
La clase intermedia AppModel está vacía y reside por defecto dentro de la carpeta /cake/. Redefinir
AppModel te permitirá definir funcionalidad que debería estar disponible a todos los modelos dentro
de tu aplicación. Para hacer eso, necesitas crear tu propio fichero app_model.php que reside en la
raíz de la carpeta /app/.
Crea tu fichero modelo en PHP en el directorio /app/models/ o en un subdirectorio de /app/models/.
CakePHP lo encontrará en cualquier lugar en el directorio. Por convención, debería tener el mismo
nombre que la clase; para este ejemplo, ingredient.php.
CakePHP creará dinámicamente un objeto modelo por ti si no puede encontrar un archivo
correspondiente en /app/models. Esto también significa que si, accidentalmente, nombras tu archivo
de manera errónea (p.ej. Ingredient.php o ingredients.php) CakePHP utilizará AppModel en lugar de
tu archivo de modelo con nombre incorrecto. Si estás tratando de utilizar un método de un modelo
personalizado y estás obteniendo errores SQL, normalmente es porque CakePHP no puede encontrar
tu modelo.
La propiedad $name es necesaria para PHP4 pero opcional para PHP5.
Con tu modelo definido, este puede ser accedido dentro de tu Controlador. CakePHP
automáticamente hará que se pueda acceder al modelo cuando su nombre concuerde con el del
controlador. Por ejemplo, un controlador llamado IngredientsController automáticamente inicializará
el modelo Ingredient y será accesible por el controlador mediante $this->Ingredient.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
35
<?php
classIngredientsController extends AppController
{
function index()
{
//obtiene todos los ingredientes y los pasa a la vista:
$ingredients = $this->Ingredient->find('all') ;
$this->set('ingredients', $ingredients) ;
}
}
?>
Están disponibles los modelos asociados a través del modelo principal. En el siguiente ejemplo, el
modelo Receta (Recipe) tiene una asociación con el modelo Ingrediente (Ingredient).
$this->Recipe->Ingredient->find('all') ;
Como podrás ver en Controllers, puedes atar múltiples modelos al controlador y acceder
directamente desde él. En el siguiente ejemplo, ambos modelos Recipe y User son accesibles desde
el controlador actual.
<?php
classRecipeController extends AppController
{
var $uses = array('Recipe', 'User') ;
function index()
{
$this->Recipe->find('all') ;
$this->User->find('all') ;
}
}
?>
Si no has añadido el modelo a través de la propiedad $uses entonces necesitarás importar el modelo
manualmente e instanciarlo dentro de la acción.
<?php
classRecipeController extends AppController
{
var $uses = array('Recipe') ;
function index()
{
$this->Recipe->find('all') ;
App::import('Model', 'User') ;
$user = new User() ;
$user->find('all') ;
}
}
?>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
36
5.2. Creando tablas de bases de datos
A pesar de que CakePHP puede tener orígenes de datos (datasources) que no son manejadas por
sistemas de gestión de bases de datos, la mayoría de las veces lo son. CakePHP está diseñado para
ser agnóstico y funcionará con MySQL, MSSQL, Oracle, PostgreSQL y otros. Puedes crear tus tablas de
base de datos como lo harías normalmente. Cuando creas tus clases del Modelo, automáticamente
se mapean a las tablas que has creado.
Los nombres de las tablas son, por convención, en minúsculas y en plural, con las palabras de los
nombres de tablas de varias palabras separadas por guiones de subrayado (_). Por ejemplo, un
nombre de Modelo de Ingredient espera el nombre de tabla ingredients. Un nombre de Modelo de
EventRegistration debería esperar un nombre de tabla event_registrations. CakePHP inspeccionará
tus tablas para determinar el tipo de dato de cada campo y utiliza esta información para automatizar
varias características como la salida de campos de formulario en la vista.
Los nombres de los campos son, por convención, en minúscula y separados por guiones de
subrayado (_).
Las asociaciones del modelo con el nombre de la tabla pueden ser anuladas con el atributo useTable
del modelo, explicado más adelante en este capítulo.
En el resto de esta sección verás cómo CakePHP "mapea" tipos de campos de bases de datos en tipos
de datos PHP y cómo CakePHP puede automatizar tareas basandose en cómo tus campos están
definidos.
Asociaciones de Tipo de Dato por Base de Datos
Todo RDMS define tipos de datos de manera ligeramente diferente. Dentro de la clase de origen de
datos (o "fuente de datos", datasource) para cada sistema de base de datos, CakePHP "mapea"
dichos tipos a algo que reconoce y crea una interfaz unificada sin importar en qué sistema de bases
de datos necesitas ejecutarlo.
El siguiente desglose describe cómo está "mapeado" cada uno:
MySQL
Un campo de tipo tinyint(1) es considerado booleano por CakePHP.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
37
MySQLi
ADOdb
INTRODUCCIÓN A CAKE PHP FRAMEWORK
38
ORACLE
SQLite
INTRODUCCIÓN A CAKE PHP FRAMEWORK
39
Títulos
Un objeto, en sentido físico, a menudo tiene un nombre o un título con el que referirse. Una persona
tiene un nombre como Juan o Ambrosio o Colega. Una entrada de un blog tiene un título. Una
categoría tiene un nombre.
Al especificar el campo title (título) o name (nombre), CakePHP automáticamente utilizará esta
etiqueta en varias circunstancias:
 Scaffolding — títulos de páginas, etiquetas de fieldset.
 Listas - normalmente utilizado para los desplegables <select>.
 TreeBehavior — reordenación, vistas de árbol.
Si tienes un campo titley un campo name en tu tabla, el campo title será el utilizado.
Creado y modificado ("created" y "modified" )
Al definir un campo created (creado) o modified (modificado) en tu tabla de la base de datos como
campo de tipo datetime, CakePHP reconocerá esos campos y los rellenará automáticamente cuando
un registro sea creado o grabado en la base de datos.
Los campos created y modified serán establecidos a la fecha y hora actuales cuando el registro es
inicialmente añadido. El campo modified será actualizado con la fecha y hora actuales cuando el
registro existente sea grabado.
NOTA: Un campo llamado updated (actualizado) exhibirá el mismo comportamiento que modified.
Estos campos necesitan ser del tipo datetime con el valor por defecto establecido a NULL para ser
reconocidos por CakePHP.
Utilizando UUIDs como Claves Primarias
Las claves primarias son normalmente definidas como campos INT. La base de datos incrementará
automáticamente el campo, comenzando en 1, para cada nuevo registro que se añade.
Alternativamente, si especificas tu clave primaria como CHAR(36), CakePHP generará
automáticamente UUIDs( Identificadores Únicos Universales) cuando son creados nuevos registros.
Un UUID es una cadena de 32 bytes separada por guiones, con un total de 36 caracteres. Por
ejemplo:
550e8400-e29b-41d4-a716-446655440000
Los UUIDs están diseñados para ser únicos, no sólo dentro de una tabla dada, sino también a través
de tablas y bases de datos. Si necesitas que un campo permanezca único a través de sistemas, los
UUIDs son un genial enfoque
INTRODUCCIÓN A CAKE PHP FRAMEWORK
40
5.3. Recuperando tus datos
Find($tipo, $parametros)
find('first', $params)
find('count', $params)
find('all', $params)
find('list', $params)
findAllBy<nombreCampo>(string $valor)
findBy<nombreCampo>(string $valor)
query(string $consulta)
field(string $nombre, string $condiciones, string $orden)
read($fields, $id)
5.4. Guardando tus datos
CakePHP hace que el salvado de los datos del modelo sea instantáneo. Los datos listos para ser
salvados deberán ser pasados al método save() del modelo usando el formato básico siguiente:
Array
(
[NombreModelo] => Array
(
[nombrecampo1] => 'valor'
[nombrecampo2] => 'valor'
)
)
La mayoría de las veces no necesitarás preocuparte por este formato: los ayudantes de CakePHP
HtmlHelper, FormHelper, y métodos de búsqueda empaquetan los datos en este formato. Si estás
usando alguno de los ayudantes, los datos también están convenientemente disponibles en
$this>data para su uso rápido.
En el siguiente ejemplo rápido se muestra una acción de un controlador que usa un modelo de
CakePHP para salvar datos en una tabla de una base de datos:
INTRODUCCIÓN A CAKE PHP FRAMEWORK
41
functionedit($id) {
// Ha POSTeado algún dormulario datos?
if(!empty($this->data))
{
// Si el formulario puede ser validado y salvado...
if($this->Receta->save($this->data)) { // Establede un mensaje flash y redirige.
$this->Session->setFlash("Receta guardada!") ;
$this->redirect('/recetas') ;
}
}
// Si no hay datos de formulario, busca la receta a editar y pásala a la vista
$this->set('receta', $this->Receta->findById($id)) ;
}
Una nota adicional: cuando se llama a save(), los datos pasados a la función como primer parámetro
son validados usando el mecanismo de validación de CakePHP. Si por alguna razón tus datos no se
graban, comprueba si alguna regla de validación se está incumpliendo.
Hay unos pocos métodos relacionados con el salvado que encontrarás útiles:
save(array $datos = null, boolean $validar = true, array $listaCampos = array())
Mostrado arriba, este método graba datos formateados en array. El segundo parámetro ($validar) te
permite eludir la validación, y el tercero ($listaCampos) te permite proveer una lista de campos del
modelo a ser grabados. Como seguridad añadida, puedes limitar los campos grabados a aquellos
listados en $listaCampos.
Una vez que un salvado ha sido completado, el identificador ID del objeto se encuentra en el atributo
$id del objeto del modelo (algo especialmente útil cuando se crean nuevos objetos).
$this->Ingrediente->save($datosNuevos) ;
$nuevoIngredienteId = $this->Ingrediente->id;
Cuando se llama a save() en un bucle, no olvides llamar a create().
create(array $datos = array())
Este método resetea el estado del modelo para grabar nueva información.
Si se pasa el parámetro $datos (usando el formato de array descrito arriba), la instancia del modelo
estará lista para salvar con esos datos (accesibles en $this->data).
saveField(string $nombreCampo, string $valorCampo, $validar = false)
Usado para salvar un único valor de un campo. Establece el ID del modelo ($this>nombreModelo->id
= $id) antes de llamar a saveField(). Cuando usas este método, $nombreCampo debería contener
sólo el nombre del campo, no el nombre del modelo y campo.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
42
Por ejemplo, para actualizar el título de una entrada de un blog, la llamada a saveField desde un
controlador debería parecerse a esto:
$this->Entrada->saveField('titulo', 'Un Nuevo Título para un Nuevo Día') ;
updateAll(array $campos, array $condiciones)
saveAll(array $datos = null, array $opciones = array())
Guardando Datos de Modelos Relacionados (hasOne, hasMany, belongsTo)
Guardando Datos de Modelos Relacionados (HABTM )
5.5. Borrando datos
del(int $id = null, boolean $cascada = true)
Borra el registro identificado por $id. Por defecto, también borra los registros dependientes del
registro especificado a ser borrado.
Por ejemplo, cuando se borra un registro Usuario que está ligado a varios registros Receta:
Si $cascada está establecido a true, los registros Receta relacionados también son borrados si el
valor de dependent en el modelo está establecida a true.
Si $cascada está establecido a false, los registros Receta permanecerán después de que el Usuario
haya sido borrado.
deleteAll(mixed $condiciones, $cascada = true)
De la misma manera que del() y remove(), excepto que deleteAll() borra todos los registros que
cumplen las condiciones dadas. El array $condiciones debería ser pasado como un fragmento SQL o
array.
5.6. Asociaciones - enlazando modelos
Una de las características más potentes de CakePHP es la habilidad para enlazar el mapeado
relacional proporcionado por el modelo. En CakePHP, los enlaces entre modelos son manejados
mediante asociaciones.
Definir relaciones entre diferentes objetos en tu aplicación debería ser un proceso natural. Por
ejemplo, en una base de datos de recetas, una receta puede tener varias revisiones, las revisiones
tienen un único autor, y los autores pueden tener varias recetas. El definir la manera en que
funcionan estas relaciones te permite acceder a tus datos de manera intuitiva y potente.
El propósito de esta sección es mostrarte cómo diseñar, definir y utilizar asociaciones entre modelos
en CakePHP.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
43
Mientras que los datos pueden provenir de una variedad de orígenes, la formá más común de
almacenamiento en aplicaciones web es una base de datos relacional. La mayoría de cosas que cubre
esta sección estará en ese contexto.
Tipos de Relaciones
hasOne
belongsTo
hasMany
hasAndBelongsToMany (HABTM)
5.7. Datasources (fuentes de datos)
DataSources son el enlace entre los modelos y la fuente de datos que cada modelo representa. En
muchos casos, los datos son recuperados de una base de datos relacional, como MySQL, PostgreSQL
o MSSQL. CakePHP se distribuye con varias datasources específicas para varias bases de datos
(consulta los archivos de clases dbo_* class files en cake/libs/model/datasources/dbo/), aquí se lista
un resumen de los mismos para tu comodidad:
 dbo_adodb.php
 dbo_db2.php
 dbo_firebird.php
 dbo_mssql.php
 dbo_mysql.php
 dbo_mysqli.php
 dbo_odbc.php
 dbo_oracle.php
 dbo_postgres.php
 dbo_sqlite.php
 dbo_sybase.php
Cuando se especifica una configuración de conexión a base de datos en app/config/database.php,
CakePHP usa de forma transparente la datasource correspondiente a la base de datos para todas las
operaciones con modelos. Por eso, aunque creas que no sabes nada de datasources, ya las has
estado usando desde siempre.
Todas las fuentes de datos indicadas arriba derivan de una clase base DboSource la cual añade
alguna lógica común a la mayoría de bases de datos relaciones. Si decides crear una datasource
RDBMS, tu mejor apuesta es trabajar a partir de una de ellas (por ejemeplo: dbo_mysql.php o
dbo_mssql.php) La mayor parte de la gente, sin embargo, está interesada en escribir datasources
para fuentes de datos externas, como APIs REST remotas o incluso servidores LDAP. Así que eso es lo
que vamos a examinar en adelante.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
44
Recuerda…
La propiedad $name del modelo es necesaria en PHP4.
Un tipo de relación HABTM significa:
- Tiene y pertenece a muchos.
- Relación de muchos a muchos.
Para hacer llamadas SQL personalizadas usamos el método: Query().
INTRODUCCIÓN A CAKE PHP FRAMEWORK
45
6. VISTAS
6.1. Plantillas de la vista
La capa vista de CakePHP es cómo hablas a tus usuarios. La mayor parte del tiempo tu vista estará
mostrando documentos (X)HTML a los navegadores, pero tal vez necesites servir datos AMF a un
objeto Flash, responder a una aplicación remota mediante SOAP o producir un fichero CSV para un
usuario.
Los ficheros de vista de CakePHP están escritos en PHP plano y tienen la extensión .ctp (CakePHP
Template) por defecto. Estos ficheros contienen toda la lógica de representación necesaria para
obtener los datos recibidos del controlador en un formato que está preparado para la audiencia a la
que estás atendiendo.
Los ficheros de vista se almacenan en /app/views/, en una carpeta nombrada tras el controlador que
usa los ficheros, y nombrada tras la acción a la que corresponde. Por ejemplo, el fichero de vista para
la acción view() del controlador Productos, normalmente, se encontraría en
/app/views/productos/view.ctp.
La capa vista en CakePHP puede estar formada por un número diferentes de partes. Cada parte tiene
usos diferentes, y será tratado en este capítulo:
 layouts (diseños): ficheros de vista que contienen el código de presentación que se
encuentra envolviendo muchas interfaces en tu aplicación. La mayoría de vistas son
'renderizadas' (presentadas) dentro de un layout (diseño).
 elements (elementos): trozo de código de vista más pequeño y reutilizable. Los elementos
generalmente son renderizados dentro de vistas.
 helpers (ayudantes): estas clases encapsulan lógica de vista que es necesaria en muchas
partes en la capa vista. Además de otras cosas, los ayudantes en CakePHP pueden ayudarte a
construir formularios, construir funcionalidad AJAX, paginar los datos del modelo o servir
feeds RSS.
6.2. Layouts
Un diseño contiene el código de presentación que envuelve una vista. Cualquier cosa que quieras ver
en todas tus vistas debería estar situada en un layout.
Los ficheros de diseño deberían situarse en /app/views/layouts. El diseño por defecto de CakePHP
puede ser sustituido creando un nuevo diseño por defecto en /app/views/layouts/default.ctp. Una
vez que ha sido creado un nuevo diseño, el código de la vista renderizado por el controlador se
coloca dentro del diseño por defecto cuando la página es renderizada.
Cuando creas un diseño, necesitas decirle a CakePHP dónde colocar el código para tus vistas. Para
hacer eso, estate seguro que tu diseño incluye un lugar para $content_for_layout (y opcionalmente,
$title_for_layout).
INTRODUCCIÓN A CAKE PHP FRAMEWORK
46
Aquí está un ejemplo de a lo que debería parecerse un diseño por defecto:
<!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo$title_for_layout?></title>
<linkrel="shortcuticon"href="Temario/1755/favicon.ico"type="image/x-icon">
<!-- Incluir ficheros y scripts externos aquí (Mirar el ayudante HTML para más
información -->
<?phpecho$scripts_for_layout ?>
</head>
<body>
<!-- Si quieres algún tipo de menú que mostrar en todas tus vistas,incluyelo aquí -->
<divid="cabecera">
<divid="menu">...</div>
</div>
<!-- Aquí es donde quiero que se vean mis vistas --><?php echo$content_for_layout ?>
<!--Añadir un pie de página a cada página mostrada -->
<divid="pie">...</div>
</body>
</html>
$scripts_for_layout contiene cualquier fichero externo y scripts incluidos con el ayudante HTML
incrustado. Es últil para incluir ficheros javascript y CSS de las vistas.
Cuando uses $html->css() o $javascript->link() en los ficheros de vista, especifica false en el
argumento 'in-line' para colocar el fuente html en $scripts_for_layout. (Mirar API para más detalles
de uso).
$content_for_layout contiene la vista. Aquí es donde será colocado el código de la vista.
$title_for_layout contiene el título de la página.
Para establecer el título para el diseño, es fácil hacerlo en el controlador, estableciendo el valor de la
variable $title_for_layout.
<?php
classUsuariosControllerextends AppController
{
functionverActivos()
{
$this->set('title_for_layout', 'Ver Usuarios Activos') ;
}
}
?>
Puedes crear tantos diseños como desees: simplemente colócalos en el directorio app/views/layouts
e intercambialos dentro de tus acciones del controlador usando la variable $layout del cotrolador, o
la función setLayout().
INTRODUCCIÓN A CAKE PHP FRAMEWORK
47
Por ejemplo, si una sección de mi site incluye un espacio menor con banner de publicidad, debería
crear un nuevo diseño (layout) con el espacio publicitario menor, especificándolo como el diseño
para todas las acciones del controlador haciendo algo como: var$layout=
'publicidad_pequena_pordefecto'.
<?php
classUsuariosControllerextends AppController
{
functionverActivos()
{
$this->set('title_for_layout', 'Ver Usuarios Activos') ;
$this->layout = 'publicidad_pequena_pordefecto';
}
functionverImagen()
{
$this->layout = 'imagen';
//mostrar la imagen del usuario
}
}
?>
CakePHP ofrece dos diseños comunes (además del diseño por defecto de CakePHP) que puedes usar
en tus propias aplicaciones: 'ajax' y 'flash'. El diseño Ajax es útil para contruir las respuestas Ajax; es
un diseño vacío (la mayoría de las llamadas ajax sólo requiren una pocas etiquetas como respuesta,
más que una interfaz completa). El diseño flash es usado por mensajes mostrados por el método
flash() del controlador.
Existen otros tres diseños: xml, js y rss en el núcleo como una manera rápida y fácil de servir
contenido que no sea text/html.
6.3. Elementos
Muchas aplicaciones tienen pequeños bloques de código de presentación que necesita ser repetido
de página en página, algunas veces en diferentes lugares del diseño. CakePHP puede ayudarte a
repetir partes de tu website que necesitan ser reutilizadas. Estar partes reutilizadas son llamadas
Elementos. Anuncios, cajas de ayuda, controles de navegación, menús extras, formularios de login y
llamadas están a menudo implementadas en CakePHP en forma de elementos. Un elemento es
básicamente una minivista que puede ser incluido en otras vistas, en diseños, e incluso dentro de
otros elementos. Los elementos pueden ser usados para hacer una vista más legible, situando el
renderizado de elementos que se repiten en sus propios ficheros. Pueden también ayudarte a
reutilizar fragmentos de contenido en tus aplicaciones.
Los elementos están en la carpeta /app/views/elements/ y tienen la extensión de archivo .ctp. Son
mostrados usando el método element() de la vista.
<?php echo$this->element('cajaayuda'); ?>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
48
6.4. Métodos de la vista
Los métodos de la Vista están disponibles para todos los archivos de vistas, elementos y plantillas.
Para llamar a cualquier método de la vista utilice: $this->method()
set(string $var,mixed$value)
Las Vistas tienen un metodoset() que es análogo al set() encontrado en los objetos Controller. Te
permite agregar variables al viewVars. Usando set() desde tu archivo de vista, agregará las variables a
la capa (layout) y elementos (elements) que luego serán renderizados.
En tu archivo vista puedes hacer:
$this->set('activeMenuButton', 'posts') ;
getVar(string $var)
Obtiene el valor de la viewVar con el nombre $var
getVars ()
Obtiene una lista con todas las variables disponibles en el ámbito de la vista actual. Devuelve un
arreglo con los nombres de las variables.
error(int $code, string $name, string $message)
Muestra una página de error al usuario. Usa layouts/error.ctppara renderizar la página.
$this->error(404, 'Notfound', 'This page wasnotfound, sorry') ;
6.5. Temas
Puedes aprovechar los temas (themes), haciendo sencillo el cambio de la apariencia de tu página de
una forma rápida y fácil.
Para usar los temas, necesitas decirle a tu controlador que use la clase ThemeView en lugar de la
clase por defecto View.
classExampleControllerextends AppController
{
var$view= 'Theme';
}
Para declarar qué tema usar por defecto, especifica el nombre del tema en tu controlador.
classExampleControllerextends AppController
{
var$view= 'Theme';
var$theme= 'ejemplo';
}
INTRODUCCIÓN A CAKE PHP FRAMEWORK
49
Los archivos de vista de los temas deben estar dentro de la carpeta /app/views/themed/. Dentro de
la carpeta themed, crea una carpeta usando el nombre de tu tema. Después de eso, la estructura de
carpetas dentro de /app/views/themed/example/ es exactamente igual a /app/views/.
Por ejemplo, el archivo de vista de una acción de edición de un controlador de Posts estaría ubicado
en /app/views/themed/example/posts/edit.ctp. Los archivos de Layout estarían en
/app/views/themed/example/layouts/.
Si un archivo de vista no puede ser encontrado en el tema, CakePHP tratará de localizarlo en la
carpeta /app/views/. De esta forma, puedes crear archivos de vista maestros y simplemente
sobreescribirlos según cada caso dentro de la carpeta de tu tema.
Si tienes archivos CSS o JavaScript que son específicos para tu tema, puedes almacenarlos en una
carpeta de tema dentro de la carpetawebroot/. Por ejemplo, tus hojas de estilo serían almacenadas
en /app/webroot/themed/example/css/ y tus archivos JavaScript estarían en
/app/webroot/themed/example/js/.
Todos los helpers de CakePHP son conscientes de los temas y crearán las rutas correctas
automáticamente. Como con los archivos de vistas, si un archivo no está en la carpeta del tema, se
ubicará por defecto en la carpeta webroot principal.
Recuerda…
Se podría decir que una vista es lo que el usuario ve.
Un layout de CakePhp soporta:
- CSS.
- Javascript.
Es compatible CakePhp con Ajax y Flash.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
50
7. HELPERS
7.1. Usando helpers
Usas helpers en CakePHP haciendo que un controlador sepa de su existencia. Cada controlador tiene
una propiedad $helpers que lista los helpers que estarán disponibles en la vista. Para habilitar un
helper en tu vista, agrega el nombre del helper en el arreglo $helpers del controlador.
<?php
classBakeriesControllerextends AppController
{
var$helpers=array('Form', 'Html', 'Javascript', 'Time') ;
}
?>
También pueden agregar helpers desde dentro de una acción, de esta forma sólo estarán disponibles
para esa acción y no para las demás acciones que permanezcan a ese controlador. Esto ahorra poder
de procesamiento para las demás acciones que no usan el helper, y mantienen al controlador mejor
organizado.
<?php
classBakeriesControllerextends AppController
{
Functionbake
{
$this->helpers[]= 'Time';
}
function mix
{
// El helper Time no es cargado aquí, no estará disponible.
}
}
?>
7.2. Creando helpers
Si un helper del coreno se ajusta a tus necesidades, los helpers son fáciles de crear.
Digamos que quisiéramos crear un helper que pudiera ser usado para mostrar como salida un link
específicamente creado con CSS que lo necesitas en diferentes partes de tu aplicación. Para poder
ajustar tu lógica dentro de la estructura existente de helpers de CakePHP, necesitarás crear una
nueva clase en /app/views/helpers. Llamemos a nuestro helperLinkHelper. El archivo de clase se verá
algo como esto:
<?php
/* /app/views/helpers/link.php */
classLinkHelperextends AppHelper
{
functionmakeEdit($title,$url)
{
// Lógica para crear un link con un formato específico va aqui...
INTRODUCCIÓN A CAKE PHP FRAMEWORK
51
}
}
?>
Existen algunos métodos incluidos en la clase de Helper en CakePHP de la cual quisieras sacar
ventaja:
output(string $string)
Usa esta función para enviar cualquier información de regreso a tu vista.
<?php
functionmakeEdit($title,$url)
{
// Usa la función de salida del helper para enviar
// datos con formato de regreso a la vista:
return$this->output("<div class="editOuter"><a href="$url" class="edit"> $title</a >
</div>") ;
}
?>
7.3. Incluyendo otros helpers
Es posible que necesites usar alguna funcionalidad existente en otro helper. Para hacerlo, puedes
especificar los helpers que deseas utilizar con un arreglo $helpers, con el formato que usarías en un
controlador.
<?php
/* /app/views/helpers/link.php (usando otros helpers) */
classLinkHelperextendsAppHelper
{
var$helpers=array('Html') ;
functionmakeEdit($title,$url)
{
// Usa el helper de HTML para mostrar
// información con formato:
$link=$this->Html->link($title,$url,array('class'=> 'edit')) ;
return$this->output("<div class="editOuter">$link</div>") ;
}
}
?>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
52
7.4. Usando tu helper
Una vez hayas creado tu helper y de haberlo colocado dentro de /app/views/helpers/, podrás
incluirlo dentro de tus controllers usando la variable especial $helpers.
Una vez tu controller se haya dado cuenta de esta nueva clase, podrás usarla en los views accediendo
mediante una variable llamada por ese helper:
<!-- crear un link usando el nuevo helper-->
<?phpecho$link->makeEdit('Change this Recipe', '/recipes/edit/5') ?>
Recuerda incluir el FormHelper en el array de $helpers si es apropiado. Los ayudantes HTML y
Session (si esta activa una sesión) siempre estarán disponibles.
7.5. Creando funcionalidad para todos los helpers
Todos los helpers extienden a una clase especial, AppHelper (así como los modelos extienden
AppModel y los controladores extienden AppController). Para crear funcionalidad que podría estar
disponible para todos los helpers, crea /app/app_helper.php.
<?php
class AppHelper extends Helper
{
functioncustomMethod()
{
}
}
?>
7.6. Helpers del core
CakePHP contiene un buen número de helpers que ayudan en la creación de la vista. Ellos asisten en
crear notación (markup) con buen formato (incluyendo formas), ayudan a dar formato a texto,
tiempo y números, y también pueden acelerar la funcionalidad de Ajax.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
53
Aquí está un resumen de los helpers disponibles por defecto.
Recuerda…
El Helper que ayuda a crear paginaciones de datos es Paginator.
El Helper que crea formularios es Form.
Un Helper puede ser compatible con XML, mediante el helper XML.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
54
8. SCAFFOLDING
8.1. Scaffolding
El scaffolding (creación de plataformas temporales) en aplicaciones es una técnica que permite a un
desarrollador definir y crear aplicaciones básicas que pueden crear, retirar, actualizar y borrar
objetos. El scaffolding en CakePHP también permite a los desarrolladores definir cómo los objetos
están relacionados unos con otros, y para crear y romper estos enlaces.
Todo lo que se necesita para crear un scaffold (plataforma temporal) es un modelo y su controlador.
Una vez que se declare la variable $scaffold en el controlador, ya estás listo y corriendo.
El scaffolding de CakePHP es bastante agradable. Te permite tener una aplicación CRUD básica
funcional en minutos. Es tan agradable, que querrás usarla en aplicaciones de producción. Ahora,
nosotros pensamos que es agradable también, pero por favor, ese cuenta lo que el scaffoldding
(plataforma temporal) es... bueno... es solo una plataforma temporal. Su estructura flexible la
deshaces rápidamente al inicio de un proyecto para poder iniciar. No fue pensada para ser
completamente flexible, fue pensada como una manera temporal de iniciar un proyecto
rápidamente. Si usted se encuentra realmente tratando de personalizar la lógica en sus vistas, es
momento de derrumbar su scaffolding para poder escribir más código.
Scaffolding es una gran manera de iniciar las primeras partes de una aplicación web iniciada. Los
esquemas de bases de datos tempranos son sujetos a cambios, lo cual es perfectamente normal en
una parte temprana del proceso de diseño. Esto tiene su inconveniente: un desarrollador web
detesta formas que nunca serán utilizadas.
Para reducir el estrés en el desarrollador, el scaffolding ha sido incluido en CakePHP. El scaffolding
analiza sus tablas en la base de datos y crea listas estándar con botones de agregar, borrar y editar,
forms estándar para editar y vistas estándar para inspeccionar un único elemento en la base de
datos.
Para agregar scaffolding a tu aplicación, en el controlador, agrega la variable $scaffold:
<?php
classCategoriesControllerextends AppController
{
var$scaffold;
}
?>
Si has creado la clase básica del modelo Category en el archivo /app/models/category.php, ya estás
listo para comenzar!. Visita http://example.com/categories para ver tu nuevo scaffold.
El crear métodos en controladores que se hayan sido "scaffoldeados" puede causar resultados no
deseados. Por ejemplo, si crea un método index() en un controlador "scaffoldeado", su método index
será mostrado en lugar que la funcionalidad de scaffoling.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
55
El scaffolding es reconocido por sus asociaciones de modelos, así que si tu modelo Category
pertenece a un User ["belongsTo" User], usted verá las IDs del modelo User relacionadas en el listado
del modelo Category. Si usted quisiera ver algo aparte de un ID (como el apellido del usuario), lo
logrará activando la variable $displayField en el modelo.
Inicializaremos la variable $displayField en nuestra clase de User para que los usuarios relacionados
con categorías serán mostrados por el primer nombre en lugar de solo el ID en el scaffolding. Esta
característica hace el scaffolding más leíble en muchas instancias.
<?php
class User extends AppModel
{
var$name= 'User';
var$displayField= 'first_name';
}
?>
Creando un simple interface Admin con scaffolding
Debes tener habilitada el enruta del admin en app/config/core.php, con
Configure::write('Routing.prefixes', array('admin'));una vez habilitada, podrás usar scaffolding para
generar el interface Admin.
Una vez habilitado asigne su prefijo a una variable scaffolding.
var$scaffold= 'admin';
Ahora tendrás acceso a acciones adminscafoldeadas:
 http://example.com/admin/controller/index
 http://example.com/admin/controller/view
 http://example.com/admin/controller/edit
 http://example.com/admin/controller/add
 http://example.com/admin/controller/delete
Esta una manera fácil de crear un simple interface “backend” de manera rápida. Tenga en cuenta que
no podrás tener admins creados con scaffolding y sin esta técnica, de manera simultánea. Aun así,
puedes usar un scaffolding sin interface Admin e incluir métodos individuales y/o reemplazarlos por
sus propios.
functionadmin_view($id=null)
{
//customcodehere
}
INTRODUCCIÓN A CAKE PHP FRAMEWORK
56
Una vez hayas reemplazado a una acción scafoldeada necesitarás crear un fichero View para tal
acción.
Personalizando Vistas Scaffold
Si estás buscando para algo un poco diferente a tus vistas scaffolded, puedes crear templates.
Nosotros aún no recomendamos esta técnica para aplicaciones de producción, pero semejante
personalización puede ser muy útil durante el desarrollo de prototipos.
La personalización se hace creando templates de vistas:
Vistas personalizadas para un controlador específico (para este ejemplo PostsController) debe ser
colocado como lo siguiente:
 /app/views/posts/scaffold.index.ctp
 /app/views/posts/scaffold.show.ctp
 /app/views/posts/scaffold.edit.ctp
 /app/views/posts/scaffold.new.ctp
Las vistas scaffolding personalizadas para todos los controladores deberían ser colocadas como las
siguientes:
 /app/views/scaffolds/index.ctp
 /app/views/scaffolds/show.ctp
 /app/views/scaffolds/edit.ctp
 /app/views/scaffolds/new.ctp
 /app/views/scaffolds/add.ctp
8.2. Constantes y funciones globales
Aunque en la mayor parte de nuestro trabajo diario en CakePHP utilizaremos clases y métodos
nativos, es útil conocer una serie de funciones globales que ofrece CakePHP. Muchas de ellas están
orientadas al trabajo con las clases de CakePHP (cargando las clases de modelo o componente), pero
muchas otras hacen más sencillo trabajar con matrices o cadenas.
También veremos en esta sección algunas de las constantes disponibles en las aplicaciones CakePHP.
Usarlas ayuda a realizar actualizaciones menos complicadas, además de ser útiles a la hora de
referenciar ciertos archivos o directorios en nuestras aplicaciones CakePHP.
Funciones globales
Éstas son las funciones globales disponibles en CakePHP. Muchas de ellas simplemente facilitan la
llamada a funciones de PHP con nombres largos, pero otras (como vendor() y uses()) se pueden usar
para incluir código o realizar otras funciones útiles. Lo más probable es que si estás buscando una
función para realizar una tarea con mucha frecuencia, la encuentres aquí.
(string$string_id, boolean $return=false)
INTRODUCCIÓN A CAKE PHP FRAMEWORK
57
Esta función gestiona la localización en las aplicaciones CakePHP. El parámetro $string_ididentifica la
ID de una traducción, mientras que el segundo parámetro indica si se debe mostrar
automáticamente la cadena (por defecto), o devolverla para su procesamiento (pasar el valor true
para que esto suceda).
a(mixed$uno,$dos,$tres...)
Devuelve un array con los parámetros pasados a la función.
print_r(a('foo', 'bar'));
// salida:
array(
=> 'foo',
=> 'bar'
)
aa(array$uno,$dos,$tres...)
Crea arrays asociativos a partir de los parámetros enviados a la función.
// salida:
array( 'a'=> 'b' )
am(array$uno,$dos,$tres...)
Combina todos los arrays pasados como parámetros y devuelve el array resultante
config
Puede ser usado para cargar archivos desde el directorio config mediante include_once. La función
comprueba si existe el archivo antes de incluir y regresa un booleano. Toma un número opcional de
argumento.
Ejemplo:config('some_file', 'myconfig') ;
convertSlash(string $cadena)
Sustituye las barras ("/") por subrayados ("_") y elimina el primer y el último subrayados en una
cadena. Devuelve la cadena convertida.
debug(mixed$var, boolean $showHtml=false)
Si el nivel de depuración, variable de configuración DEBUG, es distinto de cero, se muestra $var. Si
$showHTML es true, los datos se formatean para mostrarlos adecuadamente en los navegadores
web.
e(mixed$datos)
Simplifica la llamada a la función echo().
INTRODUCCIÓN A CAKE PHP FRAMEWORK
58
env(string $key)
Obtiene una variable de entorno a partir de las fuentes disponibles. Alternativa si las variables
$_SERVER o $_ENV están deshabilitadas.
También permite emular las variables PHP_SELF y DOCUMENT_ROOT en los servidores que no
permitan su uso. De hecho, es una buena práctica usar env() en lugar de $_SERVER o getenv() (sobre
todo si pensamos distribuir el código), ya que ofrece la misma funcionalidad y es totalmente
compatible.
fileExistsInPath(string $archivo)
Comprueba que el fichero $archivo está en el include_path actual de PHP. Devuelve un valor
booleano.
h(string $texto, string $charset)
Alias de la función htmlspecialchars().
ife($condicion,$siNoVacia,$siVacia)
Útil en operaciones ternarias. Si $condicion no es vacía, devuelve $siNoVacia; si no, devuelve
$siVacia.
low(string $cadena)
Alias de la función strtolower().
pr(mixed$var)
Alias de la función print_r(), añadiendo la etiqueta <pre> a la salida.
r(string $cadena_buscada, string $cadena_sustituta, string $cadena_original)
Alias de la función str_replace().
up(string $cadena)
Alias de la función strtoupper().
uses(string $lib1,$lib2,$lib3...)
Permite cargar las librerías nativas de CakePHP (localizadas en cake/libs/). Pasar como parámetro el
nombre de la librería sin la extensión '.php'.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
59
Constantes predefinidas
Recuerda…
El térmico CRUD es usado para referirse a las funciones básicas en bases de datos.
El significado de CRUD es Create, Read, Update y Delete.
Scaffolding está ideado:
- Para arrancar un proyecto temporalmente.
- Para crear rápidamente una estructura de proyecto.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
60
9. TAREAS COMUNES CON CAKEPHP
9.1. Validación de datos
La validación de los datos es una parte importante de cualquier aplicación, ya que asegura que los
datos en un modelo están conformes a las reglas de negocio de la aplicación. Por ejemplo, podrías
querer que los passwords tengan a lo menos un largo de ocho caracteres, o asegurar que los
username sean únicos. Definir reglas de validación hace que el manejo de los formularios sea
muchísimo más fácil.
Hay muchos diferentes aspectos del proceso de validación. En esta sección cubriremos el lado del
modelo, es decir, lo que ocurre cuando tu llamas al método save() de tu modelo. Para más
información acerca de cómo manejar el despliegue de errores de validación, revisa la sección que
cubre el FormHelper.
El primer paso en la validación de datos es la creación de las reglas de validación en el Modelo.
Para hacer eso, usa el arreglo Model::validate en la definición del Modelo, por ejemplo:
<?php
class User extends AppModel
{
var $name = 'User';
var $validate = array() ;
}
?>
En el ejemplo de arriba, el arreglo $validate se agrega al modelo User, pero el arreglo no contiene
reglas de validación. Asumiendo que la tabla users tiene los campos login, password, email y born, el
ejemplo de abajo muestra algunas simples reglas de validación que se aplican a esos campos:
<?php
class User extends AppModel
{
var $name = 'User';
var $validate = array('login' => 'alphaNumeric',
'email' => 'email',
'born' => 'date'
) ;
}
?>
INTRODUCCIÓN A CAKE PHP FRAMEWORK
61
El ejemplo muestra cómo se pueden agregar reglas de validación a los campos de un modelo. Para el
campo login serán aceptadas sólo letras y números, el email debe ser válido, y born debe ser una
fecha válida. La definición de reglas de validación habilitan en CakePHP el despliegue automático de
mensajes de error en formularos si los datos enviados no cumplen las reglas de validación.
CakePHP incluye muchas reglas de validación y usarlas puede ser bastante simple. Algunas de las
reglas incluidas permiten verificar el formato de los emails, URLs, y números de tarjeta de crédito -
las cubriremos en detalle más adelante.
Acá tenemos un ejemplo de validación más complejo que aprovecha algunas de las reglas incluidas:
<?php class User extends AppModel {
var $name = 'User';
var $validate = array(
'login' =>array(
'alphaNumeric' =>array(
'rule' => 'alphaNumeric',
'required' => true,
'message' => 'Sólo letras y números'
) ,
'between' =>array(
'rule' =>array('between', 5, 15) ,
'message' => 'Entre 5 y 15 caracteres'
)
) ,
'password' =>array(
'rule' =>array('minLength', '8') ,
'message' => 'Largo mínimo de 8 caracteres'
) ,
'email' => 'email',
'born' =>array(
'rule' => 'date',
'message' => 'Ingrese una fecha válida',
'allowEmpty' => true
)
) ;
}
?>
Dos reglas de validación son definidas para login: debería contener sólo letras y números, y su largo
debe ser de 5 a 15. El campo password debe tener un largo mínimo de 8 caracteres. El email debe
contener una dirección de correo válida, y born debe ser una fecha válida. Además, notar que puedes
agregar mensajes de error propios que CakePHP mostrará cuando estas reglas de validación no se
cumplan.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
62
Como lo muestra el ejemplo de arriba, un único campo puede tener múltiples reglas de validación. Y
si las reglas incluidas no coinciden con lo que necesitas, puedes agregar tus propias reglas de
validación según tus requerimientos.
Ahora que viste a grandes rasgos cómo funciona la validación, veamos cómo estas reglas son
definidas en el modelo. Hay tres diferentes maneras para definir reglas de validación: arreglos
simples, una única regla por campo, y múltiples reglas por campo.
9.2. Reglas simples
Tal como el nombre lo sugiere, esta es la manera más simple de definir una regla de validación.
La sintaxis para la definición de reglas usando esta manera es:
var $validate = array('fieldName' => 'ruleName');
Donde, 'fieldName' es el nombre del campo para el cual se está definiendo una regla, y 'ruleName' es
el nombre de una regla pre-definida.
Una regla por campo
Ésta técnica de definición permite un mejor control del funcionamiento de las reglas de validación.
Pero antes de su discusión, veamos el patrón de uso general para agregar una regla a un solo campo:
var $validate = array( 'fieldName1' => array(
'rule' => 'ruleName', // ó: array('ruleName', 'param1', 'param2' ...)
'required' => true,
'allowEmpty' => false,
'on' => 'create', // ó: 'update'
'message' => 'Su mensaje de error'
)
) ;
El índice 'rule' es requerido. Si sólo se setea 'required' => true la validación del formulario no
funcionará correctamente. Esto debido a que 'required' no es en realidad una regla.
Como puedes ver, cada campo (arriba se está mostrando sólo un campo) es asociado con un arreglo
que contiene cinco índice: ‘rule’, ‘required’, ‘allowEmpty’, ‘on’ y ‘message’. Veamos con más detalle
cada uno de estos índices.
INTRODUCCIÓN A CAKE PHP FRAMEWORK
63
rule
El índice ‘rule’ define el método de validación y acepta un sólo valor o un arreglo. El valor para ‘rule’
especificado puede ser el nombre de un método en tu modelo, un método de la clase coreValidation,
o una expresión regular. Para un completo listado de todas las reglas incorporadas ver la sección
llamada "Reglas de Validación Incorporadas".
Si la regla no requiere parámetros, ‘rule’ puede ser un sólo valor, por ejemplo:
var $validate = array(
'login' =>array(
'rule' => 'alphaNumeric'
)
) ;
Si la regla requiere algunos parámetros (como max, min o range), entonces ‘rule’ debería ser un
arreglo:
var $validate = array(
'password' =>array(
'rule' =>array('minLength', 8)
)
) ;
Recuerda, el índice ‘rule’ es requerido para la definición de reglas basadas en arreglos.
required
Este índice debería tener asignado un valor booleano. Si ‘required’ es true, el campo debe estar
presente en el arreglo de datos. Por ejemplo, si la regla de validación ha sido definida de la siguiente
manera:
var $validate = array(
'login' =>array(
'rule' => 'alphaNumeric',
'required' => true
) ) ;
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework
Introducción a Cake PHP Framework

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

SERVICIOS DEL SISTEMA OPERATIVO
SERVICIOS DEL SISTEMA OPERATIVOSERVICIOS DEL SISTEMA OPERATIVO
SERVICIOS DEL SISTEMA OPERATIVO
 
Arquitectura del software
Arquitectura del softwareArquitectura del software
Arquitectura del software
 
Estilos Arquitectonicos-Capas
Estilos Arquitectonicos-CapasEstilos Arquitectonicos-Capas
Estilos Arquitectonicos-Capas
 
Procedimientos almacenados en MySQL
Procedimientos almacenados en MySQLProcedimientos almacenados en MySQL
Procedimientos almacenados en MySQL
 
Comandos ddl y dml
Comandos ddl y dmlComandos ddl y dml
Comandos ddl y dml
 
Procedimientos almacenados
Procedimientos almacenadosProcedimientos almacenados
Procedimientos almacenados
 
Servicios web
Servicios webServicios web
Servicios web
 
Comando ping utilidad y como interpretarlo
Comando ping   utilidad y como interpretarloComando ping   utilidad y como interpretarlo
Comando ping utilidad y como interpretarlo
 
1-Unidad 1. Arquitectura de Diseño
1-Unidad 1. Arquitectura de Diseño1-Unidad 1. Arquitectura de Diseño
1-Unidad 1. Arquitectura de Diseño
 
Ado net
Ado netAdo net
Ado net
 
Funciones y procedimientos en SQL
Funciones y procedimientos en SQLFunciones y procedimientos en SQL
Funciones y procedimientos en SQL
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejercicios
 
Arquitectura de software
Arquitectura de softwareArquitectura de software
Arquitectura de software
 
Diagrama de paquete
Diagrama de paqueteDiagrama de paquete
Diagrama de paquete
 
Tema 3: Procesadores VLIW y procesadores vectoriales.
Tema 3: Procesadores VLIW y procesadores vectoriales.Tema 3: Procesadores VLIW y procesadores vectoriales.
Tema 3: Procesadores VLIW y procesadores vectoriales.
 
Trigger
TriggerTrigger
Trigger
 
Gestion de la configuracion del software
Gestion de la configuracion del softwareGestion de la configuracion del software
Gestion de la configuracion del software
 
Bootstrap
BootstrapBootstrap
Bootstrap
 
Laravel
LaravelLaravel
Laravel
 
Los 13 diagramas UML y sus componentes
Los 13 diagramas UML y sus componentesLos 13 diagramas UML y sus componentes
Los 13 diagramas UML y sus componentes
 

Similar a Introducción a Cake PHP Framework

Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...JaenFrankcezco
 
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corporacion de Industrias Tecnologicas S.A.
 
Desarrollo Web con ASP.NET MVC
Desarrollo Web con ASP.NET MVCDesarrollo Web con ASP.NET MVC
Desarrollo Web con ASP.NET MVCAngel Nuñez
 
Desarrollo de Aplicaciones Web con ASP.NET MVC5
Desarrollo de Aplicaciones Web con ASP.NET MVC5Desarrollo de Aplicaciones Web con ASP.NET MVC5
Desarrollo de Aplicaciones Web con ASP.NET MVC5Oscar Gensollen
 
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptxSibilinoAndante
 
Gestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterGestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterandrewzg
 
Introducción a ASPNET vNext
Introducción a ASPNET vNextIntroducción a ASPNET vNext
Introducción a ASPNET vNextJulito Avellaneda
 
API REST FOR THE BD2 DATABASE WITHIN THE IBM I SYSTEMS, USING THE PHP FRAMEWO...
API REST FOR THE BD2 DATABASE WITHIN THE IBM I SYSTEMS, USING THE PHP FRAMEWO...API REST FOR THE BD2 DATABASE WITHIN THE IBM I SYSTEMS, USING THE PHP FRAMEWO...
API REST FOR THE BD2 DATABASE WITHIN THE IBM I SYSTEMS, USING THE PHP FRAMEWO...Héctor Curbelo Barrios
 
Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Edgar Dueñas
 
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y AngularDesarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y AngularFreelancer
 

Similar a Introducción a Cake PHP Framework (20)

Manualcake
ManualcakeManualcake
Manualcake
 
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
 
Modelo mvc
Modelo mvcModelo mvc
Modelo mvc
 
Mvc4 Intro
Mvc4 IntroMvc4 Intro
Mvc4 Intro
 
CakePHP
CakePHPCakePHP
CakePHP
 
ASP.NET 5 & MVC 6 (RC1)
ASP.NET 5 & MVC 6 (RC1)ASP.NET 5 & MVC 6 (RC1)
ASP.NET 5 & MVC 6 (RC1)
 
Desarrollo Web con ASP.NET MVC
Desarrollo Web con ASP.NET MVCDesarrollo Web con ASP.NET MVC
Desarrollo Web con ASP.NET MVC
 
Desarrollo de Aplicaciones Web con ASP.NET MVC5
Desarrollo de Aplicaciones Web con ASP.NET MVC5Desarrollo de Aplicaciones Web con ASP.NET MVC5
Desarrollo de Aplicaciones Web con ASP.NET MVC5
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx
 
Framework
FrameworkFramework
Framework
 
Taller de zan php
Taller de zan phpTaller de zan php
Taller de zan php
 
Gestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterGestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniter
 
Laravel vc
Laravel vcLaravel vc
Laravel vc
 
Introducción a ASPNET vNext
Introducción a ASPNET vNextIntroducción a ASPNET vNext
Introducción a ASPNET vNext
 
API REST FOR THE BD2 DATABASE WITHIN THE IBM I SYSTEMS, USING THE PHP FRAMEWO...
API REST FOR THE BD2 DATABASE WITHIN THE IBM I SYSTEMS, USING THE PHP FRAMEWO...API REST FOR THE BD2 DATABASE WITHIN THE IBM I SYSTEMS, USING THE PHP FRAMEWO...
API REST FOR THE BD2 DATABASE WITHIN THE IBM I SYSTEMS, USING THE PHP FRAMEWO...
 
Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2
 
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y AngularDesarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
 

Más de Jomicast

Técnicas para la reparación de equipos electrónicos
Técnicas para la reparación de equipos electrónicosTécnicas para la reparación de equipos electrónicos
Técnicas para la reparación de equipos electrónicosJomicast
 
Montaje de un termostato electrónico
Montaje de un termostato electrónicoMontaje de un termostato electrónico
Montaje de un termostato electrónicoJomicast
 
Proyecto BOTTLER
Proyecto BOTTLERProyecto BOTTLER
Proyecto BOTTLERJomicast
 
Montaje de un grillo electrónico
Montaje de un grillo electrónicoMontaje de un grillo electrónico
Montaje de un grillo electrónicoJomicast
 
Medida de condensadores y bobinas
Medida de condensadores y bobinasMedida de condensadores y bobinas
Medida de condensadores y bobinasJomicast
 
Montaje de un indicador de la tensión de la bateria
Montaje de un indicador de la tensión de la bateriaMontaje de un indicador de la tensión de la bateria
Montaje de un indicador de la tensión de la bateriaJomicast
 
Montaje de una sirena de alarma electronica
Montaje de una sirena de alarma electronicaMontaje de una sirena de alarma electronica
Montaje de una sirena de alarma electronicaJomicast
 
Montaje de un sistema de carga de bateria
Montaje de un sistema de carga de bateriaMontaje de un sistema de carga de bateria
Montaje de un sistema de carga de bateriaJomicast
 
Montaje de un capacimetro digital
Montaje de un capacimetro digitalMontaje de un capacimetro digital
Montaje de un capacimetro digitalJomicast
 
Montaje de un interruptor crepuscular
Montaje de un interruptor crepuscularMontaje de un interruptor crepuscular
Montaje de un interruptor crepuscularJomicast
 
Montaje de un generador de funciones
Montaje de un generador de funcionesMontaje de un generador de funciones
Montaje de un generador de funcionesJomicast
 
Montaje de control de tonos y volumen
Montaje de control de tonos y volumenMontaje de control de tonos y volumen
Montaje de control de tonos y volumenJomicast
 
Montaje de un amplificador para sonorización
Montaje de un amplificador para sonorizaciónMontaje de un amplificador para sonorización
Montaje de un amplificador para sonorizaciónJomicast
 
Montaje de un temporizador de uso general
Montaje de un temporizador de uso generalMontaje de un temporizador de uso general
Montaje de un temporizador de uso generalJomicast
 
Montaje de un interruptor activado por sonido
Montaje de un interruptor activado por sonidoMontaje de un interruptor activado por sonido
Montaje de un interruptor activado por sonidoJomicast
 
Montaje de una fuente de alimentacion de laboratorio
Montaje de una fuente de alimentacion de laboratorioMontaje de una fuente de alimentacion de laboratorio
Montaje de una fuente de alimentacion de laboratorioJomicast
 
Montaje de un imitador de disparo de arma de fuego
Montaje de un imitador de disparo de arma de fuegoMontaje de un imitador de disparo de arma de fuego
Montaje de un imitador de disparo de arma de fuegoJomicast
 
Los circuitos hibridos
Los circuitos hibridosLos circuitos hibridos
Los circuitos hibridosJomicast
 
Montaje de un detector de movimientos
Montaje de un detector de movimientosMontaje de un detector de movimientos
Montaje de un detector de movimientosJomicast
 
El micrófono
El micrófonoEl micrófono
El micrófonoJomicast
 

Más de Jomicast (20)

Técnicas para la reparación de equipos electrónicos
Técnicas para la reparación de equipos electrónicosTécnicas para la reparación de equipos electrónicos
Técnicas para la reparación de equipos electrónicos
 
Montaje de un termostato electrónico
Montaje de un termostato electrónicoMontaje de un termostato electrónico
Montaje de un termostato electrónico
 
Proyecto BOTTLER
Proyecto BOTTLERProyecto BOTTLER
Proyecto BOTTLER
 
Montaje de un grillo electrónico
Montaje de un grillo electrónicoMontaje de un grillo electrónico
Montaje de un grillo electrónico
 
Medida de condensadores y bobinas
Medida de condensadores y bobinasMedida de condensadores y bobinas
Medida de condensadores y bobinas
 
Montaje de un indicador de la tensión de la bateria
Montaje de un indicador de la tensión de la bateriaMontaje de un indicador de la tensión de la bateria
Montaje de un indicador de la tensión de la bateria
 
Montaje de una sirena de alarma electronica
Montaje de una sirena de alarma electronicaMontaje de una sirena de alarma electronica
Montaje de una sirena de alarma electronica
 
Montaje de un sistema de carga de bateria
Montaje de un sistema de carga de bateriaMontaje de un sistema de carga de bateria
Montaje de un sistema de carga de bateria
 
Montaje de un capacimetro digital
Montaje de un capacimetro digitalMontaje de un capacimetro digital
Montaje de un capacimetro digital
 
Montaje de un interruptor crepuscular
Montaje de un interruptor crepuscularMontaje de un interruptor crepuscular
Montaje de un interruptor crepuscular
 
Montaje de un generador de funciones
Montaje de un generador de funcionesMontaje de un generador de funciones
Montaje de un generador de funciones
 
Montaje de control de tonos y volumen
Montaje de control de tonos y volumenMontaje de control de tonos y volumen
Montaje de control de tonos y volumen
 
Montaje de un amplificador para sonorización
Montaje de un amplificador para sonorizaciónMontaje de un amplificador para sonorización
Montaje de un amplificador para sonorización
 
Montaje de un temporizador de uso general
Montaje de un temporizador de uso generalMontaje de un temporizador de uso general
Montaje de un temporizador de uso general
 
Montaje de un interruptor activado por sonido
Montaje de un interruptor activado por sonidoMontaje de un interruptor activado por sonido
Montaje de un interruptor activado por sonido
 
Montaje de una fuente de alimentacion de laboratorio
Montaje de una fuente de alimentacion de laboratorioMontaje de una fuente de alimentacion de laboratorio
Montaje de una fuente de alimentacion de laboratorio
 
Montaje de un imitador de disparo de arma de fuego
Montaje de un imitador de disparo de arma de fuegoMontaje de un imitador de disparo de arma de fuego
Montaje de un imitador de disparo de arma de fuego
 
Los circuitos hibridos
Los circuitos hibridosLos circuitos hibridos
Los circuitos hibridos
 
Montaje de un detector de movimientos
Montaje de un detector de movimientosMontaje de un detector de movimientos
Montaje de un detector de movimientos
 
El micrófono
El micrófonoEl micrófono
El micrófono
 

Último

Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilJuanGallardo438714
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxlosdiosesmanzaneros
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 

Último (15)

Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmeril
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptx
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 

Introducción a Cake PHP Framework

  • 1. 16 TEMA 14. INTRODUCCIÓN A CAKE PHP FRAMEWORK. José M. Castillo Castillo
  • 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.
  • 38. INTRODUCCIÓN A CAKE PHP FRAMEWORK 37 MySQLi ADOdb
  • 39. INTRODUCCIÓN A CAKE PHP FRAMEWORK 38 ORACLE SQLite
  • 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 ) ) ;