492 Introducción a CakePHP Framework + CUEST

download 492 Introducción a CakePHP Framework + CUEST

of 184

Transcript of 492 Introducción a CakePHP Framework + CUEST

  • Todos los nombres propios de programas, sistemas operativos, equipos hardware, etc., que aparecen en este libro son marcas registradas de sus respectivas compaas u organizaciones.

    Copyright 2014, por Instituto Europeo de Desarrollo y Tecnologa, S.L.Todos los derechos reservadosC/ ODonnell, 10 - 4 Planta - 41001 - SevillaTfno.: 95 450 25 50

    www.inedetec.com

    El contenido de este libro est protegido por la ley, que establece penas de prisin y/o multas, adems de las correspondientes indemnizaciones por daos y perjuicios para quienes plagien, reproduzcan total o parcialmente este libro, realicen cualquier tratamiento informtico, distribuyan o comuniquen por cualquier forma, medio o soporte, ya sea electrnico, informtico, mecnico, por fotocopia, por registro u otros mtodos sin la perceptiva autorizacin previa y por escrito de los titulares del Copyright.

  • 1Comenzando con CakePHP

    1

  • Introduccin a CakePHP Framework

    2

    Comenzando con CakePHP

    Bienvenido al manual para el framework CakePHP que convierte el desarrollo de aplicaciones web en un juego de nios!

    Este manual supone que posees conocimientos generales de PHP y conocimientos bsicos de programacin orientada a objetos (POO). Las diferentes funciones del framework utilizan varias tecnologas -por ejemplo, SQL, JavaScript o XML. El manual no pretende explicar dichas tecnologas, sino cmo se utilizan en este contexto.

    Qu es CakePHP y por qu hay que utilizarlo?

    CakePHP es un marco de desarrollo [framework] rpido para PHP, libre, de cdigo 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 rpida, sin prdida de flexibilidad.

    Con CakePHP el desarrollo web ya no es montono porque ofrecemos las herramientas para que empieces a escribir el cdigo que realmente necesitas: la lgica especfica de tu aplicacin. 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 aade valor al proyecto. Con CakePHP, adems de no tener que reinventar la rueda, el ncleo de tu aplicacin se mejora constantemente y est bien probado.

    Esta es una lista breve con las caractersticas de las que disfrutars al utilizar CakePHP:

    Comunidad activa y amistosa Licencia flexible Compatible con PHP4 y PHP5 CRUD integrado para la interaccin con la base de datos Soporte de aplicacin [scaffolding] Generacin de cdigo Arquitectura Modelo Vista Controlador (MVC) Despachador de peticiones [dispatcher], con URLs y rutas personalizadas

    y limpias

    Validacin integrada Plantillas rpidas y flexibles (sintaxis de PHP, con ayudantes[helpers]) Ayudantes para AJAX, Javascript, formularios HTML y ms Componentes de Email, Cookie, Seguridad, Sesin y Manejo de solicitudes

  • 3Comenzando con CakePHP

    Listas de control de acceso flexibles Limpieza de datos Cach flexible Localizacin Funciona en cualquier subdirectorio del sitio web, con poca o ninguna

    configuracin de Apache

    Entendiendo Modelo-Vista-Controlador

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

    Figura 1: Una peticin MVC bsica

    La figura 1 muestra un ejemplo sencillo de una peticin [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 pgina de inicial de la aplicacin.

    Ricardo hace clic en el enlace apuntando a http://www.ejemplo.com/pasteles/comprar, y su navegador hace una peticin al servidor web.

    El despachador comprueba la URL de la peticin (/pasteles/comprar), y le pasa la peticin al controlador adecuado.

    1. El controlador realiza lgica de aplicacin especfica. Por ejemplo, puede comprobar si Ricardo ha iniciado sesin.

    2. El controlador tambin utiliza modelos para acceder a los datos de la aplicacin. La mayora de las veces los modelos representan tablas de

  • Introduccin a CakePHP Framework

    4

    una base de datos, aunque tambin 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.

    3. 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 presentacin al usuario. La mayora de las veces las vistas en CakePHP vienen en formato HTML, pero una vista puede ser fcilmente un PDF, un documento XML, o un objeto JSON, dependiendo de tus necesidades.

    4. 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 aplicacin seguirn este patrn bsico. Ms adelante, vamos a completar algunos detalles especficos de Cake, as que, por favor, ten esto en cuenta a medida que avanzamos.

    Beneficios MVC

    Por qu utilizar MVC? Porque es un patrn de diseo de software probado y se sabe que funciona. Con MVC la aplicacin se puede desarrollar rpidamente, de forma modular y mantenible. Separar las funciones de la aplicacin en modelos, vistas y controladores hace que la aplicacin sea muy ligera. Estas caractersticas nuevas se aaden fcilmente y las antiguas toman automticamente una forma nueva.

    El diseo modular permite a los diseadores y a los desarrolladores trabajar conjuntamente, as como realizar rpidamente el prototipado. Esta separacin tambin permite hacer cambios en una parte de la aplicacin sin que las dems se vean afectadas.

    Aunque lleva algn tiempo acostumbrarse a construir aplicaciones as, estamos seguros de que, una vez construyas tu primera aplicacin con CakePHP, no querrs volver a hacerlo de otra forma.

  • 5Principios bsicos de CakePHP

    2

  • Introduccin a CakePHP Framework

    6

    Principios bsicos de CakePHP

    El framework CakePHP proporciona una base robusta para tu aplicacin. Puede manejar cualquier aspecto, desde la solicitud inicial del usuario hasta el renderizado final de la pgina web. Adems, como el framework sigue los principios MVC, puedes fcilmente personalizar y extender muchos aspectos de tu aplicacin.

    El framework tambin proporciona una estructura de organizacin bsica, desde los nombres de los archivos hasta los de las tablas de la base de datos, manteniendo toda tu aplicacin consistente y lgica. Este aspecto es simple pero poderoso. Sigue las convenciones y siempre sabrs exactamente dnde estn las cosas y cmo estn organizadas.

    Estructura de CakePHP

    CakePHP incluye las clases Controlador [Controller], Modelo [Model] y Vista [View], pero tambin incluye otras clases y objetos que hacen que el desarrollo en MVC sea un poco ms rpido y agradable. Los Componentes [Components], Comportamientos [Behaviors], y Ayudantes [Helpers] son clases que proporcionan extensibilidad y reusabilidad; agregan rpidamente 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 cmo usar estas herramientas.

    Extensiones de los Controladores (Componentes)

    Un componente es una clase que ayuda a la lgica de un controlador. Si tienes alguna lgica y la quieres compartir entre varios controladores (o aplicaciones), un componente suele ser una buena eleccin. A modo de ejemplo, la clase del ncleo EmailComponent hace que la creacin y el envo de mensajes de correo electrnico sean tan sencillo como coser y cantar. En lugar de escribir lgica en el mtodo de un controlador, puedes empaquetarla en un componente para poder compartirla.

    Los Controladores tambin estn equipados con callbacks (rellamadas). Puedes utilizar estos callbacks si necesitas insertar alguna lgica en las operaciones del ncleo de CakePHP. Los Callbacks disponibles incluyen:

    beforeFilter(), se ejecuta antes que cualquier otra accin del controlador beforeRender(), se ejecuta despus de la lgica del controlador, pero antes

    de que la vista se renderice

    afterFilter(), se ejecuta despus de toda la lgica 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 lgica despus de esa llamada.

  • 7Principios bsicos de CakePHP

    Extensiones de las Vistas

    Un ayudante [Helper] es una clase que ayuda a la lgica de una vista. Del mismo modo que varios controladores utilizan un componente, los ayudantes [helpers] hacen que varias vistas accedan y compartan lgica presentacional. Con uno de los ayudantes del ncleo, el AjaxHelper, el manejo de las peticiones Ajax en las vistas es mucho ms fcil.

    La mayora de las aplicaciones repiten piezas de cdigo en sus vistas. CakePHP facilita la reutilizacin de este cdigo con diseos [layouts] y elementos [elements]. Por defecto, toda vista renderizada por un controlador se coloca en un diseo [layout]; los elementos entran en juego cuando hay que reutilizar estos fragmentos pequeos de contenido.

    Extensiones de los Modelos

    Del mismo modo, los Comportamientos [Behaviors] son formas de aadir funcionalidad comn 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, aadir, y mover nodos en la estructura de rbol subyacente.

    Los modelos tambin cuentan con el apoyo de otra clase llamada DataSource (Origen de datos). Los DataSources son una abstraccin que permite a los modelos manipular diferentes tipos de datos en forma consistente. Si bien la principal fuente de datos en una aplicacin 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 slo 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 tambin incluyen callbacks:

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

    Los nombres de estos mtodos deben ser lo suficientemente descriptivos para que sepa lo que hacen. Asegrese de obtener los detalles en el captulo acerca de los modelos.

    Extensiones de la Aplicacin

    Tanto los controladores como los ayudantes [helpers] y modelos tienen una clase padre que puede usarse para definir cambios a nivel global de la aplicacin.

  • Introduccin a CakePHP Framework

    8

    AppController (localizado en /app/app_controller.php), AppHelper (localizado en /app/app_helper.php) y AppModel (localizado en /app/app_model.php) son magnficos lugares donde colocar mtodos 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 cmo 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 aplicacin.

    Algunas caractersticas en una aplicacin merecen ser empaquetadas como un todo. Un plugin es un paquete de modelos, controladores y vistas que cumplen un propsito especfico que puede abarcar mltiples aplicaciones. Un sistema de administracin de usuarios o un blog simplificado pueden ser buenos ejemplos para plugins de CakePHP.

    Una peticin tpica de CakePHP

    Hemos cubierto los ingredientes bsicos de CakePHP, as que echemos un vistazo a cmo los objetos trabajan juntos para completar una peticin bsica. Continuando con nuestro ejemplo de peticin original, imaginemos que nuestro amigo Ricardo acaba de hacer clic en el enlace Comprar un pastel personalizado ahora! en una pgina de bienvenida de una aplicacin CakePHP.

    Figura 2. Peticin tpica 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 peticin a su servidor Web.

  • 9Principios bsicos de CakePHP

    El enrutador analiza la URL para extraer los parmetros para esta peticin: el controlador, la accin, y cualquier otro argumento(s) que pueda afectar a la lgica de negocio durante esta peticin.

    Usando las rutas, una peticin URL es mapeada a una accin de controlador (un mtodo en una clase de controlador especfica). En este caso, es el mtodo comprar() del controlador PastelesController. El callback beforeFilter() del controlador es llamado antes de que cualquier accin lgica del controlador sea ejecutada.

    El controlador puede usar modelos para ganar acceso a los datos de la aplicacin. En este ejemplo, el controlador usa un modelo para obtener informacin de la base de datos de las ltimas compras de Ricardo. Cualquier callback de modelo, comportamiento [behavior], y orgenes de datos [DataSources] aplicables pueden activarse durante esta operacin. 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.

    Despus que el modelo ha obtenido toda la informacin, sta es devuelta al controlador. Pueden activarse callbacks del modelo.

    El controlador puede usar componentes para refinar an ms los datos o realizar otras operaciones (manipulacin de sesiones, autenticacin, o envos de email, por ejemplo).

    Una vez que el controlador ha usado modelos y componentes para preparar suficientemente la informacin, sta es entregada a la vista usando el mtodo set() del controlador. Los callbacks de controlador pueden ser aplicados antes de que la informacin sea enviada. La lgica de vista es ejecutada, la cual puede incluir el uso de elementos y/o ayudantes [helpers]. Por defecto, la vista es creada dentro del diseo [layout].

    Callbacks del controlador adicionales (como afterFilter) pueden ser aplicados. El cdigo completo creado por la vista es enviado al navegador de Ricardo.

    Estructura de archivos de CakePHP

    Tras descargar y extraer CakePHP, estos sern los ficheros y carpetas que deberas ver:

    app cake vendors .htaccess index.php README Observars 3 carpetas principales:

  • Introduccin a CakePHP Framework

    10

    La carpeta app ser donde haremos nuestra magia: es donde se ubicarn los ficheros de tu aplicacin.

    La carpeta cake es donde nosotros hemos hecho nuestra magia. Compromtete a no modificar los ficheros de esta carpeta. No podremos ayudarte si has modificado el ncleo.

    Finalmente, la carpeta vendors es donde ubicars las libreras PHP de terceros que necesites usar con tus aplicaciones en CakePHP.

    La Carpeta App

    La carpeta app de CakePHP es donde realizars la mayor parte del desarrollo de tu aplicacin.

    Veamos un poco ms de cerca las carpetas dentro de app.

    config

    Contiene los (pocos) archivos de configuracin que usa CakePHP. Detalles de conexin a bases de datos, arranque (bootstrapping), archivos de configuracin del ncleo y dems deberan ser almacenados aqu.

    controllers Contiene los controladores de tu aplicacin y sus componentes.

    locale Almacena archivos de cadenas de texto para la internacionalizacin.

    modelsContiene los modelos de tu aplicacin,

    comportamientos (behaviors) y orgenes de datos (datasources).

    plugins Contiene los paquetes de plugins.

    tmp

    Aqu es donde CakePHP almacena datos temporales. La informacin que realmente se almacena depende de cmo hayas configurado CakePHP, pero normalmente esta carpeta es usada para almacenar descripciones de modelos, registros (logs) y algunas veces informacin de sesiones.

    Asegrate de que esta carpeta existe y tiene permisos de escritura, ya que de lo contrario el rendimiento de tu aplicacin se ver muy afectado. En modo debug CakePHP te avisar si este no es el caso.

  • 11

    Principios bsicos de CakePHP

    vendors

    Cualesquiera clases o libreras de terceros deberan ser ubicadas aqu. Hacerlo as hace que sea ms fcil de acceder a ellas usando la funcin App::Import(vendor,nombre). Los observadores meticulosos notarn que esto parece redundante, ya que tambin existe una carpeta vendors en el nivel superior de nuestra estructura de directorios. Veremos las diferencias entre las dos cuando discutamos acerca de la administracin de mltiples aplicaciones y configuraciones de sistemas ms complejos.

    views

    Los archivos de presentacin son ubicados aqu: elementos (elements), pginas de error, ayudantes (helpers) , layouts y archivos de vistas.

    webroot

    En una configuracin de produccin, esta carpeta debera servir como la raz del sitio (document root) para tu aplicacin. Las carpetas aqu tambin sirven como lugares de almacenamiento para hojas de estilo en cascada (CSS stylesheets), imgenes y archivos JavaScript.

    Convenciones de CakePHP

    Con las convenciones de CakePHP, usted ahorrar tiempo sobre la marcha: siguiendo las convenciones, obtendr libre funcionalidad, y tambin se libera de la pesadilla del mantenimiento del seguimiento de los archivos de configuracin. Las convenciones tambin hacen un sistema de desarrollo muy uniforme, permitiendo a otros desarrolladores ayudar ms fcilmente.

    Las convenciones de CakePHP han sido destiladas de aos de experiencia en desarrollo web y mejores prcticas. Mientras que le sugerimos el uso de estas convenciones durante el desarrollo con CakePHP, deberamos 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 smbolo guion bajo (underscore) _, mientras que los nombres de las clases usan Maysculas 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

  • Introduccin a CakePHP Framework

    12

    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 estn 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 estn en plural y usando guion bajo. Las tablas subyacentes para los modelos arriba mencionados seran: personas, personas_grandes, y personas_muy_grandes respectivamente.

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

    El nombre por defecto de las claves forneas 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 fornea panadero_id. Para una tabla compuesta por varias palabras como tipos_categorias, la clave fornea sera tipo_categoria_id.

    El nombre de las tablas de unin entre modelos, usadas en relaciones hasAndBelongToMany (HABTM), debera estar formado por el nombre de las tablas que une puestos en orden alfabtico (cebras_manzanas en vez de manzanas_cebras).

    Todas las tablas con las que interaccionan los modelos de CakePHP (con excepcin de las de unin de tablas) necesitan una clave primaria simple que identifique inequvocamente cada fila. Si deseas modelar una tabla que no tiene una clave primaria de un slo campo, como por ejemplo las filas de una tabla de unin posts_tags, la convencin de CakePHP dicta que se aada una clave primaria de un solo campo a la tabla.

    CakePHP no soporta claves primarias compuestas. Si deseas manipular directamente los datos de tu tabla de unin, usa llamadas directas a query o aade una clave primaria para que actu como un modelo normal. Por ejemplo:

    CREATE TABLE posts_tags (id INT(10) NOT NULL AUTO_INCREMENT, post_id INT(10) NOT NULL, tag_id INT(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

  • 13

    Principios bsicos de CakePHP

    de 36 caracteres siempre que grabes un nuevo registro utilizando el mtodo 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 mtodo que escribas para un controlador debe de ser el mtodo index(). Cuando la peticin especifica un controlador pero no una accin, el comportamiento por defecto de CakePHP es ejecutar el mtodo index() de dicho controlador. Por ejemplo, una peticin de http://www.example.com/apples/ se corresponde con la llama al mtodo index() del controlador ApplesController, mientras que http://www.example.com/apples/view se corresponde con una llamada al mtodo view() del controlador ApplesController.

    Tambin puedes cambiar la visibilidad de los mtodos de los controladores en CakePHP anteponiendo al nombre del mtodo guiones bajos. Si un mtodo de un controlador comienza por un guion bajo, el mtodo no ser accesible directamente desde la web, sino que estar disponible slo para uso interno. Por ejemplo:

    Mientras que la pgina http://www.example.com/noticias/ultimas/ est accesible de manera normal, si alguien intenta acceder a la pgina http://www.example.com/noticias/_buscaNuevosArticulos/ obtendr un error porque el nombre del mtodo 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 fcilmente mapeados a una url en minsculas. Por ejemplo, ApplesController (que se define en el archivo apples_controller.php) y accedido desde http://example.com/apples.

  • Introduccin a CakePHP Framework

    14

    Por otro lado mltiples combinaciones de palabras pueden ser transformadas automticamente en un mismo nombre de controlador:

    /redApples /RedApples /Red_apples /red_apples

    Todas resuelven la accin index de controlador RedApples. Sin embargo, la convencin es que las urls sean en minsculas y separadas con guion bajo, por lo tanto /red_apples/go_pick es la forma correcta de acceder a la accin. RedApplesController::go_pick.

    Convenciones de Vistas

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

    El patrn bsico es: /app/views/controller/underscored_function_name.ctp

    Al nombrar las piezas de su aplicacin utilizando las convenciones de CakePHP, usted adquiere funcionalidad sin mucho mantenimiento de la configuracin. Aqu encontramos un ejemplo final de las 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 peticin http://example.com/people/ apunta a la llamada de funcin index() en el controlador, PeopleController, donde el modelo Person est disponible automticamente (y apunta automticamente a la tabla people en la base de datos), y se renderiza en el archivo. Ninguna de estas relaciones han sido configuradas por otra razn que crear clases y archivos que usted necesita crear.

  • 15

    Desarrollando con CakePHP

    3

  • Introduccin a CakePHP Framework

    16

    Requerimientos

    Servidor HTTP. Por ejemplo: Apache. Preferiblemente conmod_rewrite,peronorequerido.

    PHP4.3.2osuperior.Si,CakePHPfuncionagenialenPHP4y5.Tcnicamente no se requiere un motor de base de datos, pero nos

    imaginamosquelamayoradelasaplicacionesusarnuno.CakePHPsoportaunagranvariedaddemotoresdealmacenamiento:

    MySQL(4osuperior) PostgreSQL FirebirdDB2 MicrosoftSQLServer Oracle SQLite ODBC ADOdb

    Preparndose para Instalar

    CakePHPesrpidoyfcildeinstalar.LosrequisitosmnimossonunservidorwebyunacopiadeCake,soloeso!AunqueestemanualseenfocaprimariamenteenlaconfiguracinsobreApache(porqueeselusadocomnmente),TupuedesconfigurarCakeparacorrersobrelamayoradeservidoresweb,talescomo,LightHTTPDobienMicrosoftIIS.Prepararlainstalacinconstadelossiguientespasos:

    DescargueCakePHP Configuresuservidorparamanejarphpsiesnecesario Chequeelospermisosdelosarchivos

    Obteniendo CakePHP

    Hay dos principales maneras de obtener una copia limpia de CakePHP.Puedesdescargarunacopiacomprimida(zip/tar.gz/tar.bz2)delapginawebprincipal,opuedesobtenerelcdigodesdeelrepositoriogit.

    ParadescargarlaltimareleaseprincipaldeCakePHP,dirgetealapginawebhttp://www.cakephp.orgyhazclicenelenlaceDownloadNow.

    TodaslasreleasesactualesestnalojadasenCakeForge.Estesitetambincontiene enlaces amuchos otros proyectos enCakePHP, incluyendopluginsyaplicacionesparaCakePHP.LasreleasesdeCakePHPestsndisponiblesenhttp://cakeforge.org/projects/cakephp.

  • 17

    Desarrollando con CakePHP

    Secreannightly buildsalternativasqueincluyenparchesymejorasalminuto(bueno,alda).

    Estaspueden seraccedidasdesde lapginaprincipal dedescargasaqu:http://cakephp.org/downloads/index/nightly. Para actualizaciones realmentealminuto,puedesobtenerelcdigodirectamentedelaramadedesarrollodelrepositoriogitaqu:http://code.cakephp.org/source.

    Permisos

    CakePHP usa el directorio /app/tmp para diferentes operaciones, comoalmacenar descripciones de los modelos, vistas en cache, informacin desesiones,entreotros.

    Por ello, asegrate que el directorio /app/tmp de tu instalacin de Caketengapermisosdeescrituraporelusuariodelservidorweb

    Instalacin

    Instalar CakePHP puede ser tan simple como colocar el directorio en elservidor, o tan complejo y flexible comonecesites. Esta seccin cubrir lostres tipos principales de instalacinparaCakePHP:desarrollo, produccin yavanzado

    Desarrollo:fcilparainiciar,losURLdelaaplicacinincluyenelnombredeldirectorio,yesmenosseguro.

    Produccin: Requiere la capacidad de configurar el servidor web paradefinireldocumentroot,muyseguro.

    Avanzado:Conciertaconfiguracin,permiteubicarlosdirectoriosclavedeCakePHPendiferentespartesdelsistemadearchivos,paracompartirunamismainstalacindeCakePHPparavariasaplicaciones.

    Desarrollo

    Usaruna instalacindedesarrollo eselmtodoms rpidoparamontarCake.EsteejemploteayudarainstalarunaaplicacindeCakePHPyhacerladisponibleenhttp://www.ejemplo.com/cake_1_2/.Asumimosparaelfindeesteejemploqueturazdedocumentosestestablecidoa/var/www/html.

    Descomprime los contenidos del archivo Cake en /var/www/html. Ahoratienesunacarpetaenturazdedocumentosconunnombredependientedela versin que te has descargado (p.ej.cake_1.2.0.7962). Renombra estacarpetaacake_1_2.Tuconfiguracindedesarrollosercomolasiguienteenelsistemadearchivos:

    /var/www/html cake_1_2 /app

  • Introduccin a CakePHP Framework

    18

    /cake /vendors .htaccess /index.php README

    Si tuservidorwebestconfiguradocorrectamente,deberasencontrar tuaplicacindeCakeaccesibleenhttp://www.ejemplo.com/cake_1_2/.

    Produccin

    UnainstalacindeproduccinesunamaneramsflexibledeinstalarCake.Usar este mtodo permite que un dominio entero se comporte como unaaplicacinCakePHPnica.EsteejemploteayudarainstalarCakeencualquiersitiodetusistemadeficherosyponerlodisponibleenhttp://www.ejemplo.com.TenerencuentaqueestainstalacinpuederequerirlosprivilegiosparacambiarelDocumentRoot(razdedocumentos)enservidoreswebApache.

    DescomprimeloscontenidosdelarchivoCakeenundirectorioatueleccin.Por motivos de ejemplo, asumimos que escoges instalar Cake en /cake_install.Tuconfiguracindeproduccinseverdelasiguientemaneraenelsistemadeficheros:

    /cake_install/ /app /webroot(estedirectorioeselestablecidoconladirectivaDocumentRoot) /cake /vendors /.htaccess /index.php /README

    Los desarrolladores que usan Apache debern establecer la directivaDocumentRootparaeldominioa:DocumentRoot/cake_install/app/webroot

    Si tuservidorwebestconfiguradocorrectamente,deberasencontrar tuaplicacinCakeaccesibleenhttp://www.ejemplo.com.

    Apache y mod_rewrite (y .htaccess )

    ApesardequeCakePHPesthechopara funcionar conmod_rewrite sintocarnada,ynormalmenteases,hemosnotadoquealgunosusuariostienendificultadesparalograrquetodofuncionecorrectamenteensussistemas.

    Aquhayunascuantascosasquepuedesprobarparaconseguirquefuncionecorrectamente.Primeromiraentuhttpd.conf(asegratedeestareditandoelhttpd.confdelsistemayquenoeshttpd.confespecficodeunusuarioodelsite).

  • 19

    Desarrollando con CakePHP

    1. Asegratequelareescritura.htaccessestpermitidayqueAllowOverrideestestablecidoaAllparaelDocumentRootadecuado.Deberasveralgosimilara:

    # Cada directorio al que tiene acceso Apache puede ser configurado en # funcin de qu servicios y caractersticas estn permitidas y/o # desactivadas en dicho directorio (y sus subdirectorios).## Primero, configuramos por defecto para que sea un conjunto de# caractersticas muy generales.#

    Options FollowSymLinks AllowOverride All# Order deny,allow# Deny from all

    2. Asegratedeestarcargandoelmdulomod_rewritecorrectamente.Debesveralgocomo:

    LoadModule rewrite_module libexec/apache2/mod_rewrite.

    Enmuchossistemasestoestarcomentado(comenzando la lneacon#)pordefecto,asqueslotendrsquequitarlossmbolos#delprincipio.

    Tras realizar los cambios reinicia Apache para estar seguro de que lasopcionesdeconfiguracinestnactivas.

    Asegratedequetusficheros.htaccessestnenlosdirectorioscorrectos.Esto puede pasar durante la copia porque algunos sistemas operativosconsideranlosarchivosquecomienzanpor.comoocultosyporlotantonoloscopian.

    3. Asegrate de que tu copia deCakePHP es de las seccin de descargasdenuestrositeonuestrorepositorioGIT,yquehasidodesempaquetadocorrectamenteverificandoqueexistenlosficheros.htaccess:

    EneldirectoriorazdeCake(necesitasercopiadoaldirectorio,estoredirigetodoatuaplicacindeCake):

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

  • Introduccin a CakePHP Framework

    20

    EneldirectorioappdeCake(sercopiadoporbake):

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

    EneldirectoriowebrootdeCake(sercopiadoatuwebrootdelaaplicacinporbake):

    RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

    Enmuchos servicios de hosting (GoDaddy, 1and1), tu servidorweb estrealmentesiendoservidodesdeundirectoriodeusuarioqueyautilizamod_rewrite. Si ests instalando CakePHP en un directorio de usuario (http://ejemplo.com/~nombreusuario/cakephp), o en cualquier otra estructuraqueyautilicemod_rewritenecesitarsaadirsentenciasRewriteBasea losarchivos .htaccess que utiliza CakePHP (/.htaccess, /app/.htaccess, /app/webroot/.htaccess)

    EstopuedeseraadidoalamismaseccinconladirectivaRewriteEngine,as,porejemplo,tuarchivo.htaccessenelwebrootdeveraseras:

    RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

    RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

  • 21

    Desarrollando con CakePHP

    Los detalles de esos cambios dependen de tu configuracin, y puedenincluir cosas adicionales que no estn relacionadas con Cake. Consulta ladocumentacinonlinedeApacheparamsinformacin.

    Encindelo

    Muybien,ahoraveamosaCakePHPenaccin.Dependiendodelaconfiguracinque hayas usado, deberas apuntar tu navegador a http://example.com/ ohttp://example.com/mi_aplicacion/.Enestepunto,setepresentar lavistadebienvenidadeCakePHPporomisin,yunmensajequeindicaelestadodeconexinconlabasededatos.

    Felicidades!YaestslistoparacreartuprimeraaplicacinCakePHP.

    Configuracin

    Configurar aplicaciones CakePHP es pan comido. Despus de instalarCakePHP,crearunaaplicacinwebbsicaslorequiereaplicarlaconfiguracindeunabasededatos.Existen,otrasconfiguracionesopcionales,quepuedesrealizarconelobjetivodeaprovecharlasventajasdelaarquitecturaflexiblede CakePHP. Puedes agregar fcilmente elementos al ncleo de CakePHP,configurarURLpersonalizadasydefinirinflexiones.

    Configuracin de Base de Datos

    CakePHPesperaquelosdetallesdeconfiguracindelabasededatosestnenapp/config/database.php.Unejemplodeconfiguracinpuedeencontrarseen el archivo app/config/database.php.default. Esta configuracin deberaversecomosigue:

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

    Elarreglodeconfiguracin$defaulteselutilizadoamenosqueseespecifiquealgnotroen lapropiedad$usDbConfigde losmodelos.Porejemplo, simiaplicacin tiene aplicaciones legadas adicionales a la que se va a utilizarpor defecto, podra utilizarla enmismodelos creando un nuevo arreglo deconfiguracin$legadaqueseasimilara$default,yasignadovar$useDbConfig=legada;enlosmodeloscorrespondientes.

  • Introduccin a CakePHP Framework

    22

    Rellenacadaparaclave/valorenelarreglodeconfiguracin,comomejorseajusteatusnecesidades

    Clave Valor

    driver

    Elnombredelcontroladordebasededatosquesedeseautilizar.Ejemplo:mysql,postgres,sqlite,pear-nombrededriver,adodb-nombrededriver,mssql,oracle,

    odbc.

    persistent Sisedebeusaronounaconexinpersistentealabasededatos.

    host Elnombredeservidordelabasededatos(odireccinIP).

    login Elnombredeusuarioparalacuenta.

    password Lacontraseaparalacuenta.

    database Nombredelabasededatosausarparalaconexin

    prefix(opcional)

    Eltextoqueprefijacadanombredetablaenlabasededatos.tilsisecompartelabasededatosconvariasaplicaciones.Dejarvacosinosedeseaninguno.

    port(opcional)ElpuertoTCPosocketUnixausarseparalaconexincon

    elservidordebasededatos.

    encodingIndicalacodificacindecaracteresausarparaenviarlas

    sentenciasSQLalservidor.

    schema UsadoenlaconfiguracindePostgreSQLparaespecificarelesquemaautilizar.

    Notaquelosprefijossonparalastablas,noparalosmodelos.Porejemplo,sicreasteunatablajoinparatusmodelosTortaySabor,estadebellamarseprefijo_sabor_torta(no prefijo_sabor_prefijo_torta),yasignarlaclaveprefixconprefijo_.

    Nombrar correctamente tus tablas (y algunas columnas) segn lasconvencionespuedenlibrartedemuchotrabajodeconfiguracin.Porejemplo,sinombrasunatablacomotortas,elmodeloTortayelcontrollerTortasController,todo funcionar automticamente si necesidad de tu intervencin. Porconvencin,utilizaguionesbajos,minsculas,ynombresenpluralpara losnombresdetustablas-porejemplo:reposteros,reposterias,sabores.

    Configuracin del Core

    LaconfiguracindelaaplicacinenCakePHPseencuentraen/app/config/core.php.EstearchivoesunacoleccindedefinicionesdevariablesConfigurey definiciones de constantes que determinan como ha de comportarse laaplicacin.DescripcindecadavariableycmoafectatuaplicacinCakePHP:

  • 23

    Desarrollando con CakePHP

    Variable de Configuracin Descripcin

    debug

    Cambiaelniveldedepuracindecake

    =Modoproduccin.Noproduceningunasalida.

    =Muestraloserroresywarnings.

    =Muestraloserror,warnings,yconsultasSQL

    App.baseUrlDescomentaestadefinicinsinodeseasutilizarelmod_rewritedeApache.Noteolvidesdeeliminarlosarchivos

    .htaccesstambin.

    Routing.admin

    DescomentaestadefinicinsideseasutilizarlasrutasadmindeCakePHP.Asignalavariablealnombredela

    rutaquetegustarautilizar.Msadelanteseexplicarendetalle.

    Cache.disable Cuandoseasignatrue,elcachesedeshabilitaparatodalaaplicacin.

    Cache.check

    Siseasignatrue,habilitaelcachedelasvistas.Tambinesnecesarioactivarelcacheenloscontrollers,peroestavariablehabilitaladeteccindedichasconfiguraciones.

    Session.save

    LeindicaaCakePHPqumecanismodealmacenamientodesesionessedebeutilizar

    php=Utilizaelalmacenamientopordefectodephpcake=Guardalosdatosdesesinen/app/tmpdatabase=Guardalosdatosenunatabladelabasededatos.AsegratedecargarelarchivoSQLubicadoen/app/

    config/sql/sessions.sql.

    Session.table Elnombredelatabla(sinincluirelprefijo)queguardalosdatosdelasesin.

    Session.database

    Elnombredelabasededatosqueguardalosdatosdesesin.

    Session.cookie Elnombredelcookieutilizadoparahacerseguimientodelassesiones.

    Session.timeoutEltiempobasedevalidezdelasesinensegundos.El

    valorrealdependedelavariableSecurity.level

    Session.start Iniciaautomticamentelasesincuandoseasignatrue.

  • Introduccin a CakePHP Framework

    24

    Session.checkAgent

    Cuandoseasignafalse,LassesionesdeCakePHPnoseasegurarndequeeluseragentdelusuarionocambie

    entrepeticiones.

    Security.level

    ElniveldeseguridaddeCakePHP.EltiempodevalidezdelasesindefinidoenSession.timeoutsemultiplicade

    acuerdoalosiguiente.

    Valoresvlidos:

    high=x10

    medium=x100

    low=x300

    Security.salt Unapalabraaleatoriausadaensumasdeseguridad.

    Acl.classname,Acl.database

    VariablesusadasparalasListasdeControldeAccesodeCakePHP.Leeelcaptulodelistasdecontroldeacceso

    paramsinformacin.

    Nota: La configuracin de Cache tambin puede ser encontrada en el archivo core.php Ms adelante cubriremos este tema.

    LaclaseConfigurepuedeserutilizadaparaleeryescribirvaloresdurantelaejecucindelprograma.Estopuedeserespecialmentetilsideseadeshabilitarel nivel de deburacion (debug) para una seccin limita de lgica en tuaplicacin.

    Comprensin de las Rutas

    ElenrutamanietopermitehacerunarelacinentreURLsyaccionesdeloscontroller. Fue aadido a CakePHP para hacer ms bonitos los URLs, msconfigurables, y ms flexibles. Usar el mod_rewrite de Apache no es unrequisitoparautilizarelenrutamiento,peroharlucirmuchomejortubarradedirecciones.

    Enrutamiento por Defecto

    CakePHP viene configurado con un conjunto de rutas por defecto. Estasrutastellevarnbastantelejosencualquieraplicacin.PuedesaccederaunaaccindirectamentedesdeelURLcolocandosunombreenlapeticin.TambinpuedespasarparmetrosalasaccionesdetuscontroladoresusandoelURL.

    PatrnURLdelasrutaspordefecto:

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

    ElURL /articulos/verdirigea laaccinver()actiondelArticulosController,y /productos/listaCompleta dirige a la accin a lista_completa() de

  • 25

    Desarrollando con CakePHP

    ProductosController.SinoseespecificaningunaaccinenelURL,seasumequesetratadelaaccinindex().

    La configuracin inicial de enrutamiento permite pasar parmetros a tusaccionesusandoelURL.Unapeticinpara/articulos/ver/25seraequivalenteallamarver(25)enelArticulosController,porejemplo.

    Parmetros con Nombre

    AlgonovedosoenCakePHP1.2eslahabilidaddeusarparmetrosconnombre(namedparameters).PuedesnombrarparmetrosyenviarsusvaloresusandoelURL.Unapeticinpara/articulos/ver/titulo:primer+articulo/categoria:generalresultaraenuna llamadaa laaccionview()deArticulosController.Endichaaccin,puedesencontrarlosvaloresdelttuloylacategoradentrode$this->passedArgs[titulo]and$this->passedArgs[categoria]respectivamente.

    Algunosejemplosqueresumanlasrutaspordefectopuedenresultartil.

    URL:/monos/saltar Dirigea:MonosController->saltar(); URL:/productos Dirigea:ProductosController->index(); URL:/tareas/ver/45 Dirigea:TareasController->ver(45); URL:/donaciones/ver/recientes/2001 Dirigea:DonacionesController->ver(recientes,2001);

    URL:/contenidos/ver/capitulo:modelos/seccion:asociaciones Dirigea:ContenidosController->ver(); $this->passedArgs[capitulo]=modelos; $this->passedArgs[seccion]=asociaciones;

  • 27

    Controladores

    4

  • Introduccin a CakePHP Framework

    28

    Introduccin

    Un controlador (Controller) se usa para manejar la lgica de cierta seccin de su aplicacin. Comnmente, los controladores (Controllers) son usados para manejar la lgica de un solo modelo (Model). Por ejemplo, si ests construyendo un sitio de una pastelera, podras tener un

    RecetasController y un IngredientesController para manejar las recetas y sus ingredientes. En CakePHP, los controladores se nombran segn 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 aplicacin 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 mtodos que son compartidos entre todos los controladores de su aplicacin. AppController es una sub-clase de Controller que es una clase de la biblioteca estndar de Cake.

    Los controladores pueden tener cualquier cantidad de mtodos a los que normalmente se les llama acciones. Las acciones son mtodos de controladores en tu aplicacin web para mostrar vistas. Una accin es un nico mtodo de un controlador. El Dispatcher de CakePHP ejecuta acciones cuando una solicitud entrante contiene en su URL el nombre de una accin del controlador. El controlador estara ubicado en /app/controllers/recetas_controller.php con el siguiente contenido:

  • 29

    Controladores

    Para que puedas usar un controlador de manera productiva en tu propia aplicacin, repasaremos algunos de los atributos y mtodos provistos por los controladores de CakePHP.

    App Controller

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

    Las propiedades y mtodos creados en tu AppController estarn disponibles para todos los controladores de tu aplicacin. Es el sitio ideal para poner el cdigo que ser comn a todos los controladores de tu aplicacin. Los Componentes (los cuales veremos despus) son lo ms utilizado para el cdigo que se utiliza en la mayora (pero no necesariamente en todos) los controladores.

    Cuando se aplica la herencia a los objetos, CakePHP tambin 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 en la seccin http://api.cakephp.org/class/controller.

    $name

    Los usuarios de PHP4 deberan empezar la definicin de sus controladores con el atributo $name. Este atributo debera 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 distincin de maysculas que tiene PHP4 para los nombres de las clases.

  • Introduccin a CakePHP Framework

    30

    $components, $helpers y $uses

    Los siguientes atributos ms comnmente utilizados del controlador indican a CakePHP qu ayudantes (helpers), componentes (components), y modelos (models) utilizars en conjuncin con el controlador actual. Utilizar esos atributos hace que las clases MVC estn 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 tambin posee el modelo Product en $this->Product.

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

    Veamos cmo decirle a un controlador de CakePHP que planeas utilizar clases MVC adicionales.

    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 Pgina: $layout y $pageTitle

    Existen unos pocos atributos en los controladores de CakePHP que te dan control sobre cmo se colocan tus vistas (views) dentro del diseo (layout).

    Al atributo $layout se le puede asignar el nombre de un diseo (layout) guardado en /app/views/layouts. Especificas un diseo al igualar $layout al nombre del archivo con el diseo excluyendo la extensin .ctp. Si este atributo no ha sido definido, CakePHP renderiza el diseo por defecto, default.ctp. Si no has definido un diseo en /app/views/layouts/default.ctp, el diseo por defecto del ncleo de CakePHPs ser renderizado.

  • 31

    Controladores

    Tambin puedes cambiar el ttulo de la pgina (que est localizado en la barra en la parte superior de tu navegador) utilizando $pageTitle. Para que esto funcione apropiadamente, tu diseo (layout) necesita incluir la variable $title_for_layout como mnimo entre las etiquetas y en la cabecera del documento HTML.

    Tambin puedes establecer el ttulo desde la vista (view) usando $this->pageTitle (Has de incluir la parte $this->; se recomienda, ya que separa la lgica del diseo y el contenido). Para una pgina esttica has de usar $this->pageTitle en la vista si quieres un ttulo personalizado.

    Si $this->pageTitle no est establecido, se generar automticamente un ttulo basado en el nombre del controlador, o el nombre del fichero de la vista en el caso de una pgina esttica.

    El Atributo de Parmetros ($params )

    Los parmetros del controlador estn disponibles en $this->params en tu controlador de CakePHP. Esta variable es usada para proporcionar acceso a la informacin sobre la peticin actual. El uso ms comn de $this->params es obtener acceso a informacin que ha sido entregada al controlador a travs de las operaciones POST o GET.

  • Introduccin a CakePHP Framework

    32

    form

    $this->params[form]

    Cualquier dato POST de cualquier formulario se almacena aqu, incluyendo informacin tambin hallada en $_FILES.

    admin

    $this->params[admin]

    Almacena un 1 si el diseo (layout) actual est vaco; 0 si no.

    isAjax

    $this->params[ajax]

    Almacena un 1 si la peticin actual es una llamada ajax; 0 si no. Esta variable slo 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 peticin. 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 peticin 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.

  • 33

    Controladores

    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] debera 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:

    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] ;

    prefix

    $this->params[prefix]

  • Introduccin a CakePHP Framework

    34

    Establecido al prefijo de enrutado. Por ejemplo, este atributo contendra la cadena admin durante una peticin a /admin/posts/someaction.

    named

    $this->params[named]

    Almacena cualquier parmetro con nombre /clave:valor/ de la cadena de peticin de la URL. Por ejemplo, si se pidi la URL /posts/view/var1:3/var2:4, entonces $this>params[named] debera 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 ms informacin sobre cmo utilizar esos atributos, echa un vistazo a sus respectivas secciones ms adelante en este manual.

    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 desempeo en muchos casos.

    Mtodos del Controlador

    Para una lista completa de los mtodos del controlador y sus descripciones visita el API de CakePHP. Echa un vistazo a http://api.cakephp.org/1.2/class_controller.html.

  • 35

    Controladores

    Interactuando con Vistas

    Set (string $variable, mixed $valor)

    El mtodo 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.

    Has seleccionado de la tarta.

    El mtodo set() tambin toma una array asociativo como primer parmetro. A menudo, esto puede ser una manera rpida de asignar un conjunto de informacin a la vista.

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

    Control de Flujo

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

    El mtodo de control de flujo que ms frecuentemente utilizars es redirect(). Este mtodo

    toma su primer parmetro en forma de URL relativa de CakePHP. Por ejemplo, cuando un usuario ha hecho un pedido satisfactoriamente, probablemente desears redirigirle a una ventana de recibo.

  • Introduccin a CakePHP Framework

    36

    function realizarPedidos() { // La lgina 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 parmetro de redirect() te permite definir un cdigo de estado HTTP que acompae la redireccin. Puede que desees usar 301 (movido permanentemente) o 303 (mirar otro), dependiendo de la naturaleza de la redireccin.

    El mtodo ejecutar exit() tras la redireccin a menos que establezcas el tercer parmetro a false.

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

    Igualmente, el mtodo flash() es usado para redirigir un usuario a una nueva pgina tras una operacin. El mtodo flash() es diferente en cuanto que muestra un mensaje antes de enviar al usuario a otra URL.

    El primer parmetro debera contener el mensaje a mostrar, y el segundo parmetro es una URL relativa a CakePHP. CakePHP mostrar el mensaje en $message durante el nmero de segundos en $pause antes de reenviar al usuario a otra pgina.

    Para mensajes flash en la pgina, cercirate de echarle un ojo al mtodo setFlash() del componente SessionComponent.

  • 37

    Modelos

    5

  • Introduccin a CakePHP Framework

    38

    La Comprensin de Modelos

    Un Modelo representa tu modelo de datos y, en programacin 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 artculos (posts) y cada artculo puede contener varios comentarios. Los objetos Blog, Artculo (Post) y Comentario son ejemplos de modelos, cada uno asociado con el otro.

    Aqu presentamos un ejemplo simple de definicin de modelo en CakePHP:

    Simplemente con esta declaracin, se le otorga al modelo Ingredient toda la funcionalidad que necesitars para crear consultas junto con guardado y borrado de datos. Estos mtodos mgicos provienen del modelo de herencia de CakePHP. El modelo Ingredient extiende el modelo de aplicacin 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 vaca y reside por defecto dentro de la carpeta /cake/. Redefinir AppModel te permitir definir funcionalidad que debera estar disponible a todos los modelos dentro de tu aplicacin. Para hacer eso, necesitas crear tu propio fichero app_model.php que reside en la raz 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 convencin, debera tener el mismo nombre que la clase; para este ejemplo, ingredient.php.

    CakePHP crear dinmicamente un objeto modelo por ti si no puede encontrar un archivo correspondiente en /app/models. Esto tambin significa que si, accidentalmente, nombras tu archivo de manera errnea (p.ej. Ingredient.php o ingredients.php) CakePHP utilizar AppModel en lugar de tu archivo de modelo con nombre incorrecto. Si ests tratando de utilizar un mtodo de un modelo personalizado y ests 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 automticamente har que se pueda acceder al modelo cuando su nombre concuerde con el del controlador. Por ejemplo, un controlador llamado IngredientsController automticamente inicializar el modelo Ingredient y ser accesible por el controlador mediante $this->Ingredient.

  • 39

    Modelos

    Estn disponibles los modelos asociados a travs del modelo principal. En el siguiente ejemplo, el modelo Receta (Recipe) tiene una asociacin con el modelo Ingrediente (Ingredient).

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

    Como podrs ver en Controllers, puedes atar mltiples modelos al controlador y acceder directamente desde l. En el siguiente ejemplo, ambos modelos Recipe y User son accesibles desde el controlador actual.

    Si no has aadido el modelo a travs de la propiedad $uses entonces necesitars importar el modelo manualmente e instanciarlo dentro de la accin.

  • Introduccin a CakePHP Framework

    40

    Creando Tablas de Bases de Datos

    A pesar de que CakePHP puede tener orgenes de datos (datasources) que no son manejadas por sistemas de gestin de bases de datos, la mayora de las veces lo son. CakePHP est diseado para ser agnstico y funcionar con MySQL, MSSQL, Oracle, PostgreSQL y otros. Puedes crear tus tablas de base de datos como lo haras normalmente. Cuando creas tus clases del Modelo, automticamente se mapean a las tablas que has creado.

    Los nombres de las tablas son, por convencin, en minsculas 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 debera esperar un nombre de tabla event_registrations. CakePHP inspeccionar tus tablas para determinar el tipo de dato de cada campo y utiliza esta informacin para automatizar varias caractersticas como la salida de campos de formulario en la vista.

    Los nombres de los campos son, por convencin, en minscula 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 ms adelante en este captulo.

    En el resto de esta seccin vers cmo CakePHP mapea tipos de campos de bases de datos en tipos de datos PHP y cmo CakePHP puede automatizar tareas basndose en cmo tus campos estn 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

  • 41

    Modelos

    y crea una interfaz unificada sin importar en qu sistema de bases de datos necesitas ejecutarlo.

    El siguiente desglose describe cmo est mapeado cada uno:

    MySQL

    Tipo CakePHP Propiedades del Campo

    primary_key NOT NULL auto_increment

    string varchar(255)

    text text

    integer int(11)

    float float

    datetime datetime

    timestamp datetime

    time time

    date date

    binary blob

    boolean tinyint(1)

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

    MySQLi

    Tipo CakePHP Propiedades del Campo

    primary_key DEFAULT NULL auto_increment

    string varchar(255)

    text text

    integer int(11)

    float float

    datetime datetime

    timestamp datetime

    time time

    date date

    binary blob

    booleantinyint(1)

  • Introduccin a CakePHP Framework

    42

    ADOdb

    Tipo CakePHP Propiedades del Campo

    primary_key R(11)

    string C(255)

    text X

    integer I(11)

    float N

    datetime T (Y-m-d H:i:s)

    timestamp T (Y-m-d H:i:s)

    time T (H:i:s)

    date T (Y-m-d)

    binary B

    ORACLE

    Tipo CakePHP Propiedades del Campo

    primary_key number NOT NULL

    string varchar2(255)

    text varchar2

    integer numeric

    float float

    datetime date (Y-m-d H:i:s)

    timestamp date (Y-m-d H:i:s)

    time date (H:i:s)

    date date (Y-m-d)

    binary bytea

    boolean boolean

    number numeric

    inet inet

  • 43

    Modelos

    SQLite

    Tipo CakePHP Propiedades del Campo

    primary_key integer primary key

    string varchar(255)

    text text

    integer integer

    float float

    datetime datetime (Y-m-d H:i:s)

    timestamp timestamp (Y-m-d H:i:s)

    time time (H:i:s)

    date date (Y-m-d)

    binary blob

    Ttulos

    Un objeto, en sentido fsico, a menudo tiene un nombre o un ttulo con el que referirse. Una persona tiene un nombre como Juan o Ambrosio o Colega. Una entrada de un blog tiene un ttulo. Una categora tiene un nombre.

    Al especificar el campo title (ttulo) o name (nombre), CakePHP automticamente utilizar esta etiqueta en varias circunstancias:

    Scaffolding ttulos de pginas, etiquetas de fieldset Listas - normalmente utilizado para los desplegables TreeBehavior reordenacin, vistas de rbol

    Si tienes un campo title y 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 automaticamente cuando un registro sea creado o grabado en la base de datos.

    Los campos created y modified sern establecidos a la fecha y hora actuales cuando el registro es inicialmente aadido. 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.

  • Introduccin a CakePHP Framework

    44

    Utilizando UUIDs como Claves Primarias

    Las claves primarias son normalmente definidas como campos INT. La base de datos incrementar automticamente el campo, comenzando en 1, para cada nuevo registro que se aade. Alternativamente, si especificas tu clave primaria como CHAR(36), CakePHP generar automticamente 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-446655440000Los UUIDs estn diseados para ser nicos, no slo dentro de una tabla

    dada, sino tambin a travs de tablas y bases de datos. Si necesitas que un campo permanezca nico a travs de sistemas, los UUIDs son un genial enfoque.

    Recuperando tus Datos

    Find($tipo, $parametros)

    $tipo es all, first, count, neighbors, list o threaded. first es el tipo de bsqueda predeterminado.

    $parametros es un array con cualquiera de las siguientes opciones disponibles como claves:

    array(conditions => array(Model.field => $thisValue), //array de condiciones recursive => 1, //intfields => array(Model.field1, Model.field2), //array de nombres de camposorder => Model.created, //string o array definiendo el ordengroup => array(Model.field), //campos para GROUP BYlimit => n, //intpage => n //int

    )

    Si ests utilizando find(list), la clave fields en $parametros define la clave, valor y grupo

  • 45

    Modelos

    // la lista generada ser indexada por Post.id, con valor de Post.title$this->Post->find(list, array(fields=>Post.title)) ; // la lista generada ser indexada por Post.slug, con valor de Post.title$this->Post->find(list, array(fields=>array(Post.slug,Post.title))) ; // la lista generada ser agrupoada por Post.author_id, y cada grupo indexado por Post.id, con valor de Post.title $this->Post->find(list, array(fields=> array(Post.id, Post.title, Post.author_id) ) ) ;

    Si ests utilizando find(neighbors), la clave field en $parametros define el campo a analizar, y la clave value en el array $parametros define el valor a mirar para determinar el siguiente y el anterior. Notar que las claves field y value no son usadas para find(all) y este es un caso especial para find(neighbors).

    // asumiendo que tenermos ids de 1 a 10, veremos assuming we have ids from 110 , veremos prev establecido a 1 y next establecido a 3$this->Post->id = 2;$one = $this->Post->find(neighbors) ;// para obtener los datos vecinos utilizando un campo diferente...$two = $this->Post->find(neighbors, array(field=> Post.title, value=> $data[Post][title]) ) ;

    Para compatibilidad hacia atra, find tambin acepta la sintasix previa:

    find(string $condiciones, array $campos, string $orden, int $recursivo)

    find(first, $params)

    first es el tipo find por defecto, y devolver un solo resultado, deberas utilizar esto para cualquier caso donde esperes solo un resultado. Abajo hay un par de ejemplos simples (cdigo del controlador[ controller ]):

  • Introduccin a CakePHP Framework

    46

    function some_function() { ... $this->Article->order = null; // reseteando si ya ha sido inicializado $semiRandomArticle = $this->Article->find() ; $this->Article->order = Article.created DESC; // simulando el modelo teniendo un rden por defecto $lastCreated = $this->Article->find() ; $alsoLastCreated = $this->Article->find(first, array(order => array(Article.created DESC))) ; $specificallyThisOne = $this->Article->find(first, array(conditions => array(Article.id => 1))) ; ...}

    En este primer ejemplo, ningn parmetro se le ha pasado a find - por lo tanto ningn criterio de condicin o de ordenamiento ser utilizado. El formato devuelto por la llamada a find(first) ser de la siguiente forma:

    Array( [ModelName] => Array ( [id] => 83 [field1] => value1 [field2] => value2 [field3] => value3 ) [AssociatedModelName] => Array ( [id] => 1 [field1] => value1 [field2] => value2 [field3] => value3 ) )

    No hay parmetros adicionales usador por find(first).

    find(count, $params)

    Devuelve un valor entero. Debajo hay un par de ejemplos sencillos (cdigo controlador):

  • 47

    Modelos

    function some_function() { ... $total = $this->Article->find(count) ; $pending = $this->Article->find(count, array(conditions => array(Article.status => pending))) ; $authors = $this->Article->User->find(count) ; $publishedAuthors = $this->Article->find(count, array( fields => DISTINCT Article.user_id, conditions => array(Article.status != => pending) )) ; ...}

    No pasar campos como arrays a find(count). Podras necesitar campos especficos para DISTINCT count (de lo contrario, count es siempre lo mismo - dictatado por las conditions (condiciones )).

    No hay parmetros adicionales usados con find(count).

    find(all, $params)

    Devuelve un array de resultados (potencialmente mltiples); es, de hecho, el mecanismo usado por todas las variantes del mtodo find(), como por ejemplo para paginar. Debajo puedes ver un par de (cdigo controlador) ejemplos:

    function some_function() { ... $allArticles = $this->Article->find(all) ; $pending = $this->Article->find(all, array(conditions => array(Article.status => pending))) ; $allAuthors = $this->Article->User->find(all) ; $allPublishedAuthors = $this->Article->User->find(all, array(conditions => array(Article.status != => pending))) ; ...}

    El ejemplo de abajo $allAuthors busca todos los campos de la tabla users, no se le han aplicado condiciones a find.

    Los resultados de llamar a find(all) sern de la siguiente forma:

  • Introduccin a CakePHP Framework

    48

    Array( [0] => Array ( [ModelName] => Array ( [id] => 83 [field1] => value1 [field2] => value2 [field3] => value3 ) [AssociatedModelName] => Array ( [id] => 1 [field1] => value1 [field2] => value2 [field3] => value3 ) ) )

    Aqu no hay parmetros condicionales usados por find(all).

    find(list, $params)

    Devuelve un array indexado, til para cualquier uso donde podras querer una lista como los polulares campos select de los formularios. Debajo hay un par de simples ejemplos (cdigo controlador):

    function some_function() { ... $allArticles = $this->Article->find(list) ; $pending = $this->Article->find(list, array(conditions => array(Article.status => pending))) ; $allAuthors = $this->Article->User->find(list) ; $allPublishedAuthors = $this->Article->User->find(list, array(conditions => array(Article.status != => pending))) ; ...}

    En el ejemplo siguiente $allAuthors va a contener todos los usuarios de la tabalo usuers, no se le aplica ninguna condicin para filtrar la bsqueda que lleva a cabo find.

    Los resultado tras llamar al mtodo find(list) tendrn el siguiente aspecto:

  • 49

    Modelos

    Array( //[id] => displayValue,=> displayValue1,=> displayValue2,=> displayValue4,=> displayValue5,=> displayValue6, [3] => displayValue3,)

    Cuando find(list) es llamado, los parmetros pasados son usados para determinar que debera ser usado como la key del array, value y opcionalmente a que grupo pertenecen los resultados. Por defecto la clave primaria para el modelo es usada por la key, y el valor que se muestra es el usado por el value.

    findAllBy(string $valor)

    Estas funciones mgias pueden ser usadas como atajos para buscar en tus tablas por cierto campo. Simplemente aade el nombre del campo (en formato CamelCase) al final del nombre de esas funciones () y proporciona los criterios para ese campo como primer parmetro.

    findBy(string $valor)

    Estas funciones mgicas pueden ser usadas como atajo en la bsqueda en tus tablas por cierto campo. Simplemente aade el nombre del campo (en forma CamelCase) al final de las funciones (< nombreCampo>), y proporciona los criterios para ese campo como primer parmetro.

    Ejemplo findAllBy en PHP5 Fragmento SQL Correspondiente$this->Product->findAllByOrderStatus(3); Product.order_status = 3

    $this->Recipe->findAllByType(Cookie); Recipe.type = Cookie

    $this->User->findAllByLastName(Anderson); User.last_name = Anderson

    $this->Cake->findById(7); Cake.id = 7

    $this->User->findByUserName(psychic); User.user_name = psychic

    Los usuarios de PHP4 han de utilizar esta funcin de manera un poco diferente debido a cierto caseinsensitivity en PHP4:

    Ejemplo findAllBy en PHP4 Fragmento SQL Correspondiente $this->Product->findAllByOrder_status(3) Product.order_status = 3

    $this->Recipe->findAllByType(Cookie) Recipe.type = Cookie

  • Introduccin a CakePHP Framework

    50

    $this->User->findAllByLast_name(Anderson) User.last_name = Anderson

    $this->Cake->findById(7) Cake.id = 7

    $this->User->findByUser_name(psychic) User.user_name = psychic

    El resultado devuelto es un array formateado tal y como sera en find() o findAll().

    query(string $consulta)

    Se pueden realizar llamadas SQL personalizadas usando el mtodo query() del modelo. query() utiliza el nombre de la tabla en la consulta como clave del array de datos devueltos, en vez del nombre del modelo. Por ejemplo:

    $this->Fotografia->query(SELECT * FROM fotografias LIMIT 2;) ;

    Debera devolver

    $this->Fotografia->query(SELECT * FROM fotografias LIMIT 2;) ; Array(=> Array ( [fotografas] => Array ( [id] => 1304 [user_id] => 759 ) )=> Array ( [fotografas] => Array ( [id] => 1305 [user_id] => 759 ) ))

    Para usar el nombre del modelo como clave del array, y obtener un resultado consistente con el devuelto por los mtodos Find, la consulta puede ser reescrita:

  • 51

    Modelos

    $this->Fotografia->query(SELECT * FROM fotografia AS Fotografia LIMIT 2;) ;

    La cual devuelve

    Array(=> Array ( [Fotografia] => Array ( [id] => 1304 [user_id] => 759 ) )=> Array ( [Fotografia] => Array ( [id] => 1305 [user_id] => 759 ) ) )

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

    Devuelve el valor de un campo singular, especificado en $name, del primer registro que cumpla $condiciones estando ordenado por $orden.

    read($fields, $id)

    read() es un mtodo usado para establecer los datos del modelo actual (Model::$data) --as tambin mientras se est editando- pero tambin puede ser usado en otras circunstancias para obtener un solo registro de la base de datos.

    $fields es usado para especificar un nombre de campo, como cadena, o un arreglo de nombres de campo que sern incluidos en la consulta; si no se especifica un valor, entonces todos los campos sern incluidos.

    $id especifica el ID de registro que ser ledo. Por defecto, el registro actualmente seleccionado, especificado por Model::$id, es usado. Si se especifica un valor diferente a $id causar que el registro que cumpla con la condicin ser seleccionado.

  • Introduccin a CakePHP Framework

    52

    function beforeDelete($cascade) { ... $rating = $this->read(rating); // obtiene el rating del registro que ser borrado. $name = $this->read(name, $id2); // obtiene el nombre un segundo registro. $rating = $this->read(rating); // obtiene el rating del segundo registro $this->id = $id3; // $this->Article->read(); // lee un tercer registro, especificado por < code>$id3. $record = $this->data // almacena el tercer registro en $record ...}

    Notar que la tercera llamada a read() obtiene el rating del mismo registro ledo anteriormente por la llamada $this->read(name, $id2). Esto es porque read() cambia el valor en Model::$id a cualquier valor pasado como $id.

    Condiciones Complejas de Bsqueda

    La mayora de las llamadas de bsqueda del modelo involucran pasar conjuntos de condiciones de una u otra manera. La aproximacin ms simple a ello es utilizar la clusula WHERE de SQL. Si ves que necesitas ms control, puedes utilizar arrays.

    Usar arrays permite una lectura ms clara y fcil, y tambin hace muy fcil la construccin de consultas. Esta sintaxis tambin particiona los elementos de tu consulta (campos, valores, operadores, etc.) en partes discretas y manipulables. Esto permite a CakePHP generar la consulta ms eficiente posible, asegurar una sintaxis SQL apropiada, y formatear apropiadamente cada parte individual de la consulta.

    En su forma ms bsica, una consulta basada en array es as:

    $condiciones = array(Articulo.title => Esto es un artculo) ; // Ejemplo de uso con un modelo:$this->Articulo->find($condiciones) ;

    La estructura aqu es bastante autoexplicativa: buscar cualquier artculo donde el ttulo sea igual a Esto es un artculo. Notar que podramos haber utilizado como nombre de campo simplemente title, pero cuando se construyen consultas es buena prctica especificar siempre el nombre del modelo (en este caso, Articulo), ya que mejora la claridad del cdigo y ayuda a prevenir colisiones en el futuro, en cuyo caso deberas modificar tu esquema de tablas.

  • 53

    Modelos

    Qu hay sobre otros tipos de condiciones? Estas son igualmente simples. Digamos que queremos buscar todos los artculos donde el ttulo no sea Esto no es un artculo:

    array(Articulo.title => Esto no es un artculo)

    Notar el que est detrs del nombre del campo. CakePHP puede analizar sintcticamente cualquier operador de comparacin en SQL, incluyendo las expresiones usando LIKE, BETWEEN, o REGEX, siempre y cuando dejes un espacio entre el nombre del campo y el operador. La unica excepcin aqu es la condicin de bsqueda del tipo IN (...). Digamos que queras buscar artculos donde el ttulo estaba dentro de un conjunto dado de valores:

    array( Articulo.title => array(Primer artculo, Segundo artculo, Tercer artculo))

    Para realizar una bsqueda con condicin NOT IN(...) para encontrar artculos cuyo ttulo no est en el conjunto de valores dado:

    array(NOT => array( Articulo.title => array(Primer artculo, Segundo artculo, Tercer artculo) ) )

    Aadir filtros adicionales a las condiciones es tan simple como aadir pares clave/valor adicionales al array:

    array ( Articulo.title => array(Primer artculo, Segundo artculo, Tercer artculo) , Articulo.created > => date(Y-m-d, strtotime(-2 weeks)) )

    Tambin puedes crear bsquedas que comparen dos campos en la base de datos:

    array(Articulo.created = Articulo.modified)

    Este ejemplo de arriba devolver artculos en los cuales la fecha de creacin es igual a la fecha de modificacin (p.e. devolver artculos que nunca han sido modificados).

    Por defecto, CakePHP junta mltiples condiciones con AND booleano; es decir, las condiciones de ms arriba slo coincidirn con artculos que han sido creados en las ltimas dos semanas (-2 weeks), y posean un ttulo que

  • Introduccin a CakePHP Framework

    54

    coincida con alguno de los dados en el conjunto (Primer artculo,...).

    No obstante, podemos igualmente buscar artculos que coincidan con cualquiera de las condiciones:

    array( or => array ( Articulo.title => array(Primer artculo, Segundo artculo, Tercer artculo) , Articulo.created > => date(Y-m-d, strtotime(-2 weeks)) ))

    Cake acepta todas las operaciones booleanas de SQL vlidas, incluyendo AND, OR, NOT, XOR, etc..., y pueden estar en maysculas o minsculas, como prefieras. Estas condiciones son tambin infinitamente anidables. Digamos que tienes una relacin belongsTo entre Artculos y Autores.

    Digamos que quieres buscar todos los artculos que contienen una cierta palabra (p.e. magico) o que han sido creados en las ltimas dos semanas, pero quieres restringir tu bsqueda a artculos escritos por Pedro:

    array ( Autor.name => Pedro, or => array ( Articulo.title LIKE => %magico%, Articulo.created > => date(Y-m-d, strtotime(-2 weeks)) ))

    Cake tambin puede comprobar campos nulos (null). En este ejemplo, la consulta devolver registros en los que el ttulo del artculo no es nulo:

    array ( not => array (Articulo.title => null, ))

    Para manejar consultas con BETWEEN, puedes usar lo siguiente:array(Articulo.id BETWEEN ? AND ? => array(1,10))

    Nota: CakePHP entrecomillar los valores numricos dependiendo del tipo de campo definido en tu base de datos.

  • 55

    Modelos

    Guardando Tus Datos

    CakePHP hace que el salvado de los datos del modelo sea instantneo. Los datos listos para ser salvados debern ser pasados al mtodo save() del modelo usando el formato bsico siguiente:

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

    La mayora de las veces no necesitars preocuparte por este formato: los ayudantes de CakePHP HtmlHelper, FormHelper, y mtodos de bsqueda empaquetan los datos en este formato. Si ests usando alguno de los ayudantes, los datos tambin estn convenientemente disponibles en $this>data para su uso rpido.

    Aqu est un ejemplo rpido de una accin de un controlador que usa un modelo de CakePHP para salvar datos en una tabla de una base de datos:

    function edit($id) { // Ha POSTeado algn 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 psala a la vista $this->set(receta, $this->Receta->findById($id)) ;}

    Una nota adicional: cuando se llama a save(), los datos pasados a la funcin como primer parmetro son validados usando el mecanismo de validacin de CakePHP. Si por alguna razn tus datos no se graban, comprueba si alguna regla de validacin se est incumpliendo.

  • Introduccin a CakePHP Framework

    56

    Hay unos pocos mtodos relacionados con el salvado que encontrars tiles:

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

    Mostrado arriba, este mtodo graba datos formateados en array. El segundo parmetro ($validar) te permite eludir la validacin, y el tercero ($listaCampos) te permite proveer una lista de campos del modelo a ser grabados. Como seguridad aadida, 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 mtodo resetea el estado del modelo para grabar nueva informacin.

    Si se pasa el parmetro $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 mtodo, $nombreCampo debera contener slo el nombre del campo, no el nombre del modelo y campo.

    Por ejemplo, para actualizar el ttulo de una entrada de un blog, la llamada a saveField desde un controlador debera parecerse a esto:

    $this->Entrada->saveField(titulo, Un Nuevo Ttulo para un Nuevo Da) ;

    updateAll(array $campos, array $condiciones)

    Actualiza varios registros en una nica llamada. Los registros a ser

  • 57

    Modelos

    actualizados estn identificados por el array $conditions, y los campos a ser actualizados, as como sus valores, estn identificados por el array $fields.

    Por ejemplo, para aprobar a todos los panaderos que han sido miembros durante ms de un ao, la llamada de actualizacin debera ser algo como:

    $este_ao = date(Y-m-d h:i:s, strtotime(-1 year)) ;$this->Panadero->updateAll( array(Panadero.approved => true) , array(Panadero.created $este_ao) ) ;

    El array $campos acepta expresiones SQL. Los valores literales deberan ser entrecomillados manualmente.

    Por ejemplo, para cerrar todos los tickets que pertenecen a cierto vendedor:$this->Ticket->updateAll( array(Ticket.estado => cerrado) , array(Ticket.vendedor_id => 453)) ;saveAll(array $datos = null, array $opciones = array())

    Usado para salvar (a) mltiples registros individuales para un nico modelo o (b) este registro as como todos los registros asociados.

    Para salvar mltiples registros de un nico modelo, $data necesita ser un array de registros indexado numricamente como esto:

    Array(=> Array ( [titulo] => titulo 1 )=> Array ( [titulo] => titulo 2 ))

    Para salvar un registro junto con su registro relacionado teniendo una asociacin hasOne o belognsTo, el array de datos debera ser como:

  • Introduccin a CakePHP Framework

    58

    Array( [Usuario] => Array ( [nombreusuario] => billy ) [Perfil] => Array ( [sexo] => Varon [ocupacion] => Programador ))

    Para salvar un registro junto con sus registros relacionados teniendo una asociacin hasMany, el array de datos debera ser como:

    Array( [Articulo] => Array ( [titulo] => Mi primer artculo ) [Comentario] => Array (=> Array ( [comentario] => Comment 1 [comentario] => 1 )=> Array ( [comentario] => Comment 2 [comentario] => 2 ) ))

    Guardando Datos de Modelos Relacionados (hasOne, hasMany, belongsTo)

    Cuando estamos trabajando con modelos asociados, es importante tener en cuenta que al guardar los datos de un modelo hay que hacerlo con el correspondiente modelo de CakePHP. Si ests guardando una nueva Entrada y sus Comentarios asociados, entonces deberas usar ambos modelos, Entrada y Comentario, durante la operacin de guardado.

  • 59

    Modelos

    Si ninguno de los registros de los modelos asociados existe an (por ejemplo, quieres guardar registros de un nuevo Usuario y su Perfil relacionado a la vez), primero necesitars guardar el modelo primario o padre.

    Para tener una idea de cmo funciona esto, imaginemos que tenemos una accin en nuestro controlador de usuarios UsersController que maneja el guardado de un nuevo usuario y su perfil correspondiente. En la accin de ejemplo mostrada abajo se asumir que has POSTeado sufientes datos (usando el FormHelper) para crear un solo Usuario y un solo Perfil.

    Como norma general, cuando trabajamos con asociaciones hasOne, hasMany y belongsTo (tiene un, tiene varios, y pertenece a), todo es cuestin de las claves. La idea bsica es coger la clave de un modelo y ponerla en el campo de clave fornea en el otro. A veces esto puede implica usar el atributo $id de la clase del modelo despus de save(), pero otras veces podra simplemente implicar obtener el ID desde un campo oculto de un formulario POSTeado a una accin del controlador.

    Para complementar el enfoque bsico usado arriba, CakePHP tambin ofrece el mtodo muy til saveAll, el cual te permite validar y grabar mltiples modelos de golpe. Adems, saveAll provee de soporte transaccional para asegurar la integridad de los datos en tu base de datos (p.ej. si un modelo falla en la grabacin, los otros modelos tampoco sern grabados).

    Para que las transacciones funcionen correctametne en MySQL, tus tablas han de usar el mecanismo InnoDB. Recuerda que las tablas MyISAM no soportan transacciones.

    Veamos cmo podemos usar saveAll() para grabar modelos de Compaa (utilizamos este nombre incorrecto por motivos didcticos) y Cuenta al mismo tiempo.

  • Introduccin a CakePHP Framework

    60

    Primero, necesitas construir tu formulario tanto para el modelo Compaa como el modelo Cuenta (asumismo que Compaa hasMany Cuenta).

    echo $form->create(Compaa, array(action=>add)) ;echo $form->input(Compaa.nombre, array(label=>Nombre de compaa)) ; echo $form->input(Compaa.descripcin) ; echo $form->input(Compaa.localizacin) ;echo $form->input(Cuenta.0.nombre, array(label=>Nombre de cuenta)) ; echo $form->input(Cuenta.0.nombreusuario) ; echo $form->input(Cuenta.0.email) ; echo $form->end(Aadir) ;

    Echemos un vistazo a la manera en que hemos nombrado los campos del formulario para el modelo Cuenta. Si Compaa es nuestro modelo principal, saveAll esperar que los datos de los modelos relacionados (en este caso, Cuenta) lleguen en un formado especfico, y teniendo Cuenta.0.nombreCampo es exactamente lo que necesitamos.

    El nombrado de campos de arriba es necesario para la asociacin hasMany. Si la asociacin entre los modelos es hasOne, necesitars usar la notacin NombreModelo.nombreCampo para el modelo asociado.

    Ahora, en nuestro compaias_controler.php podemos crear una accin add():

    function add() { if(!empty($this->data))

    { $this->Compaia->saveAll($this->data, array(validate=>first)) ; }}

    Esto es todo para ello. Ahora nuestros modelos Compaa y Cuenta sern validados y grabados al mismo tiempo. Una cosa rpida que comentar aqu es el uso de array(validate=>first): esa opcin asegurar que ambos modelos son validados.

    Guardando Datos de Modelos Relacionados (HABTM )

    Grabar modelos que estn asociados por hasOne, belongsTo y hasMany es bastante simple:

    Simplemente rellenas el campo de clave fornea con el ID del modelo asociado. Una vez que est hecho, simplemente llamas al mtodo save() del mode