Anda di halaman 1dari 548

El manual

Editar Historia Comparar con el contenido original Click aqu para la versin 1.1.x del manual de CakePHP Bienvenido al Cookbook, la documentacin de CakePHP. El Cookbook es un sistema wiki que permite las contribuciones del pblico. Con un sistema abierto, esperamos mantener un alto nivel de calidad, validez, y precisin en la documentacin de CakePHP. El Cookbook tambin facilita a cualquier persona contribuir. Un gran agradecimiento para AD7six, quin abog desde un inicio por la causa del Cookbook, trabajando numerosas horas para el desarrollo, prueba y mejora de est aplicacin.

# Como funciona?
Editar Ver slo esta seccin Historia Comparar con el contenido original

Si reconoces un error, algo que est incompleto, algo que no ha sido cubierto en su totalidad, o algo que simplemente no est escrito a tu gusto, aqu te explicamos cmo puedes ayudar: 1. Haz click en el link Editar de la seccin que deseas cambiar. 2. Inicia sesin en el Cookbook utilizando tu cuenta de Bakery. Cualquiera puede conseguir una cuenta! 3. Por favor revisa las indicaciones para contribuir en el Cookbook para asegurar la consistencia. 4. Enva tus ediciones o adiciones para su revisin, utilizando semntica HTML vlida. 5. Sigue el progreso de tus envos usando los feeds rss o revisa al da siguiente para ver tus cambios aprobados.

# Traducciones
Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Enva un email a John David Anderson (docs arroba cakephp punto org) o contacta con l a travs del IRC (#cakephp en freenode como _psychic_) para plantearle cualquier proyecto de traduccin en el que te gustara participar.

Pautas para la traduccin: Busca y edita en el mismo idioma al que ests traduciendo el contenido - de lo contrario ser registrado como una modificacin en ingls, con escasas posibilidades de que el revisor conozca el idioma en que ests escribiendo. No dudes en cooperar si tu lengua ya existe en el Cookbook. Usa la lista Todo (arriba a la derecha) para ver dnde se requiere atencin en tu lengua. Utiliza el registro informal. Traduce a la vez el ttulo y el contenido. Comprara el texto con el contenido en ingls antes de enviar una correccin (si corriges algo, pero no integras los cambios de la rama principal en ingls, tu propuesta no ser aceptada). Si necesitas escribir un trmino en ingls, mtelo entre etiquetas <em>. E.g. "asdf asdf Controller asdf" o "asdf asdf Kontroller (Controller) asfd" como es apropiado. No enves traducciones parciales. No edites una seccin con cambios pendientes (ver informacin "Historia"). No uses entidades html para caracteres acentuados, el cookbook utiliza UTF-8. No cambies significativamente el etiquetado (HTML) o aadas nuevo contenido - Si al contenido original le falta informacin, edtalo primero. Modifica los vnculos para enlazarlos con el idioma traducido. Estamos comprometidos a hacer la documentacin de CakePHP mejor de lo que nunca ha sido. Esperamos que te unas a nosotros usando el Cookbook y realimentando un proyecto del que tanto nos hemos beneficiado todos.

1 Comenzando con CakePHP


Editar Ver slo esta seccin Historia Comparar con el contenido original

Bienvenido al Cookbook, el 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. 1.1 Qu es CakePHP y por qu hay que utilizarlo? Editar Ver slo esta seccin Historia Comparar con el contenido original

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

1.2 Dnde obtener ayuda Editar Ver slo esta seccin Historia Comparar con el contenido original

# El sitio oficial CakePHP

Editar Ver slo esta seccin Historia Comparar con el contenido original

http://www.cakephp.org El sitio web oficial de CakePHP es siempre un gran lugar para visitar. Cuenta con enlaces a herramientas de desarrollo frecuentemente utilizadas, videos, oportunidades de donar, y descargas.

# El Cookbook

Editar Ver slo esta seccin Historia Comparar con el contenido original

http://book.cakephp.org Has comenzado en el lugar correcto. Este manual (y la API) es probablemente el primer lugar al que tienes que dirigirte para obtener ayuda. Como ocurre con muchos otros proyectos de cdigo abierto, tenemos gente nueva con regularidad, por lo que, para reducir nuestra carga de trabajo, intenta primero buscar respuestas por t mismo. Las respuestas pueden demorarse, pero una vez obtenidas las recordars durante mucho tiempo. Tanto el manual como la API tienen una versin en lnea.
# El Bakery

Editar Ver slo esta seccin Historia Comparar con el contenido original

http://bakery.cakephp.org La Panadera de CakePHP (CakePHP Bakery) es un almacn de cosas relacionadas con CakePHP. Consltalo si ests buscando tutoriales, casos de estudio o ejemplos de cdigo. Cuando ests familiarizado con CakePHP, accede a l y comparte tus conocimientos con la comunidad.
# El API

Editar Ver slo esta seccin Historia Comparar con el contenido original

http://api.cakephp.org/ Directo al grano y directamente de los desarrolladores de CakePHP, la API (Interfaz de Programacin de Aplicaciones) CakePHP es la documentacin ms completa y directa que explica los detalles internos del funcionamiento del framework. Se trata de una gua de referencia de cdigo concisa.
# CakeForge

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones http://www.cakeforge.org CakeForge es otro recurso para desarrolladores que puedes utilizar para hospedar tus proyectos CakePHP para compartir con los dems. Si ests buscando (o quieres compartir) un componente interesante o un plugin recomendable, echa un vistazo a CakeForge.
# Los Casos de Prueba

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones http://api.cakephp.org/tests Si alguna vez te ha parecido que la informacin proporcionada por la API no es suficiente echa un vistazo al codigo de los casos de prueba proporcionados con CakePHP 1.3. Estos pueden servir como ejemplo practico del uso de funciones y miembros de datos de una clase. Para obtener los casos de prueba es necesario descargar u obtener la rama 1.3 desde el repositorio git. Los casos de prueba se encuentran en: 1. cake/tests/cases
# El canal IRC

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones #cakephp -- Discusin General #cakephp-docs -- Documentacin #cakephp-bakery -- Bakery Si te quedas estancado en algn punto, consltanos en el canal IRC de CakePHP. Generalmente, algn miembro del equipo de desarrollo suele estar conectado, sobre todo durante las horas de luz solar de

Amrica del Norte y Amrica del Sur. Nos gustara mucho saber de t: si necesitas ayuda, si deseas encontrar usuarios en tu rea o si quieres donar tu flamante coche deportivo. #cakephp-es -- Canal de la comunidad hispano-parlante
# El Google Group

Editar Ver slo esta seccin Historia Comparar con el contenido original

Adems, CakePHP tiene un grupo Google muy activo; un recurso excelente en que se encuentran respuestas archivadas, preguntas frecuentes, y donde tambin puedes obtener respuestas inmediatas a tus problemas. http://groups.google.com/group/cake-php/ Si ests buscando un grupo Google en espaol, suscrbete al grupo de la comunidad hispanohablante. http://groups.google.com/group/cakephp-esp/ 1.3 Entendiendo Modelo-Vista-Controlador Editar Ver slo esta seccin Historia Comparar con el contenido original

Las aplicaciones CakePHP bien escritas siguen el patrn de diseo de software MVC (Modelo-VistaControlador). 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 inicial de la aplicacin. 1. Ricardo hace clic en el enlace apuntando a http://www.ejemplo.com/pasteles/comprar, y su

2. 3. 4.

5.

6.

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. El controlador realiza lgica de aplicacin especfica. Por ejemplo, puede comprobar si Ricardo ha iniciado sesin. El controlador tambin utiliza modelos para acceder a los datos de la aplicacin. La mayora de las veces los modelos representan tablas de 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. 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. 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

Editar Ver slo esta seccin Historia Comparar con el contenido original

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.

2 Principios bsicos de CakePHP


Editar Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones 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. 2.1 Estructura de CakePHP Editar Ver slo esta seccin Historia Comparar con el contenido original

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.
2.1.1 Extensiones de los Controladores ("Componentes")

Editar Ver slo esta seccin Historia Comparar con el contenido original Hay un cambio pendiente para esta seccin

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 sea 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. 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.

2.1.2 Extensiones de las Vistas

Editar Ver slo esta seccin Historia Comparar con el contenido original

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.
2.1.3 Extensiones de los Modelos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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 le 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.
2.1.4 Extensiones de la Aplicacin

Editar Ver slo esta seccin Historia Comparar con el contenido original

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. 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. 2.2 Una peticin tpica de CakePHP Editar Ver slo esta seccin Historia Comparar con el contenido original

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. 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 aun 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. 2.3 Estructura de archivos de CakePHP Editar Ver slo esta seccin Historia Comparar con el contenido original app cake plugins vendors .htaccess index.php README

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

Observars 3 carpetas principales: 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

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La carpeta app de CakePHP es donde realizars la mayor parte del desarrollo de tu aplicacin. Vemos 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. Contiene los modelos de tu aplicacin, comportamientos (behaviors) y orgenes de datos models (datasources). plugins Contiene los paquetes de plugins. 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. tmp 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. 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 vendors 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. Los archivos de presentacin son ubicados aqu: elementos (elements), pginas de error, views ayudantes (helpers), layouts y archivos de vistas. 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 webroot almacenamiento para hojas de estilo en cascada (CSS stylesheets), imgenes y archivos JavaScript. 2.4 Convenciones de CakePHP Editar Ver slo esta seccin Historia Comparar con el contenido original

Somos grandes fanticos de convencin sobre configuracin. Aun cuando toma un poco de tiempo aprender las convenciones de CakePHP, usted ahorrar tiempo en la marcha: siguiendo las convenciones, usted obtiene 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 de 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.
2.4.1 Convenciones de los nombres de archivos y clases

Editar

Ver slo esta seccin Historia Comparar con el contenido original En general, los nombres de archivo llevan el smbolo underscore "_", mientras que los nombres de las clases usan 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.
2.4.2 Convenciones de Modelo y de la Base de datos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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 guin bajo. Las tablas subyacentes para los modelos arriba mencionados seran: personas, personas_grandes, y personas_muy_grandes respectivamente. Puedes utilizar la librera de utilidades "Inflector" para verificar las palabras singulares/plurales. Consulta la documentacin de Inflector para ms informacin. 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 actue 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 de 36 caracteres siempre que grabes un nuevo registro utilizando el mtodo Model::save.
2.4.3 Convenciones de Controladores

Editar Ver slo esta seccin Historia Comparar con el contenido original

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 controllador comienza por un guin bajo, el mtodo no ser accesible diretamente desde la web, sino que estar disponible slo para uso interno. Por ejemplo: 1. <?php 2. class NoticiasController extends AppController { 3. function ultimas() { 4. $this->_buscaNuevosArticulos(); 5. } 6. function _buscaNuevosArticulos() { 7. //Lgica para encontrar los nuevos articulos. 8. } 9. } 10.?> 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 guin bajo.
2.4.3.1 Consideraciones de URL para nombres de controladores

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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. 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 guin bajo, por lo tanto /red_apples/go_pick es la forma correcta de acceder a la accin. RedApplesController::go_pick. Para mas informacin sobre CakePHP URLs y sus parametros, ver Configuracin de Rutas.
2.4.4 Convenciones de Vistas

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los archivos de plantillas de Vistas (Views) deben ser nombradas despus de las funciones de los controladores con guin bajo "_". La funcion 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 peticion http://example.com/people/ apunta a la llamada de funcion index() en el controlador , PeopleController, donde el modelo Person esta disponible automaticamente (y apunta automaticamente a la tabla people en la base de datos), y se renderiza en el archivo. Ninguna de estas relaciones han sido configuradas por otra razon que crear clases y archivos que usted necesita crear. Ahora que usted ya se ha involucrado con los fundamentos de CakePHP, puede revisar el tutorial para realizar un Blog en CakePHP, que se encuentra al final de este manual.

3 Desarrollando con CakePHP


Editar Ver slo esta seccin Historia Comparar con el contenido original

Y ahora, a cocinar. 3.1 Requerimientos Editar Ver slo esta seccin Historia Comparar con el contenido original Hay un cambio pendiente para esta seccin

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. Tcnicamente no se requiere un motor de base de datos, pero nos imaginamos que la mayora de las aplicaciones usarn 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 Preparndose para Instalar Editar Ver slo esta seccin Historia Comparar con el contenido original

CakePHP es rpido y fcil de instalar.Los requisitos mnimos son un servidor web y una copia de Cake, solo eso! Aunque este manual se enfoca primariamente en la configuracin sobre Apache (por que es el usado comnmente), Tu puedes configurar Cake para correr sobre la mayora de servidores web, tales como, LightHTTPD o bien Microsoft IIS. Preparar la instalacin consta de los siguientes pasos: Descargue CakePHP Configure su servidor para manejar php si es necesario Chequee los permisos de los archivos
3.2.1 Obteniendo CakePHP

Editar Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Hay dos principales maneras de obtener una copia limpia de CakePHP. Puedes descargar una copia comprimida (zip/tar.gz/tar.bz2) de la pgina web principal, o puedes obtener el cdigo desde el repositorio git. Para descargar la ltima release principal de CakePHP, dirgete a la pgina web http://www.cakephp.org y haz clic en el enlace Download Now. Todas las releases actuales estn alojadas en CakeForge. Este site tambin contiene enlaces a muchos otros proyectos en CakePHP, incluyendo plugins y aplicaciones para CakePHP. Las releases de CakePHP estsn disponibles en http://cakeforge.org/projects/cakephp. Se crean nightly builds alternativas que incluyen parches y mejoras al minuto (bueno, al da). Estas pueden ser accedidas desde la pgina principal de descargas aqu: http://cakephp.org/downloads/index/nightly. Para actualizaciones realmente al minuto, puedes obtener el cdigo directamente de la rama de desarrollo del repositorio git aqu: http://code.cakephp.org/source.
3.2.2 Permisos

Editar Ver slo esta seccin Historia Comparar con el contenido original

CakePHP usa el directorio /app/tmp para diferentes operaciones, como almacenar descripciones de los modelos, vistas en cache, informacin de sesiones, entre otros. Por ello, asegrate que el directorio /app/tmp de tu instalacin de Cake tenga permisos de escritura por el usuario del servidor web 3.3 Instalacin Editar Ver slo esta seccin Historia Comparar con el contenido original

Instalar CakePHP puede ser tan simple como colocar el directorio en el servidor, o tan complejo y flexible como necesites. Esta seccin cubrir los tres tipos principales de instalacin para CakePHP: desarrollo, produccin y avanzado Desarrollo: fcil para iniciar, los URL de la aplicacin incluyen el nombre del directorio, y es menos seguro. Produccin: Requiere la capacidad de configurar el servidor web para definir el "document root", muy seguro. Avanzado: Con cierta configuracin, permite ubicar los directorios clave de CakePHP en diferentes partes del sistema de archivos, para compartir una misma instalacin de CakePHP para varias aplicaciones.
3.3.1 Desarrollo

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Usar una instalacin de desarrollo es el mtodo ms rpido para montar Cake. Este ejemplo te ayudar a instalar una aplicacin de CakePHP y hacerla disponible en http://www.ejemplo.com/cake_1_2/. Asumimos para el fin de este ejemplo que tu raz de documentos est establecido a /var/www/html. Descomprime los contenidos del archivo Cake en /var/www/html. Ahora tienes una carpeta en tu raz de documentos con un nombre dependiente de la versin que te has descargado (p.ej. cake_1.2.0.7962). Renombra esta carpeta a cake_1_2. Tu configuracin de desarrollo ser como la siguiente en el sistema de archivos: /var/www/html cake_1_2 /app

/cake /vendors .htaccess /index.php README

Si tu servidor web est configurado correctamente, deberas encontrar tu aplicacin de Cake accesible en http://www.ejemplo.com/cake_1_2/.
3.3.2 Produccin

Editar Ver slo esta seccin Historia Comparar con el contenido original

Una instalacin de produccin es una manera ms flexible de instalar Cake. Usar este mtodo permite que un dominio entero se comporte como una aplicacin CakePHP nica. Este ejemplo te ayudar a installar Cake en cualquier sitio de tu sistema de ficheros y ponerlo disponible en http://www.ejemplo.com. Tener en cuenta que esta instalacin puede requerir los privilegios para cambiar el DocumentRoot (raz de documentos) en servidores web Apache. Descomprime los contenidos del archivo Cake en un directorio a tu eleccin. Por motivos de ejemplo, asumimos que escoges instalar Cake en /cake_install. Tu configuracin de produccin 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 debern establecer la directiva DocumentRoot para el dominio a:
DocumentRoot /cake_install/app/webroot

Si tu servidor web est configurado correctamente, deberas encontrar tu aplicacin Cake accesible en http://www.ejemplo.com.
3.3.3 Instalacin Avanzada

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Existen situaciones en las que querrs colocar los directorios de CakePHP en lugares diferentes del sistema de archivos. Esto puede ser debido a restricciones de un servidor compartido, o quizs simplemente deseas que algunas de tus aplicaciones compartan las mismas libreras de Cake. Esta seccin describe cmo esparcir los directorios de CakePHP sobre un sistema de archivos. En primer lugar, date cuenta que existen tres partes principales de una aplicacin Cake: 1. Las libreras principales(core) de CakePHP, en /cake. 2. El cdigo de tu aplicacin, en /app. 3. El webroot de la aplicacin, normalmente en /app/webroot. Cada uno de estos directorios puede ser ubicado en cualquier lugar de tu sistema de archivos, a excepcin del webroot, que debe ser accesible por el servidor web. Incluso puedes mover el directorio webroot fuera de tu carpeta app siempre que le indiques a Cake en donde lo has puesto. Para configurar tu instalacin de Cake, necesitars hacer algunos cambios a /app/webroot/index.php. Hay tres constantes que debers editar: ROOT, APP_DIR, y CAKE_CORE_INCLUDE_PATH. ROOT debe contener la ruta del directorio que contiene la carpeta app (es decir, el padre de APP_DIR). APP_DIR debe ser establecida con el nombre(base) de tu carpeta app. CAKE_CORE_INCLUDE_PATH debe contener la ruta al directorio que contiene las libreras de Cake. Vamos a mostrar un ejemplo para ver cmo quedara una instalacin avanzada en la prctica. Imagina que quiero configurar CakePHP para que funcione de esta manera: Las Libreras de CakePHP sern ubicadas en /usr/lib/cake. El webroot de mi aplicacin ser /var/www/misitio/. El directorio app de mi aplicacin estar en /home/yo/misitio. Dada esta configuracin, necesitar editar mi webroot/index.php (el cual terminar ubicado en /var/www/misitio/index.php, en este ejemplo) para que sea as: 1. // /app/webroot/index.php (codigo parcial, sin comentarios) 2. if (!defined('ROOT')) { 3. define('ROOT', DS.'home'.DS.'yo'); 4. } 5. if (!defined('APP_DIR')) { 6. define ('APP_DIR', 'misitio'); 7. } 8. if (!defined('CAKE_CORE_INCLUDE_PATH')) { 9. define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib'); 10.} Es recomendable utilizar la constante DS en lugar de barras inclinadas para delimitar las rutas de los

archivos. Esto evita errores por falta de archivo como resultado de usar el delimitador equivocado, y adems hace tu cdigo ms portable.
3.3.3.1 Rutas de Clase Adicionales

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Ocasionalmente es til compartir clases MVC entre aplicaciones en el mismo sistema. Si quieres el mismo controler en dos aplicaciones, puedes usar el archivo bootstrap.php de CakePHP para traer estas clases adicionales a la escena. En el archivo bootstrap.php, define algunas variables especiales para que CakePHP sepa otros lugares en donde buscar clases MVC: 1. $viewPaths = array(); 2. $controllerPaths = array(); 3. $modelPaths = array(); 4. $helperPaths = array(); 5. $componentPaths = array(); 6. $behaviorPaths = array(); 7. $pluginPaths = array(); 8. $vendorPaths = array(); 9. $localePaths = array(); 10.$shellPaths = array(); Cada una de estas variables especiales pude ser establecida a un array de rutas absolutas en el sistema de archivos donde las clases adicionales pueden ser encontradas cuando se solicite. Asegrate que cada ruta contenga una barra inclinada (o preferiblemente la constante DS) al final.
3.3.4 Apache y mod_rewrite (y .htaccess)

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones

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 (asegrate de estar editando el httpd.conf del sistema y que no es httpd.conf especfico de un usuario o del site). 1. Asegrate que la reescritura .htaccess est permitida y que AllowOverride est establecido a All para el DocumentRoot adecuado. Deberas ver algo similar a: 1. # 2. # Cada directorio al que tiene acceso Apache puede ser configurado en 3. # funcin de qu servicios y caractersticas estn permitidas y/o 4. # desactivadas en dicho directorio (y sus subdirectorios). 5. # 6. # Primero, configuramos "por defecto" para que sea un conjunto de 7. # caractersticas muy restrivo. 8. # 9. <Directory /> 10.Options FollowSymLinks 11.AllowOverride All 12.# Order deny,allow 13.# Deny from all 14.</Directory> 2. Asegrate de estar cargando el mdulo mod_rewrite correctamente. Debes ver algo como: 1. LoadModule rewrite_module libexec/apache2/mod_rewrite.so En muchos sistemas esto estar comentado (comenzando la lnea con #) por defecto, as que slo tendrs que quitar los smbolos # del principio. Tras realizar los cambios reinicia Apache para estar seguro de que las opciones de configuracin estn activas. Asegrate de que tus ficheros .htaccess estn 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. 3. Asegrate de que tu copia de CakePHP es de las seccin de descargas de nuestro site o nuestro repositorio GIT, y que ha sido desempaquetado correctamente verificando que existen los ficheros .htaccess: En el directorio raz de Cake (necesita ser copiado al directorio, esto redirige todo a tu aplicacin de Cake): 1. 2. 3. 4. 5. <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule>

En el directorio app de Cake (ser copiado por bake): 6. <IfModule mod_rewrite.c> 7. RewriteEngine on 8. RewriteRule ^$ webroot/ [L] 9. RewriteRule (.*) webroot/$1 [L] 10.</IfModule> En el directorio webroot de Cake (ser copiado a tu webroot de la aplicacin por bake): 11.<IfModule mod_rewrite.c> 12.RewriteEngine On 13.RewriteCond %{REQUEST_FILENAME} !-d 14.RewriteCond %{REQUEST_FILENAME} !-f 15.RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 16.</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 ests instalando CakePHP en un directorio de usuario (http://ejemplo.com/~nombreusuario/cakephp), o en cualquier otra estructura que ya utilice mod_rewrite necesitars aadir sentencias RewriteBase a los archivos .htaccess que utiliza CakePHP (/.htaccess, /app/.htaccess, /app/webroot/.htaccess) Esto puede ser aadido a la misma seccin con la directiva RewriteEngine, as, por ejmplo, tu archivo .htaccess en el webroot devera ser as: 17.<IfModule mod_rewrite.c> 18.RewriteEngine On 19.RewriteBase / 20.RewriteCond %{REQUEST_FILENAME} !-d 21.RewriteCond %{REQUEST_FILENAME} !-f 22.RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 23.</IfModule> Los detalles de esos cambios dependen de tu configuracin, y pueden incluir cosas adicionales que no estn relacionadas con Cake. Consulta la documentacin online de Apache para ms informacin.
3.3.5 Lighttpd y mod_magnet

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones

Aunque Lighttpd cuenta con un mdulo de reescritura, no es equivalente al mod_rewrite de Apache. Las funcinalidades completas de mod_rewrite se reparten entre el mod_rewrite de Lighttp, el mod_magnet y el mod_proxy. Sin embargo, CakePHP, mayoritariamente necesita mod_magnet para redirigir las solicitudes a fin de trabajar con bastantes URLs Para utilizar bastantes URLs con CakePHP y Lighttp, sustituye este lua script en /etc/lighttpd/cake. 1. -- pequea funcion helper 2. function file_exists(path) 3. local attr = lighty.stat(path) 4. if (attr) then 5. return true 6. else 7. return false 8. end 9. end 10.function removePrefix(str, prefix) 11.return str:sub(1,#prefix+1) == prefix.."/" and str:sub(#prefix+2) 12.end 13.-- prefijo sin la barra 14.local prefix = '' 15.-- la magia ;) 16.if (not file_exists(lighty.env["physical.path"])) then 17.-- fichero an desaparecido, pasarlo al fastcgi Backend 18.request_uri = removePrefix(lighty.env["uri.path"], prefix) 19.if request_uri then 20.lighty.env["uri.path"] = prefix .. "/index.php" 21.local uriquery = lighty.env["uri.query"] or "" 22.lighty.env["uri.query"] = uriquery .. (uriquery ~= "" and "&" or "") .. "url=" .. request_uri 23.lighty.env["physical.rel-path"] = lighty.env["uri.path"] 24.lighty.env["request.orig-uri"] = lighty.env["request.uri"] 25.lighty.env["physical.path"] = lighty.env["physical.docroot"] .. lighty.env["physical.rel-path"] 26.end 27.end 28.-- fallthrough pondr de nuevo la solucititud en el bucle lighty 29.-- eso significa que tenemos la manipulacin 304 de forma gratuita. ;) If you run your CakePHP installation from a subdirectory, you must set prefix = 'subdirectory_name' in the above script. Then tell Lighttpd about your vhost:
$HTTP["host"] =~ "example.com" { server.error-handler-404 = "/index.php"

magnet.attract-physical-path-to = ( "/etc/lighttpd/cake.lua" )

server.document-root = "/var/www/cake-1.2/app/webroot/" # adems piensa como coger los ficheros vim tmp fuera url.access-deny = ( "~", ".inc", ".sh", "sql", ".sql", ".tpl.php", ".xtmpl", "Entries", "Repository", "Root", ".ctp", "empty" ) }

3.3.6 Pretty URLs en nginx

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones nginx es un servidor popular que, del mismo modo que Lighttpd, consume menos recursos del sistema. Su inconveniente es que no utiliza ficheros .htaccess como Apache y Lighttpd, por lo que es necesario crear esas reescrituras de URLs en la configuracin de site-available. Dependiendo de tu configuracin, necesitars modificar esto, pero como mnimo necesitars que PHP se ejecute como instancia de FastCGI. 1. server { 2. listen 80; 3. server_name www.ejemplo.com; 4. rewrite ^(.*) http://ejemplo.com$1 permanent; 5. } 6. server { 7. listen 80; 8. server_name ejemplo.com; 9. access_log /var/www/ejemplo.com/log/access.log; 10.error_log /var/www/ejemplo.com/log/error.log; 11.location / { 12.root /var/www/ejemplo.com/public/app/webroot/; 13.index index.php index.html index.htm; 14.if (-f $request_filename) { 15.break; 16.} 17.if (-d $request_filename) { 18.break; 19.} 20.rewrite ^(.+)$ /index.php?q=$1 last;

21.} 22.location ~ .*\.php[345]?$ { 23.include /etc/nginx/fcgi.conf; 24.fastcgi_pass 127.0.0.1:10005; 25.fastcgi_index index.php; 26.fastcgi_param SCRIPT_FILENAME /var/www/ejemplo.com/public/app/webroot$fastcgi_script_name; 27.} 28.}
3.3.7 URL Rewrites on IIS7 (Windows hosts)

Editar Ver slo esta seccin Historia Comparar con el contenido original

IIS7 no tiene soporte nativo para archivos .htaccess. Aunque hay agregados que proporcionan ese soporte, tambin pueden importarse las reglas htacess en IIS para usar las reescritura nativa de CakePHP. Para hacer esto, siga los siguientes pasos: 1. Use el Instalador de Plataforma Web de Microsoft para instalar el Mdulo URL Rewrite 2.0. 2. Crear un nuevo archivo en el folder de CakePHP llamado web.config 3. Usando Notepad u otro editor XML-seguro, copiar el siguiente cdigo en el archivo web.config recin creado. <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Redirect static resources" stopProcessing="true"> <match url="^(ico|img|css|files|js)(.*)$" /> <action type="Rewrite" url="app/webroot/{R:1}{R:2}" appendQueryString="false" /> 9. </rule> 10.<rule name="Imported Rule 1" stopProcessing="true"> 11.<match url="^(.*)$" ignoreCase="false" /> 12.<conditions logicalGrouping="MatchAll"> 13.<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 14.<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 15.</conditions> 16.<action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" /> 17.</rule> 18.<rule name="Imported Rule 2" stopProcessing="true"> 19.<match url="^$" ignoreCase="false" /> 20.<action type="Rewrite" url="/" /> 1. 2. 3. 4. 5. 6. 7. 8.

21.</rule> 22.<rule name="Imported Rule 3" stopProcessing="true"> 23.<match url="(.*)" ignoreCase="false" /> 24.<action type="Rewrite" url="/{R:1}" /> 25.</rule> 26.<rule name="Imported Rule 4" stopProcessing="true"> 27.<match url="^(.*)$" ignoreCase="false" /> 28.<conditions logicalGrouping="MatchAll"> 29.<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 30.<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 31.</conditions> 32.<action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" /> 33.</rule> 34.</rules> 35.</rewrite> 36.</system.webServer> 37.</configuration> Tambin es posible usar la funcionalidad Import en el mdulo URL Rewrite de IIS para importar reglas directamente del archivo .htaccess de CakePHP's en root, /app/, and /app/webroot/ - aunque puede ser necesaria alguna edicin para lograr que funcionen. Cuando se importan las reglas de esta manera, IIS automticamente crear el archivo web.config para nosotros. Una vez que se cree el archivo web.config con las reglas de reescritura aceptadas por IIS, los vnculos, css, js y redireccionamiento en CakePHP deben funcionar correctamente.
3.3.8 Encindelo

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Muy bien, ahora veamos a CakePHP en accin. Dependiendo de la configuracin que hayas usado, deberas 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 omisin, y un mensaje que indica el estado de conexin con la base de datos. Felicidades! Ya ests listo para crear tu primera aplicacin CakePHP

3.4 Configuracin Editar Ver slo esta seccin Historia Comparar con el contenido original

Configurar aplicaciones CakePHP es pan comido. Despues de instalar CakePHP, crear una aplicacin web bsica solo requiere aplicar la configuracin 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. Tu puedes agregar facilmente elementos al ncleo de CakePHP, configurar URL personalizadas y definir inflexiones.
3.4.1 Configuracin de Base de Datos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones CakePHP espera que los detalles de configuracin de la base de datos estn en app/config/database.php. Un ejemplo de configuracin puede encontrarse en el archivo app/config/database.php.default. Esta configuracin debera verse como sigue: 1. 2. 3. 4. 5. 6. 7. var $default = array('driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'cakephpuser', 'password' => 'c4k3roxx!', 'database' => 'mi_proyecto', 'prefix' => '');

El arreglo de configuracin $default es el utilizado a menos que se especifique algn otro en la propiedad $usDbConfig de los modelos. Por ejemplo, si mi aplicacin tiene aplicaciones legadas adicionales a la que se va a utilizar por defecto, podra utilizarla en mis modelos creando un nuevo arreglo de configuracin $legada que sea similar a $default, y asignado var $useDbConfig = 'legada'; en los modelos correspondientes. Rellena cada para clave/valor en el arreglo de configuracin, como mejor se ajuste a tus necesidades Clave driver persistent host Valor El nombre del controlador de base de datos que se desea utilizar. Ejemplo: mysql, postgres, sqlite, pear-nombrededriver, adodb-nombrededriver, mssql, oracle, odbc. Si se debe usar o no una conexin persistente a la base de datos. El nombre de servidor de la base de datos (o direccin IP).

login El nombre de usuario para la cuenta. password La contrasea para la cuenta. database Nombre de la base de datos a usar para la conexin prefix El texto que prefija cada nombre de tabla en la base de datos. til si se comparte la base (opcional) de datos con varias aplicaciones. Dejar vaco si no se desea ninguno. port El puerto TCP o socket Unix a usarse para la conexin con el servidor de base de datos. (opcional) encoding Indica la codificacin de caracteres a usar para enviar las sentencias SQL al servidor. schema Usado en la configuracin de PostgreSQL para especificar el esquema a utilizar. 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_. A este punto, pudieras querer echar un vistazo a las Convenciones de CakePHP, enunciadas en el apndice de este manual. Nombrar correctamente tus tablas (y algunas columnas) segn las convenciones puede librarte de mucho trabajo de configuracin. Por ejemplo, si nombras una tabla como tortas, el modelo Torta y el controller TortasController, todo funcionar automticamente si necesidad de tu intervencin. Por convencin, utiliza guiones bajos, minsculas, y nombres en plural para los nombres de tus tablas - por ejemplo: reposteros, reposterias, sabores.
3.4.2 Configuracin del Core

Editar Ver slo esta seccin Historia Comparar con el contenido original

La configuracin de la aplicacin en CakePHP se encuentra en /app/config/core.php. Este archivo es una coleccin de definiciones de variables Configure y definiciones de constantes que determinan como ha de comportarse la aplicacin. Antes de sumergirse en cada una de estas directivas, necesitars familiarizarte con Configure, la clase de registro de configuraciones de CakePHP
3.4.3 La Clase de Configuracin

Editar Ver slo esta seccin Historia Comparar con el contenido original

A pesar de que muy pocas cosas necesitan configuracin en CakePHP, a veces es til tener tus propias reglas de configuracin para tu aplicacin. En el pasado seguramente habras definido alguno de estos valores creando constantes en varios archivos. Hacerlo de esa manera te obligara a incluir estos archivos cada vez que desees utilizarlos La nueva clase Configure de CakePHP puede ser utilizada para guardar y recuperar valores especficos de la aplicacin o de tiempo de ejecucin. Se cuidadoso, esta clase permite almacenar cualquier cosa en ella, para luego usarla en cualquier lugar de tu cdigo: una tentacin segura para romper el patrn MVC con el cual fue diseado CakePHP. El objetivo principal de la clase Configure es mantener centralizadas las variables que pueden ser compartidas entre varios objetos. Recuerda tratar de mantener la filosofa de "convencin sobre configuracin" y as no terminars rompiendo la estructura

MVC que se ha diseado Esta clase acta como un singletn, y sus mtodos pueden ser llamados desde cualquier lugar en tu aplicacin, en un contexto esttico 1. <?php Configure::read('debug'); ?>
3.4.3.1 Mtodos de la Clase Configure

Editar Ver slo esta seccin Historia Comparar con el contenido original

3.4.3.1.1 write

Editar Ver slo esta seccin Historia Comparar con el contenido original

1. write(string $clave, mixed $valor) Utiliza write() para almacenar datos en la configuracin de la aplicacin 1. Configure::write('Empresa.nombre','Pizza, Inc.'); 2. Configure::write('Empresa.lema','Pizza para tu cuerpo y alma'); Nota el uso de la notacin punto en el parmetro $clave. Puedes utilizar esta notacin para organizar tus configuraciones dentro de grupos lgicos El ejemplo anterior pudo ser escrito en una sola llamada: 1. Configure::write( 2. 'Empresa',array('nombre'=>'Pizza, Inc.','lema'=>'Pizza para tu cuerpo y alma') 3. ); Puedes utilizar Configure::write(debug, $int) para cambiar entre desarrollo y produccin dentro de la ejecucin de tu programa. Esto es especialmente til para interacciones AMF o SOAP donde la informacin de depuracin puede ocasionar problema de parseo.
3.4.3.1.2 read

Editar Ver slo esta seccin Historia Comparar con el contenido original

read(string $clave = 'debug') Se usa para leer datos de configuracin de la aplicacin. Por defecto devuelve el importante valor de "debug" (nivel de depuracin). Si se especifica una clave, los datos correspondientes son devueltos. Usando nuestros anteriores ejemplos de write(), podemos leer esos datos de vuelta: 1. Configure::read('Empresa.nombre'); //devuelve: 'Pizza, Inc.'

2. Configure::read('Empresa.lema'); //devuelve: 'Pizza para tu cuerpo y alma' 3. Configure::read('Empresa'); 4. //devuelve: 5. array('nombre' => 'Pizza, Inc.', 'lema' => 'Pizza para tu cuerpo y alma');
3.4.3.1.3 delete

Editar Ver slo esta seccin Historia Comparar con el contenido original

delete(string $clave) Se usa para borrar informacin de configuracin de la aplicacin. 1. Configure::delete('Empresa.nombre');


3.4.3.1.4 load

Editar Ver slo esta seccin Historia Comparar con el contenido original

1. load(string $path) Usa este mtodo para cargar informacin de configuracin desde una archivo especfico. 1. // /app/config/mensajes.php: 2. <?php 3. $config['Empresa']['nombre'] = 'Pizza, Inc.'; 4. $config['Empresa']['lema'] = 'Pizza para tu cuerpo y alma'; 5. $config['Empresa']['telefono'] = '555-55-55'; 6. ?> 7. <?php 8. Configure::load('mensajes'); 9. Configure::read('Empresa.nombre'); 10.?> Cada clave-valor de la configuracin est representado en el archivo con la variable $config. Cualquier otra variable que aparezca en el archivo ser ignorada por la funcin load().
3.4.3.1.5 version

Editar Ver slo esta seccin Historia Comparar con el contenido original

version()

Devuelve la versin de CakePHP de la aplicacin actual.


3.4.3.2 Variables de Configuracin Principales de CakePHP

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La clase Configure se usa para manejar un conjunto de variables de configuracin de CakePHP. Estas variables pueden ser encontradas en app/config/core.php. Abajo se encuentra una descripcin de cada variable y cmo afecta tu aplicacin CakePHP Variable de Configuracin Descripcin Cambia el nivel de depuracin de cake debug 0 = Modo producin. No produce ninguna salida. 1 = Muestra los error y warnings. 2 = Muestra los error, warnings, y consultas SQL 3 = Muestra los error, warnings, consultas SQL, y volcado completo del Controller. Descomenta esta definicin si no deseas utilizar el mod_rewrite de Apache. No te olvides de eliminar los archivos .htaccess tambin. Descomenta esta definicin si deseas utilizar las rutas admin de CakePHP. Asigna la variable al nombre de la ruta que te gustara utilizar. Ms adelante se explicar en detalle. Cuando se asigna true, el cache se deshabilita para toda la aplicacin. Si se asigna true, habilita el cache de las vistas. Tambin es necesario activar el cache en los controllers, pero esta variable habilita la deteccin de dichas configuraciones. Le indica a CakePHP qu mecanismo de almacenamiento de sesiones se debe utilizar php = Utiliza el almacenamiento por defecto de php cake = Guarda los datos de sesin en /app/tmp database = Guarda los datos en una tabla de la base de datos. Asegrate de cargar el archivo SQL ubicado en /app/config/sql/sessions.sql. El nombre de la tabla (sin incluir el prefijo) que guarda los datos de la sesin. El nombre de la base de datos que guarda los datos de sesin. El nombre del cookie utilizado para hacer seguimiento de las sesiones.

App.baseUrl Routing.admin Cache.disable Cache.check

Session.save

Session.table Session.database Session.cookie

Session.timeout Session.start Session.checkAgent

El tiempo base de validez de la sesin en segundos. El valor real depende de la variable Security.level Inicia automticamente la sesin cuando se asigna true. Cuando se asigna false, Las sesiones de CakePHP no se asegurarn de que el "user agent" del usuario no cambie entre peticiones. El nivel de seguridad de CakePHP. El tiempo de validez de la sesin definido en 'Session.timeout' se multiplica de acuerdo a lo siguiente.

Valores vlidos: 'high' = x 10 'medium' = x 100 'low' = x 300 Security.salt Una palabra aleatoria usada en sumas de seguridad. Acl.classname, Variables usadas para las Listas de Control de Acceso de CakePHP. Lee el Acl.database captulo de listas de control de acceso para ms informacin. Nota: La configuracin de Cache tambin puede ser encontrada en el archivo core.php Ms adelante cubriremos este tema. La clase Configure puede ser utilizada para leer y escribir valores durante la ejecucin del programa. Esto puede ser especialmente til si desea deshabilitar el nivel de deburacion ("debug") para una seccin limita de lgica en tu aplicacin, por ejemplo
3.4.3.3 Constantes de Configuracin

Security.level

Editar Ver slo esta seccin Historia Comparar con el contenido original

A pesar de que la mayora de las opciones de configuracin se manejan con la clase Configure, existen unas pocas constantes que utiliza CakePHP durante su ejecucin. Constante Descripcin LOG_ERRO Constante de error. Usada para diferenciar entre registros de depuracin y registros de R error. Actualmente PHP solo soporta LOG_DEBUG.
3.4.4 La Clase App

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Cargar clases adicionales se ha vuelto mucho ms sencillo con CakePHP. En versiones anteriores

existan funciones diferentes para cargar una clase dependiendo de su tipo. Estas funciones han sido reemplazadas, ahora toda la carga de clases debera hacerse a travs de el mtodo App::import(). ste mtodo te asegura que una clase ha sido cargada slo una vez, que las clases que extiende se hayan cargado apropiadamente, y resuelve las rutas de ubicacin automticamente en la gran mayora de los casos
3.4.4.1 Usando App::import()

Editar Ver slo esta seccin Historia Comparar con el contenido original

1. App::import($type, $name, $parent, $search, $file, $return); A primera vista App::import parece complejo, sin embargo, en la mayora de los casos es suficiente con tan slo dos parmetros.
3.4.4.2 Importando libreras del Core

Editar Ver slo esta seccin Historia Comparar con el contenido original

Las libreras del Core, como Sanitize y Xml pueden ser cargadas mediante: 1. App::import('Core', 'Sanitize'); Lo anterior har que la clase Sanitize est disponible para su uso.
3.4.4.3 Importando Controladores, Modelos, Ayudantes, Comportamientos y Componentes

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Todas las clases relacionadas con la aplicacin pueden ser importadas con App::import(). Los siguientes ejemplos muestran cmo hacerlo:
3.4.4.3.1 Cargando Controladores

Editar Ver slo esta seccin Historia Comparar con el contenido original

App::import('Controller', 'MyController'); Llamando a App::import es equivalente a require. Es importante darse cuenta que la clase posteriormente necesita ser inicializada. <?php // Lo mismo que require('controllers/users_controller.php'); App::import('Controller', 'Users'); // Necesitamos cargar la clase $Users = new UsersController; // If we want the model associations, components, etc to be loaded 7. $Users->constructClasses(); 8. ?> 1. 2. 3. 4. 5. 6.
3.4.4.3.2 Cargando Modelos

Editar Ver slo esta seccin Historia Comparar con el contenido original

App::import('Model', 'MyModel');
3.4.4.3.3 Cargando Componentes [Components]

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones App::import('Component', 'Auth');
3.4.4.3.4 Cargando Comportamientos [Behaviors]

Editar Ver slo esta seccin Historia Comparar con el contenido original

App::import('Behavior', 'Tree');
3.4.4.3.5 Cargando Ayudantes[Helpers]

Editar Ver slo esta seccin

Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones App::import('Helper', 'Html');
3.4.4.3.6 Cargando Ayudantes[Helpers]

Editar Ver slo esta seccin Historia Comparar con el contenido original

App::import('Helper', 'Html');
3.4.4.4 Cargando desde Plugins

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Cargar clases en plugins funciona casi igual que cargar clases ubicadas en el Core o en la aplicacin principal, a excepcin de que debe especificarse el nombre del plugin donde reside la clase a cargar. 1. App::import('Modelo', 'NombrePlugin.Comentario');
3.4.4.5 Cargando Archivos de Terceros

Editar Ver slo esta seccin Historia Comparar con el contenido original

La funcin vendor() ha sido reemplazada. Los archivos de terceros deben ser cargados tambin mediante App::import(). La sintaxis y los argumentos adicionales son levemente diferentes, debido a que los archivos de terceros y su estructura pueden variar inmensamente, y no todos los archivos de terceros contienen clases. Los siguientes ejemplos ilustran cmo cargar archivos de terceros en diferentes rutas y estructuras. Los archivos de terceros deben estar ubicados en cualquiera de los directorios vendor.

3.4.4.5.1 Ejemplos de archivos de terceros

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para cargar vendors/geshi.php 1. App::import('Vendor', 'geshi'); Para cargar vendors/flickr/flickr.php 1. App::import('Vendor', 'flickr/flickr'); Para cargar vendors/cierto.nombre.php 1. App::import('Vendor', 'CiertoNombre', array('file' => 'cierto.nombre.php')); Para cargar vendors/services/well.named.php 1. App::import('Vendor', 'WellNamed', array('file' => 'services'.DS.'well.named.php'));
3.4.5 Configuracin de Rutas

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El enrutamanieto permite hacer una relacin entre URLs y acciones de los controller. Fue aadido a CakePHP para hacer ms bonitos los URLs, ms configurables, y ms flexibles. Usar el mod_rewrite de Apache no es un requisito para utilizar el enrutamiento, pero har lucir mucho mejor tu barra de direcciones. Las rutas en CakePHP 1.2 han sido mejoradas y pueden llegar a ser muy poderosas.

Enrutamiento por Defecto


Antes de que aprendas a configurar tus propias rutas, deberas saber que CakePHP viene configurado

con un conjunto de rutas por defecto. Estas rutas te llevarn bastante lejos en cualquier aplicacin. Puedes acceder a una accin directamente desde el URL colocando su nombre en la peticin. Tambin puedes pasar parmetros a las acciones de tus controladores usando el URL. 1. Patron URL de las rutas por defecto: 2. http://example.com/controlador/accion/param1/param2/param3 El URL /articulos/ver dirige a la accinver() action del ArticulosController, y /productos/listaCompleta dirige a la accion to the lista_completa() de ProductosController. Si no se especifica ninguna accin en el URL, se asume que se trata de la accin index(). La configuracin inicial de enrutamiento permite pasar parmetros a tus acciones usando el URL. Una peticin para /articulos/ver/25 sera equivalente a llamar ver(25) en el ArticulosController, por ejemplo.

Parmetros con Nombre


Algo novedoso en CakePHP 1.2 es la habilidad de usar parmetros con nombre (named parameters). Puedes nombrar parmetros y enviar sus valores usando el URL. Una peticin para /articulos/ver/titulo:primer+articulo/categoria:general resultara en una llmada a la accion view() de ArticulosController. En dicha accin, puedes encontrar los valores del ttulo y la categora dentro de $this->passedArgs['titulo'] and $this->passedArgs['categoria'] respectivamente. Algunos ejemplos que resuman las rutas por defecto puede resultar til. 1. URL: /monos/saltar 2. Dirige a: MonosController->saltar(); 3. URL: /productos 4. Dirige a: ProductosController->index(); 5. URL: /tareas/ver/45 6. Dirige a: TareasController->ver(45); 7. URL: /donaciones/ver/recientes/2001 8. Dirige a: DonacionesController->ver('recientes', '2001'); 9. URL: /contenidos/ver/capitulo:modelos/seccion:asociaciones 10.Dirige a: ContenidosController->ver(); 11.$this->passedArgs['capitulo'] = 'modelos'; 12.$this->passedArgs['seccion'] = 'asociaciones'; Definir Rutas Definir tus propias rutas te permite definir cmo va a responder tu aplicacin cuando se solicite un URL determinado. Tus rutas deben ser definidas en el archivo /app/config/routes.php usando el mtodo Router::connect(). El mtodo connect() toma hasta tres parmetros: el patron de URL que deseas hacer coindicir, los valores por defecto para los elementos de enrutamient propios, y expresiones regulares que ayuden al enrutador a hacer coincidir elementos en el URL. El formto bsico para una definicin de ruta es: 1. 2. 3. 4. Router::connect( 'URL', array('nombreParam' => 'valorPorDefecto'), array('nombreParam' => 'expresionRegular')

5. ) El primer parmetro es usado para decirle al enrutador qu tipo de URL ests tratando de controlar. El URL es una cadena de caracteres separadas por barras inclinadas (slash), pero tambin pueden contener el un comodn comodn (*) o elementos de enrutamiento propios (Elementos de URL prefijados con el caracter dos puntos ":"). Usar un comodn le indica al enrutador qu tipos de URL quieres hacer coincidir, y especificar elementos de enrutamiento te permite recolectar parmetros para las acciones de tus controladores Una vez que hayas especificado un URL, debes utilizar los ltimos dos parmetros del mtodo connect() para decirle a CakePHP que hacer con esa peticin una vez que ha sido seleccionada la regla adecuada. El segundo parmetro es una arreglo asociativo. Las claves de este arreglo deben ser nombradas como los elementos de enrutamiento en el URL, o los elementos por defecto, que son, :controller, :action y :plugin. Los valores en este arreglo son los valores por omisin para cada una de las claves. Veamos algunos ehjemplos bsicos antes de empezar a usar el tercer parmetro de connect() 1. 2. 3. 4. Router::connect( '/pages/*', array('controller' => 'pages', 'action' => 'display') );

Esta ruta se encuentra en el archivo routes.php distribuido con CakePHP (linea 40). Esta ruta coincide con los URL que comienzan con /pages/ y delega a la accin display() de PagesController el manejo de la peticin. La peticin /pages/productos puede sera dirigida a PagesController->display('productos'), por ejemplo. 1. 2. 3. 4. Router::connect( '/mujeres', array('controller' => 'productos', 'action' => 'mostrar', 5) );

Este segundo ejemplo muestra como usar el segundo parmetro de connect() para definir parmetros por omisin. Si construiste un sitio que muestra productos para diferentes categoras de clientes, puedes considerar el hacer una ruta. Esto te ayuda a crear el enlace /mujeres en lugar de /productos/mostrar/5 Para tener flexibilidad adicional, puedes especificar elementos de enrutamiento propios. Hacer esto te da el poder de definir lugares en el URL donde los parmentros para las acciones deben residir. Cuando se hace una peticin, los valores para estos elementos propios se encuentran en $this-gt;params del controlador. Estos son diferentres de los parametros con nombre, y esta es la diferencia: los parmmetros con nombre (/controlador/accion/nombre:valor) se encuentran en $this->passedArgs, mientras que los elementos propios de enrutamiento se encuentran en $this->params. Cuando defines un elemento propio de enrutamiento, tambin necesitas especificar una expresin regular. Esto le indica a CakePHP cmo reconocer si el URL est bien formado o no. 1. 2. 3. 4. 5. Router::connect( '/:controller/:id', array('action' => 'ver'), array('id' => '[0-9]+') );

Este ejemplo sencillo muestra cmo crear una manera sencilla de ver registros desde cualquier controlador accediendo a un URL que luce como /mincontrolador/id. El URL suministrado a connect() especifica dos elementos de enrutamiento, :controller e :id, El primer elemento es uno que viene por defecto con CakePHP, as que el enrutador sabe cmo reconocer nombres de controladores en el URL.

El elemento :id es propio, y debe ser clarificado especificando una expresin regular en el tercer parmetro de conenct(). Esto le dice a CakePHP cmo reconocer el ID en el URL en contraposicin a cualquier otra cosa que est all, como el nombre de una accin. Una vez que hayas definido esta ruta, solicitar /manzanas/5, sera lo mismo que solicitar /manzanas/ver/5. Ambos harn una llamada al mtodo ver() de ManzanasController. Dentro del mtodo ver(), podras acceder al id en $this->params['id']. unejemplo ms y sers un profesional del enrutador. 1. 2. 3. 4. 5. 6. 7. 8. 9. Router::connect( '/:controller/:year/:month/:day', array('action' => 'listar', 'day' => null), array( 'year' => '[12][0-9]{3}', 'month' => '(0[1-9]|1[012])', 'day' => '(0[1-9]|[12][0-9]|3[01])' ) );

Puede parecer un poco enredado, pero muestra lo poderosas que pueden ser las rutas. El URL suministrado tiene cuatro elemento. El primero ya debe resultarte familiar: el elemento que le dice a CakePHP que se trata de un nombre de controlador. A continuacin, vamos a especificar algunos valores por defecto. Sin importar el controlador, queremos que la accin listar() sea llamada. Asignamos el parmetro day (da, que es el cuarto elemento en el URL) a null, para marcarlo como opcional. Finalmente especificamos algunas expresiones regulares que coindidiran con aos, meses y das en su forma numrica. Una vez definda, esta ruta coindcidir con /articulos/2007/02/01, /escritos/2004/11/16 y /productos/2001/05 (recuerdas que el parametro day era opcional?), enviando la peticin a listar() de sus respectivos controladores, con los parmetros de fecha definidos en $this->params. Pasando parmetros a la accin Asumiendo que tu accin fue definida como se muestra a continuacin, y que desea acceder a los argumentos usando $articuloID en lugar de $this->params['id'], simplemente agrega el tercer parmetro de Router::connect(). 1. // some_controller.php 2. function ver($articuloID = null, $slug = null) { 3. // mi codigo aqui... 4. } 5. // routes.php 6. Router::connect( 7. // E.g. /blog/3-CakePHP_Rocks 8. '/blog/:id-:slug', 9. array('controller' => 'blog', 'action' => 'ver'), 10.array( 11.// el orden importa, puesto que esto enviar ":id" como el parmetro $articuloID de tu accin.

12.'pass' => array('id', 'slug'), 13.'id' => '[0-9]+' 14.) 15.) Y ahora, gracias a las capacidades de enrutamiento inverso, puedes usar el arreglo de url que se muestra a continuacin y Cake sabr cmo formar el URL tal como fue definido en las rutas. 1. 2. 3. 4. 5. 6. 7. 8. // ver.ctp // Esto va a devolver un lik a /blog/3-CakePHP_Rocks <?php echo $html->link('CakePHP Rocks', array( 'controller' => 'blog', 'action' => 'view', 'id' => 3, 'slug' => Inflector::slug('CakePHP Rocks') )) ?>

Rutas con prefijos Muchas cplicaciones requieren una zona administrativa donde los usuarios privilegiados puedan hacer cambios. Estos es comunment hecho a travs de un URL especial como /admin/usuarios/editar/5. En CakePHP, las rutas admin pueden ser habilitadas en el archivo core.php asignando la ruta para Routing.admin. 1. Configure::write('Routing.admin', 'admin'); En tu controlador, cualquier accin que empiece por admin_ ser llamada. Usando nuestro ejemplo de usuarios, el nombre de la accin de nuestro UsuariosController debe ser admin_editar Puedes usar el enrutador para usar prefijos propios para usos ms all de la administrain 1. Router::connect('/perfiles/:controller/:action', array('prefix' => 'perfiles')); Cualquier llamada a la seccin de perfiles buscar el prefijo perfiles_ en las llamadas a mtodos. Nuestro ejemplo de usuarios tendra una estructura de URL que lucira como /perfiles/usuarios/editar/5, lo cual invocara el mtodo perfiles_editar del UsuariosController. tambin es importante reordar que usar el Ayudante HTML para construir tus enlaces te ayudar a mantener los prefijos. Este es un ejemplo de un enlace usando el ayudante HTML 1. echo $html->link('Editat tu perfil', array('controller' => 'usuarios', 'action' => 'perfiles_editar')); Puedes utilizar mltiples prefijos de ruta para crar una muy flexible estructura de URL para tu aplicacin
3.4.5.1 Enrutamiento por defecto

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este

differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Antes de que leas como configurar tus rutas, deberas saber que CakePHP incluye algunas por defecto. El enrutamiento en CakePHP te ofrece mucho ms que cualquier otra aplicacin. Puedes acceder directamente a cualquier accin ponindola solo en la URL. Puedes enviar tambin variables a la accin a travs de la URL.
Patrones de enrutamiento por defecto: http://example.com/controller/action/param1/param2/param3

La URL /posts/view enruta hacia la accion view() del controlador PostsController y /products/viewClearance enruta hacia la accion view_clearance() del controlador ProductsController. Si la accin no esta definida en la URL, el mtodo index() es asumido por defecto. El enrutamiento por defecto te permite enviar parmetros a la accin a travs de la URL. Una peticin hacia /posts/view/25 sera equivalente a llamar a la accin view(25) en el controlador PostsController.
3.4.5.2 Passed arguments

Editar Ver slo esta seccin Historia Comparar con el contenido original

Los argumentos pasados son argumentos adicionales o segmentos de rutas que se usan al hacer una solicitud. Generalmente se usan para pasar parmetros a los mtodos de los controladores.
http://localhost/calendars/view/recent/mark

En el ejemplo anterior, recent y mark son argumentos que se pasan a CalendarsController::view(). Los argumentos pasados se dan a los controladores de tres formas. Primero, como argumentos al mtodo de accin llamado, segundo estan disponibles en $this->params['pass'] como una matriz indexada numericamente. Por ltimo, existe $this>passedArgs disponible de la misma manera que la segunda forma. Al utilizar rutas personalizadas pueden pasarse ciertos parmetros junto con los argumentos pasados. Ver 'Pasando Argumentos a una accin' para ms informacin. Argumentos del mtodo de accin llamado 1. 2. 3. 4. 5. 6. 7. CalendarsController extends AppController{ function view($arg1, $arg2){ debug($arg1); debug($arg2); debug(func_get_args()); } }

Aqui tendremos:
recent

mark Array ( [0] => recent [1] => mark )

$this->params['pass'] como matriz indexada numericamente 1. debug($this->params['pass']) Aqui tendremos:


Array ( [0] => recent [1] => mark )

$this->passedArgs como matriz indexada numericamente 1. debug($this->passedArgs)


Array ( [0] => recent [1] => mark )

$this->passedArgs tambin puede contener parmentros Nombrados como una matriz mixta con los argumentos pasados.
3.4.5.3 Parmetros con nombre

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Una nueva caracterstica en CakePHP 1.2 es la posibilidad de setear nombres de parmetros y su valor por la URL. Una peticin a /posts/view/title:first+post/category:general resultara en una llamada a la accin view() del controlador PostsController. En esta accin, podrs encontrar los valores para title y category dentro de $this->passedArgs['title'] y $this->passedArgs['category'] respectivamente. Algunos ejemplos que pueden ser de utilidad.
Acceder a la accin jump() del controlador MonkeysController desde la URL: URL: /monkeys/jump

Enrutado: MonkeysController->jump(); URL: /products Enrutado: ProductsController->index(); URL: /tasks/view/45 Enrutado: TasksController->view(45); URL: /donations/view/recent/2001 Enrutado: DonationsController->view('recent', '2001'); URL: /contents/view/chapter:models/section:associations Enrutado: ContentsController->view(); $this->passedArgs['chapter'] = 'models'; $this->passedArgs['section'] = 'associations';

3.4.5.4 Defining Routes

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Defining your own routes allows you to define how your application will respond to a given URL. Define your own routes in the /app/config/routes.php file using the Router::connect() method. The connect() method takes up to three parameters: the URL you wish to match, the default values for your route elements, and regular expression rules to help the router match elements in the URL. The basic format for a route definition is: 1. 2. 3. 4. 5. Router::connect( 'URL', array('paramName' => 'defaultValue'), array('paramName' => 'matchingRegex') )

The first parameter is used to tell the router what sort of URL you're trying to control. The URL is a normal slash delimited string, but can also contain a wildcard (*) or route elements (variable names prefixed with a colon). Using a wildcard tells the router what sorts of URLs you want to match, and specifying route elements allows you to gather parameters for your controller actions. Once you've specified a URL, you use the last two parameters of connect() to tell CakePHP what to do with a request once it has been matched. The second parameter is an associative array. The keys of the array should be named after the route elements in the URL, or the default elements: :controller, :action, and :plugin. The values in the array are the default values for those keys. Let's look at some basic examples before we start using the third parameter of connect(). 1. 2. 3. 4. Router::connect( '/pages/*', array('controller' => 'pages', 'action' => 'display') );

This route is found in the routes.php file distributed with CakePHP (line 40). This route matches any URL starting with /pages/ and hands it to the display() method of the PagesController(); The request /pages/products would be mapped to PagesController->display('products'), for example. 1. 2. 3. 4. Router::connect( '/government', array('controller' => 'products', 'action' => 'display', 5) );

This second example shows how you can use the second parameter of connect() to define default parameters. If you built a site that features products for different categories of customers, you might consider creating a route. This allows you link to /government rather than /products/display/5. Another common use for the Router is to define an "alias" for a controller. Let's say that instead of accessing our regular URL at /users/someAction/5, we'd like to be able to access it by /cooks/someAction/5. The following route easily takes care of that: 1. Router::connect( 2. '/cooks/:action/*', array('controller' => 'users', 'action' => 'index') 3. ); This is telling the Router that any url beginning with /cooks/ should be sent to the users controller. When generating urls, routes are used too. Using array('controller' => 'users', 'action' => 'someAction', 5) as a url will output /cooks/someAction/5 if the above route is the first match found If you are planning to use custom named arguments with your route, you have to make the router aware of it using the Router::connectNamed function. So if you want the above route to match urls like /cooks/someAction/type:chef we do: 1. Router::connectNamed(array('type')); 2. Router::connect( 3. '/cooks/:action/*', array('controller' => 'users', 'action' => 'index') 4. ); You can specify your own route elements, doing so gives you the power to define places in the URL where parameters for controller actions should lie. When a request is made, the values for these route elements are found in $this->params of the controller. This is different than named parameters are handled, so note the difference: named parameters (/controller/action/name:value) are found in $this>passedArgs, whereas custom route element data is found in $this->params. When you define a custom route element, you also need to specify a regular expression - this tells CakePHP how to know if the URL is correctly formed or not. 1. 2. 3. 4. 5. Router::connect( '/:controller/:id', array('action' => 'view'), array('id' => '[0-9]+') );

This simple example illustrates how to create a quick way to view models from any controller by crafting a URL that looks like /controllername/id. The URL provided to connect() specifies two route elements: :controller and :id. The :controller element is a CakePHP default route element, so the router knows how to match and identify controller names in URLs. The :id element is a custom route element, and must be further clarified by specifying a matching regular expression in the third parameter of connect(). This tells CakePHP how to recognize the ID in the URL as opposed to something else, such as an action name. Once this route has been defined, requesting /apples/5 is the same as requesting /apples/view/5. Both would call the view() method of the ApplesController. Inside the view() method, you would need to access the passed ID at $this->params['id']. If you have a single controller in your application and you want that controller name does not appear in url, e.g have urls like /demo instead of /home/demo: 1. Router::connect('/:action', array('controller' => 'home')); One more example, and you'll be a routing pro. 1. 2. 3. 4. 5. 6. 7. 8. 9. Router::connect( '/:controller/:year/:month/:day', array('action' => 'index', 'day' => null), array( 'year' => '[12][0-9]{3}', 'month' => '0[1-9]|1[012]', 'day' => '0[1-9]|[12][0-9]|3[01]' ) );

This is rather involved, but shows how powerful routes can really become. The URL supplied has four route elements. The first is familiar to us: it's a default route element that tells CakePHP to expect a controller name. Next, we specify some default values. Regardless of the controller, we want the index() action to be called. We set the day parameter (the fourth element in the URL) to null to flag it as being optional. Finally, we specify some regular expressions that will match years, months and days in numerical form. Note that parenthesis (grouping) are not supported in the regular expressions. You can still specify alternates, as above, but not grouped with parenthesis. Once defined, this route will match /articles/2007/02/01, /posts/2004/11/16, and /products/2001/05 (as defined, the day parameter is optional as it has a default), handing the requests to the index() actions of their respective controllers, with the date parameters in $this->params.
3.4.5.5 Pasando parmetros a las acciones

Editar Ver slo esta seccin Historia Comparar con el contenido original

Asumiendo que tu action fue definida as y quieres acceder los argumentos usando $articleID en vez de $this->params['id'], tan solo agrega un array extra en el 3er parmetro de Router::connect().

1. // some_controller.php 2. function view($articleID = null, $slug = null) { 3. // some code here... 4. } 5. // routes.php 6. Router::connect( 7. // E.g. /blog/3-CakePHP_Rocks 8. '/blog/:id-:slug', 9. array('controller' => 'blog', 'action' => 'view'), 10.array( 11.// el orden es importante ya que esto va a mapear ":id" con $articleID en tu action 12.'pass' => array('id', 'slug'), 13.'id' => '[0-9]+' 14.) 15.); Y ahora, gracias a la capacidad de enrutamiento inverso podrs pasar la url como se muestra abajo y Cake sabr como formar la URL como se defini en los routers. 1. 2. 3. 4. 5. 6. 7. 8. // view.ctp // esto devolver un link a /blog/3-CakePHP_Rocks <?php echo $html->link('CakePHP Rocks', array( 'controller' => 'blog', 'action' => 'view', 'id' => 3, 'slug' => Inflector::slug('CakePHP Rocks') )); ?>

3.4.5.6 Prefix Routing

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Muchas aplicaciones necesitan una seccin administrativa donde los usuarios con privilegios puedan hacer cambios. Con frecuencia, esto se hace con una URL especial como /admin/users/edit/5. En CakePHP, el admin routing puede activarse dentro del archivo de configuracin del core ajustando la ruta de administracin para Routing.admin. 1. Configure::write('Routing.admin', 'admin'); En tu controlador, ser llamada cualquier accin con un prefijo admin_. Recurriendo a nuestro ejemplo de usuarios, acceder a la URL /admin/users/edit/5 debera llamar al mtodo

admin_edit de nuestro UsersController pasando 5 como primer parmetro. Puedes mapear la URL /admin a tu accin admin_index del pages controller usando la ruta 1. Router::connect('/admin', array('controller' => 'pages', 'action' => 'index', 'admin' => true)); Puedes configurar el Router usado mltiples prefijos: 1. Router::connect('/profiles/:controller/:action/*', array('prefix' => 'profiles', 'profiles' => true)); Cualquier llamada a la seccin Profiles buscara el prefijo profiles_ en las llamadas a los mtodos. Nuestro ejemplo tendra una URL como /profiles/users/edit/5 que llamara al mtodo profiles_edit en el UsersController. Es tambin importante recordar que usar el HTML helper para construir tus enlaces, te ayudar a mantener las llamadas a los prefijos. He aqu cmo construir este enlace usando el HTML helper: 1. echo $html->link('Edit your profile', array('profiles' => true, 'controller' => 'users', 'action' => 'edit', 'id' => 5)); Puedes ajustar mltiples rutas con prefijos usando esta metodologa para crear una estructura de URL flexible para tu aplicacin.
3.4.5.7 Rutas y plugins

Editar Ver slo esta seccin Historia Comparar con el contenido original

Las rutas a Plugins utilizan la clave plugin. Puedes crear enlaces que apunten a un plugin siempre que aadas la clave plugin al array de la url. 1. echo $html->link('New todo', array('plugin' => 'todo', 'controller' => 'todo_items', 'action' => 'create')); Por el contrario, si la peticin activa es un plugin y quieres crear un enlace que no tiene plugin, puedes hacerlo como sigue. 1. echo $html->link('New todo', array('plugin' => null, 'controller' => 'users', 'action' => 'profile')); Al poner plugin => null le ests diciendo al Router que quieres crear un enlace que no forma parte de un plugin.
3.4.5.8 Extensiones de archivo

Editar Ver slo esta seccin Historia Comparar con el contenido original

Para manejar diferentes extensiones de archivo con tus rutas, necesitas una lnea extra en el archivo de configuracin de rutas: 1. Router::parseExtensions('html', 'rss');

Esto le dir al router que retire las extensiones de archivo coincidentes y que procese entonces el resto.. Si quieres crear una url como /page/title-of-page.html podras crear tu ruta como se explica a continuacin: 1. 2. 3. 4. 5. 6. 7. Router::connect( '/page/:title', array('controller' => 'pages', 'action' => 'view'), array( 'pass' => array('title') ) );

Para crear enlaces que se mapeen a esas rutas simplemente usamos: 1. $html->link('Link title', array('controller' => 'pages', 'action' => 'view', 'title' => Inflector::slug('text to slug', '-'), 'ext' => 'html'))
3.4.5.9 Custom Route classes

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Custom route classes allow you to extend and change how individual routes parse requests and handle reverse routing. A route class should extend CakeRoute and implement one or both of match() and parse(). Parse is used to parse requests and match is used to handle reverse routing. You can use a custom route class when making a route by using the routeClass option, and loading the file containing your route before trying to use it. 1. 2. 3. 4. 5. Router::connect( '/:slug', array('controller' => 'posts', 'action' => 'view'), array('routeClass' => 'SlugRoute') );

This route would create an instance of SlugRoute and allow you to implement custom parameter handling
3.4.6 Inflexiones Propias

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones Las convenciones de nomenclatura de CakePHP pueden ser muy buenas. Nombras la tabla de base de datos "usuarios", tu modelo "Usuario", tu controlador "UsuariosController" y todo funcionar automticamente. La forma en que CakePHP sabe como atar unas cosas a otras es a travs de las inflexiones de palabras entre formas en singular y plural. Hay ocasiones, sobre todo para usuarios de habla hispana, en que encontrars situaciones donde el inflector de CakePHP no funcione como lo esperas. Si CakePHP no es capaz de reconocer tu Reloj o Ciudad, editar el archivo de inflexiones propias es la manera de indicarle a CakePHP que existen otros casos especiales. Este archivo se encuentra en /app/config/inflections.php. En este archivo encontrars seis variables. Cada una de ellas te permite definir a un grado muy fino el comportamiento de inflexiones de CakePHP. Variable de inflections.php $pluralRules $uninflectedPlural Descripcin Este arreglo contienen las expresiones regulares para pluralizar los casos especiales. Las claves del arreglo son los patrones y los valores los reemplazos. Un arreglo que contiene palabras que no han de ser modificadas para obtener su plural, como la palabra gente o dinero. Un arreglo que contiene palabras y su respectivo plural. Las claves de este arreglo contienen la forma singular y los valores la forma plural. Este arreglo debe ser utilizado para colocar palabras que no sigan las reglas definidas en $pluralRules. Igual que $pluralRules, solo que contiene las reglas para singularizar palabras. Igual que $uninflectedPlural, solo que este arreglo contiene las palabras que no tienen singular. Por defecto es igual que $uninflectedPlural. Igual que $irregularPlural, solo que con palabras en forma singular.

$irregularPlural $singularRules $uninflectedSingular $irregularSingular

3.4.7 Haciendo Bootstrap de CakePHP

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si tienes necesidades de configuracin adicionales, usa el archivo de bootstrap de CakePHP que se encuentra en /app/config/bootstrap.php. Este archivo es ejecutado inmediatamente despus de el bootstrap propio de CakePHP. Este archivo es ideal para un nmero de tareas comunes: Definir funciones de conveniencia Definir constantes globales Definir rutas adicionales para modelos, controladores, vistas, plugins... S cuidadoso de mantener el patron de diseo MVC cuando agregues cosas al archivo bootstrap, puede resultar tentador colocar funciones para dar formato a texto all para luego usarlas en controladores.

Resiste la tentacin. Te lo agradecers ms adelante a ti mismo. Podras considerar colocar cosas en la clase AppController. Esta clase en poder de todos los controladores de la aplicacin. AppController es til para colocar funciones que se ejecutan antes o despus de eventos definidos (callbacks), que sern usados en todos tus controladores. 3.5 Controladores Editar Ver slo esta seccin Historia Comparar con el contenido original

# Introduccin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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: 1. 2. 3. 4. 5. <?php # /app/controllers/recetas_controller.php class RecetasController extends AppController { function ver($id) { //la lgica de la accin va aqui...

6. } 7. function compartir($cliente_id, $receta_id) { 8. //la lgica de la accin va aqui... 9. } 10.function buscar($query) { 11.//la lgica de la accin va aqui... 12.} 13.} 14.?> 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.
3.5.1 The App Controller

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Como se coment en la introduccin, la clase AppController es la clase superior a todos los controladores de tu aplicacin. AppController extiende la clase Controller incluida en la libreria base de CakePHP. As, AppController es definida en /app/app_controller.php como: 1. 2. 3. 4. <?php class AppController extends Controller { } ?>

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 controladpres 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 CakePHP combina las siguientes variables de AppController con los controladores de tu aplicacin: $components $helpers $uses Por favor, recuerda realizar las llamadas a los callbacks de AppController desde los controladores de tu aplicacin para que todo funcione correctamente:

1. function beforeFilter(){ 2. parent::beforeFilter(); 3. }


3.5.2 The Pages Controller

Editar Ver slo esta seccin Historia Comparar con el contenido original

El ncleo de CakePHP viene con un controlador por defecto llamado the Pages Controller (el Controlador de Pginas) (cake/libs/controller/pages_controller.php). La pgina de inicio que ves luego de la instalacin, es generada utilizando este controlador. Por ejemplo: S creas un archivo de vista app/views/pages/about_us.ctp puedes accesarlo utilizando la url http://example.com/pages/about_us Cuando "cocinas" una aplicacin utilizando la consola de CakePHP el controlador de pginas es copiado a tu carpeta app/controllers/ y puedes modificarla a tus necesidades si es necesario. O simplemente puedes copiar el archivo page_controller.php del ncleo a tu app. No modifiques directamente NINGUN archivo dentro de la carpeta cake para evitar problemas futuros en la actualizacin del ncleo
3.5.3 Atributos del Controlador

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para ver la lista completa de atributos visite la API de CakePHP en la seccin http://api.cakephp.org/class/controller.
3.5.3.1 $name

Editar Ver slo esta seccin Historia Comparar con el contenido original

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.

1. 2. 3. 4. 5. 6.

<?php # $name Ejemplo de uso del atributo $name class RecetasController extends AppController { var $name = 'Recetas'; } ?>

3.5.3.2 $components, $helpers y $uses

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los siguientes atributos ms comunmente 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). Cada controlador tiene alguna de esas clases disponibles por defecto, as que no necesitars configurar tu controlador. 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. Para aprender ms sobre estas clases, no olvides leer sus respectivas secciones ms adelante en este manual. Veamos cmo decirle a un controlador de CakePHP que planeas utilizar clases MVC adicionales. 1. 2. 3. 4. 5. 6. 7. 8. <?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.
3.5.3.3 Atributos Relacionados con la Pgina: "$layout" y "$pageTitle"

Editar

Ver slo esta seccin Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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. 1. 2. 3. 4. 5. 6. 7. 8. <?php // Usando <em>$layout</em> para definir un diseo alternativo class RecipesController extends AppController { function quickSave() { $this->layout = 'ajax'; } } ?>

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 <title> y </title> en la cabecera del documento HTML. 1. <?php 2. // Usando <em>$pageTitle</em> para definir el ttulo de la pgina 3. class RecipesController extends AppController { 4. function quickSave() { 5. $this->pageTitle = 'Mi ttulo del motor de bsquedas optimizado'; 6. } 7. } 8. ?> 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.

3.5.3.4 El Atributo de Parmetros ("$params")

Editar Ver slo esta seccin Historia Comparar con el contenido original

Los parmetros del controlador estn disponibles en $this->params en tu controlador de CakePHP. Esta variables 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.
3.5.3.4.1 form

Editar Ver slo esta seccin Historia Comparar con el contenido original

$this->params['form'] Cualquier dato POST de cualquier formulario se almacena aqu, incluyendo informacin tambin hallada en $_FILES.
3.5.3.4.2 admin

Editar Ver slo esta seccin Historia Comparar con el contenido original

$this->params['admin'] Contiene el valor 1 si la accin (action) actual fue invocada mediante enrutamiento "admin".
3.5.3.4.3 bare

Editar Ver slo esta seccin Historia Comparar con el contenido original

$this->params['bare'] Almacena un 1 si el diseo (layout) actual est vaco; 0 si no.


3.5.3.4.4 isAjax

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes:

Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones $this->params['ajax'] Almacena un 1 si la peticin actual es una llamada ajax; 0 si no. Esta variables slo se establece si el componente RequestHandler es usado en el controlador.
3.5.3.4.5 controller

Editar Ver slo esta seccin Historia Comparar con el contenido original

$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".
3.5.3.4.6 action

Editar Ver slo esta seccin Historia Comparar con el contenido original

$this->params['action'] Almacena el nombre de la accin actual sirviendo la peticin. Por ejemplo, si fue pedida la URL /posts/view/1, entonces $this->params['action'] ser igual a "view".
3.5.3.4.7 pass

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones $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".

3.5.3.4.8 url

Editar Ver slo esta seccin Historia Comparar con el contenido original

$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 )

3.5.3.4.9 data

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones $this->data Usado para manejar datos POST enviados desde los formularios de FormHelper al controlador. 1. // El helper FormHelper es usado para crear un elemento de formulario: 2. $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 1. // El valor first_name enviado se puede encontrar aqu: 2. $this->data['User']['first_name'];
3.5.3.4.10 prefix

Editar Ver slo esta seccin Historia

Comparar con el contenido original $this->params['prefix'] Establecido al prefijo de enrutado. Por ejemplo, este atributo contendra la cadena "admin" durante una peticin a /admin/posts/someaction.
3.5.3.4.11 named

Editar Ver slo esta seccin Historia Comparar con el contenido original

$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 )

3.5.3.5 Otros Atributos

Editar Ver slo esta seccin Historia Comparar con el contenido original

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, cha un vistazo a sus respectivas secciones ms adelante en este manual.
3.5.3.6 persistModel

Editar Ver slo esta seccin Historia Comparar con el contenido original

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.
3.5.4 Mtodos del Controlador

Editar

Ver slo esta seccin Historia Comparar con el contenido original 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/class/controller.
3.5.4.1 Interactuando con Vistas


# set

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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. 1. 2. 3. 4. 5. 6. 7. <?php // Primero pasas datos desde el controlador: $this->set('color', 'azul'); // Despue, en las vista, puedes utilizar el dato: ?> Has seleccionado <?php echo $color; ?>ar 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.): 1. 2. 3. 4. 5. 6. <?php $data = array( 'color' => 'pink', 'type' => 'sugar', 'base_price' => 23.95 );

7. // hace que $color, $type, y $basePrice 8. // estn disponibles a la vista: 9. $this->set($data); 10.?>
# render

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones render(string $action, string $layout, string $file) El mtodo render() es llamado automticamente al final de cada accin de controlador pedida. Este mtodo lleva a cabo toda la lgica de la vista (usando los datos que has proporcionado con el mtodo set()), coloca la vista (view) dentro de su diseo (layout) y lo sirve de vuelta al usuario final. El fichero de vista por defecto utilizado por render es determinado por convenio. Por ejemplo, si se pide la accin search() del controlador RecipesController, ser renderizado el fichero de vista en /app/views/recipes/search.ctp. 1. 2. 3. 4. 5. 6. 7. class RecipesController extends AppController { function search() { // Render the view in /views/recipes/search.ctp $this->render(); } ... }

A pesar de que CakePHP lo llamar automticamente (a menos que hayas establecido $this>autoRender a falso) despus de cada lgica de las acciones, puedes utilizar render para especificar un fichero de vista alternativo indicando un nombre de accin en el controlador usando $action. Si $action comienza por '/' se asume que es un fichero de vista o elemento relativo a la carpeta /app/views. Esto permite el renderizado inmediato de elementos, algo muy til en las llamadas ajax. 1. // Render the element in /views/elements/ajaxreturn.ctp 2. $this->render('/elements/ajaxreturn'); Tambin puedes especificar un fichero de vista alternativo usando el tercer parmetro, $file. Cuando ests usando $file, no olvides utilizar unas pocas de las constantes globales de CakePHP (como VIEWS). El parmetro $layout te permite especificar el diseo en el que la vista es renderizada.

# Renderizando una vista especfica

Editar Ver slo esta seccin Historia Comparar con el contenido original

En tu controlador podras querer renderizar una vista de otra manera de la que normalmente se hara. Puedes hacer esto llamando a render() directamente. Una vez que llamaste a render() CakePHP no tratar de re-renderizar la vista. 1. 2. 3. 4. 5. class PostsController extends AppController { function my_action() { $this->render('custom_file'); } }

Esto renderizar app/views/posts/custom_file.ctp en vez de app/views/posts/my_action.ctp


3.5.4.2 Control de Flujo

Editar Ver slo esta seccin Historia Comparar con el contenido original

3.5.4.2.1 redirect

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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. function realizarPedidos() { // La lgina para finalizar el pedido va aqu if($satisfactorio) { $this->redirect(array('controller' => 'pedidos', 'action' => 'gracias')); 5. } else { 6. $this->redirect(array('controller' => 'pedidos', 'action' => 1. 2. 3. 4.

'confirmar')); 7. } 8. } 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 metodo ejecutar exit() tras la redireccin a menos que establezcas el tercer parmetro a false.
3.5.4.2.2 flash

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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, cercinate de echarle un ojo al mtodo setFlash() del componente SessionComponent.
3.5.4.3 Retrollamadas ("Callbacks")

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los controladores de CakePHP vienen con retrollamas (callbacks) empotradas que puedes usar para insertar lgica justo antes o despus de que las acciones del controlador sean llevadas a cabo. beforeFilter()

Esta funcin se ejecuta antes de toda accin en el controlador. Es un lugar prctico para comprobar una sesin activa o inspeccionar los permisos del usuario. beforeRender() Llamada tras la lgica de accin del controlador, pero antes de que la vista es renderizada. Este callback no es utilizado a menudo, pero puedes necesitarlo si ests llamando a render() manualmente antes del final de una accin dada. afterFilter() Llamada tras toda accin del controlador. afterRender() Llamada tras haber sido renderizada una accin. CakePHP tambin soporta callbacks relacionados con el scaffolding. _beforeScaffold($metodo) $metodo es el nombre del mtodo llamado, por ejemplo: index, edit, etc. _afterScaffoldSave($metodo) $metodo es el nombre del mtodo llamado tras edit o update. _afterScaffoldSaveError($metodo) $metodo es el nombre del mtodo llamado tras edit o update. _scaffoldError($metodo) $metodo es el nombre del mtodo llamado, por ejemplo: index, edit, etc.
3.5.4.4 Otros Mtodos tiles

Editar Ver slo esta seccin Historia Comparar con el contenido original

3.5.4.4.1 constructClasses

Editar Ver slo esta seccin Historia Comparar con el contenido original

Este mtodo carga los modelos requeridos por el controlador. El proceso de carga es realizado por CakePHP normalmente, pero hay que tener a mano este mtodo cuando se accede a los controladores desde una perspectiva diferente. Si necesitas CakePHP en un script de lnea de comando o algn otro uso externo, constructClasses() ser til.
3.5.4.4.2 referer

Editar Ver slo esta seccin Historia

Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Devuelve la URL remitente de la peticin actual. Ver referer en la wikipedia para ms informacin.
3.5.4.4.3 disableCache

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Usado para indicarle al navegador del usuario que no guarde en cach los resultados de la peticin actual. Esto es diferente que guardar en cach una vista (view caching), tratado en un captulo posterior.
3.5.4.4.4 postConditions

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones postConditions(array $datos, mixed $operadores, string $bool, boolean $exclusivo) Usa este mtodo para convertir un conjunto de datos de modelo recibidor mediante POST (de inputs compatibles con HtmlHelper) en un conjunto de condiciones de bsqueda para un modelo. Esta funcin ofrece un atajo rpido para la construccin de la lgica de bqueda. Por ejemplo, un usuario administrativo puede querer buscar pedidos para saber qu elementos necesitan ser enviados. Puedes utilizar los ayudantes FormHelper y HtmlHelper para crear un formulario rpido basado en el modelo Pedido. Entonces, una accin de un controlador puede usar los datos recibidos desde ese formulario para encauzar las condiciones de bsqueda: 1. function index() {

2. $o = $this->Pedidos->findAll($this->postConditions($this>data)); 3. $this->set('pedidos', $o); 4. } Si $this->data[Pedido][destino] es igual a Old Towne Bakery, postConditions convierte esa condicin en un array compatible para ser usado en un mtodo Model->findAll(). En este caso, array(pedido.destino => Old Towne Bakery). Si deseas usar un operador SQL distinto entre trminos, proporcinalos usando el segundo parmetro. 1. /* 2. contenidos de $this->data 3. array( 4. 'Pedido' => array( 5. 'num_items' => '4', 6. 'referrer' => 'Ye Olde' 7. ) 8. ) 9. */ 10.//Obtengamos los pedidos que tiene como mnimo 4 elementos y contienen Ye Olde 11.$o = $this->Pedido->findAll($this->postConditions( 12.$this->data, 13.array('>=', 'LIKE') 14.)); La clave al especificar operadores es el orden de las columnas en el array $this->data. Dado que num_items est de primero, el operador >= es el que se le aplica. El tercer parmetro te permite decirle a CakePHP qu operador booleano SQL usar entre condiciones de bsqueda. Una cadena de carateres como AND, OR y XOR son valores vlidos. Finalmente, si el ltimo parmetro se establece a true, y el parmetro $operadores es un array, los campos no incluidos en $operadores no se incluirn en las condiciones devueltas.
3.5.4.4.5 paginate

Editar Ver slo esta seccin Historia Comparar con el contenido original

Este mtodo es usado para paginar resultados cargados por tus modelos. Puedes especificar tamao de pginas, condiciones de bsqueda del modelo y ms. Mira la seccin paginacin para ms detalles sobre cmo usar paginate.
3.5.4.4.6 requestAction

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones requestAction(string $url, array $opciones) Esta funcin llama a una accin de un controlador de cualquier lugar y devuelve los datos de la accin. La direccin $url pasada es una URL relativa de CakePHP (/nombrecontrolador/nombreaccion/parametros). Para pasar datos extras a la accin del controladores receptor, adelos al array $options. Puedes usar requestAction() para obtener una vista completamente renderizada pasando 'return' en las opciones: requestAction($url, array('return')); Si se utiliza sin cach, requestAction puede llevar a un pobre rendimiento. Es rramente apropiado usarlo en un controlador o modelo. Es mejor usar requestAction junto con elementos en cach, como una manera de obtener datos para un elemento antes de renderizar. Usemos el ejemplo de poner un elemento "ltimos comentarios" en el diseo (layout). Primero necesitamos crear una funcin en un controlador que devolver los datos. 1. // controllers/comments_controller.php 2. class CommentsController extends AppController { 3. function latest() { 4. return $this->Comment->find('all', 5. array( 6. 'order' => 'Comment.created DESC', 7. 'limit' => 10) 8. ); 9. } 10.} Si ahora creamos un elemento simple para llamar a esa funcin: 1. 2. 3. 4. 5. // views/elements/latest_comments.ctp $comments = $this->requestAction('/comments/latest'); foreach($comments as $comment) { echo $comment['Comment']['title']; }

Podemos colocar esos elementos en cualquier sitio para obtener la salida usando: 1. echo $this->element('latest_comments'); Escrito de esta manera, siempre que el elemento sea renderizado, se realizar una peticin al controlador para obtener los datos, los datos sern procesados y devueltos. De todos modos, de acuerdo con el aviso anterior, es mejor utilizar cach de elementos para prevenir procesamiento innecesario. Modificando la llamada a element para que se vea as: 1. echo $this->element('latest_comments', array('cache'=>'+1 hour'));

La llamada a requestAction no se realizar mientras que la el archivo de la vista del elemento en cache exista y sea vlido. Adems, requestAction ahora toma urls con estilo cake basadas en arrays: 1. 2. 3. 4. 5. 6. 7. echo $this->requestAction( array( 'controller' => 'articles', 'action' => 'featured' ), array('return') );

Esto permite a la llamada a requestAction evitar el uso de Router::url lo que puede incrementar el rendimiento. Las urls basadas en arrays son las mismas que las que HtmlHelper:link usa, con una diferencia. Si ests usando parmetros con nombre en tu url, entonces el array de url debe envolver los parmetros con nombre en la clave 'named'. Esto es porque requestAction slo combina los argumentos nombrados del array en el array de miembros de Controller::params y no coloca los argumentos con nombre en la clave 'named'. 1. echo $this->requestAction('/articles/featured/limit:3'); Este, como array en requestAction debera ser: 1. 2. 3. 4. 5. 6. 7. 8. 9. echo $this->requestAction( array( 'controller' => 'articles', 'action' => 'featured', 'named' => array( 'limit' => 3 ) ) );

A diferencia de otros lugares donde las urls de arrays son anlogas a urls de cadenas, requestAction las trata de manera diferente. Cuando utilices una url de array junto con requestAction() has de especificar todos los parmetros que necesitars en la accin pedida. Esto incluye parmetros como $this->data y $this->params['form']
3.5.4.4.7 loadModel

Editar Ver slo esta seccin Historia Comparar con el contenido original

loadModel(string $modelClass, mixed $id) La funcin loadModel es til cuando se necesita usar un modelo que no es propiamente el modelo por defecto del controlador o uno de sus modelos asociados. 1. $this->loadModel('Article'); 2. $recentArticles = $this->Article->find('all', array('limit' =>

5, 'order' => 'Article.created DESC')); 1. $this->loadModel('User', 2); 2. $user = $this->User->read(); 3.6 Componentes Editar Ver slo esta seccin Historia Comparar con el contenido original

3.6.1 Introduccin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los componentes son paquetes de lgica que son compartidos entre los controladores. Si tiene ganas de copiar y pegar cdigo de un controlador a otro, debera antes considerar agrupar algunas funcionalidades en un componente. CakePHP incluye un conjunto fantstico de componentes listos para usar para conseguir ayuda con: Seguridad Sesiones Lista de control de acceso (ACL) Emails Cookies Autenticacin Manejo de pedidos (Requests)

Cada uno de estos componentes del ncleo (Core) son detallados en su propio capitulo. Por el momento, veremos como crear sus propios componentes. Con esto ayudar a mantener el cdigo de los controladores limpio y le ser mas sencillo reusar cdigo entre proyectos.
3.6.2 Configuracin de componentes.

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este

differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Muchos de los componentes bsicos requieren ser configurados. Algunos ejemplos de componentes que requieren ser configurados son: Auth, Cookie e Email. Toda la configuracin de estos componentes y los componentes en general se hacen en el mtodo del controlador beforeFilter(). 1. function beforeFilter() { 2. $this->Auth->authorize = 'controller'; 3. $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); 4. $this->Cookie->name = 'CookieMonster'; 5. } El cdigo anterior sera un ejemplo de configuracin de las variables de componente del controlador beforeFilter()
3.6.3 Creando Componentes a medida

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Supongamos que nuestra aplicacin online necesita efectuar una compleja operacin matemtica en muchas partes de la aplicacin. Creariamos un componente que albergara esa lgica compartida para poder ser usada en diferentes controladores El primer paso es crear una nueva clase y fichero de componente. Crea el fichero en /app/controllers/components/math.php. La estructura bsica para el componente quedara as. 1. 2. 3. 4. 5. 6. 7. <?php class MathComponent extends Object { function doComplexOperation($amount1, $amount2) { return $amount1 + $amount2; } } ?>

3.6.3.1 Aadiendo Componentes a tus Controladores

Editar Ver slo esta seccin

Historia Comparar con el contenido original Una vez finalizado nuestro componente, podemos usarlo en los controladores de la aplicacin aadiendo su nombre (excepto la parte "Component" al array $components del controlador. Automticamente, el controlador recibir un nuevo atributo con un nombre a partir del nombre del componente, a travs del cual podremos acceder a una instancia del mismo: 1. /* Hace el nuevo componente accesible en $this->Math, 2. al igual que el standard $this->Session */ 3. var $components = array('Math', 'Session'); Los componentes declarados en AppController sern combinados con los de tus otros controladores, as que no hay necesidad de redeclarar el mismo componente dos veces. Cuando se incluyen Componentes a un Controlador tambien puedes declarar un conjunto de parmetros que sern pasados al mtodo intialize() de los Componentes. Estos parmetros pueden ser manejados por el Componente. 1. 2. 3. 4. 5. 6. 7. var $components = array( 'Math' => array( 'precision' => 2, 'randomGenerator' => 'srand' ), 'Session', 'Auth' );

Este cdigo pasara el array conteniendo precision y randomGenerator al mtodo intialize() de MathComponent como segundo parmetro. Por ahora, esta sintaxis no est implementada por ninguno de los Componentes Core
3.6.3.2 Acceso a clases MVC dentro de componentes

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para acceder a la instancia del controlador desde tu recien creado componente, necesitars implementar el mtodo initialize() o el startup(). Estos mtodos especiales llevan una referencia al controlador como primer parmetro y son llamados automticamente. El mtodo initialize() es llamado antes del mtodo beforeFilter(), y el mtodo startup() despus del mtodo beforeFilter. Si por algn motivo no deseas que el mtodo startup() sea llamado cuando el controlador est inicializando cosas, dale el valor true a la variable $disableStartup. Si deseas insertar algn cdigo de lgica antes de que el controlador beforeFilter() sea llamado,

necesitars usar el mtodo initialize() del componente. 1. <?php 2. class CheckComponent extends Object { 3. //llamado antse de Controller::beforeFilter() 4. function initialize(&$controller) { 5. // salvando la referencia al controlador para uso posterior 6. $this->controller =& $controller; 7. } 8. //llamado tras Controller::beforeFilter() 9. function startup(&$controller) { 10.} 11.function redirectSomewhere($value) { 12.// ulizando un mtodo de controlador 13.$this->controller->redirect($value); 14.} 15.} 16.?> Tambin podrias querer utilizar otros componentes dentro del componente a medida. Para ello, simplemente crea una variable de clase $components (tal como lo haras en un controlador ) como un array que contenga los nombres de los componentes que quieres utilizar. 1. <?php 2. class MyComponent extends Object { 3. // Este componente usa otros componentes 4. var $components = array('Session', 'Math'); 5. function doStuff() { 6. $result = $this->Math->doComplexOperation(1, 2); 7. $this->Session->write('stuff', $result); 8. } 9. } 10.?> No es muy recomendable acceder o usar un modelo en un componente, pero si tras sopesar las posibilidades eso es lo que quieres hacer, tendrs que instanciar tu clase modelo y usarla manualmente. Aqu tienes un ejemplo: 1. <?php 2. class MathComponent extends Object { 3. function doComplexOperation($amount1, $amount2) { 4. return $amount1 + $amount2; 5. } 6. function doUberComplexOperation ($amount1, $amount2) { 7. $userInstance = ClassRegistry::init('User'); 8. $totalUsers = $userInstance->find('count'); 9. return ($amount1 + $amount2) / $totalUsers; 10.} 11.} 12.?>

3.6.3.3 Usando Componentes en tu Componente

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones A veces uno de tus componentes puede depender de otro. Si las funcionalidades que estos componentes proveen no estn relacionados, excepto por su dependencia el uno del otro, entonces no querrs ponerlos dentro de un solo componente. En cambio puedes hacer que tu componente sea un "Padre" e indicarle con el array $components la lista de sus "Hijos". Los componentes padres se cargan antes que sus componentes hijos, y cada componente hijo tiene acceso a su padre. Declaracin del padre: 1. <?php 2. class PadreComponent extends Object { 3. var $name = "Padre"; 4. var $components = array( "Hijo" ); 5. function initialize(&$controller) { 6. $this->Hijo->foo(); 7. } 8. function bar() { 9. // ... 10.} 11.} Declaracin del hijo: 1. <?php 2. class HijoComponent extends Object { 3. var $name = "Hijo"; 4. function initialize(&$controller) { 5. $this->Padre->bar(); 6. } 7. function foo() { 8. // ... 9. } 10.} 3.7 Modelos Editar Ver slo esta seccin

Historia Comparar con el contenido original


3.7.1 La Comprensin de Modelos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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: 1. 2. 3. 4. 5. <?php class Ingredient extends AppModel { var $name = 'Ingredient'; } ?>

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 aplicacinm AppModel, el cual extiende la clase Model, interna de CakePHP. Es esta clase Model interna la que otorga la funcionalidad a nuestro modelo pesonalizado, 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/. Creando un proyecto utilizando Bake, Bake generar automticamente este fichero por ti. 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 dinamicamente 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.

Ver tambin Comportamientos para ms informacin sobre cmo aplicar lgica similar para mltiples modelos. La propiedad $name es necesaria para PHP4 pero opcional para PHP5. Con tu modelo definido, este puede ser accedido dentro de tu Controlador. CakePHP automaticamente har que se pueda acceder al modelo cuando su nombre concuerde con el del controloador. Por ejemplo, un controlador llamado IngredientsController automaticamente inicializar el modelo Ingredient y ser accesible por el controlador mediante $this->Ingredient. 1. 2. 3. 4. 5. 6. 7. 8. 9. <?php class IngredientsController extends AppController { function index() { //obtiene todos los ingredientes y los pasa a la vista: $ingredients = $this->Ingredient->find('all'); $this->set('ingredients', $ingredients); } } ?>

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). 1. $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. 1. 2. 3. 4. 5. 6. 7. 8. 9. <?php class RecipeController extends AppController { var $uses = array('Recipe', 'User'); function index() { $this->Recipe->find('all'); $this->User->find('all'); } } ?>

Si no has aadido el modelo a travs de la propiedad $uses entonces necesitars importar el modelo manualmente e instanciarlo dentro de la accin. 1. <?php 2. class RecipeController extends AppController { 3. var $uses = array('Recipe'); 4. function index() { 5. $this->Recipe->find('all'); 6. App::import('Model', 'User'); 7. $user = new User(); 8. $user->find('all'); 9. } 10.} 11.?>

3.7.2 Creando Tablas de Bases de Datos

Editar Ver slo esta seccin Historia Comparar con el contenido original

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 apra 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 basandose en cmo tus campos estn definidos. CakePHP viene preparado para el ingls. En caso de desear flexiones para el espaol es necesario modificar eL fichero cake/libs/inflector.php
3.7.2.1 Asociaciones de Tipo de Dato por Base de Datos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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 cmo est "mapeado" cada uno.

3.7.2.1.1 MySQL

Editar Ver slo esta seccin Historia Comparar con el contenido original

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.
3.7.2.1.2 MySQLi

Editar Ver slo esta seccin Historia Comparar con el contenido original Propiedades del Campo DEFAULT NULL auto_increment varchar(255) text int(11) float datetime datetime time date blob tinyint(1)

Tipo CakePHP primary_key string text integer float datetime timestamp time date binary boolean
3.7.2.1.3 ADOdb

Editar Ver slo esta seccin Historia Comparar con el contenido original

Tipo CakePHP primary_key string text integer float datetime timestamp time date binary boolean
3.7.2.1.4 DB2

Propiedades del Campo R(11) C(255) X I(11) N T (Y-m-d H:i:s) T (Y-m-d H:i:s) T (H:i:s) T (Y-m-d) B L(1)

Editar Ver slo esta seccin Historia Comparar con el contenido original Tipo CakePHP Propiedades del Campo not null generated by default as identity (start with 1, increment by 1) varchar(255) clob integer(10) double timestamp (Y-m-d-H.i.s) timestamp (Y-m-d-H.i.s) time (H.i.s) date (Y-m-d) blob smallint(1)

primary_key string text integer float datetime timestamp time date binary boolean
3.7.2.1.5 Firebird/Interbase

Editar Ver slo esta seccin Historia Comparar con el contenido original Propiedades del Campo IDENTITY (1, 1) NOT NULL varchar(255) BLOB SUB_TYPE 1 SEGMENT SIZE 100 CHARACTER SET NONE

Tipo CakePHP primary_key string text

integer float datetime timestamp time date binary boolean


3.7.2.1.6 MS SQL

integer float timestamp (d.m.Y H:i:s) timestamp (d.m.Y H:i:s) time (H:i:s) date (d.m.Y) blob smallint

Editar Ver slo esta seccin Historia Comparar con el contenido original Propiedades del Campo IDENTITY (1, 1) NOT NULL varchar(255) text int numeric datetime (Y-m-d H:i:s) timestamp (Y-m-d H:i:s) datetime (H:i:s) datetime (Y-m-d) image bit

Tipo CakePHP primary_key string text integer float datetime timestamp time date binary boolean
3.7.2.1.7 Oracle

Editar Ver slo esta seccin Historia Comparar con el contenido original Propiedades del Campo number NOT NULL varchar2(255) varchar2 numeric float date (Y-m-d H:i:s) date (Y-m-d H:i:s) date (H:i:s)

Tipo CakePHP primary_key string text integer float datetime timestamp time

date binary boolean number inet


3.7.2.1.8 PostgreSQL

date (Y-m-d) bytea boolean numeric inet

Editar Ver slo esta seccin Historia Comparar con el contenido original Propiedades del Campo serial NOT NULL varchar(255) text integer float timestamp (Y-m-d H:i:s) timestamp (Y-m-d H:i:s) time (H:i:s) date (Y-m-d) bytea boolean numeric inet

Tipo CakePHP primary_key string text integer float datetime timestamp time date binary boolean number inet
3.7.2.1.9 SQLite

Editar Ver slo esta seccin Historia Comparar con el contenido original Propiedades del Campo integer primary key varchar(255) text integer float datetime (Y-m-d H:i:s) timestamp (Y-m-d H:i:s) time (H:i:s) date (Y-m-d)

Tipo CakePHP primary_key string text integer float datetime timestamp time date

binary boolean
3.7.2.1.10 Sybase

blob boolean

Editar Ver slo esta seccin Historia Comparar con el contenido original Propiedades del Campo numeric(9,0) IDENTITY PRIMARY KEY varchar(255) text int(11) float datetime (Y-m-d H:i:s) timestamp (Y-m-d H:i:s) datetime (H:i:s) datetime (Y-m-d) image bit

Tipo CakePHP primary_key string text integer float datetime timestamp time date binary boolean
3.7.2.2 Titulos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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 <select> TreeBehavior reordenacin, vistas de rbol Si tienes un campo title y un campo name en tu tabla, el campo title ser el utilizado.

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

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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.
3.7.2.4 Utilizando UUIDs como Claves Primarias

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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-446655440000

Los 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.

3.7.3 Recuperando tus Datos


3.7.3.1 find

Editar Ver slo esta seccin Historia Comparar con el contenido original

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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: 1. array( 2. 'conditions' => array('Model.field' => $thisValue), //array de condiciones 3. 'recursive' => 1, //int 4. 'fields' => array('Model.field1', 'Model.field2'), //array de nombres de campos 5. 'order' => 'Model.created', //string o array definiendo el orden 6. 'group' => array('Model.field'), //campos para GROUP BY 7. 'limit' => n, //int 8. 'page' => n //int 9. ) Si ests utilizando find('list'), la clave 'fields' en $parametros define la clave, valor y grupo 1. // la lista generada ser indexada por Post.id, con valor de Post.title 2. $this->Post->find('list', array('fields'=>'Post.title')); 3. // la lista generada ser indexada por Post.slug, con valor de Post.title 4. $this->Post->find('list', 5. array( 6. 'fields'=>array('Post.slug', 7. 'Post.title') 8. )

9. ); 10.// la lista generada ser agrupoada por Post.author_id, y cada grupo indexado por Post.id, con valor de Post.title 11.$this->Post->find('list', 12.array( 13.'fields'=> array('Post.id', 14.'Post.title', 15.'Post.author_id') 16.) 17.); 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'). 1. // asumiendo que tenermos id's de 1 a 10, veremos assuming we have id's from 1-10, veremos <em>prev</em> establecido a 1 y <em>next</em> establecido a 3 2. $this->Post->id = 2; 3. $one = $this->Post->find('neighbors'); 4. // para obtener los datos vecinos utilizando un campo diferente... 5. $two = $this->Post->find('neighbors', 6. array( 7. 'field'=> 'Post.title', 8. 'value'=> $data['Post']['title']) 9. ); Para compatibilidad hacia atra, find tambin acepta la sintasix previa: find(string $condiciones, array $campos, string $orden, int $recursivo)
3.7.3.1.1 find('first')

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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]): 1. function some_function() { 2. ... 3. $this->Article->order = null; // reseteando si ya ha sido inicializado 4. $semiRandomArticle = $this->Article->find(); 5. $this->Article->order = 'Article.created DESC'; // simulando el modelo teniendo un rden por defecto 6. $lastCreated = $this->Article->find(); 7. $alsoLastCreated = $this->Article->find('first', array('order' => array('Article.created DESC'))); 8. $specificallyThisOne = $this->Article->find('first', array('conditions' => array('Article.id' => 1))); 9. ... 10.} 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').


3.7.3.1.2 find('count')

Editar Ver slo esta seccin Historia Comparar con el contenido original

find('count', $params) find('count', $params) Devuelve un valor entero. Debajo hay un par de ejemplos sencillos (cdigo controlador): 1. function some_function() {

2. ... 3. $total = $this->Article->find('count'); 4. $pending = $this->Article->find('count', array('conditions' => array('Article.status' => 'pending'))); 5. $authors = $this->Article->User->find('count'); 6. $publishedAuthors = $this->Article->find('count', array( 7. 'fields' => 'DISTINCT Article.user_id', 8. 'conditions' => array('Article.status !=' => 'pending') 9. )); 10.... 11.} No pasar campos como arrays a find('count'). Podras necesitar campos especficos para DISTINCT count (de lo contrario, count es siempre lo mismo - dictado por las conditions (condiciones)). No hay parmetros adicionales usados con find('count').
3.7.3.1.3 find('all')

Editar Ver slo esta seccin Historia Comparar con el contenido original

find('all', $params) find('all')devuelve un array de resultados(potentially multiple); 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: 1. 2. 3. 4. 5. 6. 7. 8. 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:
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').


3.7.3.1.4 find('list')

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones find('list', $params) 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): 1. 2. 3. 4. 5. 6. 7. 8. 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:
Array

( //[id] [1] => [2] => [4] => [5] => [6] => [3] => => 'displayValue', 'displayValue1', 'displayValue2', 'displayValue4', 'displayValue5', 'displayValue6', '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. Algunos ejemplos aclarar un poco ms: 1. function some_function() { 2. ... 3. $justusernames = $this->Article->User->find('list', array('fields' => array('User.username')); 4. $usernameMap = $this->Article->User->find('list', array('fields' => array('User.username', 'User.first_name')); 5. $usernameGroups = $this->Article->User->find('list', array('fields' => array('User.username', 'User.first_name', 'User.group')); 6. ... 7. } En el anterior ejemplo, el resultado devuelto se parecera a esto:
$justusernames = Array ( //[id] => 'username', [213] => 'AD7six', [25] => '_psychic_', [1] => 'PHPNut', [2] => 'gwoo', [400] => 'jperras', ) $usernameMap = Array ( //[username] => 'firstname', ['AD7six'] => 'Andy', ['_psychic_'] => 'John', ['PHPNut'] => 'Larry', ['gwoo'] => 'Gwoo', ['jperras'] => 'Jol', ) $usernameGroups = Array ( ['Uber'] => Array ( ['PHPNut'] => 'Larry', ['gwoo'] => 'Gwoo',

) ['Admin'] => Array ( ['_psychic_'] => 'John', ['AD7six'] => 'Andy', ['jperras'] => 'Jol', ) )

3.7.3.1.5 find('threaded')

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones find('threaded', $params) find('threaded', $params)Devuelve un array anidado, y es apropiado si quieres usar el campo parent_id de tu modelo de datos para construir resultados anidados. Abajo se muestran un par de ejemplos (cdigo controlador): function some_function() { ... $allCategories = $this->Category->find('threaded'); $aCategory = $this->Category->find('first', array('conditions' => array('parent_id' => 42)); // not the root 5. $someCategories = $this->Category->find('threaded', array( 6. 'conditions' => array( 7. 'Article.lft >=' => $aCategory['Category']['lft'], 8. 'Article.rght <=' => $aCategory['Category']['rght'] 9. ) 10.)); 11.... 12.} 1. 2. 3. 4. No es necesario utilizar el comportamiento en rbol para usar este mtodo, pero todos los resultados deseados deben poderse encontrar en una sencilla consulta. El anterior ejemplo, $allCategories contendra un array anidado representando la estuctura entera de la categora. El segundo ejemplo hace uso de la estructura de datos Tree behavior the return a partial, nested, result for $aCategory and everything below it. The results of a call to find('threaded') will be of the following form:
Array

( [0] => Array ( [ModelName] => Array ( [id] => 83 [parent_id] => null [field1] => value1 [field2] => value2 [field3] => value3 ) [AssociatedModelName] => Array ( [id] => 1 [field1] => value1 [field2] => value2 [field3] => value3 ) [children] => Array ( [0] => Array ( [ModelName] => Array ( [id] => 42 [parent_id] => 83 [field1] => value1 [field2] => value2 [field3] => value3 ) [AssociatedModelName] => Array ( [id] => 2 [field1] => value1 [field2] => value2 [field3] => value3 ) [children] => Array ( )

) ) )

) ...

El orden en el que aparecen los resultados puede ser cambiado como lo es la influencia de la orden de procesamiento. Por ejemplo, si 'order' => 'name ASC' es pasado en los parmetros a find('threaded'), los resultados van a aparecer en orden segn el nombre. Del mismo modo cualquier orden puede ser usado, there is no inbuilt requirement of this method for the top result to be returned first. No hay parmetros adicionales usados por find('threaded').

3.7.3.1.6 find('neighbors')

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones find('neighbors', $params) 'neighbors' realiza una bsqueda similar a 'first', a diferencia que devuelve el registro precedente y posterior del solicitado. A continuacin un (cdigo en controlador) ejemplo: 1. function some_function() { 2. $neighbors = $this->Article->find('neighbors', array('field' => 'id', 'value' => 3)); 3. } En este ejemplo podemos ver dos elementos esenciales del arreglo $params: 'field' y 'value'. Adems de estos, se pueden utilizar otros elementos que se utilizan en las dems implementaciones del mtodo find (Por ejemplo: Si tu modelo acta como contenedor, deberas de utilizar 'contain' en el arreglo $params). El formato de salida para una llamada find('neighbors') es de la siguiente forma:
Array ( [prev] => Array ( [ModelName] => Array ( [id] => 2 [field1] => value1 [field2] => value2 ... ) [AssociatedModelName] => Array ( [id] => 151 [field1] => value1 [field2] => value2 ... ) ) [next] => Array ( [ModelName] => Array ( [id] => 4 [field1] => value1 [field2] => value2 ... )

[AssociatedModelName] => Array ( [id] => 122 [field1] => value1 [field2] => value2 ... ) ) )

Note que el resultado siempre tendr dos arreglos principales: prev y next.
3.7.3.2 findAllBy

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones findAllBy<nombreCampo>(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 (<nombreCampo>) y proporciona los criterios para ese campo como primer parmetro.
3.7.3.3 findBy

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones findBy<nombreCampo>(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<x> en PHP5 $this->Product->findAllByOrderStatus(3); Fragmento SQL Correspondiente 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<x> en PHP4 Fragmento SQL Correspondiente $this->Product->findAllByOrder_status(3); Product.order_status = 3 $this->Recipe->findAllByType(Cookie); Recipe.type = Cookie $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().
3.7.3.4 query

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones query(string $consulta) Se pueden realizar llamadas SQL personalizadas usando el mtodo query() del modelo. Si alguna vez usas consultas SQL personalizadas en tu aplicacin, no olvides leer la seccin Desinfeccin de Datos (Sanitization) de CakePHP, la cual ayuda a limpiar datos de usuario de injection y ataques de cross-site scripting. 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: 1. $this->Fotografia->query("SELECT * FROM fotografias LIMIT 2;"); debera devolver 1. 2. 3. 4. 5. 6. 7. 8. Array ( [0] => Array ( [fotografas] => Array ( [id] => 1304 [user_id] => 759

9. ) 10.) 11.[1] => Array 12.( 13.[fotografas] => Array 14.( 15.[id] => 1305 16.[user_id] => 759 17.) 18.) 19.) 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: 1. $this->Fotografia->query("SELECT * FROM fotografia AS Fotografia LIMIT 2;"); la cual devuelve 1. Array 2. ( 3. [0] => Array 4. ( 5. [Fotografia] 6. ( 7. [id] => 1304 8. [user_id] => 9. ) 10.) 11.[1] => Array 12.( 13.[Fotografia] 14.( 15.[id] => 1305 16.[user_id] => 17.) 18.) 19.)
3.7.3.5 field

=> Array 759

=> Array 759

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original

Mas info sobre traduciones 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.
3.7.3.6 read()

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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. 1. function beforeDelete($cascade) { 2. ... 3. $rating = $this->read('rating'); // obtiene el <em>rating</em> del registro que ser borrado. 4. $name = $this->read('name', $id2); // obtiene el nombre un segundo registro. 5. $rating = $this->read('rating'); // obtiene el <em>rating</em> del segundo registro 6. $this->id = $id3; // 7. $this->Article->read(); // lee un tercer registro, especificado por <code>$id3</code>. 8. $record = $this->data // almacena el tercer registro en <code>$record</code> 9. ... 10.} 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. Las lineas 6-8 demuestran como read() cambia los datos

del modelo actual.


3.7.3.7 Condiciones Complejas de Bsqueda

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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: 1. $condiciones = array("Articulo.title" => "Esto es un artculo"); 2. // Ejemplo de uso con un modelo: 3. $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. 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': 1. 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: 1. array( 2. "Articulo.title" => array("Primer artculo", "Segundo artculo", "Tercer artculo") 3. ) Para realizar una bsqueda con condicin NOT IN(...) para encontrar artculos cuyo ttulo no est

en el conjunto de valores dado: 1. array( 2. "NOT" => array( "Articulo.title" => array("Primer artculo", "Segundo artculo", "Tercer artculo") ) 3. ) Aadir filtros adicionales a las condiciones es tan simple como aadir pares clave/valor adicionales al array: 1. array ( 2. "Articulo.title" => array("Primer artculo", "Segundo artculo", "Tercer artculo"), 3. "Articulo.created >" => date('Y-m-d', strtotime("-2 weeks")) 4. ) Tambin puedes crear bsquedas que comparen dos campos en la base de datos: 1. 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 coincida con alguno de los dados en el conjunto ("Primer artculo",...). No obstante, podemos igualmente buscar artculos que coincidan con cualquiera de las condiciones: 1. array( 2. "or" => array ( 3. "Articulo.title" => array("Primer artculo", "Segundo artculo", "Tercer artculo"), 4. "Articulo.created >" => date('Y-m-d', strtotime("-2 weeks")) 5. ) 6. ) 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 Articulos 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: 1. 2. 3. 4. 5. 6. 7. 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: 1. array (

2. 3. 4. 5.

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

Para manejar consultas con BETWEEN, puedes usar lo siguiente: 1. 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. Puedes crear condiciones muy complejas anidando mltiples arrays de condiciones: 1. array( 2. 'OR' => array( 3. array('Compania.name' => 'Emporio Futuro'), 4. array('Compania.name' => 'Megatrabajos de Acero') 5. ), 6. 'AND' => array( 7. array( 8. 'OR'=>array( 9. array('Compania.status' => 'activo'), 10.'NOT'=>array( 11.array('Compania.status'=> array('inactivo', 'suspendido')) 12.) 13.) 14.) 15.) 16.); Las cuales producen el siguiente cdigo SQL: 1. SELECT `Compania`.`id`, `Compania`.`name`, 2. `Compania`.`description`, `Compania`.`location`, 3. `Compania`.`created`, `Compania`.`status`, `Compania`.`size` 4. FROM 5. `companias` AS `Compania` 6. WHERE 7. ((`Compania`.`name` = 'Emporio Futuro') 8. OR 9. (`Compania`.`name` = 'Megatrabajos de Acero')) 10.AND 11.((`Compania`.`status` = 'activo') 12.OR (NOT (`Compania`.`status` IN ('inactivo', 'suspendido'))))
3.7.4 Guardando Tus Datos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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: 1. function edit($id) { 2. // Ha POSTeado algn dormulario datos? 3. if(!empty($this->data)) { 4. // Si el formulario puede ser validado y salvado... 5. if($this->Receta->save($this->data)) { 6. // Establede un mensaje flash y redirige. 7. $this->Session->setFlash("Receta guardada!"); 8. $this->redirect('/recetas'); 9. } 10.} 11.// Si no hay datos de formularo, busca la receta a editar y psala a la vista 12.$this->set('receta', $this->Receta->findById($id)); 13.} 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 (ver el captulo de validacin de datos para ms informacin). Si por alguna razn tus datos no se graban, comprueba si alguna regla de validacin se est incumpliendo. 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). 1. $this->Ingrediente->save($datosNuevos); 2. $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: 1. $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 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: 1. 2. 3. 4. 5. $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: 1. 2. 3. 4. $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 ( [0] => Array ( ) [1] => Array ( ) ) [titulo] => titulo 1

[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:
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 ( [0] => Array ( [comentario] => Comment 1 [user_id] => 1 ) [1] => Array ( [comentario] => Comment 2 [user_id] => 2 ) ) )

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

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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. 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. <?php function add() { if (!empty($this->data)) { // Podemos guardar los datos de Usuario // deberan estar en: $this->data['Usuario'] $this->Usuario->save($this->data); // El ID del nuevo Usuario est ahora en $this->User->id, as que lo 8. // aadimos a los datos a grabar y grabamos el Perfil 9. $this->data['Perfil']['usuario_id'] = $this->Usuario->id; 10.// Como nuestro "Usuario hasOne Perfil", podemos acceder 11.// al modelo Perfil a travs del modelo Usuario 12.$this->Usuario->Perfil->save($this->data); 13.} 14.} 15.?> 1. 2. 3. 4. 5. 6. 7. 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. Primero, necesitas construir tu formulario tanto para el modelo Compaa como el modelo Cuenta (asumismo que Compaa hasMany Cuenta). 1. echo $form->create(Compaa, array('action'=>'add')); 2. echo $form->input('Compaa.nombre', array('label'=>'Nombre de compaa')); 3. echo $form->input('Compaa.descripcin'); 4. echo $form->input('Compaa.localizacin'); 5. echo $form->input('Cuenta.0.nombre', array('label'=>'Nombre de cuenta')); 6. echo $form->input('Cuenta.0.nombreusuario'); 7. echo $form->input('Cuenta.0.email'); 8. 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) llegue 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(): 1. function add() { 2. if(!empty($this->data)) { 3. $this->Compaia->saveAll($this->data, array('validate'=>'first')); 4. } 5. } 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.
3.7.4.1.1 counterCache - Cache your count()

Traducir Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

This function helps you cache the count of related data. Instead of counting the records manually via find('count'), the model itself tracks any addition/deleting towards the associated $hasMany model and increases/decreases a dedicated integer field within the parent model table. The name of the field consists of the singular model name followed by a underscore and the word "count". 1. my_model_count Let's say you have a model called ImageComment and a model called Image, you would add a new INT-field to the image table and name it image_comment_count. Here are some more examples: Model Associated Model Example User Image users.image_count Image ImageComment images.image_comment_count BlogEntry BlogEntryComment blog_entries.blog_entry_comment_count Once you have added the counter field you are good to go. Activate counter-cache in your association by adding a counterCache key and set the value to true. 1. 2. 3. 4. 5. class Image extends AppModel { var $belongsTo = array( 'ImageAlbum' => array('counterCache' => true) ); }

From now on, every time you add or remove a Image associated to ImageAlbum, the number within image_count is adjusted automatically. You can also specify counterScope. It allows you to specify a simple condition which tells the model when to update (or when not to, depending on how you look at it) the counter value. Using our Image model example, we can specify it like so: class Image extends AppModel { var $belongsTo = array( 'ImageAlbum' => array( 'counterCache' => true, 'counterScope' => array('Image.active' => 1) // only count if "Image" is active = 1 6. )); 7. } 1. 2. 3. 4. 5.
3.7.4.2 Guardando Datos de Modelos Relacionados (HABTM)

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones 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 modelo y todo queda enlazado correctamente. Con HABTM (Has And Belongs To Many), necesitas establecer el ID del modelo asociado en tu array de datos. Construiremos un formulario que crea una nueva etiqueta y la asocia al vuelo con alguna receta. El formulario ms simple debera parecerse al algo como esto (asumimos que $receta_id ya est establecido a algo): 1. <?php 2. echo $form->create('Etiqueta'); 3. echo $form->input('Receta.id', array('type'=>'hidden', 'value' => $receta_id)); 4. echo $form->input('Etiqueta.nombre'); 5. echo $form->end('Aadir etiqueta'); 6. ?> En este ejemplo, puedes ver el campo oculto Receta.id cuyo valor se establece al ID de la receta a la que queremos enlazar la etiqueta. La accin del controlador que se encarga de guardar este formulario es muy simple: 1. 2. 3. 4. 5. 6. function add() { // Graba la asociacin if ($this->Etiqueta->save($this->data)) { // Hacer algo si todo fue bien } }

Y de esa manera, nuestra nueva Etiqueta es creada y asociada con Receta, cuyo ID estaba en $this>data['Receta']['id'].
3.7.5 Borrando Datos

Editar Ver slo esta seccin Historia Comparar con el contenido original

Estos mtodos pueden ser usados para eliminar datos.


3.7.5.1 del

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este

differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones del(int $id = null, boolean $cascada = true); Borra el registro identificado por $id. Por defecto, tambin 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 tambin son borrados si el valor de dependent (ver la seccin hasMany) en el modelo est establecida a true. si $cascada est establecido a false, los registros Receta permanecern despus de que el Usuario haya sido borrado.
3.7.5.2 deleteAll

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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 debera ser pasado como un fragmento SQL o array.
3.7.6 Asociaciones: Enlazando Modelos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Una de las caractersticas ms 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 aplicacin debera 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 propsito de esta seccin es mostrarte cmo disear, definir y utilizar asociaciones entre modelos en CakePHP. Mientras que los datos pueden provenir de una variedad de orgenes, la form ms comn de almacenamiento en aplicaciones web es una base de datos relacional. La mayora de cosas que cubre esta seccin estar en ese contexto. Para obtener informacin sobre asociaciones con modelos de Plugin, ver Plugin Models.
3.7.6.1 Tipos de Relaciones

Editar Ver slo esta seccin Historia Comparar con el contenido original

Los cuatro tipos de relaciones en CakePHP son: hasOne, hasMany, belongsTo y hasAndBelongsToMany (HABTM), "tiene un", "tiene muchos", "pertenece a" y "tiene y pertenece a muchos", respectivamente. Ejemplo Un usuario tiene un perfil. Un usuario puede tener mltiples uno a muchos hasMany ("tiene muchos") recetas. muchos a uno belongsTo ("pertenece a") Muchas recetas pertenecen a un usuario. muchos a hasAndBelongsToMany ("tiene y pertenece a Las recetas tienen, y pertenecen a, muchos muchos") muchas etiquetas. Las asociaciones son definidas creando una variable de clase nombrada tras la asociacin que ests definiendo. La variable de clase puede, a veces, ser tan simple como una cadena de caracteres, pero puede ser tan completa como un array multidimensional usado para definir asociaciones concretas. 1. <?php 2. class Usuario extends AppModel { 3. var $name = 'Usuario'; 4. var $hasOne = 'Pefil'; 5. var $hasMany = array( 6. 'Receta' => array( 7. 'className' => 'Receta', 8. 'conditions' => array('Receta.aprobada' => '1'), 9. 'order' => 'Receta.created DESC' 10.) 11.); 12.} 13.?> Relacin uno a uno Tipo de Asociacin hasOne ("tiene un")

En el ejemplo de arriba, la primera instancia de la palabra 'Receta' es lo que se llama un 'Alias'. Este es un identificador para la relacin y puede ser cualquier cosa que escojas. Normalmente, escogers el mismo nombre que la clase que referencia. De todos modos, los alias han de ser nicos dentro de un modelo dado y en ambas partes de una relacin belongsTo/hasMany o belongsTo/hasOne. Escoger nombres no nicos para alias puede causar comportamiento inesperados.
3.7.6.2 hasOne

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Configuremos un modelo Usuario con una relacin hasOne con un modelo Perfil. Primero, necesitas establecer las claves de tus tablas de base de datos correctamente. Para que funcione una relacin hasOne correctamente, una tabla ha de contener una clave fornea que apunte a un registro en la otra. En este caso, la tabla 'perfiles' contendr un campo llamado usuario_id. El patrn bsico es: hasOne: el otro modelo contiene la clave fornea. Relacin Esquema Manzana hasOne Pltano plananos.manzana_id Usuario hasOne Perfil perfiles.usuario_id Doctor hasOne Mentor mentores.doctor_id El archivo del modelo Usuario ser grabado en /app/models/usuario.php. Para definir la asociacin 'Usuario hasOne Perfil', aade la propiedad $hasOne a la clase del modelo. Recuerda tener un modelo Perfil en /app/models/perfil.php, o la asociacin no funcionar. 1. 2. 3. 4. 5. 6. <?php class Usuario extends AppModel { var $name = 'Usuario'; var $hasOne = 'Perfil'; } ?>

Hay dos manera de describir esta relacin en tus archivos del modelo. La manera ms simple es establecer el atributo $hasOne a una cadena de caracteres conteniendo el nombre de la clase del modelo asociado, como hemos hecho arriba. Si necesitas ms control, puedes definir tus asociaciones utilizando sintaxis de arrays. Por ejemplo, podras desear limitar la asociacin para incluir slo ciertos registros. 1. <?php 2. class Usuario extends AppModel {

3. var $name = 'Usuario'; 4. var $hasOne = array( 5. 'Perfil' => array( 6. 'className' => 'Perfil', 7. 'conditions' => array('Perfil.publicado' => '1'), 8. 'dependent' => true 9. ) 10.); 11.} 12.?> Las claves posibles para los arrays de asociaciones hasOne incluyen: className: el nombre de la clase del modelo que est siendo asociado al modelo actual. si ests definiendo una relacin 'Usuario hasOne Perfil', la clave className debera ser igual a 'Perfil'. foreignKey: el nombre de la clave fornea que se encuentra en el otro modelo. Esto es especialmente til si necesitas definir mltiples relaciones hasOne. El valor por defecto para esta clave es el nombre en singular del modelo actual, seguido del sufijo '_id'. En el ejemplo de arriba, debera ser por defecto 'usuario_id'. conditions: Un fragmento SQL usado para filtrar registros del modelo relacionado. Es buena prctica usar nombres de modelos en los fragmentos SQL: 'Perfil.aprobado = 1' siempre es mejor que simplemente 'aprobado = 1'. fields: Una lista de campos a ser devueltos cuando se traen los datos del modelo asociado. Por defecto devuelve todos los campos. dependent: Cuando la clave dependent se establece a true, y el mtodo delete() del modelo es llamado con el parmetro $cascada con valor true, los registros del modelo asociado tambin son borrados. En este caso lo ponemos a true de manera que borrando un Usuario tambin borrar su Perfil asociado. Una vez que esta asociacin ha sido definida, las operaciones de bsqueda en el modelo usuario traern tambin el registro Perfil relacionado si existe:
// Resultados de ejemplo de una llamada a $this->Usuario->find() Array ( [Usuario] => Array ( [id] => 121 [name] => Gwoo the Kungwoo [created] => 2007-05-01 10:31:01 ) [Perfil] => Array ( [id] => 12 [user_id] => 121 [habilidad] => Hornear Pasteles [created] => 2007-05-01 10:31:01 ) )

3.7.6.3 belongsTo

Editar Ver slo esta seccin Historia Comparar con el contenido original

Ahora que tenemos acceso a los datos de Perfil desde el modelo Usuario, definamos la asociacin belongsTo (perteneceA) en el modelo Perfil para tener acceso a los datos de Usario relacionados. La asociacin belongsTo es un complemento natural a las asociaciones hasOne (tieneUn) y hasMany (tieneMuchos): nos permite ver los datos de la otra direccin. A la hora de establecer las claves de las tablas de tu base de datos para una relacin belongsTo, sigue estas convenciones: belongsTo: el modelo actual contiene la clave fornea. Relacin Esquema Platano belongsTo Manzana platanos.manzana_id Perfil belongsTo Usuario perfiles.usuario_id Mentor belongsTo Doctor mentores.doctor_id Si un modelo (tabla) contiene una clave fornea, "perteneceA" (belongsTo) el otro modelo (tabla). Podemos definir la asociacin belongsTo en nuestro modelo Perfil en /app/models/perfil.php usando la sintaxis de cadena de caracteres as: 1. 2. 3. 4. 5. 6. <?php class Perfil extends AppModel { var $name = 'Perfil'; var $belongsTo = 'Usuario'; } ?>

Tambin podemos definir una relacin ms especfica usando sintaxis de arrays: 1. <?php 2. class Perfil extends AppModel { 3. var $name = 'Perfil'; 4. var $belongsTo = array( 5. 'Usuario' => array( 6. 'className' => 'Usuario', 7. 'foreignKey' => 'usuario_id' 8. ) 9. ); 10.} 11.?> Claves posibles para los arrays de la asociacin belongsTo son: className: el nombre de la clase del modelo que se est asociando al modelo actual. Si ests definiendo una relacin 'Perfil belongsTo Usuario', la clave className ha de tener el valor 'Usuario'. foreignKey: el nombre de la clave fornea que se encuentra en el modelo actual. Esto es especialmente til si necesitas definir mltiples relaciones belongsTo. El valor por defecto de

esta clave es el nombre en singular del otro modelo (separado por guiones de subrayado) con el sufijo '_id'. conditions: el fragmento SQL filtra los registros del modelo relacionado. Es buena prctica usar el nombre de los modelos en los fragmentos SQL: 'Usuario.activo = 1' siempre es mejor que simplemente 'activo = 1'. fields: lista de campos a ser recuperados cuando los datos del modelo asociado se traen de la base de datos. Por defecto devuelve todos los campos. counterCache: (booleano) si se establece a true, el modelo asociado automticamente incrementar o decrementar el campo '[nombre_modelo_en_singular]_count' de la tabla fornea siempre que hagas un save() o delete() (ver counterCache). El valor en el campo contador representa el nmero de filas relacionadas. Una vez que esta asociacin ha sido definida, las operaciones de bsqueda en el modelo Perfil tambin traern el registro de Usuario relacionado si existe:
// Resultados de ejemplo de la llamada a $this->Perfil->find(). Array ( [Perfil] => Array ( [id] => 12 [usuario_id] => 121 [habilidad] => Baking Cakes [created] => 2007-05-01 10:31:01 ) [Usuario] => Array ( [id] => 121 [name] => Gwoo the Kungwoo [created] => 2007-05-01 10:31:01 ) )

3.7.6.4 hasMany

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Siguiente paso: definiendo una asociacin "Usuario hasMany Comentario". Una asociacin hasMany (tieneMuchos) nos permitir traer los comentarios del usuario cuando se trae un registro Usuario. A la hora de establecer las claves de las tablas de tu base de datos para una relacin hasMany, sigue estas convenciones: hasMany: el otro modelo contiene la clave fornea.

Relacin Esquema Usuario hasMany Comentario comentarios.usuario_id Cake hasMany Virtud virtudes.cake_id Producto hasMany Opcion opciones.producto_id Podemos definir la asociacin hasMany en nuestro modelo Usuario en /app/models/usuario.php usando la sintaxis de cadena de caracteres as: 1. 2. 3. 4. 5. 6. <?php class Usuario extends AppModel { var $name = 'Usuario'; var $hasMany = 'Comentario'; } ?>

Tambin podemos definir una relacin ms especfica usando sintaxis de arrays: 1. <?php 2. class Usuario extends AppModel { 3. var $name = 'Usuario'; 4. var $hasMany = array( 5. 'Comentario' => array( 6. 'className' => 'Comentario', 7. 'foreignKey' => 'usuario_id', 8. 'conditions' => array('Comentario.estado' => '1'), 9. 'order' => 'Comentario.created DESC', 10.'limit' => '5', 11.'dependent'=> true 12.) 13.); 14.} 15.?> Las claves posibles para los arrays de la asociacin hasMany son: className: el nombre de la clase del modelo que est siendo relacionado con el modelo actual. Si ests definiendo una relacin 'Usuario hasMany Comentario', el valor de clasName ha de ser 'Comentario'. foreignKey: el nombre de la clave fornea en el otro modelo. Esto es especialmente til si necesitas definir mltiples relaciones hasMany. El valor por defecto para esta clave es el nombre en singular del otro modelo (separado por guiones de subrayado), con el sufijo '_id'. conditions: un fragmento SQL filtra los registros del modelo relacionado. Es buena prctica usar el nombre de los modelos en los fragmentos SQL: 'Usuario.activo = 1' siempre es mejor que simplemente 'activo = 1'. fields: lista de campos a ser recuperados cuando los datos del modelo asociado se traen de la base de datos. Por defecto devuelve todos los campos. order: un fragmento SQL que define el orden de las filas asociadas devueltas. limit: el nmero mximo de filas asociadas que quieres que devuelva. offset: el nmero de filas asociadas que quieres saltarte (dadas las condiciones y orden actuales) antes de traer las filas y asociarlas. dependent: Cuando dependent se establece a true, es posible el borrado recursivo del

modelo. En este ejemplo, los registros Comentario sern borrados cuando sus registros Usuario asociados han sido borrados. El segundo parmetro del mtodo Modelo->delete() ha de establecerse a true para que ocurra un borrado recursivo. finderQuery: Una consulta SQL completa que CakePHP puede usar para traer los registros del modelo asociado. Esto debera ser usado en situaciones que requieren unos resultados muy personalizados. Una vez que esta asociacin ha sido definida, las operaciones de bsqueda en el modelo Usuario tambin traern los registros Comentario relacionados si existen:
// Resultados de ejemplo de llamada a $this->Usuario->find(). Array ( [Usuario] => Array ( [id] => 121 [name] => Gwoo the Kungwoo [created] => 2007-05-01 10:31:01 ) [Comentario] => Array ( [0] => Array ( [id] => 123 [usuario_id] => 121 [title] => On Gwoo the Kungwoo [cuerpo] => The Kungwooness is not so Gwooish [created] => 2006-05-01 10:31:01 ) [1] => Array ( [id] => 123 [usuario_id] => 121 [title] => More on Gwoo [cuerpo] => But what of the Nut? [created] => 2006-05-01 10:41:01 ) ) )

Algo a recordar es que necesitars la asociacin complementaria 'Comentario belongsTo Usuario' para obtener los datos en ambas direcciones. Lo que hemos esbozado en esta seccin te permite obtener datos de Comentario desde Usuario. Aadir la asociacin 'Comentario belongsTo Usuario' en el modelo comentario te permite obtener los datos de Usuario desde el modelo Comentario, completando la conexin y permitiendo el flujo de la informacin desde ambas perspectivas del modelo.
3.7.6.5 hasAndBelongsToMany (HABTM)

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Perfecto. En este punto puedes llamarte "profesional de asociaciones del modelo de CakePHP". Ya ests versado en tres de las asociaciones que tratan la mayora de las relaciones de objetos. Tratemos el ltimo tipo de relacin: hasAndBelongsToMany (tieneYPerteneceAMuchos), o HABTM. Esta asociacin es usada cuando tienes dos modelos que necesitas unir, repetidamente, muchas veces, de muchas maneras distintas. La principal diferencia entre hasMany y HABTM es que un enlace entre modelos en HABTM no es exclusivo. Por ejemplo, vamos a unir nuestro modelo Receta con un modelo Etiqueta usando HABTM. Atando la etiqueta 'Italiano' a la receta 'Gnocci' de mi abuela no 'acapara' la etiqueta; tambin puedo etiquetar con 'Italiano' mis 'Espaguettis a la barbacoa con miel glaseada". Los enlaces entre objetos asociados mediante hasMany son exclusivos. Si mi 'Usuario hasMany Comentarios', un comentario est slo enlazado a un usuario especfico. Deja de estar disponible para todos. Continuando. Necesitaremos establecer una tabla extra en la base de datos para manejar las asociaciones HABTM. El nombre de esta nueva tabla de unin necesita incluir los nombres de ambos modelos involucrados en plural, en orden alfabtico, y separados por un guin de subrayado ( _ ). El esquema de la tabla debera contener como mnimo dos campos, cada uno clave fornea (que deberan ser enteros) apuntando a ambas claves primarias de los modelos involucrados. HABTM necesita una tabla de unin separada que incluya los nombres de ambos modelos. Relacin Esquema Receta HABTM Etiqueta id, etiquetas_recetas.receta_id, etiquetas_recetas.etiqueta_id Cake HABTM Fan id, cakes_fans.cake_id, cakes_fans.fan_id Foo HABTM Bar id, bars_foos.foo_id, bars_foos.bar_id Los nombres de las tablas estn, por convencin, en orden alfabtico. Una vez que esta nueva tabla ha sido creada, podemos definir las asociaciones HABTM en los ficheros del modelo. Vamos a saltar directamente a la sintaxis de arrays esta vez: 1. <?php 2. class Receta extends AppModel { 3. var $name = 'Receta'; 4. var $hasAndBelongsToMany = array( 5. 'Etiqueta' => 6. array('className' => 'Etiqueta', 7. 'joinTable' => 'etiquetas_recetas', 8. 'foreignKey' => 'receta_id', 9. 'associationForeignKey' => 'etiqueta_id', 10.'with' => '', 11.'conditions' => '', 12.'order' => '', 13.'limit' => '',

14.'unique' => true, 15.'finderQuery' => '', 16.'deleteQuery' => '', 17.'insertQuery' => '' 18.) 19.); 20.} 21.?> Claves posibles para los arrays de asociaciones HABTM son: className: el nombre de la clase del modelo que se est asociando al modelo actual. Si ests definiendo una relacin 'Usuario hasAndBelongsToMany Comentarios', className debera ser igual a 'Comentario'. joinTable: el nombre de la tabla de unin usuada en esta asociacin (si si la tabla actual no se adhiere a la convencin de nombrado para tablas de unin HABTM). foreignKey: el nombre de la clave fornea que se encuentra en el modelo actual. Esto es especialmente til si necesitas definir mltiples relaciones HABTM. El valor por defecto para esta clave es el nombre en singular, separado por guiones de subrayado (_), del modelo actual con el sufijo '_id'. associationForeignKey: el nombre de la clave fornea que se encuentra en el otro modelo. Esto es especialmente til si necesitas definir mltiples relaciones HABTM. El valor por defecto para esta clave es el nombre en singulas, separado por guiones de subrayado (_), del modelo actual con el sufijo '_id'. with: define el nombre del modelo para la tabla de unin. Por defecto, CakePHP autocrear un modelo por ti. Usando el ejemplo de arriba, se llamara EtiquetaReceta. Usando esta clave puedes sustituir este nombre por defecto. El modelo de la tabla de unin puede ser usado como cualquier modelo 'regular' para acceder a la tabla de unin directamente conditions: fragmento SQL usado para filtrar registros del modelo relacionado. Es buena prctica usar nombres de modelos en los fragmentos SQL: 'Comentario.estado = 1' siempre es preferible a simplemente 'estado = 1'. fields: lista de campos a ser devueltos cuando los datos del modelo asociado son trados. Devuelve todos los campos por defecto. order: fragmento SQL que define el orden de las filas asociadas devueltas. limit: el nmero mximo de filas asociadas que deseas que sean devueltas. unique: si tiene el valor true (valor por defecto) Cake borrar primero los registros de relacin existentes en la tabla de claves forneas antes de insertar nuevas filas, cuando se actualiza un registro. As, las asociaciones existentes debern ser pasadas de nuevo durante las actualizaciones. offset: el nmero de filas asociadas que omitir (dadas las condiciones actuales y orden) antes de buscar y asociar. finderQuery, deleteQuery, insertQuery: una consulta SQL completa que CakePHP puede usar para buscar, borrar o crear nuevos registros del modelo asociado. Esto debera ser usado en situaciones que requieren resultados muy personalizados. Una vez que esta asociacin ha sido definida, las operaciones de bsqueda en el modelo Receta tambin devolvern los registros Etiqueta relacionados si existen:
// Resultados de ejemplo de una llamada a $this->Receta->find().

Array ( [Receta] => Array ( [id] => 2745 [name] => Bombas de Cholocate con Azcar Glaseada [created] => 2007-05-01 10:31:01 [usuario_id] => 2346 ) [Etiqueta] => Array ( [0] => Array ( [id] => 123 [name] => Desayuno ) [1] => Array ( [id] => 124 [name] => Postre ) [2] => Array ( [id] => 125 [name] => Enfermedad del Corazn ) ) )

Recuerda definir una asociacin HABTM en el modelo Etiqueta si quieres traer datos de Receta cuando uses el modelo Etiqueta. Tambin es posible ejecutar consultas de bsqueda personalizadas basadas en relaciones HABTM. Considera los ejemplos siguientes: Asumiendo la misma estructura en el ejemplo de arriba (Receta HABTM Etiqueta), digamos que queremos obtener todas las Recetas con la etiqueta 'Postre', una manera potencial (pero errnea) de conseguirlo sera aplicar una condicin a la misma asociacin: 1. 2. 3. 4. 5. 6. 7. 8. $this->Receta->bindModel(array( 'hasAndBelongsToMany' => array( 'Etiqueta' => array( 'conditions'=>array('Etiqueta.name'=>'Postre') ) ) ) ); $this->Receta->find('all');

// Datos devueltos Array ( 0 => Array { [Receta] => Array ( [id] => 2745 [name] => Bombas de Cholocate con Azcar Glaseada

) [Etiqueta] => Array ( [0] => Array ( [id] => 124 [name] => Postre ) )

[created] => 2007-05-01 10:31:01 [usuario_id] => 2346

) 1 => Array { [Receta] => Array ( [id] => 2745 [name] => Pasteles de Cangrejo [created] => 2008-05-01 10:31:01 [usuario_id] => 2349 ) [Etiqueta] => Array ( } } }

Notar que este ejemplo devuelve TODAS las recetas pero slo la etiqueta 'Postre'. Para conseguir nuestro objetivo adecuadamente, hay diversas maneras de hacerlo. Una opcin es buscar en el modelo Etiqueta (en vez de Receta), lo que nos dar tambin todas las Recetas asociadas. 1. $this->Receta->Tag->find('all', array('conditions'=>array('Etiqueta.name'=>'Postre'))); Podramos tambin usar el modelo de tabla de unin (que CakePHP nos provee), para buscar por un ID dado. 1. $this->Receta->bindModel(array('hasOne' => array('EtiquetaReceta'))); 2. $this->Receta->find('all', array( 3. 'fields' => array('Receta.*'), 4. 'conditions'=>array('EtiquetaReceta.etiqueta_id'=>124) // id de Postre 5. )); Tambin es posible crear una asociacin extica con el propsito de crear tantas uniones como necesarias para permitir el filtrado, por ejemplo: 1. 2. 3. 4. 5. 6. 7. $this->Receta->bindModel( array( 'hasOne' => array( 'EtiquetaReceta', 'EtiquetaFiltro' => array( 'className' => 'Tag', 'foreignKey' => false,

8. 'conditions' => array('EtiquetaFiltro.id = EtiquetaReceta.id') 9. ) 10.) 11.) 12.); 13.$this->Receta->find('all', array( 14.'fields' => array('Receta.*'), 15.'conditions'=>array('EtiquetaReceta.name'=>'Postre') 16.)); Ambos devolvern los siguientes datos:
// Datos devueltos Array ( 0 => Array { [Receta] => Array ( [id] => 2745 [name] => Bombas de Cholocate con Azcar Glaseada [created] => 2007-05-01 10:31:01 [usuario_id] => 2346 ) [Etiqueta] => Array ( [0] => Array ( [id] => 123 [name] => Desayuno ) [1] => Array ( [id] => 124 [name] => Postre ) [2] => Array ( [id] => 125 [name] => Enfermedad del corazn ) ) }

Para ms informacin sobre asociaciones de modelo ligadas al vuelo mira Creando y Destruyendo Asociaciones al Vuelo Mezcla y encaja tcnicas para conseguir tu objetivo especfico.
3.7.6.6 hasMany through (The Join Model)

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre

traduciones It is sometimes desirable to store additional data with a many to many association. Consider the following Student hasAndBelongsToMany Course Course hasAndBelongsToMany Student In other words, a Student can take many Courses and a Course can be taken my many Students. This is a simple many to many association demanding a table such as this
id | student_id | course_id

Now what if we want to store the number of days that were attended by the student on the course and their final grade? The table we'd want would be
id | student_id | course_id | days_attended | grade

The trouble is, hasAndBelongsToMany will not support this type of scenario because when hasAndBelongsToMany associations are saved, the association is deleted first. You would lose the extra data in the columns as it is not replaced in the new insert. The way to implement our requirement is to use a join model, otherwise known (in Rails) as a hasMany through association. That is, the association is a model itself. So, we can create a new model CourseMembership. Take a look at the following models. 1. student.php 2. class Student extends AppModel 3. { 4. public $hasMany = array( 5. 'CourseMembership' 6. ); 7. public $validate = array( 8. 'first_name' => array( 9. 'rule' => 'notEmpty', 10.'message' => 'A first name is required' 11.), 12.'last_name' => array( 13.'rule' => 'notEmpty', 14.'message' => 'A last name is required' 15.) 16.); 17.} 18.course.php 19.class Course extends AppModel 20.{ 21.public $hasMany = array( 22.'CourseMembership' 23.); 24.public $validate = array( 25.'name' => array( 26.'rule' => 'notEmpty', 27.'message' => 'A course name is required'

28.) 29.); 30.} 31.course_membership.php 32.class CourseMembership extends AppModel 33.{ 34.public $belongsTo = array( 35.'Student', 'Course' 36.); 37.public $validate = array( 38.'days_attended' => array( 39.'rule' => 'numeric', 40.'message' => 'Enter the number of days the student attended' 41.), 42.'grade' => array( 43.'rule' => 'notEmpty', 44.'message' => 'Select the grade the student received' 45.) 46.); 47.} The CourseMembership join model uniquely identifies a given Student's participation on a Course in addition to extra meta-information.

Working with join model data


Now that the models have been defined, let's see how we can save all of this. Let's say the Head of Cake School has asked us the developer to write an application that allows him to log a student's attendance on a course with days attended and grade. Take a look at the following code. controllers/course_membership_controller.php class CourseMembershipsController extends AppController { public $uses = array('CourseMembership'); public function index() { $this->set('course_memberships_list', $this->CourseMembership>find('all')); 7. } 8. public function add() { 9. if (! empty($this->data)) { 10.if ($this->CourseMembership->saveAll( 11.$this->data, array('validate' => 'first'))) { 12.$this->redirect(array('action' => 'index')); 13.} 14.} 15.} 16.} 17.views/course_memberships/add.ctp 18.<?php echo $form->create('CourseMembership'); ?> 1. 2. 3. 4. 5. 6.

19.<?php echo $form->input('Student.first_name'); ?> 20.<?php echo $form->input('Student.last_name'); ?> 21.<?php echo $form->input('Course.name'); ?> 22.<?php echo $form->input('CourseMembership.days_attended'); ?> 23.<?php echo $form->input('CourseMembership.grade'); ?> 24.<button type="submit">Save</button> 25.<?php echo $form->end(); ?> You can see that the form uses the form helper's dot notation to build up the data array for the controller's save which looks a bit like this when submitted.
Array ( [Student] => Array ( [first_name] => Joe [last_name] => Bloggs ) [Course] => Array ( [name] => Cake ) [CourseMembership] => Array ( [days_attended] => 5 [grade] => A ) )

Cake will happily be able to save the lot together and assigning the foreign keys of the Student and Course into CourseMembership with a saveAll call with this data structure. If we run the index action of our CourseMembershipsController the data structure received now from a find('all') is:
Array ( [0] => Array ( [CourseMembership] => Array ( [id] => 1 [student_id] => 1 [course_id] => 1 [days_attended] => 5 [grade] => A ) [Student] => Array ( [id] => 1 [first_name] => Joe [last_name] => Bloggs ) [Course] => Array

( [id] => 1 [name] => Cake ) ) )

There are of course many ways to work with a join model. The version above assumes you want to save everything at-once. There will be cases where you want to create the Student and Course independently and at a later point associate the two together with a CourseMembership. So you might have a form that allows selection of existing students and courses from picklists or ID entry and then the two meta-fields for the CourseMembership, e.g. 1. views/course_memberships/add.ctp 2. <?php echo $form->create('CourseMembership'); ?> 3. <?php echo $form->input('Student.id', array('type' => 'text', 'label' => 'Student ID', 'default' => 1)); ?> 4. <?php echo $form->input('Course.id', array('type' => 'text', 'label' => 'Course ID', 'default' => 1)); ?> 5. <?php echo $form->input('CourseMembership.days_attended'); ?> 6. <?php echo $form->input('CourseMembership.grade'); ?> 7. <button type="submit">Save</button> 8. <?php echo $form->end(); ?> And the resultant POST
Array ( [Student] => Array ( [id] => 1 ) [Course] => Array ( [id] => 1 ) [CourseMembership] => Array ( [days_attended] => 10 [grade] => 5 ) )

Again Cake is good to us and pulls the Student id and Course id into the CourseMembership with the saveAll. Join models are pretty useful things to be able to use and Cake makes it easy to do so with its built-in hasMany and belongsTo associations and saveAll feature.

3.7.6.7 Creando y Destruyendo Asociaciones al Vuelo

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Algunas veces es necesario crear y destruir asociaciones del modelo al vuelo. Esto puede ser por varias razones: Quieres reducir la cantidad de datos asociados buscados, pero todas tus asociaciones estn en el primer nivel de recursin. Deseas cambiar la manera en que la asociacin est definida para ordenar o filtar los datos asociados. Esta creacin y destruccin de asociaciones se realiza usando los mtodos del modelo de CakePHP bindModel() y unbindModel(). Tambin hay un comportamiento muy til llamado 'Containable', mirar la seccin del manual sobre comportamientos empotrados para ms informacin. Establezcamos unos pocos modelos para que podamos ver cmo funcionan bindModel() y unbindModel(). Empezaremos con dos modelos: 1. <?php 2. class Lider extends AppModel { 3. var $name = 'Lider'; 4. var $hasMany = array( 5. 'Seguidor' => array( 6. 'className' => 'Seguidor', 7. 'order' => 'Seguidor.rango' 8. ) 9. ); 10.} 11.?> 12. 13.<?php 14.class Seguidor extends AppModel { 15.var $name = 'Seguidor'; 16.} 17.?> Ahora, en el LideresController podemos usar el mtodo find() en el modelo Lider para obtener un lider y sus seguidores asociados. Como puedes ver arriba, el array de asociacin en el modelo Lider define una relacin 'Lider hasMany Seguidores'. Por motivos demostrativos, usemos unbindModel() para eliminar esa asociacin en una accin de un controlador 1. function algunaAccion() { 2. // Esto obtiene Lideres, y sus Seguidores asociados

3. $this->Lider->findAll(); 4. // Eliminemos el hasMany... 5. $this->Lider->unbindModel( 6. array('hasMany' => array('Seguidor')) 7. ); 8. // Ahora usar una funcion find devolver 9. // Lideres, sin Seguidores 10.$this->Lider->findAll(); 11.// NOTE: unbindModel slo afecta la siguiente funcin 12.// function. Una llamada adicional a find usar la 13.// informacin de la asociacin configurada. 14.// Hemos uado findAll() tras unbindModel(), 15.// as que esto obtendr Lideres con Seguidores asociados 16.// una vez ms... 17.$this->Lider->findAll(); 18.} Eliminar o aadir asociaciones usando bind- y unbindModel() slo funciona para la operacin del modelo next() a menos que el segundo parmetro haya sido establecido a false. Si el segundo parmetro ha sido establecido a false, la unin se mantiene para el resto de la peticin. Aqu est el patrn bsico de uso para unbindModel(): 1. $this->Modelo->unbindModel( 2. array('tipoAsociacion' => array('nombreDeClaseDelModeloAsociado')) 3. ); Ahora que hemos eliminado satisfactoriamente una asociacin al vuelo, aadamos otra. Nuestro Lider 'sin todava' principios necesita algunos Principios asociados. El fichero del modelo para nuestro modelo Principio est vaco, excepto por la declaracin var $name. Asociemos algunos Principios a nuestro Lider al vuelo (pero recuerda, slo para la siguiente operacin de bsqueda). Esta funcin aparece en LiderController: 1. function otraAccion() { 2. // No hay 'Lider hasMany Principio' en 3. // el fichero de modelo lider.php, asi que una bsqueda 4. // aqu slo obtiene Lideres. 5. $this->Lider->findAll(); 6. // Usemod bindModel() para aadir una nueva asociacin 7. // al modelo Lider: 8. $this->Lider->bindModel( 9. array('hasMany' => array( 10.'Principio' => array( 11.'className' => 'Principio' 12.) 13.) 14.) 15.); 16.// Ahora que hemos asociado correctamente, 17.// podemos usar una funcin de bsqueda para obtener

18.// Lideres con sus principios asociados: 19.$this->Lider->findAll(); 20.} Ah lo tienes. El uso bsico para bindModel() es la encapsulacin de un array normal de asociacin dentro de un array cuya clave es nombrada tras el tipo de asociacin que ests tratando de crear: 1. 2. 3. 4. 5. 6. 7. 8. $this->Modelo->bindModel( array('nombreAsociacion' => array( 'nombreDeClaseDelModeloAsociado' => array( // claves de asociacion normales van aqu... ) ) ) );

A pesar de que el nuevo modelo unido no necesita ningn tipo de asociacin en la definicin de su fichero de modelo, todava necesitar tener la clave correcta para que la nueva asociacin funcione correctamente.
3.7.6.8 Multiples relaciones al mismo modelo

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Hay casos en los que un Modelo tiene ms de una relacin a otro Modelo. Por ejemplo podras tener un Modelo Mensaje que tiene dos relaciones al Modelo Usuario. Una relacin con el usuario que enva el mensaje y una segunda relacin con el usuario que recibe el mensaje. La tabla mensaje tendr el campo usuario_id, pero tendr adems un campo receptor_id. Tu Modelo Mensaje lucira as:: 1. <?php 2. class Mensaje extends AppModel { 3. var $name = 'Mensaje'; 4. var $belongsTo = array( 5. 'Emisor' => array( 6. 'className' => 'Usuario', 7. 'foreignKey' => 'usuario_id' 8. ), 9. 'Receptor' => array( 10.'className' => 'Usuario', 11.'foreignKey' => 'receptor_id' 12.) 13.);

14.} 15.?> Receptor es un alias para el Modelo Usuario. Ahora veamos como se vera el Modelo Usuario. 1. <?php 2. class Usuario extends AppModel { 3. var $name = 'Usuario'; 4. var $hasMany = array( 5. 'MensajeEnviado' => array( 6. 'className' => 'Mensaje', 7. 'foreignKey' => 'usuario_id' 8. ), 9. 'MensajeRecibido' => array( 10.'className' => 'Mensaje', 11.'foreignKey' => 'receptor_id' 12.) 13.); 14.} 15.?>
3.7.6.9 Joining tables

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones In SQL you can combine related tables using the JOIN statement. This allows you to perform complex searches across multiples tables (i.e: search posts given several tags). In CakePHP some associations (belongsTo and hasOne) perform automatic joins to retrieve data, so you can issue queries to retrieve models based on data in the related one. But this is not the case with hasMany and hasAndBelongsToMany associations. Here is where forcing joins comes to the rescue. You only have to define the necessary joins to combine tables and get the desired results for your query. Remember you need to set the recursion to -1 for this to work. I.e: $this->Channel->recursive = -1; To force a join between tables you need to use the "modern" syntax for Model::find(), adding a 'joins' key to the $options array. For example: 1. 2. 3. 4. 5. 6. 7. 8. 9. $options['joins'] = array( array('table' => 'channels', 'alias' => 'Channel', 'type' => 'LEFT', 'conditions' => array( 'Channel.id = Item.channel_id', ) ) );

10.$Item->find('all', $options); Note that the 'join' arrays are not keyed. In the above example, a model called Item is left joined to the channels table. You can alias the table with the Model name, so the retrieved data complies with the CakePHP data structure. The keys that define the join are the following: table: The table for the join. alias: An alias to the table. The name of the model associated with the table is the best bet. type: The type of join: inner, left or right. conditions: The conditions to perform the join.

With joins, you could add conditions based on Related model fields: 1. $options['joins'] = array( 2. array('table' => 'channels', 3. 'alias' => 'Channel', 4. 'type' => 'LEFT', 5. 'conditions' => array( 6. 'Channel.id = Item.channel_id', 7. ) 8. ) 9. ); 10.$options['conditions'] = array( 11.'Channel.private' => 1 12.); 13.$privateItems = $Item->find('all', $options); You could perform several joins as needed in hasBelongsToMany: Suppose a Book hasAndBelongsToMany Tag association. This relation uses a books_tags table as join table, so you need to join the books table to the books_tags table, and this with the tags table: 1. $options['joins'] = array( 2. array('table' => 'books_tags', 3. 'alias' => 'BooksTag', 4. 'type' => 'inner', 5. 'conditions' => array( 6. 'Books.id = BooksTag.books_id' 7. ) 8. ), 9. array('table' => 'tags', 10.'alias' => 'Tag', 11.'type' => 'inner', 12.'conditions' => array( 13.'BooksTag.tag_id = Tag.id' 14.) 15.) 16.); 17.$options['conditions'] = array( 18.'Tag.tag' => 'Novel'

19.); 20.$books = $Book->find('all', $options); Using joins with Containable behavior could lead to some SQL errors (duplicate tables), so you need to use the joins method as an alternative for Containable if your main goal is to perform searches based on related data. Containable is best suited to restricting the amount of related data brought by a find statement.
3.7.7 Mtodos Callback

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si necesitas colar alguna lgica justo antes o despus de una operacin de modelo de CakePHP, utiliza los callbacks del modelo (funciones de retrollamada). Estas funciones pueden ser definidas en clases del modelo (incluido tu AppModel). Asegrate de mirar el valor de retorno esperado para cada una de estas funciones especiales.
3.7.7.1 beforeFind

Editar Ver slo esta seccin Historia Comparar con el contenido original

beforeFind(mixed $datosConsulta) Llamado antes de cualquier operacin relacionada con bsquedas. Los datos de consulta $datosConsulta pasados a este callback contienen informacin sobre la consulta actual: condiciones, campos, etc. Si no deseas que la operacin de bsqueda comience (posiblemente basado en una decisin relacionada con las opciones de $datosConsulta), devuelve false. De lo contrario, devuleve $datosConsulta posiblemente modificado, o cualquier cosa que quieras pasar a la bsquea y sus homlogos. Deberas usar este callback para restringir las operaciones de bsqueda basado en el rol de un usuario, o llevar a cabo decisiones de cacheo basadas en la carga actual.
3.7.7.2 afterFind

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original

Mas info sobre traduciones afterFind(array $resultados, bool $primario) Usa este callback para modficar los resultados que han sido devueltos de una operacin de bsqueda, o para realizar cualquier otra lgica tras la bsqueda. El parmetro $resultados pasado a este callback contiene los resultados devueltos por la operacin de bsqueda del modelo, p.ej. algo como: 1. 2. 3. 4. 5. 6. 7. 8. $resultados = array( 0 => array( 'NombreModelo' => array( 'campo1' => 'valor1', 'campo2' => 'valor2', ), ), );

Los valores devueltos por este callback deberan ser los resulados (posiblemente modificados) de la operacin de bsqueda que dispararon este callback. Si $primario es false, el formato de $resultados ser un poco diferente de lo que uno debera esperar; en vez del resultado que obtendras normalmente de una operacin de bsqueda, obtendras esto: 1. 2. 3. 4. $resultados = array( 'campo_1' => 'valor', 'campo_2' => 'valor2' );

El cdigo que espera que $primario sea true probablemente obtedr un error falta "Cannot use string offset as an array" de PHP si se usa una bsqueda recursiva Abajo se muestra un ejemplo de cmo afterFind puede ser usado para formateo de datos: function afterFind($resultados) { foreach ($resultados as $clave => $valor) { if (isset($valor['Evento']['fechainicio'])) { $resultados[$clave]['Evento']['fechainicio'] = $this>formatoFechaAfterFind($valor['Evento']['fechainicio']); 5. } 6. } 7. return $resultados; 8. } 9. function formatoFechatAfterFind($cadenaFecha) { 10.return date('d-m-Y', strtotime($cadenaFecha)); 11.} 1. 2. 3. 4.
3.7.7.3 beforeValidate

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones beforeValidate() Usa este callback para modificar datos del modelo antes de que sean validados. Tambin puede ser usado para aadir reglas de validacin adicionales ms complejas usando Model::invalidate(). En este contexto, los datos del modelo son accesibles via $this->data. Esta funcin tambin debe devolver true, de lo contrario la ejecucin actual de save() ser abortada.
3.7.7.4 beforeSave

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones beforeSave() Sita cualquier lgica de antes de grabar en esta funcin. Esta funcin se ejecuta inmediatamente despus de que los datos del modelo han sido satisfactoriamente validados, pero justo antes de que los datos sean grabados. Esta funcin debera tambin devolver true si deseas que contine la operacin de grabado. Este callback es especialmente til para cualquier lgica de tratamiento de datos que necesita ocurrir antes de que tus datos sean almacenados. Si tu mecanismo de almacenamiento necesita datos en un formato especfico, accede a ellos mediante $this->data y modifcalos. Abajo se muestra un ejemplo de cmo beforeSave puede ser usado para conversin de fechas. El cdigo en el ejemplo es usado para una aplicacin con una fechainicio formateada como AAAAMM-DD en la base de datos y es mostrada como DD-MM-AAAA en la aplicacin. Por supuesto, esto puede ser cambiado muy facilmente. Usa el cdigo siguiente en el modelo apropiado. 1. function beforeSave() { 2. if(!empty($this->data['Evento']['fechainicio']) && !empty($this>data['Evento']['fechafin'])) { 3. $this->data['Evento']['fechainicio'] = $this>formatoFechaBeforeSave($this->data['Evento']['fechainicio']); 4. $this->data['Evento']['fechafin'] = $this>formatoFechaBeforeSave($this->data['Evento']['fechafin']); 5. } 6. return true;

7. } 8. function formatoFechaBeforeSave($cadenaFecha) { 9. return date('Y-m-d', strtotime($cadenaFecha)); // Direction is from 10.} Asegrate de que beforeSave() devuelve true, o tu grabado fallar.
3.7.7.5 afterSave

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones afterSave(boolean $creado) Si tienes lgica que necesitas que sea ejecutada justo despus de cada operacin de grabacin, colcala en este mtodo callback. El valor de $creado ser true si fue creado un nuevo objeto (en vez de una actualizacin).
3.7.7.6 beforeDelete

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones beforeDelete(boolean $cascada) Coloca en esta funcin cualquier lgica de antes de borrar. Esta funcin debera devolver true si deseas que contine el borrado, y false si quieres que aborte. El valor de $cascada ser true si los registros que dependen de este registro tambin sern borrados.
3.7.7.7 afterDelete

Editar Ver slo esta seccin

Historia Comparar con el contenido original afterDelete() Coloca en este mtodo callback cualquier lgica que quieras que sea ejecutada despus de cada borrado.
3.7.7.8 onError

Editar Ver slo esta seccin Historia Comparar con el contenido original

onError() Callback llamado si ocurre cualquier problema.


3.7.8 Atributos del Modelo

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los atributos del modelo te permiten establecer propiedades que pueden redefinir el comportamiento por defecto del modelo. Para una lista completa de los atributos del modelo y sus respectivas descripciones, visita la API del CakePHP. Echa un vistazo a http://api.cakephp.org/1.2/class_model.html.
3.7.8.1 useDbConfig

Editar Ver slo esta seccin Historia Comparar con el contenido original

La propiedad useDbConfig es un cadena de caracteres que especifica el nombre de la conexin a la base de datos usada para enlazar tu clase modelo a la tabla de la base de datos relacionada. Puedes estabecer el valor a cualquiera de las conexiones definidas dentro de tu fichero de configuracin de tu base de datos. El fichero de configuracin de la base de datos se encuentra en /app/config/database.php. La propiedad useDbConfig tiene por defecto la conexin a la base de datos 'default' ( $useDbConfig = 'default'; )

Ejemplo de uso: 1. class Ejemplo extends AppModel { 2. var $useDbConfig = 'alternativo'; 3. }


3.7.8.2 useTable

Editar Ver slo esta seccin Historia Comparar con el contenido original

La propiedad $useTable especifica el nombre de la tabla de la base de datos. Por defecto, el modelo usa la forma plural y en minsculas del nombre de la clase del modelo. Establece este atributo al nombre de una tabla alternativa, o dale el valor false si deseas que el modelo no use una tabla de base de datos. Ejemplo de uso: 1. class Ejemplo extends AppModel { 2. var $useTable = false; // Este modelo no usa una tabla de base de datos 3. } Alternativamente: 1. class Ejemplo extends AppModel { 2. var $useTable = 'exmp'; // Este modelo usa la tabla 'exmp' de la base de datos 3. }
3.7.8.3 tablePrefix

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El nombre del prefijo de tabla usado para el modelo. El prefijo de tabla se establece inicialmente en el fichero de conexin a la base de datos /app/config/database.php. Por defecto es sin prefijo. Puedes sustituir la configuracin por defecto estableciendo el atributo tablePrefix en el modelo. Ejemplo de uso: 1. class Ejemplo extends AppModel { 2. var $tablePrefix = 'otros_'; // buscar la tabla 'otros_ejemplos'

3. }
3.7.8.4 primaryKey

Editar Ver slo esta seccin Historia Comparar con el contenido original

Normalmente cada tabla tiene una clave primaria id. Puedes cambiar qu nombre de campo usar el modelo como clave primaria. Esto es comn cuando se configura CakePHP para usar una tabla de base de datos ya existente. Ejemplo de uso: 1. class Ejemplo extends AppModel { 2. var $primaryKey = 'ejemplo_id'; // ejemplo_id es el nombre del campo en la base de datos 3. }
3.7.8.5 displayField

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El atributo displayField ('visualizarCampo') especifica qu campo de la base de datos debera ser usado como etiqueta para el registro. La etiqueta se utiliza en scaffolding y en llamadas find('lista'). El modelo usar por defecto el campo name o title. Por ejemplo, para utilizar el campo nombre_de_usuario: 1. class Ejemplo extends AppModel { 2. var $displayField = 'nombre_de_usuario'; 3. } No se pueden combinar nombres de campos mltiples en un nico campo de display (de visualizacin). Por ejemplo, no puedes especificar array('nombre', 'apellido') como campo de visualizacin.
3.7.8.6 recursive

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La propiedad $recursive define la profundidad a la que CakePHP ha de llegar para obtener los datos de modelos asociados mediante los mtodos find() y findAll(). Imagina que tu aplicacin muestra Grupos que pertenecen a un Dominio que tiene muchos Usuarios que, a su vez, tienen muchos Artculos. Puedes establecer $recursive con diferentes valores basados en la cantidad de datos quieres obtener con una llamada a $this->Grupo->find(): Profundidad Descripcin -1 Cake obtiene slo los datos de Grupo, no realiza uniones (joins). 0 Cake obtiene datos de Grupo y su Dominio 1 Cake obtiene un Grupo, su Dominio y sus Usuarios asociados Cake obtiene un Grupo, su Dominio, sus Usuarios asociados y los Artculos asociados a 2 los Usuarios No lo establezcas a un valor mayor de lo que necesites. Hacer que CakePHP obtenga datos que no vas a utilizar ralentiza tu aplicaci innecesariamente. Si deseas combinar $recursive con la funcionalidad de $fields, necesitars aadir las columnas que contienen las claves forneas necesarias al array fields manualmente. En el ejemplo de arriba, esto podra significar aadir domain_id.
3.7.8.7 order

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El criterio de ordenacin de datos por defecto para cualquier operacin de bsqueda. Algunos valores posibles son: 1. 2. 3. 4. 5. 6. $order = $order = $order = $order = $order = $order = "DESC"); "campo" "Modelo.campo"; "Modelo.campo asc"; "Modelo.campo ASC"; "Modelo.campo DESC"; array("Modelo.campo" => "asc", "Modelo.campo2" =>

3.7.8.8 data

Editar Ver slo esta seccin Historia Comparar con el contenido original

El contenedor para los datos del modelo que se han obtenido. A pesar de que los datos devueltos por una clase del modelo normalmente se utilizan como los devueltos por una llamada a find(), dentro de un callback del modelo necesitars acceder a la informacin almacenadana a travs de $data.
3.7.8.9 _schema

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Contiene metadatos describiendo los campos de tabla de la base de datos del modelo. Cada campo es descrito por: nombre tipo (integer, string, datetime, etc.) null valor por defecto longitud

3.7.8.10 validate

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Este atributo contiene reglas que permiten al modelo realizar decisiones de validacin de datos antes de grabar. Las claves nombradas tras los campos contienen expresiones regulares permitiendo al modelo buscar correspondencias. Para ms informacin, mira el captulo Validacin de Datos ms adelante en este manual.

3.7.8.11 virtualFields

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Array of virtual fields this model has. Virtual fields are aliased SQL expressions. Fields added to this property will be read as other fields in a model but will not be saveable. Example usage for MySQL: 1. var $virtualFields = array( 2. 'name' => "CONCAT(User.first_name, ' ', User.last_name)" 3. ); In subsequent find operations, your User results would contain a name key with the result of the concatenation. It is not advisable to create virtual fields with the same names as columns on the database, this can cause SQL errors. For more information on the virtualFields property, its proper usage, as well as limitations, see the section on virtual fields.
3.7.8.12 name

Editar Ver slo esta seccin Historia Comparar con el contenido original

Como habrs visto antes en este captulo, el atributo $name es una caracterstica de compatibilidad para los usuarios de PHP4 y se establece el valor al nombre del modelo. Ejemplo de uso: 1. class Ejemplo extends AppModel { 2. var $name = 'Ejemplo'; 3. }
3.7.8.13 cacheQueries

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si se establece a true, los datos obtenidos por el modelo durante una peticin son cacheados (cached). Este cacheo es slo en memoria, y dura slo el tiempo de duracin de la peticin. Cualquier peticin duplicada de los mismos datos es tratada por la cach.
3.7.9 Mtodos Personalizados y Propiedades

Editar Ver slo esta seccin

Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Aunque las funciones de modelo de CakePHP deberan llevarte donde necesites ir, no olvides que las clases modelos son justamente eso: clases que te permiten escribir tus propios mtodos o definir tus propias propiedades. Cualquier operacin que maneja la grabacin o bsqueda de datos es mejor que est alojada en tus clases modelo. Este concepto es a menudo referido como "fat model". 1. 2. 3. 4. 5. 6. 7. 8. class Ejemplo extends AppModel { function getReciente() { $condiciones = array( 'created BETWEEN (curdate() - interval 7 day) and (curdate() interval 0 day))' ); return $this->find('all', compact($condiciones)); } }

Ahora, este mtodo getReciente() puede ser usado dentro del controlador. 1. $reciente = $this->Ejemplo->getReciente();
3.7.9.1 Using virtualFields

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Virtual fields are a new feature in the Model for CakePHP 1.3. Virtual fields allow you to create arbitrary SQL expressions and assign them as fields in a Model. These fields cannot be saved, but will be treated like other model fields for read operations. They will be indexed under the model's key alongside other model fields. How to create virtual fields Creating virtual fields is easy. In each model you can define a $virtualFields property that contains an array of field => expressions. An example of virtual field definitions would be: 1. var $virtualFields = array( 2. 'name' => 'CONCAT(User.first_name, " ", User.last_name)' 3. ); In subsequent find operations, your User results would contain a name key with the result of the

concatenation. It is not advisable to create virtual fields with the same names as columns on the database, this can cause SQL errors. Using virtual fields Creating virtual fields is straightforward and easy, interacting with virtual fields can be done through a few different methods. Model::hasField() Model::hasField() has been updated so that it returns true if the model has a virtualField with the correct name. By setting the second parameter of hasField to true, virtualFields will also be checked when checking if a model has a field. Using the example field above, 1. $this->User->hasField('name'); // Will return false, as there is no concrete field called name 2. $this->User->hasField('name', true); // Will return true as there is a virtual field called name Model::isVirtualField() This method can be used to check if a field/column is a virtual field or a concrete field. Will return true if the column is virtual. 1. $this->User->isVirtualField('name'); //true 2. $this->User->isVirtualField('first_name'); //false Model::getVirtualField() This method can be used to access the SQL expression that comprises a virtual field. If no argument is supplied it will return all virtual fields in a Model. 1. $this->User->getVirtualField('name'); //returns 'CONCAT(User.first_name, ' ', User.last_name)' Model::find() and virtual fields As stated earlier Model::find() will treat virtual fields much like any other field in a model. The value of a virtual field will be placed under the model's key in the resultset. Unlike the behavior of calculated fields in 1.2 1. $results = $this->User->find('first'); 2. // results contains the following 3. array( 4. 'User' => array( 5. 'first_name' => 'Mark', 6. 'last_name' => 'Story', 7. 'name' => 'Mark Story', 8. //more fields. 9. ) 10.); Pagination and virtual fields Since virtual fields behave much like regular fields when doing find's, Controller::paginate() has been updated to allows sorting by virtual fields.

3.7.10 Virtual fields

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Virtual fields are a new feature in the Model for CakePHP 1.3. Virtual fields allow you to create arbitrary SQL expressions and assign them as fields in a Model. These fields cannot be saved, but will be treated like other model fields for read operations. They will be indexed under the model's key alongside other model fields.
3.7.10.1 Creating virtual fields

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Creating virtual fields is easy. In each model you can define a $virtualFields property that contains an array of field => expressions. An example of a virtual field definition using MySQL would be: 1. var $virtualFields = array( 2. 'full_name' => 'CONCAT(User.first_name, " ", User.last_name)' 3. ); And with PostgreSQL: 1. var $virtualFields = array( 2. 'name' => 'User.first_name || \' \' || User.last_name' 3. ); In subsequent find operations, your User results would contain a name key with the result of the concatenation. It is not advisable to create virtual fields with the same names as columns on the database, this can cause SQL errors. It is not always useful to have User.first_name fully qualified. If you do not follow the convention (i.e. you have multiple relations to other tables) this would result in an error. In this case it may be better to just use first_name || \'\' || last_name without the Model Name.
3.7.10.2 Using virtual fields

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Creating virtual fields is straightforward and easy, interacting with virtual fields can be done through a few different methods.

Model::hasField() Model::hasField() has been updated so that it can return true if the model has a virtualField with the correct name. By setting the second parameter of hasField to true, virtualFields will also be checked when checking if a model has a field. Using the example field above, 1. $this->User->hasField('name'); // Will return false, as there is no concrete field called name 2. $this->User->hasField('name', true); // Will return true as there is a virtual field called name Model::isVirtualField() This method can be used to check if a field/column is a virtual field or a concrete field. Will return true if the column is virtual. 1. $this->User->isVirtualField('name'); //true 2. $this->User->isVirtualField('first_name'); //false Model::getVirtualField() This method can be used to access the SQL expression that comprises a virtual field. If no argument is supplied it will return all virtual fields in a Model. 1. $this->User->getVirtualField('name'); //returns 'CONCAT(User.first_name, ' ', User.last_name)' Model::find() and virtual fields As stated earlier Model::find() will treat virtual fields much like any other field in a model. The value of a virtual field will be placed under the model's key in the resultset. Unlike the behavior of calculated fields in 1.2 1. $results = $this->User->find('first'); 2. // results contains the following 3. array( 4. 'User' => array( 5. 'first_name' => 'Mark', 6. 'last_name' => 'Story', 7. 'name' => 'Mark Story', 8. //more fields. 9. ) 10.); Pagination and virtual fields Since virtual fields behave much like regular fields when doing find's, Controller::paginate() has been updated to allow sorting by virtual fields.
3.7.10.3 Virtual fields and model aliases

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

When you are using virtualFields and models with aliases that are not the same as their name, you can run into problems as virtualFields do not update to reflect the bound alias. If you are using virtualFields in models that have more than one alias it is best to define the virtualFields in your model's constructor 1. function __construct($id = false, $table = null, $ds = null) { 2. parent::__construct($id, $table, $ds); 3. $this->virtualFields['name'] = sprintf('CONCAT(%s.first_name, " ", %s.last_name)', $this->alias, $this->alias); 4. } This will allow your virtualFields to work for any alias you give a model.
3.7.10.4 Limitations of virtualFields

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The implementation of virtualFields in 1.3 has a few limitations. First you cannot use virtualFields on associated models for conditions, order, or fields arrays. Doing so will generally result in an SQL error as the fields are not replaced by the ORM. This is because it's difficult to estimate the depth at which an associated model might be found. A common workaround for this implementation issue is to copy virtualFields from one model to another at runtime when you need to access them. 1. $this->virtualFields['full_name'] = $this->Author>virtualFields['full_name']; Alternatively, you can define $virtualFields in your model's constructor, using $this>alias, like so: public function __construct($id=false,$table=null,$ds=null){ parent::__construct($id,$table,$ds); $this->virtualFields = array( 'name'=>"CONCAT(`{$this->alias}`.`first_name`,' ',`{$this>alias}`.`last_name`)" 5. ); 6. } 1. 2. 3. 4.
3.7.11 Transactions

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones To perform a transaction, a model's tables must be of a type that supports transactions. All transaction methods must be performed on a model's DataSource object. To get a model's

DataSource from within the model, use: 1. $dataSource = $this->getDataSource(); You can then use the data source to start, commit, or roll back transactions. 1. 2. 3. 4. 5. 6. 7. $dataSource->begin($this); //Perform some tasks if(/*all's well*/) { $dataSource->commit($this); } else { $dataSource->rollback($this); }

Nested transactions are currently not supported. If a nested transaction is started, a commit will return false on the parent transaction. 3.8 Comportamientos Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los comportamientos del modelo (Model behaviors) son una manera de organizar parte de la funcionalidad definida en los modelos de CakePHP. Nos permiten separar la lgica que puede no estar relacionada directamente con un modelo, pero que necesita estar ah. Proveyendo una manera simple pero potente manera de extender modelos, los comportamientos nos permiten atar funcionalidad a los modelos definiendo una simple variable de clase. As es como los comportamientos permiten a los modelos deshacerse de todo el peso extra que no debera ser parte de contrato de negocio que estn modelando, o al menos es necesario en diferentes modelos y puede, entonces, ser extrapolado. Como ejemplo, considera un modelo que nos da acceso a una tabla de una base de datos la cual almacena informacin estructural de un rbol. Eliminando, aadiendo y migrando nodos en el rbol no es tan simple como borrar, insertar y editar filas en una tabla. Muchos registros debern ser actualizados segn las cosas se mueven. En vez de crear esos mtodos de manipulacin del rbol en cada base de modelo (para todo modelo que necesita dicha funcionalidad), podramos simplemente decirle a nuestro modelo que utilize el TreeBehavior (ArbolComportamiento), o en trminos ms formales, decirle a nuestro modelo que se comporte como un rbol. Esto es conocido como atar un comportamiento a un modelo. Con slo una lnea de cdigo, nuestro modelo de CakePHP toma todo un nuevo conjunto de mtodos que le permiten interactuar con la estructura subyacente. CakePHP ya incluye comportamientos para estructuras de rbol, contenido traducido, interaccin con listas de control de acceso, sin comentar los comportamientos aportados por la comunidad disponibles en CakePHP Bakery. En esta seccin cubriremos el patrn bsico de uso para aadir comportamientos a modelos, cmo utilizar los comportamientos de CakePHP incorporados y cmo crear uno nosotros

mismos.
3.8.1 Utilizando Comportamientos

1. 2. 3. 4. 5. 6.

Editar Ver slo esta seccin Historia Comparar con el contenido original <?php class Category extends AppModel { var $name = 'Category'; var $actsAs = array('Tree'); } ?>

Los comportamientos son atados a modelos mediante la variable de clase del modelo $actsAs:

Este ejemplo muestra cmo un modelo de Category puede ser manejado en una estructura de rbol utilizando el comportamiento de rbol (TreeBehavior). Una vez que un comportamiento ha sido especificado, utiliza los mtodos aadidos por el comportamiento como si siempre existiesen como parte del modelo original: 1. 2. 3. 4. // Set ID $this->Category->id = 42; // Utilizar un mtodo de comportamiento, children(): $kids = $this->Category->children();

Algunos comportamientos pueden requerir o permitir opciones a ser definidas cuando el comportamiento es atado al modelo. Aqu, decimos a nuestro TreeBehavior (comportamiento de rbol) los nombres de los campos left (izquierdo) y right (derecho) en la tabla de base de datos subyacente: 1. <?php 2. class Category extends AppModel { 3. var $name = 'Category'; 4. var $actsAs = array( 5. 'Tree' => array( 6. 'left' => 'left_node', 7. 'right' => 'right_node' 8. ) 9. ); 10.} 11.?> Podemos tambin atar varios comportamientos a un modelo. No hay razn por la que, por ejemplo, nuestro modelo Category deba slo comportarse como un rbol, tambin puede necesitar soporte de internacionalizacin: 1. 2. 3. 4. 5. <?php class Category extends AppModel { var $name = 'Category'; var $actsAs = array( 'Tree' => array(

6. 'left' => 'left_node', 7. 'right' => 'right_node' 8. ), 9. 'Translate' 10.); 11.} 12.?> Hasta el momento hemos estado aadiendo comportamientos a modelos utilizando una variable de la clase. Eso significa que nuestros comportamientos sern atados a muestros modelos durante todo el tiempo de vida del modelo. Sin embargo, puede ser que necesitemos "desatar" comportamientos de nuestros modelos en tiempo de ejecucin. Digamos que en nuestro modelo Category anterior, el cual est actuando como un modelo Tree y Translate, necesitamos por alguna razn forzar a que deje de actuar como un modelo Translate: 1. // Desata un comportamiento de nuestro modelo: 2. $this->Category->Behaviors->detach('Translate'); Eso har que nuestro modelo Category deje de comportarse como un modelo Translate desde ese momento. Tal vez necesitemos, en cambio, simplemente desactivar el comportamiento Translate de actuar sobre operaciones normales del modelo: nuestras bsquedas, grabados, etc. De hecho, estamos buscando desactivar el comportamiento de actuar sobre nuestros callbacks del modelo de CakePHP. En vez de desatar el comportamiento, le decimos a nuestro modelo que pare de informar sobre dichos callbacks al comportamiento Translate: 1. // Parar de dejar al comportamiento manejar los callbacks de nuestro modelo 2. $this->Category->Behaviors->disable('Translate'); Tambin necesitaremos saber si nuestro comportamiento est manejando los callbacks del modelo, y si no, restauramos su habilidad para reaccionar a ellos: 1. // Si nuestro comportamiento no est manejando los callbacks del modelo 2. if (!$this->Category->Behaviors->enabled('Translate')) { 3. // Decirle que comience a hacerlo 4. $this->Category->Behaviors->enable('Translate'); 5. } Tal como podemos desatar completamente un comportamiento de un modelo en tiempo de ejecucin, tambin podemos atar nuevos comportamientos. Digamos que nuestro modelo Category necesita empezar a comportarse como un modelo Christmas (Navidad), pero slo en el da de Navidad: 1. 2. 3. 4. 5. // Si hoy es 25 de diciembre if (date('m/d') == '12/25') { // Nuestro modelo necesita comportarse como un modelo Christmas $this->Category->Behaviors->attach('Christmas'); }

Podemos tambin utilizar el mtodo attach() para sobreescribir las opciones de comportamiento: 1. // Cambiaremos una opcin de nuestro ya atado comportamiento 2. $this->Category->Behaviors->attach('Tree', array('left' => 'new_left_node'));

Tambin hay un mtodo para obtener la lista de comportamientos atados a un modelo: attached(). Si pasamos el nombre de un comportamiento al mtodo, nos dir si dicho comportamiento est atado al modelo; de cualquier otra manera nos dar una lista de los comportamientos atados. 1. // Si el comportamiento "Translate" no est atado al modelo 2. if (!$this->Category->Behaviors->attached('Translate')) { 3. // Obtener la lista de todos los comportamientos atados al modelo 4. $behaviors = $this->Category->Behaviors->attached(); 5. }
3.8.2 Creando Comportamientos Personalizados

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Este es el contenedor del contenido.
3.8.3 Creating behavior methods

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Behavior methods are automatically available on any model acting as the behavior. For example if you had: 1. 2. 3. 4. class Duck extends AppModel { var $name = 'Duck'; var $actsAs = array('Flying'); }

You would be able to call FlyingBehavior methods as if they were methods on your Duck model. When creating behavior methods you automatically get passed a reference of the calling model as the first parameter. All other supplied parameters are shifted one place to the right. For example 1. $this->Duck->fly('toronto', 'montreal'); Although this method takes two parameters, the method signature should look like: 1. function fly(&$Model, $from, $to) { 2. // Do some flying.

3. } Keep in mind that methods called in a $this->doIt() fashion from inside a behavior method will not get the $model parameter automatically appended.
3.8.4 Behavior callbacks

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Model Behaviors can define a number of callbacks that are triggered before/after the model callbacks of the same name. Behavior callbacks allow your behaviors to capture events in attached models and augment the parameters or splice in additional behavior. The available callbacks are: beforeValidate is fired before a model's beforeValidate beforeFind is fired before a model's beforeFind afterFind is fired before a model's afterFind beforeSave is fired before a model's beforeSave afterSave is fired before a model's afterSave beforeDelete is fired after a model's beforeDelete afterDelete is fired before a model's afterDelete

3.8.5 Creating a behavior callback

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Model behavior callbacks are defined as simple methods in your behavior class. Much like regular behavior methods, they receive a $Model parameter as the first argument. This parameter is the model that the behavior method was invoked on. function beforeFind(&$model, $query) If a behavior's beforeFind returns false it will abort the find(). Returning an array will augment the query parameters used for the find operation. afterFind(&$model, $results, $primary) You can use the afterFind to augment the results of a find. The return value will be passed on as the results to either the next behavior in the chain or the model's afterFind. beforeDelete(&$model, $cascade = true) You can return false from a behavior's beforeDelete to abort the delete. Return true to allow it continue. afterDelete(&$model)

You can use afterDelete to perform clean up operations related to your behavior. beforeSave(&$model) You can return false from a behavior's beforeSave to abort the save. Return true to allow it continue. afterSave(&$model, $created) You can use afterSave to perform clean up operations related to your behavior. $created will be true when a record is created, and false when a record is updated. beforeValidate(&$model) You can use beforeValidate to modify a model's validate array or handle any other pre-validation logic. Returning false from a beforeValidate callback will abort the validation and cause it to fail. 3.9 DataSources (fuentes de datos) Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones DataSources son el enlace entre los modelos y la fuente de datos que cada modelo representa. En muchos caos, los datos son recuperados de una base de datos relacional, como MySQL, PostgreSQL o MSSQL. CakePHP se distribuye con varias datasources especficas 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 configuracin de conexin 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 aade alguna

lgica comn a la mayora de bases de datos relaciones. Si decides crear una datasource RDBMS, tu mejor apuesta es trabajar a paritr 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.
3.9.1 API bsica para DataSources

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Una datasource puede, y debera implementar al menos uno de los siguientes mtodos: create, read, update y/o delete (la signatura y detalles de implementacin no son importantes en este momento, y sern descritos ms tarde). No necesitas implementar ms mtodos de los necesarios de los descritos arriba - si ests escribiendo una datasource de slo-lectura, no hay razn para implementar create y update. Mtodos que deben ser implementados describe($model) listSources() Al menos uno de: create($model, $fields = array(), $values = array()) read($model, $queryData = array()) update($model, $fields = array(), $values = array()) delete($model, $id = null) Es posible tambin (y muchas veces bastante til) definir el atributo de clase $_schema dentro la datasource misma, en lugar de en el modelo. Y esto es casi todo lo que hay. Emparejando una datasource a un modelo podrs utilizar Model::find()/save/() como haras normalmentem y los datos y/o parmetros adecuados sern usados para llamar a esos mtodos sern pasados a la propia datasource, donde puedes decidir implementar cualquier prestacin que necesites (por ejemplo: opciones para Model::find como procesasr 'conditions', 'limit' o incluso tus propios parmetros a medida).
3.9.2 Un ejemplo

Editar Ver slo esta seccin Historia Comparar con el contenido original

Lo que sigue es un ejemplo simple de como usar dataSources y HttpSocket para implementar una fuente muy bsica de Twitter que nos permita utilizar la API de twitter y enviar nuestras actualizaciones. Este ejemplo slo funcionar sobre PHP 5.2 o superior, debido al uso de json_decode para procesar los datos en formato JSON. Tendrs que colocar la datasource para Twitter en tu app/models/datasources/twitter_source.php: <?php /** * Twitter DataSource * * Utilizada para leer y escribir en Twitter usando modelos. * * PHP Version 5.x * * CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) 10.* Copyright 2005-2009, Cake Software Foundation, Inc. (http://www.cakefoundation.org) 11.* 12.* Licensed under The MIT License 13.* Redistributions of files must retain the above copyright notice. 14.* 15.* @filesource 16.* @copyright Copyright 2009, Cake Software Foundation, Inc. (http://www.cakefoundation.org) 17.* @link http://cakephp.org CakePHP(tm) Project 18.* @license http://www.opensource.org/licenses/mit-license.php The MIT License 19.*/ 20.App::import('Core', 'HttpSocket'); 21.class TwitterSource extends DataSource { 22.protected $_schema = array( 23.'tweets' => array( 24.'id' => array( 25.'type' => 'integer', 26.'null' => true, 27.'key' => 'primary', 28.'length' => 11, 29.), 30.'text' => array( 31.'type' => 'string', 32.'null' => true, 33.'key' => 'primary', 34.'length' => 140 35.), 1. 2. 3. 4. 5. 6. 7. 8. 9.

36.'status' => array( 37.'type' => 'string', 38.'null' => true, 39.'key' => 'primary', 40.'length' => 140 41.), 42.) 43.); 44.public function __construct($config) { 45.$auth = "{$config['login']}:{$config['password']}"; 46.$this->connection = new HttpSocket( 47."http://{$auth}@twitter.com/" 48.); 49.parent::__construct($config); 50.} 51.public function listSources() { 52.return array('tweets'); 53.} 54.public function read($model, $queryData = array()) { 55.if (!isset($queryData['conditions']['username'])) { 56.$queryData['conditions']['username'] = $this->config['login']; 57.} 58.$url = "/statuses/user_timeline/"; 59.$url .= "{$queryData['conditions']['username']}.json"; 60.$response = json_decode($this->connection->get($url), true); 61.$results = array(); 62.foreach ($response as $record) { 63.$record = array('Tweet' => $record); 64.$record['User'] = $record['Tweet']['user']; 65.unset($record['Tweet']['user']); 66.$results[] = $record; 67.} 68.return $results; 69.} 70.public function create($model, $fields = array(), $values = array()) { 71.$data = array_combine($fields, $values); 72.$result = $this->connection->post('/statuses/update.json', $data); 73.$result = json_decode($result, true); 74.if (isset($result['id']) && is_numeric($result['id'])) { 75.$model->setInsertId($result['id']); 76.return true; 77.} 78.return false; 79.} 80.public function describe($model) { 81.return $this->_schema['tweets'];

82.} 83.} 84.?> La implementacin de tu modelo puede ser tan simple como: 1. 2. 3. 4. 5. <?php class Tweet extends AppModel { public $useDbConfig = 'twitter'; } ?>

Si no hemos definido nuestro esquema en la propia datasource, nos dar un mensaje de error al efecto aqu. Y los ajustes de configuracin en tu app/config/database.php se parecern a estos: 1. 2. 3. 4. 5. 6. 7. <?php var $twitter = array( 'datasource' => 'twitter', 'login' => 'username', 'password' => 'password', ); ?>

Usando los familiares mtodos de modelo desde un controlador: 1. <?php 2. // Usar el nombre de usuario definido en $twitter como se mostr arriba: 3. $tweets = $this->Tweet->find('all'); 4. // Encontrar tweets de otros usuario 5. $conditions= array('username' => 'caketest'); 6. $otherTweets = $this->Tweet->find('all', compact('conditions')); 7. ?> De forma similar, guardando una actualizacin del estatus: 1. <?php 2. $this->Tweet->save(array('status' => 'This is an update')); 3. ?>
3.9.3 Plugin DataSources and Datasource Drivers

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

Plugin Datasources
You can also package Datasources into plugins.

Simply place your datasource file into plugins/[your_plugin]/models/datasources/ [your_datasource]_source.php and refer to it using the plugin notation: 1. 2. 3. 4. 5. var $twitter = array( 'datasource' => 'Twitter.Twitter', 'username' => 'test@example.com', 'password' => 'hi_mom', );

Plugin DBO Drivers


In addition, you can also add to the current selection of CakePHP's dbo drivers in plugin form. Simply add your drivers to plugins/[your_plugin]/models/datasources/dbo/ [your_driver].php and again use plugin notation: 1. 2. 3. 4. var $twitter = array( 'driver' => 'Twitter.Twitter', ... );

Combining the Two


Finally, you're also able to bundle together your own DataSource and respective drivers so that they can share functionality. First create your main class you plan to extend: 1. plugins/[social_network]/models/datasources/ [social_network]_source.php : 2. <?php 3. class SocialNetworkSource extends DataSource { 4. // general functionality here 5. } 6. ?> And now create your drivers in a sub folder: 1. plugins/[social_network]/models/datasources/[social_network]/ [twitter].php 2. <?php 3. class Twitter extends SocialNetworkSource { 4. // Unique functionality here 5. } 6. ?> And finally setup your database.php settings accordingly: 1. 2. 3. 4. 5. 6. 7. var $twitter = array( 'driver' => 'SocialNetwork.Twitter', 'datasource' => 'SocialNetwork.SocialNetwork', ); var $facebook = array( 'driver' => 'SocialNetwork.Facebook', 'datasource' => 'SocialNetwork.SocialNetwork',

8. ); Just like that, all your files are included Automagically! No need to place App::import() at the top of all your files. 3.10 Vistas Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

3.10.1 Plantillas de la Vista

Editar Ver slo esta seccin Historia Comparar con el contenido original

La capa vista de CakePHP es cmo 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 aplicacin remota mediante SOAP o producir un fichero CSV para un usuario. Los ficheros de vista de CakePHP estn escritos en PHP plano y tienen la extensin .ctp (CakePHP Template) por defecto . Estos ficheros contienen toda la lgica de representacin necesaria para obtener los datos recibidos del controlador en un formato que est preparado para la audiencia a la que ests 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 accin a la que corresponde. Por ejemplo, el fichero de vista para el la accin view() del controlador Productos, normalmente, se encontrara en /app/views/productos/view.ctp. La capa vista en CakePHP puede estar formada por un nmero diferentes de partes. Cada parte tiene usos diferentes, y ser tratado en este captulo: layouts (diseos): ficheros de vista que contienen el cdigo de presentacin que se encuentra envolviendo muchas interfaces en tu aplicacin. La mayora de vistas son 'renderizadas' (presentadas) dentro de un layout (diseo). elements (elementos): trozo de cdigo de vista ms pequeo y reutilizable. Los elementos generalmente son renderizados dentro de vistas. helpers (ayudantes): estas clases encapsulan lgica de vista que es necesaria en muchas partes en la capa vista. Adems de otras cosas, los ayudantes en CakePHP pueden ayudarte a construir formularios, construir funcionalidad AJAX, paginar los datos del modelo o servir feeds RSS.
3.10.2 Layouts

Editar Ver slo esta seccin Historia Comparar con el contenido original

Un diseo contiene el cdigo de presentacin que envuelve una vista. Cualquier cosa que quieras ver en todas tus vistas debera estar situada en un layout. Los ficheros de diseo deberan situarse en /app/views/layouts. El diseo por defecto de CakePHP puede ser sustituido creando un nuevo diseo por defecto en /app/views/layouts/default.ctp. Una vez que ha sido creado un nuevo diseo, el cdigo de la vista renderizado por el controlador se coloca dentro del diseo por defecto cuando la pgina es renderizada. Cuando creas un diseo, necesitas decirle a CakePHP dnde colocar el cdigo para tus vistas. Para hacer eso, estate seguro que tu diseo incluye un lugar para $content_for_layout (y opcionalmente, $title_for_layout). Aqu est un ejemplo de a lo que debera parecerse un diseo por defecto: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title><?php echo $title_for_layout?></title> <link rel="shortcut icon" href="favicon.ico" type="image/xicon"> 7. <!-- Incluir ficheros y scripts externos aqu (Mirar el ayudante HTML para ms informacin --> 8. <?php echo $scripts_for_layout ?> 9. </head> 10.<body> 11.<!-- Si quieres algn tipo de men para mostrar en todas tus vistas, incluyelo aqu --> 12.<div id="cabecera"> 13.<div id="menu">...</div> 14.</div> 15.<!-- Aqu es donde quiero que se vean mis vistas --> 16.<?php echo $content_for_layout ?> 17. 18.<!-- Aadir un pie de pgina a cada pgina mostrada --> 19.<div id="pie">...</div> 20.</body> 21.</html> 1. 2. 3. 4. 5. 6. $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 ms detalles de uso). $content_for_layout contiene la vista. Aqu es donde ser colocado el cdigo de la vista. $title_for_layout contiene el ttulo de la pgina. Para establecer el ttulo para el diseo, es fcil hacerlo en el controlador, estableciendo el valor de la variable $title_for_layout.

1. 2. 3. 4. 5. 6. 7.

<?php class UsuariosController extends AppController { function verActivos() { $this->set('title_for_layout', 'Ver Usuarios Activos'); } } ?>

Puedes crear tantos diseos como desees: simplemente colcalos en el directorio app/views/layouts e intercambialos dentro de tus acciones del controlador usando la variable $layout del cotrolador, o la funcin setLayout(). Por ejemplo, si una seccin de mi site incluye un espacio menor con banner de publicidad, debera crear un nuevo diseo (layout) con el espacio publicitario menor, especificndolo como el diseo para todas las acciones del controlador haciendo algo como: var $layout = 'publicidad_pequena_pordefecto'; 1. <?php 2. class UsuariosController extends AppController { 3. function verActivos() { 4. $this->set('title_for_layout', 'Ver Usuarios Activos'); 5. $this->layout = 'publicidad_pequena_pordefecto'; 6. } 7. function verImagen() { 8. $this->layout = 'imagen'; 9. //mostrar la imagen del usuario 10.} 11.} 12.?> CakePHP ofrece dos diseos comunes (adems del diseo por defecto de CakePHP) que puedes usar en tus propias aplicaciones: 'ajax' y 'flash'. El diseo Ajax es til para contruir las respuestas Ajax; es un diseo vaco (la mayora de las llamadas ajax slo requiren una pocas etiquetas como respuesta, ms que una interfaz completa). El diseo flash es usado por mensajes mostrados por el mtodo flash() del controlador. Existen otros tres diseos: xml, js y rss en el ncleo como una manera rpida y fcil de servir contenido que no sea text/html.
3.10.3 Elementos

Editar Ver slo esta seccin Historia Comparar con el contenido original

Muchas aplicaciones tienen pequeos bloques de cdigo de presentacin que necesita ser repetido de pgina en pgina, algunas veces en diferentes lugares del diseo. 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 navegacin, mens extras, formularios de login y llamadas estn a menudo implementadas en CakePHP en forma de elementos. Un elemento es bsicamente una

minivista que puede ser incluido en otras vistas, en diseos, e incluso dentro de otros elementos. Los elementos pueden ser usados para hacer una vista ms legible, situando el renderizado de elementos que se repiten en sus propios ficheros. Pueden tambin ayudarte a reutilizar fragmentos de contenido en tus aplicaciones. Los elementos estn en la carpeta /app/views/elements/ y tienen la extensin de archivo .ctp. Son mostrados usando el mtodo element() de la vista. 1. <?php echo $this->element('cajaayuda'); ?>
3.10.3.1 Pasar Variables a un elemento

1. 2. 3. 4.

Editar Ver slo esta seccin Historia Comparar con el contenido original <?php echo $this->element('helpbox', array("helptext" => "Oh, this text is very helpful.")); ?>

Puedes pasarle datos a un elemento usando el segundo argumento de element():

Dentro del archivo del elemento, todas las variables pasadas estan disponibles como miembros del array de parmetros (de la misma manera que set() en el controlador funciona con los archivos de las vistas). En el ejemplo siguiente, el archivo /app/views/elements/helpbox.ctp puede usar la variable $helptext. 1. <?php 2. echo $helptext; //outputs "Oh, this text is very helpful." 3. ?> La funcin element() combina opciones para el elemento con los datos a pasar en element. Las dos opciones son 'cache' y 'plugin'. Un ejemplo: 1. <?php echo 2. $this->element('helpbox', 3. array( 4. "helptext" => "Esto es pasado al elemento como $helptext" 5. "foobar" => "Esto es pasado al elemento como $foobar" 6. "cache" => "+2 days" //setea el 'cacheo' a +2 das. 7. "plugin" => "" //para renderizar un elemento desde un plugin 8. ) 9. ); 10.?> Para tener en cache distintas versiones del mismo elemento en una aplicacin, provee una clave nica de cache usando el siguiente formato: 1. 2. 3. 4. <?php $this->element('helpbox', array( "cache" => array('time'=> "+7 days",'key'=>'unique value')

5. ) 6. ); 7. ?> Puedes aprovechar bien los elementos usando requestAction(). La funcin requestAction() trae las variables desde una accin de controlador y las retorna como un array. Esto permite que tus elementos cumplan con el diseo MVC. Crea una accin de controlador que prepare las variables de la vista para tus elementos, luego haz la llamada requestAction() dentro del segundo parmetro de element() para proveerle al elemento las variables de vista desde tu controlador. Para hacer esto, en tu controlador aade algo como lo siguiente, para el ejemplo de Post. 1. <?php 2. class PostsController extends AppController { 3. ... 4. function index() { 5. $posts = $this->paginate(); 6. if (isset($this->params['requested'])) { 7. return $posts; 8. } else { 9. $this->set(compact('posts')); 10.} 11.} 12.} 13.?> Ahora en el elemento podemos acceder el modelo de posts paginados. Para tener los ltimos cinco posts en una lista ordenada deberamos hacer lo siguiente: 1. <h2>Latest Posts</h2> 2. <?php $posts = $this>requestAction('posts/index/sort:created/order:asc/limit:5'); ?> 3. <?php foreach($posts as $post): ?> 4. <ol> 5. <li><?php echo $post['Post']['title']; ?></li> 6. </ol> 7. <?php endforeach; ?>
3.10.3.2 Cache de Elements

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones

Puedes aprovechar el cache de vistas de CakePHP si aportas un parmetro 'cache'. Si lo ajustas a true, mantendr en cache durante un da. De otro modo, puedes ajustar tiempos de caducidad alternativos. Lee Cache para ms informacin sobre cmo fijar la caducidad. 1. <?php echo $this->element('helpbox', array('cache' => true)); ?> Si dibujas el mismo elemento ms de una vez en una vista y tienes el cache activado, asegrate de ajustar el parmetro 'key' con un nombre diferente cada vez. Esto evitar que cada sucesiva llamada sobreescriba el resultado almacenado en cache de la anterior llamada element(). Por ejemplo: 1. <?php 2. echo $this->element('helpbox', array('cache' => array('key' => 'first_use', 'time' => '+1 day'), 'var' => $var)); 3. echo $this->element('helpbox', array('cache' => array('key' => 'second_use', 'time' => '+1 day'), 'var' => $differentVar)); 4. ?> Lo anterior asegura que ambos elementos son almacenados en cache de forma separada.
3.10.3.3 Utilizar Elements de un Plugin

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si ests usando un plugin y deseas usar elements dentro de ese plugin, simplemente especifica el parmetro plugin. Si la vista est siendo dibujada para un controlador/accin de un plugin, se usar el elemento del plugin. Si el elemento no existe en el plugin, se buscar en la carpeta APP principal. 1. <?php echo $this->element('helpbox', array('plugin' => 'pluginname')); ?>
3.10.4 Mtodos de la vista

Editar Ver slo esta seccin Historia Comparar con el contenido original

Los mtodos de la Vista estn disponibles para todos los archivos de vistas, elementos y plantillas. Para llamar a cualquier mtodo de la vista utilice: $this->method()
3.10.4.1 set()

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones set(string $var, mixed $value) Las Vistas tienen un metodo set() que es anlogo 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 sern renderizados. Ver Controller::set() para mas informacin en el uso de set(). En tu archivo vista puedes hacer 1. $this->set('activeMenuButton', 'posts'); Luego en tu capa (layout) la variable $activeMenuButton estar disponible y contendr el valor: 'posts'.
3.10.4.2 getVar()

Editar Ver slo esta seccin Historia Comparar con el contenido original

getVar(string $var) Obtiene el valor de la viewVar con el nombre $var


3.10.4.3 getVars()

Editar Ver slo esta seccin Historia Comparar con el contenido original

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.
3.10.4.4 error()

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones error(int $code, string $name, string $message) Displays an error page to the user. Uses layouts/error.ctp to render the page. 1. $this->error(404, 'Not found', 'This page was not found, sorry'); This will render an error page with the title and messages specified. Its important to note that script

execution is not stopped by View::error() So you will have to stop code execution yourself if you want to halt the script.
3.10.4.5 element()

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones element(string $elementPath, array $data, bool $loadHelpers) Renders an element or view partial. See the section on View Elements for more information and examples.
3.10.4.6 uuid

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones uuid(string $object, mixed $url) Generates a unique non-random DOM ID for an object, based on the object type and url. This method is often used by helpers that need to generate unique DOM ID's for elements such as the AjaxHelper. 1. $uuid = $this->uuid('form', array('controller' => 'posts', 'action' => 'index')); 2. //$uuid contains 'form0425fe3bad'
3.10.4.7 addScript()

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones addScript(string $name, string $content) Adds content to the internal scripts buffer. This buffer is made available in the layout as $scripts_for_layout. This method is helpful when creating helpers that need to add javascript or css directly to the layout. Keep in mind that scripts added from the layout, or elements in the layout will not be added to $scripts_for_layout. This method is most often used from inside helpers, like the Javascript and Html Helpers.
3.10.5 Temas

Editar Ver slo esta seccin

Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Puedes aprovechar los temas (themes), haciendo sencillo el cambio de la apariencia de tu pgina de una forma rpida y fcil. Para usar los temas, necesitas decirle a tu controlador que use la clase ThemeView en lugar de la clase por defecto View. 1. class ExampleController extends AppController { 2. var $view = 'Theme'; 3. } Para declarar qu tema usar por defecto, especifica el nombre del tema en tu controlador. 1. 2. 3. 4. class ExampleController extends AppController { var $view = 'Theme'; var $theme = 'ejemplo'; }

Tambin puedes setear o cambiar el nombre del tema dentro de una accin o en las funciones de callback beforeFilter() o beforeRender(). 1. $this->theme = 'otro_ejemplo'; 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. Despus 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 accin de edicin de un controlador de Posts estara ubicado en /app/views/themed/example/posts/edit.ctp. Los archivos de Layout estaran 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 segn cada caso dentro de la carpeta de tu tema. Si tienes archivos CSS o JavaScript que son especficos para tu tema, puedes almacenarlos en una carpeta de tema dentro de la carpetawebroot/. Por ejemplo, tus hojas de estilo seran almacenadas en /app/webroot/themed/example/css/ y tus archivos JavaScript estaran en /app/webroot/themed/example/js/. Todos los helpers de CakePHP son concientes de los temas y crearn las rutas correctas automticamente. 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.
3.10.5.1 Increasing performance of plugin and theme assets

Traducir

Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Its a well known fact that serving assets through PHP is guaranteed to be slower than serving those assets without invoking PHP. And while the core team has taken steps to make plugin and theme asset serving as fast as possible, there may be situations where more performance is required. In these situations its recommended that you either symlink or copy out plugin/theme assets to directories in app/webroot with paths matching those used by cakephp. app/plugins/debug_kit/webroot/js/my_file.js becomes app/webroot/debug_kit/js/my_file.js app/views/themed/navy/webroot/css/navy.css becomes app/webroot/theme/navy/css/navy.css
3.10.6 Vistas de Medios

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Las vistas de medios te permiten enviar archivos binarios al usuario. Por ejemplo, puedes querer tener un directorio de archivos fuera de la carpeta /webroot para prevenir que los usuarios tengan acceso directo a ellos. Puedes usar vistas Media para traer el archivo desde una carpeta especial dentro de /app/, pudiendo hacer autenticacin antes de entregar el archivo al usuario. Para usar vistas Media, necesitas decirle a tu controlador que use la clase MediaView en vez de la clase por defecto View. Despus de esto, slo pasa los parmetros adicionales para especificar dnde est ubicado tu archivo. 1. class EjemploController extends AppController { 2. function download () { 3. $this->view = 'Media'; 4. $params = array( 5. 'id' => 'ejemplo.zip', 6. 'name' => 'ejemplo', 7. 'download' => true, 8. 'extension' => 'zip', 9. 'path' => 'files' . DS 10.); 11.$this->set($params); 12.}

13.} Parmetros Descripcin id El ID es el nombre del archivo tal como est en el servidor, incluyendo su extensin. El nombre (name) te permite especificar un nombre de archivo alternativo para ser name enviado al usuario. Especifica el nombre sin la extensin del archivo. download Un valor booleano que indica si los encabezados deben forzar la descarga. La extensin del archivo. Esto se compara con una lista interna de tipos MIME extension aceptados. Si el tipo MIME especificado no est en la lista, el archivo no ser descargado. El nombre del archivo, incluyendo el separador del directorio final. La ruta (path es path relativa a la carpeta app/. Un arreglo con tipos MIME adicionales que sern mezclados con la lista interna de tipos mimeType MIME aceptados. 3.11 Helpers Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Helpers son las clases simil-componentes para la capa de aplicacin de tu aplicacin. Ellos contienen la lgica presentacional que es compartida entre vistas, elementos, o layouts. Este captulo te mostrar cmo crear tus propios helpers, abarcando las tareas bsicas en las que los helpers del ncleo CakePHP pueden ayudarte a lograr. Para ms informacin sobre los helpers del ncleo, dirgete a Helpers 'de fbrica'.
3.11.1 Usando Helpers

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones T usas helpers en CakePHP haciendo que un controlador sepa de su existencia. Cada controlador tiene

una propiedad $helpers que lista los helpers que estarn disponibles en la vista. Para habilitar un helper en tu vista, agrega el nombre del helper en el arreglo $helpers del controlador. 1. 2. 3. 4. 5. <?php class BakeriesController extends AppController { var $helpers = array('Form', 'Html', 'Javascript', 'Time'); } ?>

Tambin pueden agregar helpers desde dentro de una accin, de esta forma slo estarn disponibles para esa accin y no para las dems acciones que permanezcan a ese controlador. Esto ahorra poder de procesamiento para las dems acciones que no usan el helper, y mantinen al controlador mejor organizado. 1. <?php 2. class BakeriesController extends AppController { 3. function bake { 4. $this->helpers[] = 'Time'; 5. } 6. function mix { 7. // El helper Time no es cargado aqu, no estar disponible. 8. } 9. } 10.?>
3.11.2 Creando Helpers

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Si un helper del core (o alguno mostrado en Cakeforge o en la Bakery) no se ajusta a tus necesidades, los helpers son fciles de crear. Digamos que quisieramos crear un helper que pudiera ser usado para mostrar como salida un link especficamente creado con CSS que lo necesitas en diferentes partes de tu aplicacin. Para poder ajustar tu lgica dentro de la estructura existente de helpers de CakePHP, necesitars crear una nueva clase en /app/views/helpers. Llamemos a nuestro helper LinkHelper. El archivo de clase se ver algo como esto: 1. 2. 3. 4. <?php /* /app/views/helpers/link.php */ class LinkHelper extends AppHelper { function makeEdit($title, $url) {

5. // Lgica para crear un link con un formato especfico va aqui... 6. } 7. } 8. ?> Existen algunos mtodos incluidos en la clase de Helper en CakePHP de la cual quisieras sacar ventaja: output(string $string) Usa esta funcin para enviar cualquier informacin de regreso a tu vista. 1. <?php 2. function makeEdit($title, $url) { 3. // Usa la funcin de salida del helper para enviar 4. // datos con formato de regreso a la vista: 5. return $this->output( 6. "<div class=\"editOuter\"> 7. <a href=\"$url\" class=\"edit\">$title</a> 8. </div>" 9. ); 10.} 11.?>
3.11.2.1 Including other Helpers

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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 usaras en un controlador. <?php /* /app/views/helpers/link.php (usando otros helpers) */ class LinkHelper extends AppHelper { var $helpers = array('Html'); function makeEdit($title, $url) { // Usa el helper de HTML para mostrar // informacin con formato: $link = $this->Html->link($title, $url, array('class' => 'edit')); 9. return $this->output("<div class=\"editOuter\">$link</div>"); 1. 2. 3. 4. 5. 6. 7. 8.

10.} 11.} 12.?>


3.11.2.2 Callback method

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Helpers feature a callback used by the parent controller class. beforeRender() The beforeRender method is called after the controller's beforeRender method but before the controller's renders views and layout.
3.11.2.3 Usando tu Helper

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Una vez hayas creado tu helper y de haberlo colocado dentro de /app/views/helpers/, podrs incluirlo dentro de tus controllers usando la variable especial $helpers. Una vez tu controller se haya dado cuenta de esta nueva clase, podrs usarla en los views accesando mediante una variable llamada por ese helper: 1. <!-- crear un link usando el nuevo helper --> 2. <?php echo $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 sesin) siempre estarn disponibles.
3.11.3 Creando Funcionalidad para todos los Helpers

Editar Ver slo esta seccin Historia Comparar con el contenido original

Todos los helpers extienden a una clase especial, AppHelper (as como los modelos extienden

AppModel y los controladores extienden AppController). Para crear funcionalidad que podra estar disponible para todos los helpers, crea /app/app_helper.php. 1. 2. 3. 4. 5. 6. <?php class AppHelper extends Helper { function customMethod () { } } ?>

3.11.4 Helpers del Core

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones CakePHP contiene un buen nmero de helpers que ayudan en la creacin de la vista. Ellos asisten en crear notacin (markup) con buen formato (incluyendo formas), ayudan a dar formato a texto, tiempo y nmeros, y tambin pueden acelerar la funcionalidad de Ajax. Aqu est un resumen de los helpers disponibles por defecto. Para ms imformacin revisa Helpers del Core. Helper de CakePHP Ajax Cache Form Html Javascript Number Paginator Rss Session Text Time Descripcin Usado en conjunto con Prototype Javascript Library para crear funcionalidad en las vistas. Contiene mtodos rpidos para drag/drop (levantar/tirar), formularios ajax & enlaces, observadores, y ms. Es usado por el ncleo (core) para almacenar el contenido de las vistas en cach. Crea formularios HTML y elementos de formulario que se poblan solas y manejan problemas de validacin. Mtodos convenientes para crear cdigo (markup) bien formateado. Imgenes, links, tablas, tags de headers y ms. Usado para 'escapar' valores para usarse en JavaScript, escribir tus propios objetos JSON, y dar formato a bloques de cdigo. Formato para nmeros y tipo de cambio. Paginar y ordenar informacin de modelos. Mtodos convenientes para regresar datos RSS feed XML. Aceso para escribir valores de la sesin en las vistas. Enlaces inteligentes, marcadores, truncado inteligente de palabras. Deteccin de proximidad (es este siguiente ao?), buen formateo de cadenas de caracteres (Hoy, 10:20 am) y conversiones de usos horarios.

Xml

Mtodos convenientes para crear elementos y headers XML.

3.12 Scaffolding Editar Ver slo esta seccin Historia Comparar con el contenido original

El scaffolding (andamiaje) en aplicaciones es una tcnica que permite a un desarrollador definir y crear aplicaciones bsicas que pueden crear, leer, actualizar y borrar objetos. El scaffolding en CakePHP tambin permite a los desarrolladores establecer los enlaces que vinculan unos objetos con otros, y crear y romper dichos enlaces. Todo lo que se necesita para crear un scaffold (andamio) es un modelo y su controlador. Slo tienes ahora que declarar la variable $scaffold en el controlador y el proyecto estar en marcha. El scaffolding de CakePHP mola bastante. Te permite tener una aplicacin CRUD bsica funcional en minutos. Mola tanto, que querrs usarlo en aplicaciones de produccin. Nosotros pensamos tambin que mola, pero por favor, ten en cuenta lo que el scaffoldding (andamiaje) es... bueno... es solo una plataforma temporal. Una estructura precaria que levantas rpidamente al inicio de un proyecto para poder arrancar. No fue pensada para ser completamente flexible, fue pensada como una manera temporal de iniciar un proyecto rpidamente. Si te encuentras realmente tratando de personalizar la lgica de tus vistas, ha llegado el momento de derrumbar el andamio y ponerse ha escribir cdigo. La consola Bake de CakePHP, cubierta en la siguiente seccin, es tu gran segundo paso: genera todo el cdigo que producira el mismo resultado que el ms reciente de los andamios. El scaffolding es una manera fantastica de dar los primeros pasos de desarrollo de una aplicacin web. Los esquemas de base de datos iniciales estn sujetos a cambio, lo cual es perfectamente normal cuando el proceso de diseo todava no est maduro. Esto tiene un inconveniente: un desarrollador web odia crear formularios para que despus no tengan un uso real. As que CakePHP introduce el scaffolding como una tcnica para quitarle estrs al desarrollador. El scaffolding analiza las tablas de tu base de datos y crea listas estndar con botones para aadir, borrar y editar, formularios estndar de edicin y vistas estndar para inspeccionar elementos individuales de la base de datos. Para agregar scaffolding a tu aplicacin, agrega la variable $scaffold en el controlador: 1. 2. 3. 4. 5. <?php class CategoriesController extends AppController { var $scaffold; } ?>

Si has creado la clase basica del modelo Category en el archivo /app/models/category.php, ya ests listo para comenzar!. Visita http://example.com/categories para ver tu nuevo scaffold. El crear mtodos en controladores que se hayan sido "scaffoldeados" pueden causar resultados no deseados. Por ejemplo, si crea un mtodo index() en un controlador "scaffoldeado", su mtodo index ser mostrado en lugar que la funcionalidad de scaffoling. El scaffolding es reconocido por sus asociaciones de modelos, as que si tu modelo Category pertenece a un User ["belongsTo" User], vers las IDs del modelo User relacionadas en el listado del modelo Category. Si quisieras ver algo aparte de un ID (como el apellido del usuario), lo logrars activando la variable $displayField en el modelo.

Inicializaremos la variable $displayField en nuestra clase de User para que los usuarios relacionados con categoras sern mostrados por el primer nombre en lugar de solo el ID en el scaffolding. Esta caracterstica hace el scaffolding ms leble en muchas circunstancias. 1. 2. 3. 4. 5. 6. <?php class User extends AppModel { var $name = 'User'; var $displayField = 'first_name'; } ?>

3.12.1 Creating a simple admin interface with scaffolding

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If you have enabled admin routing in your app/config/core.php, with Configure::write('Routing.prefixes', array('admin')); you can use scaffolding to generate an admin interface. Once you have enabled admin routing assign your admin prefix to the scaffolding variable. 1. var $scaffold = 'admin'; You will now be able to access admin scaffolded actions: 1. 2. 3. 4. 5. 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

This is an easy way to create a simple backend interface quickly. Keep in mind that you cannot have both admin and non-admin methods scaffolded at the same time. As with normal scaffolding you can override individual methods and replace them with your own. 1. function admin_view($id = null) { 2. //custom code here 3. } Once you have replaced a scaffolded action you will need to create a view file for the action as well.
3.12.2 Personalizando Vistas Scaffold

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si ests buscando para algo un poco diferente a tus vistas scaffolded, puees crear templetes. Nosotros an no recomendamos esta tcnica para aplicaciones de produccin, pero semejante personalizacin

puede ser muy til durante el esarrollo e prototipos. La personalizacin se hace creando templetes de vistas:
Vistas personalizadas para un controlador especfico (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 deberan 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

3.13 La consola de CakePHP Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta seccin provee una introduccin a CakePHP en la lnea de comandos. Si tu alguna vez has utilizado tus clases MVC de CakePHP en un cron job o cualquier otro script de lnea de comandos, esta seccin es para ti. PHP provee un poderoso cliente CLI que hace que crear interfases entre tus archivos de sistema y tus aplicaciones sea mucho ms sencillo. La Consola CakePHP provee un framework para crear scritps de shell. La Consola usa una configuracin del tipo despachador para cargar una un shell o una tarea, y para regresar sus parmetros. Una versin de lnea de comandos (cli) de PHP debe de estar disponible en el sistema si planeas usar la Consola. Antes de que nos metamos en cosas ms especficas, hay que asegurarnos de que podemos correr CakePHP en consola. Primero, necesitas abrir una terminal el sistema. Los ejemplos mostrados en esta seccin sern en bash, pero la Consola e CakePHP es compatible con Windows tambin. Ejecutemos el programa de Consola desde bash. Este ejemplo asume que el usuario ya esta logeado en una sesin de bash y se encuentra en la raz de la instalacin de CakePHP. Puedes tcnicamente correr la consola usando algo similar a esto:
$ cd /my/cake/app_folder $ ../cake/console/cake

Pero el uso preferido es agregando el directorio de consola a tu ruta para que puedas usar el comando cake en cualquier lado:
$ cake

Ejecutar la Consola sin argumentos produce el siguiente mensaje de ayuda:


Hello user, Welcome to CakePHP v1.2 Console --------------------------------------------------------------Current Paths: -working: /path/to/cake/ -root: /path/to/cake/ -app: /path/to/cake/app/ -core: /path/to/cake/ Changing Paths: your working path should be the same as your application path to change your path use the '-app' param. Example: -app relative/path/to/myapp or -app /absolute/path/to/myapp Available Shells: app/vendors/shells/: - none vendors/shells/: - none cake/console/libs/: acl api bake console extract To run a command, type 'cake shell_name [args]' To get help on a specific command, type 'cake shell_name help'

La primera informacin mostrada se relaciona con las rutas. Esto es epecialmente til si estas ejecutando la consola de diferentes partes del sistema de archivos. Muchos usuarios agregan la Consola de CakePHP a sus rutas del sistema operativo para que pueda ser ejecutado fcilmente. Imprimiendo las rutas del directorio de trabajo root, app, y core te permite ver donde la Consola har los cambios. Para cambiar la carpeta de app con el que deseas trabajar, puedes proporcionar su ruta como el primer argumento al comando cake. Este siguiente ejemplo nos muestra como especificar un folder de app, asumiendo que ya has agregado el carpeta de la consola en tu PATH:
$ cake -app /path/to/app

La ruta provista puede ser relativa al directorio de trabajo actual o provista como una ruta absoluta.
3.13.1 Creando Shells y Tasks

Editar Ver slo esta seccin Historia Comparar con el contenido original

3.13.1.1 Creando tus Propios Shells

Editar Ver slo esta seccin Historia Comparar con el contenido original

Crearemos una shell para usarla en la Consola. Para este ejemplo, crearemos una report' shell que imprima datos de un modelo. Primero, crea un report.php en /vendors/shells/. 1. 2. 3. 4. 5. <?php class ReportShell extends Shell { function main() {} } ?>

Desde este punto, ya podemos correr el shell, pero no har mucho. Agreguemos algunos modelos al shell para que podamos crear un reporte de algn tipo. Esto se hace de la misma forma que en el controlador: al agregar los nombres de los modelos a la variable $uses; 1. 2. 3. 4. 5. 6. 7. <?php class ReportShell extends Shell { var $uses = array('Order'); function main() { } } ?>

Una vez que agregamos nuestro modelo al arreglo $uses, podemos usarlo en el mtodo main(); En este ejemplo, nuestro modelo Order debe de ahora ser accesible como $this->Order en el mtodo main() de nuestro nuevo shell. Aqu hay un ejemplo simple de la lgica que podemos usar en este shell: class ReportShell extends Shell { var $uses = array('Order'); function main() { //Agrega las rdenes enviadas el mes pasado. $month_ago = date('Y-m-d H:i:s', strtotime('-1 month')); $orders = $this->Order>find("all",array('conditions'=>"Order.shipped >= '$month_ago'")); 7. //Imprime la informacin de cada orden. 8. foreach($orders as $order) { 9. $this->out('Order date: ' . $order['Order']['created'] . "\n"); 10.$this->out('Amount: $' . number_format($order['Order'] ['amount'], 2) . "\n"); 11.$this->out('----------------------------------------' . "\n"); 12.$total += $order['Order']['amount']; 13.} 14.//Imprime el total de las ordenes seleccionadas. 15.$this->out("Total: $" . number_format($total, 2) . "\n"); 16.} 1. 2. 3. 4. 5. 6.

17.} Debes de ser caps de correr este reporte ejecutando este comando (si el comando cake esta en tu PATH):
$ cake report

donde report es el nombre del archivo shell en /vendor/shells/ sin la extensin .php. Esto deber regresar lo siguiente:
Hello user, Welcome to CakePHP v1.2 Console --------------------------------------------------------------App : app Path: /path/to/cake/app --------------------------------------------------------------Order date: 2007-07-30 10:31:12 Amount: $42.78 ---------------------------------------Order date: 2007-07-30 21:16:03 Amount: $83.63 ---------------------------------------Order date: 2007-07-29 15:52:42 Amount: $423.26 ---------------------------------------Order date: 2007-07-29 01:42:22 Amount: $134.52 ---------------------------------------Order date: 2007-07-29 01:40:52 Amount: $183.56 ---------------------------------------Total: $867.75

3.13.1.2 Tasks (Tareas)

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los tasks (tareas) son pequeas extensiones para los shells. Nos permiten que haya lgica comapartida entre shells, y son agregadas a nuestros shells usando una variable de clase especial $task. Por ejemplo en la shell core de bake, hay un cierto nmero de tasks definidos: 1. <?php 2. class BakeShell extends Shell { 3. var $tasks = array('Project', 'DbConfig', 'Model', 'View', 'Controller');

4. } 5. ?> Los tasks son almacenados en /vendors/shells/tasks/ en archivos con el nombre de sus clases. As que si quisiramos crear una nueva tarea cool , la clase CookTask (que extiende de Shell) sera colocada en /vendors/shells/tasks/cool.php. La clase VeryCoolTask (que extiende Shell) sera colocada en /vendors/shells/tasks/cool.php. Cada task debe de tener por lo menos un mtodo execute() - los shells llamarn a este mtodo para iniciar la lgica del task. 1. <?php 2. class SoundTask extends Shell { 3. var $uses = array('Model'); // Lo mismo que en el controlador var $uses 4. function execute() {} 5. } 6. ?> Puedes acceder a tasks dentro de tus clases de shell y ejecutarlas desde ah: 1. <?php 2. class SeaShell extends Shell // Se encuentra en /vendors/shells/sea.php { 3. var $tasks = array('Sound'); //Se encuentra en /vendors/shells/tasks/sound.php 4. function main() { 5. $this->Sound->execute(); 6. } 7. } 8. ?> Un mtodo llamado sound en la clase SeaShell podra sustituir la habilidad de acceder a la funcionalidad de la tarea Sound especificada en el arreglo $tasks. Puedes tambin acceder a los tasks directamente desde la lnea de comados:
$ cake sea sound

3.13.2 Running Shells as cronjobs

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones A common thing to do with a shell is making it run as a cronjob to clean up the database once in a while or send newsletters. However, when you have added the console path to the PATH variable via ~/.profile, it will be unavailable to the cronjob. The following BASH script will call your shell and append the needed paths to $PATH. Copy and save this to your vendors folder as 'cakeshell' and don't forget to make it executable. (chmod +x

cakeshell)
#!/bin/bash TERM=dumb export TERM cmd="cake" while [ $# -ne 0 ]; do if [ "$1" = "-cli" ] || [ "$1" = "-console" ]; then PATH=$PATH:$2 shift else cmd="${cmd} $1" fi shift done $cmd

You can call it like:


$ ./vendors/cakeshell myshell myparam -cli /usr/bin -console /cakes/1.2.x.x/cake/console

The -cli parameter takes a path which points to the php cli executable and the -console parameter takes a path which points to the CakePHP console. As a cronjob this would look like:
# m h dom mon dow command */5 * * * * /full/path/to/cakeshell myshell myparam -cli /usr/bin -console /cakes/1.2.x.x/cake/console -app /full/path/to/app

A simple trick to debug a crontab is to set it up to dump it's output to a logfile. You can do this like:
# m h dom mon dow command */5 * * * * /full/path/to/cakeshell myshell myparam -cli /usr/bin -console /cakes/1.2.x.x/cake/console -app /full/path/to/app >> /path/to/log/file.log

3.14 Plugins Editar Ver slo esta seccin Historia Comparar con el contenido original

CakePHP nos permite combinar una serie de controladores, modelos y vistas y publicarlos como una aplicacin empaquetada, plugin, que otros pueden integrar en sus aplicaciones CakePHP. Has desarrolado un mdulo de administracin de usuarios amigable, un blog sencillo o un web service en alguna de tus aplicaciones? Empaqutalo como un plugin de CakePHP e inclyelo en otras aplicaciones. El principal vnculo entre un plugin y la aplicacin en la que se instala es la configuracin de la aplicacin (conexin a la base de datos, etc.). Por lo dems, el plugin opera en su propio espacio, comportndose como si fuese una aplicacin en s mismo.

3.14.1 Crear un Plugin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Como ejemplo, vamos a crear un nuevo plugin que encargue pizzas. Para empezar tendremos que colocar todos los archivos de nuestro plugin en el directorio /app/plugins. El nombre del directorio padre del plugin es importante y se referenciar muy a menudo, as que conviene escogerlo con prudencia. Para este ejemplo utilizaremos el nombre 'pizza'. La estructura de archivos ser la siguiente:
/app /plugins /pizza /controllers /models /views /pizza_app_controller.php /pizza_app_model.php

<<<<<-

controladores del plugin modelos del plugin vistas del plugin clase AppController del plugin clase AppModel del plugin

Si queremos acceder a nuestro plugin a travs de una URL, es necesario definir las clases AppController y AppModel para el mismo. Estas dos clases especiales tienen el nombre del plugin y extienden las clases AppController y AppModel de la aplicacin principal. En nuestro ejemplo: 1. 2. 3. 4. 5. 6. 1. 2. 3. 4. 5. 6. // /app/plugins/pizza/pizza_app_controller.php: <?php class PizzaAppController extends AppController { //... } ?> // /app/plugins/pizza/pizza_app_model.php: <?php class PizzaAppModel extends AppModel { //... } ?>

Si olvidamos definir estas clases, CakePHP nos mostrar el error "Missing Controller".
3.14.2 Controladores del Plugin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los controladores de nuestro plugin pizza se almacenan en /app/plugins/pizza/controllers/. Puesto que las acciones que ms trataremos son las peticiones de pizza, necesitaremos el controlador PeticionesController para este plugin. Aunque no es necesario, conviene llamar los controladores de los plugin con un nombre relativamente nico, con el fin de evitar conflictos de espacios de nombre con la aplicacin principal. No es extrao pensar que una aplicacin podra tener controladores como UsuariosController, PeticionesController o ProductosController: deberamos ser creativos con los nombres de los controladores, o anteponer el nombre del plugin al nombre de la clase (PizzaPeticionesController en nuestro ejemplo). As, ubicamos nuestro nuevo controlador, PizzaPeticionesController, en /app/plugins/pizza/controllers, quedando: 1. // /app/plugins/pizza/controllers/pizza_peticiones_controller.php 2. class PizzaPeticionesController extends PizzaAppController { 3. var $name = 'PizzaPeticiones'; 4. var $uses = array('Pizza.PizzaPeticion'); 5. function index() { 6. //... 7. } 8. } Observa cmo este controlador extiende el controlador AppController del plugin (llamado PizzaAppController) en lugar del controlador AppController de la aplicacin principal. Adems, al nombre del modelo se aade como prefijo el nombre del plugin. Esta lnea de cdigo se aade por claridad, pero no es necesaria en este caso. Si quieres acceder a lo que hemos hecho hasta ahora, visita /pizza/pizzaPeticiones. Deberas obtener un error Missing Model, porque no hemos definido todava el modelo PizzaPeticion.
3.14.3 Modelos del Plugin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los modelos de un plugin son almacenados en /app/plugins/pizza/models. En el apartado anterior,

definimos el controlador PizzaPeticionesController para nuestro plugin de ejemplo. Ahora crearemos el modelo para ese controlador, PizzaPeticion, definicin consistente con el esquema de nombres que establecimos previamente, anteponiendo a todas las clases de nuestro plugin el nombre del mismo, Pizza. 1. 2. 3. 4. 5. // /app/plugins/pizza/models/pizza_peticion.php: class PizzaPeticion extends PizzaAppModel { var $name = 'PizzaPeticion'; } ?>

Acceder a /pizza/pizzaPeticiones ahora (suponiendo que tenemos una tabla en nuestra base de datos llamada pizza_peticiones) nos debera dar un error Missing View. Este ser el prximo paso. Si necesitamos referenciar un modelo dentro de nuestro plugin, tenemos que incluir el nombre del plugin junto con el nombre del modelo, separados por un punto. 1. 2. 3. 4. 5. 6. // /app/plugins/pizza/models/pizza_peticion.php: class ExampleModel extends PizzaAppModel { var $name = 'ExampleModel'; var $hasMany = array('Pizza.PizzaPeticion'); } ?>

3.14.4 Vistas del Plugin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Las vistas se comportan en un plugin exactamente igual a como lo hacen en una aplicacin normal. Basta con colocarlas en la carpeta adecuada en /app/plugins/[plugin]/views/. Para nuestro plugin encargado de pedir pizza, necesitaremos una vista para la accin PizzaPeticionesController::index(): 1. 2. 3. 4. // /app/plugins/pizza/views/pizza_peticiones/index.ctp: <h1>Pide una Pizza</h1> <p>Nada combina con Cake mejor que una buena pizza!</p> <!-- Aqu debera ir un formulario para solicitar pizza...-->

# Overriding plugin views from inside your application

Traducir Ver slo esta seccin Historia

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones You can override any plugin views from inside your app using special paths. If you have a plugin called 'Pizza' you can override the view files of the plugin with more application specific view logic by creating files using the following template "app/views/plugins/$plugin/$controller/$view.ctp". For the pizza controller you could make the following file: 1. /app/views/plugins/pizza/pizza_orders/index.ctp Creating this file, would allow you to override "/app/plugins/pizza/views/pizza_orders/index.ctp".
3.14.5 Componentes, Ayudantes y Comportamientos

Editar Ver slo esta seccin Historia Comparar con el contenido original

Al igual que una aplicacin tpica, un plugin puede tener Componentes (Components), Ayudantes (Helpers) y Comportamientos (Behaviors). Incluso podemos crear plugins que incluyan nicamente estas clases, siendo un mecanismo excelente para construir mdulos reutilizables que pueden aadirse fcilmente en cualquier proyecto. Los componentes se desarrollan exactamente de la misma manera a como se desarrollan en una aplicacin normal, sin ninguna convencin de nombres especial. Hacer referencia a nuestros componentes desde el mismo plugin no requiere ninguna notacin especial. 1. 2. 3. 4. 5. // Componente class EjemploComponent extends Object { } // desde los controladores de nuestro plugin: var $components = array('Ejemplo');

Para invocar el Componente desde fuera del entorno del plugin, tenemos que indicar el nombre del mismo. 1. var $components = array('PluginNombre.Ejemplo'); 2. var $components = array('Pizza.Ejemplo'); // referencia al componente EjemploComponent en el plugin Pizza. La misma tcnica se aplica a los Ayudantes y Comportamientos.
3.14.6 CSS y Javascript en los Plugins

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original

Mas info sobre traduciones Podemos incluir archivos CSS y Javascript en nuestros plugins, colocndolos, respectivamente, en nuestro_plugin/vendors/css y nuestro_plugin/vendors/js. Pueden incluirse en nuestras vistas usando los ayudantes nativos del framework. 1. <?php echo $html->css('/nuestro_plugin/css/mi_css'); ?> 2. 3. <?php echo $javascript>link('/nuestro_plugin/js/mi_javascript'); Las lneas anteriores son ejemplos de como incluir archivos javascript y css en nuestro plugin. Es importante observar como se incluye en la ruta del arhivo js o css /nuestro_plugin/. Esto hace que la magia funcione
3.14.7 Consejos para desarrollar Plugins

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Una vez que ya hemos desarrollado todo lo necesario, nuestro plugin est listo para ser distribuido (aunque sera conveniente aadir unos cuantos extras, como un readme o un fichero SQL). Despus de instalar el plugin en /app/plugins, podemos acceder al mismo siguiendo la URL /nombreplugin/nombrecontrolador/accion. En nuestro plugin de ejemplo para ordenar pizza, accedemos a PizzaPeticionesController en /pizza/pizzaPeticiones. Algunos consejos tiles a tener en cuenta cuando trabajamos con plugins en nuestras aplicaciones CakePHP: Si no definimos [Plugin]AppController y [Plugin]AppModel, recibiremos errores "Missing Controller" cuando intentemos accede a un controlador del plugin. Podemos tener un controlador por defecto con el mismo nombre de nuestro plugin. Podemos acceder a l via /[plugin]/accion. Por ejemplo, a un plugin llamado 'usuarios' con un controlador UsuariosController podemos acceder en /usuarios/add si no hay ningn plugin llamado AddController en la carpeta [plugin]/controllers. Podemos definir el diseo de nuestros plugins en app/plugin/views/layouts. En caso contrario, los plugins usarn, por defecto, los diseos en /app/views/layouts folder by default. Usando $this->requestAction('/plugin/controller/accion'); en los controladores logramos comunicar distintos plugins. Si pretendemos usar requestAction, debemos asegurarnos de que los nombres de modelos y controladores son tan nicos como sea posible. Si no fuera as, pueden surgir errores PHP del tipo "clase redefinida ..."

3.15 Constantes y Funciones Globales Editar Ver slo esta seccin Historia Comparar con el contenido original

Aunque en la mayor parte de nuestro trabajo diario en CakePHP utilizaremos clases y mtodos nativos, es til conocer una serie de funciones globales que ofrece CakePHP. Muchas de ellas estn orientadas al trabajo con las clases de CakePHP (cargando las clases de modelo o componente), pero muchas otras hacen ms sencillo trabajar con matrices o cadenas. Tambin veremos en esta seccin algunas de las constantes disponibles en las aplicaciones CakePHP. Usarlas ayuda a realizar actualizaciones menos complicadas, adems de ser tiles a la hora de referenciar ciertos archivos o directorios en nuestras aplicaciones CakePHP.
3.15.1 Funciones globales

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones 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 cdigo o realizar otras funciones tiles. Lo ms probable es que si ests buscando una funcin para realizar una tarea con mucha frecuencia, la encuentres aqu.
3.15.1.1 __

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones __(string $string_id, boolean $return = false) Esta funcin gestiona la localizacin en las aplicaciones CakePHP. El parmetro $string_id identifica la ID de una traduccin, mientras que el segundo parmetro indica si se debe mostrar

automticamente la cadena (por defecto), o devolverla para su procesamiento (pasar el valor true para que esto suceda). Visita la seccin Localizacin e Internacionalizacin para ms informacin.
3.15.1.2 a

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones a(mixed $uno, $dos, $tres...) Devuelve un array con los parmetros pasados a la funcin. 1. 2. 3. 4. 5. 6.
3.15.1.3 aa

print_r(a('foo', 'bar')); // salida: array( [0] => 'foo', [1] => 'bar' )

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones aa(array $uno, $dos, $tres...) Crea arrays asociativos a partir de los parmetros enviados a la funcin. 1. 2. 3. 4. 5. echo aa('a','b'); // salida: array( 'a' => 'b' )

3.15.1.4 am

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones am(array $uno, $dos, $tres...) Combina todos los arrays pasados como parmetros y devuelve el array resultante.
3.15.1.5 config

Editar Ver slo esta seccin Historia Comparar con el contenido original

Puede ser usado para cargar archivos desde el directorio config mediante include_once. La funcin checa si existe el archivo antes de incluir y regresa un booleano. Toma un nmero opcional de argumento. Ejemplo: config('some_file', 'myconfig');
3.15.1.6 convertSlash

Editar Ver slo esta seccin Historia Comparar con el contenido original

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

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original

Mas info sobre traduciones debug(mixed $var, boolean $showHtml = false) Si el nivel de depuracin, variable de configuracin DEBUG, es distinto de cero, se muestra $var. Si $showHTML es true, los datos se formatean para mostrarlos adecuadamente en los navegadores web.
3.15.1.8 e

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones e(mixed $datos) Simplifica la llamada a la funcin echo().
3.15.1.9 env

Editar Ver slo esta seccin Historia Comparar con el contenido original

env(string $key) Obtiene una variable de entorno a partir de las fuentes disponibles. Alternativa si las variables $_SERVER o $_ENV estn deshabilitadas. Tambin permite emular las variables PHP_SELF y DOCUMENT_ROOT en los servidores que no permitan su uso. De hecho, es una buena prctica usar env() en lugar de $_SERVER o getenv() (sobretodo si pensamos distribuir el cdigo), ya que ofrece la misma funcionalidad y es totalmente compatible.
3.15.1.10 fileExistsInPath

Editar Ver slo esta seccin Historia Comparar con el contenido original

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

Editar

Ver slo esta seccin Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones h(string $texto, string $charset) Alias de la funcin htmlspecialchars().
3.15.1.12 ife

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones ife($condicion, $siNoVacia, $siVacia) til en operaciones ternarias. Si $condicion no es vaca, devuelve $siNoVacia; si no, devuelve $siVacia.
3.15.1.13 low

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones low(string $cadena) Alias de la funcin strtolower().
3.15.1.14 pr

Editar

Ver slo esta seccin Historia Comparar con el contenido original pr(mixed $var) Alias de la funcin print_r(), aadiendo la etiqueta <pre> a la salida.
3.15.1.15 r

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones r(string $cadena_buscada, string $cadena_sustituta, string $cadena_original) Alias de la funcin str_replace().
3.15.1.16 stripslashes_deep

Editar Ver slo esta seccin Historia Comparar con el contenido original

stripslashes_deep(array $valor) Elimina recursivamente las barras invertidas de $valor. Devuelve el array modificado.
3.15.1.17 up

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones up(string $cadena) Alias de la funcin strtoupper().

3.15.1.18 uses

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones uses(string $lib1, $lib2, $lib3...) Permite cargar las libreras nativas de CakePHP (localizadas en cake/libs/). Pasar como parmetro el nombre de la librera sin la extensin '.php'.
3.15.2 Constantes predefinidas

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones constante APP APP_PATH CACHE CAKE COMPONENTS CONFIGS directorio raz. directorio app. directorio de archivos de cache. directorio cake. directorio components. directorio de archivos de configuracin. Ruta absoluta dentro de la aplicacin al ...

CONTROLLER_TEST directorio controller de los tests. S CONTROLLERS CSS directorio controllers. directorio de archivos CSS.

ELEMENTS HELPER_TESTS HELPERS INFLECTIONS JS LAYOUTS LIB_TESTS LIBS LOGS MODEL_TESTS MODELS SCRIPTS TESTS TMP VENDORS VIEWS WWW_ROOT

directorio elements. directorio helper de los tests. directorio helpers. directorio inflections (normalmente dentro del directorio de configuracin). directorio de archivos JavaScript (en webroot). directorio layouts. directorio CakePHP Library de los tests. directorio de libreras CakePHP. directorio de logs (en app). directorio model de los tests. directorio models. directorio de scripts de Cake. directorio tests (directorio padre de los directorios de test para los modelos, controladores, etc.) directorio tmp. directorio vendors. directorio views. ruta completa a webroot.

3.16 Paquetes de terceros (Vendor packages) Editar Ver slo esta seccin Historia Comparar con el contenido original

La informacin del archivo Vendor va aqu.

3.16.1 Vendor assets

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Support for vendor assets have been removed for 1.3. It is recommended that you take any vendor assets you have and repackage them into plugins. See Plugin assets for more information.

4 Tareas comunes con CakePHP


Editar Ver slo esta seccin Historia Comparar con el contenido original

4.1 Validacin de Datos Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La validacin de los datos es una parte importante de cualquier aplicacin, ya que asegura que los datos en un modelo estn conformes a las reglas de negocio de la aplicacin. Por ejemplo, tu podrias querer que los passwords tengan a lo menos un largo de ocho caracteres, o asegurar que los username sean nicos. Definir reglas de validacin hace que el manejo de los formularios sea muchsimo ms fcil. Hay muchos diferentes aspectos del proceso de validacin. En esta seccin cubriremos el lado del modelo, es decir, lo que ocurre cuando tu llamas al mtodo save() de tu modelo. Para ms informacin acerca de cmo manejar el despliegue de errores de validacin, revisa la seccin que cubre el FormHelper. El primer paso en la validacin de datos es la creacin de las reglas de validacin en el Modelo. Para hacer eso, usa el arreglo Model::validate en la definicin del Modelo, por ejemplo: 1. 2. 3. 4. 5. 6. <?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 validacin. Asumiendo que la tabla users tiene los campos login, password, email y born, el ejemplo de abajo muestra algunas simples reglas de validacin que se aplican a esos campos: 1. <?php 2. class User extends AppModel { 3. var $name = 'User'; 4. var $validate = array( 5. 'login' => 'alphaNumeric', 6. 'email' => 'email', 7. 'born' => 'date' 8. ); 9. } 10.?> El ejemplo muestra cmo se pueden agregar reglas de validacin a los campos de un modelo. Para el campo login sern aceptadas slo letras y nmeros, el email debe ser vlido, y born debe ser una fecha vlida. La definicin de reglas de validacin habilitan en CakePHP el despliegue automtico de mensajes de error en formularos si los datos enviados no cumplen las reglas de validacin. CakePHP incluye muchas reglas de validacin y usarlas puede ser bastante simple. Algunas de las reglas incluidas permiten verificar el formato de los emails, URLs, y nmeros de tarjeta de crdito - las cubriremos en detalle ms adelante. Ac tenemos un ejemplo de validacin ms complejo que aprovecha algunas de las reglas incluidas: 1. <?php 2. class User extends AppModel { 3. var $name = 'User'; 4. var $validate = array( 5. 'login' => array( 6. 'alphaNumeric' => array( 7. 'rule' => 'alphaNumeric', 8. 'required' => true, 9. 'message' => 'Slo letras y nmeros' 10.), 11.'between' => array( 12.'rule' => array('between', 5, 15), 13.'message' => 'Entre 5 y 15 caracteres' 14.) 15.), 16.'password' => array( 17.'rule' => array('minLength', '8'), 18.'message' => 'Largo mnimo de 8 caracteres' 19.), 20.'email' => 'email', 21.'born' => array( 22.'rule' => 'date', 23.'message' => 'Ingrese una fecha vlida', 24.'allowEmpty' => true 25.)

26.); 27.} 28.?> Dos reglas de validacin son definidas para login: debera contener slo letras y nmeros, y su largo debe ser de 5 a 15. El campo password debe tener un largo mnimo de 8 caracteres. El email debe contener una direccin de correo vlida, y born debe ser una fecha vlida. Adems, notar que puedes agregar mensajes de error propios que CakePHP mostrar cuando estas reglas de validacin no se cumplan. Como lo muestra el ejemplo de arriba, un nico campo puede tener mltiples reglas de validacin. Y si las reglas incluidas no coinciden con lo que necesitas, puedes agregar tus propias reglas de validacin segn tus requerimientos. Ahora que viste a grandes rasgos cmo funciona la validacin, veamos cmo estas reglas son definidas en el modelo. Hay tres diferentes maneras para definir reglas de validacin: arreglos simples, una nica regla por campo, y mltiples reglas por campo.
4.1.1 Reglas Simples

Editar Ver slo esta seccin Historia Comparar con el contenido original

Tal como el nombre lo sugiere, esta es la manera ms simple de definir una regla de validacin. La sintaxis para la definicin de reglas usando esta manera es: 1. 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 (cubriremos esto en la siguiente seccin).
4.1.2 Una regla por campo

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones sta tcnica de definicin permite un mejor control del funcionamiento de las reglas de validacin. Pero antes de su discusin, veamos el patrn de uso general para agregar una regla a un solo campo: 1. var $validate = array( 2. 'fieldName1' => array( 3. 'rule' => 'ruleName', // : array('ruleName', 'param1', 'param2' ...)

4. 5. 6. 7. 8. 9.

'required' => true, 'allowEmpty' => false, 'on' => 'create', // : 'update' 'message' => 'Su mensaje de error' ) );

El ndice 'rule' es requerido. Si slo se setea 'required' => true la validacin 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 slo un campo) es asociado con un arreglo que contiene cinco ndice: rule, required, allowEmpty, on y message. Veamos con ms detalle cada uno de estos ndices.
4.1.2.1 rule

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El ndice rule define el mtodo de validacin y acepta un slo valor o un arreglo. El valor para rule especificado puede ser el nombre de un mtodo en tu modelo, un mtodo de la clase core Validation, o una expresin regular. Para un completo listado de todas las reglas incorporadas ver la seccin llamada "Reglas de Validacin Incorporadas". Si la regla no requiere parmetros, rule puede ser un slo valor, por ejemplo: 1. 2. 3. 4. 5. var $validate = array( 'login' => array( 'rule' => 'alphaNumeric' ) );

Si la regla requiere algunos parmetros (como max, min o range), entonces rule debera ser un arreglo: 1. 2. 3. 4. 5. var $validate = array( 'password' => array( 'rule' => array('minLength', 8) ) );

Recuerda, el ndice rule es requerido para la definicin de reglas basadas en arreglos.

4.1.2.2 required

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Este ndice debera 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 validacin ha sido definida de la siguiente manera: 1. 2. 3. 4. 5. 6. var $validate = array( 'login' => array( 'rule' => 'alphaNumeric', 'required' => true ) );

Los datos enviados al mtodo save() del modelo deben contener un valor para el campo login. Si no es as, la validacin falla (la regla no se cumple). El valor por defecto para este ndice es un false booleano. Si el ndice login estn presente pero no tiene un valor asignado, la validacin ser exitosa. Setear required a true slo verifica que el ndice del campo este presente.
4.1.2.3 allowEmpty

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Al ndice allowEmpty se le debera asignar un valor booleano. Si allowEmpty es false, los datos pasados al mtodo save() del modelo deben incluir el campo a un valor no-vaco para ese campo. Cuando se deja en true, un campo vaco pasar exitosamente la validacin de ese campo. El valor por defecto de allowEmpty es null. Esto significa que el campo siempre procesar las reglas de validacin incluyendo la ejecucin de funciones de validacin propias.
4.1.2.4 on

Editar

Ver slo esta seccin Historia Comparar con el contenido original El ndice on puede ser seteado con uno de los siguientes valores: update o create. Esto provee un mecanismo que permite que cierta regla sea aplicada ya sea durante la creacin de un nuevo registro, o durante la actualizacin de un registro. Si la regla fue definida como on => create, entonces la regla slo ser verificada durante la creacin de un nuevo registro. De igual manera, si es definida como on => update, la regla slo ser verificada durante la actualizacin de un registro. El valor por defecto de on es null. Cuando on es null, la regla ser verificada durante la creacin y actualizacin de un registro.
4.1.2.5 message

1. 2. 3. 4. 5. 6.

Editar Ver slo esta seccin Historia Comparar con el contenido original var $validate = array( 'password' => array( 'rule' => array('minLength', 8), 'message' => 'Password debe tener a lo menos 8 caracteres' ) );

El ndice message permite definir un mensaje de error de validacin para la regla:

4.1.3 Mltiples Reglas por Campo

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La tcnica descrita anteriormente nos entrega mayor flexibilidad que la asignacin de reglas simples, pero hay un paso adicional que podemos tomar para lograr un control ms fino de la validacin de datos. La siguiente tcnica que revisaremos nos permite asignar mltiples reglas de validacin por cada campo de un modelo. Si quieres asignar mltiples reglas de validacin a un slo campo, bsicamente as es cmo se ver: 1. var $validate = array( 2. 'nombreCampo' => array(

3. 'nombreRegla' => array( 4. 'rule' => 'nombreRegla', 5. // ac van ndices extra como on, required, etc. 6. ), 7. 'nombreRegla2' => array( 8. 'rule' => 'nombreRegla2', 9. // ac van ndices extra como on, required, etc. 10.) 11.) 12.); Como puedes ver, esto es bastante similar a lo que hicimos en la seccin previa. Anteriormente, por cada campo tenamos un slo arreglo con parmetros de validacin. En este caso, cada nombreCampo consiste en un arreglo de ndices de reglas. Cada nombreRegla contiene un arreglo distinto con parmetros de validacin. Esto se entiende mejor con un ejemplo prctico: 1. var $validate = array( 2. 'login' => array( 3. 'alphanumeric' => array( 4. 'rule' => 'alphaNumeric', 5. 'message' => 'Se permiten slo letras y nmeros', 6. 'last' => true 7. ), 8. 'minlength' => array( 9. 'rule' => array('minLength', '8'), 10.'message' => 'Largo mnimo de 8 caracteres' 11.), 12.) 13.); El ejemplo de arriba define dos reglas para el campo login: alphanumeric y minLength. Como puedes ver, cada regla se identifica con un nombre de ndice. En este caso particular, los nombres de ndice son similares a las reglas que usan, pero el nombre de ndice puede ser cualquier nombre. Por defecto CakePHP trata de validar un campo usando todas las reglas de validacin declaradas para l y retorna un mensaje de error para la ltima regla no satisfecha. Pero si el ndice last es dejado como true y la regla no es satisfecha, entonces se mostrar el mensaje de error para esa regla y no se validar ninguna regla adicional. Asi que si prefieres mostrar un mensaje de error para la primera regla no satisfecha entonces debes dejar 'last' => true por cada regla. Si vas a usar mensajes de error internacionalizados podrias quierer especificar los mensajes de error en las vistas: 1. 2. 3. 4. 5. 6. 7. echo $form->input('login', array( 'label' => __('Login', true), 'error' => array( 'alphanumeric' => __('Se permiten slo letras y nmeros', true), 'minlength' => __('Largo mnimo de 8 caracteres', true) ) )

8. ); El campo ahora est totalmente internacionalizado, y puedes eliminar los mensajes del modelo. Para ms informacin acerca de la funcin __() ver "Localization & Internationalization"
4.1.4 Reglas de Validacin Incorporadas

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La clase Validation de CakePHP contiene muchas reglas de validacin incorporadas que pueden hacer mucho ms fcil la validacin de datos. Esta clase contiene muchas tcnicas de validacin frecuentemente usadas que no necesitars escribir por tu cuenta. Abajo encontrars una lista completa de todas las reglas, junto ejemplos de uso.
4.1.4.1 alphaNumeric

1. 2. 3. 4.

Editar Ver slo esta seccin Historia Comparar con el contenido original

Los datos para el campo deben contener slo letras y nmeros. var $validate = array( 'login' => array( 'rule' => 'alphaNumeric', 'message' => 'Los nombres de usuario deben contener slo letras y nmeros.' 5. ) 6. );
4.1.4.2 between

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original

Mas info sobre traduciones El largo de los datos para el campo debe estar dentro de un rango numrico especfico. Se debe indicar un valor mnimo y mximo. var $validate = array( 'password' => array( 'rule' => array('between', 5, 15), 'message' => 'Las contraseas deben tener un largo entre 5 y 15 caracteres.' 5. ) 6. ); 1. 2. 3. 4.
4.1.4.3 blank

Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta regla es usada para asegurar que el campo es dejado en blanco o con slo espacios en blanco como su valor. Los espacios en blanco incluyen los caracteres de la barra espaciadora, tabulador, retorno de carro y nueva lnea. 1. 2. 3. 4. 5. 6. var $validate = array( 'id' => array( 'rule' => 'blank', 'on' => 'create' ) );

4.1.4.4 boolean

Editar Ver slo esta seccin Historia Comparar con el contenido original

El campo debe contener un valor booleano. Los valores aceptados son true o false, los enteros 0 o 1 y las cadenas "0" o "1". 1. 2. 3. 4. 5. 6.
4.1.4.5 cc

var $validate = array( 'myCheckbox' => array( 'rule' => array('boolean'), 'message' => 'Valor incorrecto en myCheckbox' ) );

Editar Ver slo esta seccin Historia

Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla es usada para verificar si los datos corresponden a un nmero de tarjeta de credito vlido. Acepta tres parmetros: type, deep y regex. El type puede ser fast, all o cualquiera de los siguientes: bankcard diners disc electron enroute jcb maestro mc solo switch visa voyager

Si type es dejado en fast, se validan los datos contra el formato numrico de las principales tarjetas de crdito. Tambin se puede dejar type como un arreglo con todos los tipos de validaciones que se quiere satisfacer. El ndice deep debera dejarse con un valor booleano. Si es verdadero, la validacin usar el algoritmo de Luhn para tarjetas de crdito (http://en.wikipedia.org/wiki/Luhn_algorithm). Por defecto el valor se asume como falso. El ndice regex permite indicar una expersin regular propia que ser usada para validar el nmero de tarjeta de credito. var $validate = array( 'ccnumber' => array( 'rule' => array('cc', array('visa', 'maestro'), false, null), 'message' => 'El nmero de tarjeta de crdito que ha suministrado no es vlido.' 5. ) 6. ); 1. 2. 3. 4.
4.1.4.6 comparison

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla es usada para comparar valores numricos. Soporta is greater, is less, greater or equal, less or equal, is less, equal to, y not equal. A continuacin algunos ejemplos: 1. var $validate = array( 2. 'age' => array( 3. 'rule' => array('comparison', '>=', 18), 4. 'message' => 'Debe tener al menos 18 aos para calificar.' 5. ) 6. ); 7. var $validate = array( 8. 'age' => array( 9. 'rule' => array('comparison', 'greater or equal', 18), 10.'message' => 'Debe tener al menos 18 aos para calificar.' 11.) 12.);
4.1.4.7 date

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla asegura que los datos enviados esten en un formato de fecha vlido. Un nico parmetro (que puede ser un arreglo) puede ser pasado y que ser usado para verificar el formato de la fecha indicada. El valor del parmetro puede ser uno de los siguientes formatos: dmy por ejemplo 27-12-2006 o 27-12-06 (los separadores pueden ser espacio, punto, guion, slash) mdy por ejemplo 12-27-2006 or 12-27-06 (los separadores pueden ser espacio, punto, guion, slash) ymd por ejemplo 2006-12-27 or 06-12-27 (los separadores pueden ser espacio, punto, guion, slash) dMy por ejemplo 27 December 2006 o 27 Dec 2006 Mdy por ejemplo December 27, 2006 o Dec 27, 2006 (la coma es opcional) My por ejemplo (December 2006 o Dec 2006) my por ejemplo 12/2006 o 12/06 (los separadores pueden ser espacio, punto, guion, slash)

Si no especifica ningn ndice, se usar el ndice por defecto ymd. var $validate = array( 'born' => array( 'rule' => 'date', 'message' => 'Ingrese una fecha vlida usando el formato AA-MMDD.', 5. 'allowEmpty' => true 6. ) 7. ); 1. 2. 3. 4. Mientras que muchos almacenes de datos (motores de bases de datos) requieren cierto formato de datos, podrias considerar aceptar una amplia variedad de formatos de fechas y luego convertirlos, en vez de forzar a los usuarios a ingresar cierto formato. Entre ms trabajo puedas hacer por tus usuarios, mejor.
4.1.4.8 decimal

Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta regla asegura que el dato es un nmero decimal vlido. Se puede pasar un parmetro para especificar la cantidad de dgitos requeridos despus del punto decimal. Si no se pasa ningn parmetro, el dato ser validado como un nmero de punto flotante cientfico, que causar que la validacin no sea satisfecha si es que no se encuentra ningn dgito despus del punto decimal. 1. 2. 3. 4. 5. var $validate = array( 'price' => array( 'rule' => array('decimal', 2) ) );

4.1.4.9 email

Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta regla verifica que el dato sea una direccin de correo electrnico vlida. Al pasar un valor booleano verdadero como segundo parmetro se tratar tambin de verificar que el host de la direccin sea vlido. var $validate = array('email' => array('rule' => 'email')); var $validate = array( 'email' => array( 'rule' => array('email', true), 'message' => 'Por favor indique una direccin de correo electrnico vlida.' 6. ) 1. 2. 3. 4. 5.

7. );
4.1.4.10 equalTo

1. 2. 3. 4. 5. 6.

Editar Ver slo esta seccin Historia Comparar con el contenido original var $validate = array( 'food' => array( 'rule' => array('equalTo', 'cake'), 'message' => 'El valor debe ser el string cake' ) );

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

4.1.4.11 extension

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla verifica que la extensin de archivo sea como .jpg o .png. Para permitir mltiples extensiones estas se deben pasar dentro de un arreglo. 1. 2. 3. 4. 5. 6.
4.1.4.12 file

var $validate = array( 'image' => array( 'rule' => array('extension', array('gif', 'jpeg', 'png', 'jpg'), 'message' => 'Por favor indique una imgen vlida.' ) );

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones Esta seccin an tiene que ser escrita, si tienes una idea de qu poner aqui, por favor usa los links y djanos saber tu sugerencia!
4.1.4.13 ip

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla asegura que haya sido ingresada una direccin IPv4 vlida. 1. 2. 3. 4. 5. 6. var $validate = array( 'clientip' => array( 'rule' => 'ip', 'message' => 'Por favor ingrese una direccin IP vlida.' ) );

4.1.4.14 isUnique

1. 2. 3. 4. 5. 6.

Editar Ver slo esta seccin Historia Comparar con el contenido original var $validate = array( 'login' => array( 'rule' => 'isUnique', 'message' => 'Este nombre de usuario ya ha sido asignado.' ) );

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

4.1.4.15 minLength

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este

differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla asegura que el dato cumple con un requisito de largo mnimo. var $validate = array( 'login' => array( 'rule' => array('minLength', '8'), 'message' => 'Los nombres de usuario deben tener un largo de al menos 8 caracteres.' 5. ) 6. ); 1. 2. 3. 4.
4.1.4.16 maxLength

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla asegura que el dato siempre est dentro del requisito de largo mximo. var $validate = array( 'login' => array( 'rule' => array('maxLength', '15'), 'message' => 'Los nombres de usuario no pueden tener un largo mayor a 15 caracteres.' 5. ) 6. ); 1. 2. 3. 4.
4.1.4.17 money

Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta regla asegura que el valor sea una cantidad en formato monetario vlido. El segundo parmetro define dnde se ubica el smbolo: left/right (izquierda/derecha). 1. var $validate = array( 2. 'salary' => array( 3. 'rule' => array('money', 'left'),

4. 'message' => 'Por favor ingrere una cantidad monetaria vlida.' 5. ) 6. );


4.1.4.18 multiple

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Empleado para validar campos input select multiple. Soporta los paramentros "in", "max" y "min". 1. var $validate = array( 2. 'multiple' => array( 3. 'rule' => array('multiple', array('in' => array('foo', 'bar'), 'min' => 1, 'max' => 3)), 4. 'message' => 'Por favor seleccione una, dos o tres opciones' 5. ) 6. );
4.1.4.19 inList

Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta regla asegura que el valor est dentro de un conjunto dado. Necesita de un arreglo de valores. El valor es vlido si coincide con uno de los valores del arreglo indicado. Example: 1. 2. 3. 4. 5. 6. 7. 8. var $validate = array( 'function' => array( 'allowedChoice' => array( 'rule' => array('inList', array('Foo', 'Bar')), 'message' => 'Ingreso Foo o ingrese Bar.' ) ) );

4.1.4.20 numeric

Editar Ver slo esta seccin

Historia Comparar con el contenido original Verifica si el dato ingresado es un nmero vlido. 1. 2. 3. 4. 5. 6. var $validate = array( 'cars' => array( 'rule' => 'numeric', 'message' => 'Por favor indique la cantidad de vehculos.' ) );

4.1.4.21 notEmpty

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Regla bsica para asegurar que un campo no este vaco. 1. 2. 3. 4. 5. 6. var $validate = array( 'title' => array( 'rule' => 'notEmpty', 'message' => 'Este campo no puede quedar vaco.' ) );

4.1.4.22 phone

Editar Ver slo esta seccin Historia Comparar con el contenido original

Phone valida nmeros telefnicos de EE.UU. Si quieres validar nmeros telefnicos que no sean de EE.UU. puedes proveer una expresin regular como segundo parmetro para cubrir formatos adicionales. 1. 2. 3. 4. 5. var $validate = array( 'phone' => array( 'rule' => array('phone', null, 'us') ) );

4.1.4.23 postal

Editar Ver slo esta seccin Historia Comparar con el contenido original

Postal es usado para validar cdigos ZIP de EE.UU. (us), Canada (ca), Reino Unido (uk), Italia (it), Alemania (de) y Blgica (be). Para otros formatos ZIP puedes proveer una expersin regular como segundo parmetro. 1. 2. 3. 4. 5. var $validate = array( 'zipcode' => array( 'rule' => array('postal', null, 'us') ) );

4.1.4.24 range

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla asegura que el valor est dentro de un rango dado. Si no se indica un rango, la regla va a verificar si el valor es un nmero finito vlido en la actual plataforma. 1. 2. 3. 4. 5. 6. var $validate = array( 'number' => array( 'rule' => array('range', 0, 10), 'message' => 'Por favor ingrese un nmero entre 0 y 10' ) );

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

Editar Ver slo esta seccin Historia Comparar con el contenido original

Ssn valida los nmeros de seguridad social de EE.UU. (us), Dinamarca (dk), y los Paises Bajos (nl). Para otros formatos de nmeros de seguridad social puedes proveer una expersin regular.

1. 2. 3. 4. 5.
4.1.4.26 url

var $validate = array( 'ssn' => array( 'rule' => array('ssn', null, 'us') ) );

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Esta regla verifica formatos de URL vlidos. Soporta los protocolos http(s), ftp(s), file, news, y gopher. 1. 2. 3. 4. 5. var $validate = array( 'website' => array( 'rule' => 'url' ) );

4.1.5 Reglas de Validacin Personalizadas

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si hasta el momento no has encontrado lo que buscabas, siempre podrs crear tus propias reglas de validacin personalizadas. Hay dos maneras de hacer esto: definiendo expresiones regulares personalizadas, o creando mtodos de validacin personalizados.
4.1.5.1 Validacin Personalizada Mediante Expresiones Relugares

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones

Si la tcnica de validacin que necesitas usar puede ser completada usando expresiones regulares, puedes definir una expresin personalizada como una regla de validacin de un campo. 1. 2. 3. 4. 5. 6. var $validate = array( 'login' => array( 'rule' => array('custom', '/^[a-z0-9]{3,}$/i'), 'message' => 'Slo letras y enteros, mnimo 3 caracteres' ) );

El ejemplo de arriba verifica si login contiene slo letras y enteros, con un largo mnimo de tres caracteres.
4.1.5.2 Validacin Mediante Mtodos Personalizados

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Algunas veces revisar los datos usando expresiones regulares no es suficiente. Por ejemplo, si quieres asegurar que un cdigo promocional slo pueda ser usado 25 veces, necesitas agregar una funcin de validacin personalizada, como se muestra ms abajo: 1. <?php 2. class User extends AppModel { 3. var $name = 'User'; 4. var $validate = array( 5. 'promotion_code' => array( 6. 'rule' => array('limitDuplicates', 25), 7. 'message' => 'Este cdigo ha sido usado demasiadas veces.' 8. ) 9. ); 10.function limitDuplicates($data, $limit){ 11.$existing_promo_count = $this->find( 'count', array('conditions' => $data, 'recursive' => -1) ); 12.return $existing_promo_count < $limit; 13.} 14.} 15.?> Si quieres pasar parmetros a tu funcin de validacin personalizada, agrega elementos extra al arreglo rule y trtalos como parmetros extra (despes del parmetro principal $data) en tu funcin personalizada. Tu funcin de validacin personalizada puede estar en el modelo (como en el ejemplo de arriba), o en

un behavior implementado por el modelo. Esto incluye los modelos mapeados. Notar que los mtodos del model/behavior son verificados primero, antes de buscar un mtodo en la clase Validation. Esto significa que puedes sobreescribir mtodos de validacin existentes (como por ejemplo alphaNumeric()) en el nivel de aplicacin (agregando el mtodo a AppModel), o en el nivel de modelo.
4.1.6 Validando datos desde el Controlador

Editar Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Mientras que normalmente slo usars el mtodo save del modelo, habrn veces que te gustara validar los datos sin guardarlos. Por ejemplo, podras querer mostrar algo de informacin adicional al usuario antes de guardar los datos a la base de datos. Validar datos requiere de un proceso ligeramente distinto al de slo guardar los datos. Primero, debes setear los datos al modelo: 1. $this->ModelName->set( $this->data ); Luego, para verificar si los datos se validan correctamente, usa el mtodo validates del modelo, que retornar true si es que se valida y false si es que no: 1. 2. 3. 4. 5. if ($this->ModelName->validates()) { // paso la lgica de validacin } else { // no paso la lgica de validadicin }

El mtodo validates invoca el mtodo invalidFields que le asignar un valor a la propiedad validationErrors del modelo. El mtodo invalidFields tambin retorna los datos como su resultado. 1. $errors = $this->ModelName->invalidFields(); // contiene el arrego validationErrors Es importante notar que los datos se deben primero setear al modelo antes de poder validarlos. Esto es diferente al mtodo save que permite pasar los datos como un parmetro. Tambin, ten en cuenta que no es necesario llamar a validates antes de llamar a save ya que save validar automticamente los datos antes realmente de guardarlos. 4.2 Limpieza de Datos Editar

Ver slo esta seccin Historia Comparar con el contenido original La clase Sanitize de CakePHP puede ser usada para eliminar datos maliciosos y otra informacin no deseada desde los datos enviados por un usuario. Sanitize es una librera del ncleo, por lo que puede ser usada en cualquier parte de tu cdigo, pero probablemente ser mejor usada en los controladores y modelos. CakePHP te protege automticamente contra Inyeccin SQL si usas los mtodos ORM de CakePHP (como find() y save()) y la notacin de arrays apropiada (ejemplo array('campo' => $valor)) en lugar de sentencias SQL incrustadas en el cdigo. Para la limpieza de datos contra XSS generalmente es mejor guardar el HTML sin tratar en la base de datos y posteriormente limpiar los datos en el momento de mostrarlos. Todo lo que necesitas hacer es inclur la librera del ncleo Sanitize (p.ej. antes de la definicin de la clase controlador): 1. 2. 3. 4. 5. App::import('Sanitize'); class MiController extends AppController { ... ... }

Una vez hecho eso, puedes hacer llamadas estticas a Sanitize.


4.2.1 paranoid

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones paranoid(string $string, array $allowedChars); Esta funcin elimina cualquier cosa desde $string que no sean caracteres alfanumricos. Esta funcin no eliminar ciertos caracteres al pasarlos en el arreglo $allowedChars. 1. 2. 3. 4. 5. $badString = ";:<script><html>< // >@@#"; echo Sanitize::paranoid($badString); // salida: scripthtml echo Sanitize::paranoid($badString, array(' ', '@')); // salida: scripthtml @@

4.2.2 html

Editar

Ver slo esta seccin Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones html(string $string, boolean $remove = false) Este mtodo prepara los datos enviados por un usuario para desplegarlos dentro de HTML. Esto es especialmente til si no quieres que los usuarios quiebren tus layouts o inserten imgenes o scripts dentro de las pginas HTML. Si la opcin $remove se deja en true, el contenido HTML detectado es eliminado en vez de mostrado como entidades HTML. 1. $badString = '<font size="99" color="#FF0000">HEY</font><script>...</script>'; 2. echo Sanitize::html($badString); 3. // salida: &lt;font size=&quot;99&quot; color=&quot;#FF0000&quot;&gt;HEY&lt;/font&gt;&lt;script&gt;...&l t;/script&gt; 4. echo Sanitize::html($badString, true); 5. // salida: HEY...
4.2.3 escape

Editar Ver slo esta seccin Historia Comparar con el contenido original

escape(string $string, string $connection) Usado para escapar sentencias SQL agregndole barras invertidas, dependiendo de la configuracin de magic_quotes_gpc del sistema. $connection es el nombre de la base de datos para la cual escapar el string, segn el nombre definido en app/config/database.php.
4.2.4 clean

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original

Mas info sobre traduciones Sanitize::clean(mixed $data, mixed $options) Esta funcin es un limpiador multi-propsito y de potencia industrial, y sirve para ser usado en arreglos (como $this->data, por ejemplo). La funcin recibe un arreglo (o string) y retorna su versin limpia. Las siguientes operaciones de limpieza son realizadas en cada elemento del arreglo (recursivamente): Los espacios raros (incluyendo 0xCA) son reemplazados con espacios regulares. Verificacin doble de caracteres especiales y remocin de retornos de carro para una mayor seguridad SQL. Se agregan barras para SQL (slo llama a la funcin sql explicada anteriormente). Se reemplazan las barras invertidas ingresadas por el usuario por barras invertidas confiables. 4.3 Manejo de Errores Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones En caso de un error irrecuperable en tu aplicacin, es comn detener el procesamiento y mostrar una pgina de error al usuario. Para ahorrarte tener que codificar el manejo de esto en cada uno de tus controladores y componentes, puedes usar el mtodo: 1. $this->cakeError(<string errorType>, [array parameters]); Al llamar este mtodo se mostrar una pgina de error al usuario y se detendr cualquier tipo de procesamiento en tu aplicacion. CakePHP pre-define un conjunto de tipos de error, pero en estos momentos (escritura de este manual), la mayora son realmente tiles para el mismo framework. Uno que es ms til para el desarrollador de aplicaciones es el viejo y querido error 404. Puede ser llamado sin ningn parmetro de la siguiente manera: 1. $this->cakeError('error404'); De manera alternativa, puedes hacer que la pgina reporte que el error fue en una URL especfica pasando el parmetro url: 1. $this->cakeError('error404', array('url' => 'some/other.url')); Todo esto comienza a ser mucho ms til al extender el administrador de errores para que use tus propios tipos de error. Los administradores de error customizados son principalmente como acciones de un controlador. Tpicamente vas a usar set() para dejar disponibles sus parmetros en la vista y luego mostrar (render) un fichero tipo vista desde el directorio app/views/errors. Crea un fichero app/app_error.php con la siguiente definicin.

1. 2. 3. 4.

<?php class AppError extends ErrorHandler { } ?>

Se pueden implementar administradores (handlers) para nuevos tipos de error agregando mtodos a esta clase. Simplemente crea un nuevo mtodo con el nombre que quieres usar como tu tipo de error. Digamos que tenemos una aplicacin que escribe cierta cantidad de ficheros a disco y que es apropiado mostrale al usuario los errores de escritura. No quieremos agregar cdigo para esto en diferentas partes de la aplicacin, as que es un buen caso para usar un nuevo tipo de error. Agrega un nuevo mtodo a tu clase AppError. Vamos a aceptar un parmetro llamado file que ser la ruta al fichero cuya escritura fallo. 1. 2. 3. 4. function cannotWriteFile($params) { $this->controller->set('file', $params['file']); $this->__outputMessage('cannot_write_file'); }

Crea la vista en app/views/errors/cannot_write_file.ctp 1. <h2>No fue posible escribir en el fichero</h2> 2. <p>No se pudo escribir el fichero <?php echo $file ?> en el disco.</p> y lanza el error en tu controllador/componente 1. $this->cakeError('cannotWriteFile', array('file'=>'somefilename')); La implementacin por defecto de $this->__outputMessage() slo mostrar la vista en views/errors/.ctp. Si quieres cambiar este comportamiento, puedes redefinir __outputMessage($template) en tu clase AppError. 4.4 Depuracin Editar Ver slo esta seccin Historia Comparar con el contenido original

La depuracin es una parte necesaria e inevitable de cualquier ciclo de desarrollo. Mientras que CakePHP no ofrece ninguna herramienta que se conecte directamente con ningn editor o IDE, provee de varias herramientas para ayudar en la depuracin y exponer lo que se esta ejecutando dentro de su aplicacin.
4.4.1 Depuracin bsica

Editar Ver slo esta seccin Historia Comparar con el contenido original

debug($var, $showHTML = false, $showFrom = true)

La funcin debug() est disponible de forma global, esta trabaja similar a la funcin de PHP print_r(). La funcin debug() permite mostrar el contenido de una variable en diferente nmero de formas. Primero, si quieres que la data se muestre en formato HTML amigable, establece el segundo parmetro a true. Por defecto la funcin muestra la lnea y el archivo donde se origina. La salida de esta funcin solo se muestra si la variable debug del core (app/config/core.php, lnea 43) se ha establecido a un valor mayor que 0.
4.4.2 Usando la clase Debugger

Editar Ver slo esta seccin Historia Comparar con el contenido original

Para usar el depurador hay que primero asegurarse que Configure::read('debug') este seteado a un valor mayor a 0. dump($var) Dump muestra el contenido de una variable. Desplegar todas las propiedades y mtodos (si existen) de la variable que se indique. 1. $foo = array(1,2,3); 2. Debugger::dump($foo); 3. //outputs 4. array( 5. 1, 6. 2, 7. 3 8. ) 9. //objeto simple 10.$car = new Car(); 11.Debugger::dump($car); 12.//despliegue 13.Car:: 14.Car::colour = 'red' 15.Car::make = 'Toyota' 16.Car::model = 'Camry' 17.Car::mileage = '15000' 18.Car::acclerate() 19.Car::decelerate() 20.Car::stop() log($var, $level = 7) Crea un log detallado de la traza de ejecucin al momento de su invocacin. El mtodo log() genera datos similares a los de Debugger::dump() pero los enva al archivo debug.log en vez del buffer de salida. Notar que el directorio app/tmp (y su contenido) debe tener permisos de escritura para el servidor web para que log() funcione correctamente. trace($options)

Retorna la traza de ejecucin actual. Cada lnea de la traza incluye el mtodo que fue llamado, incluyendo desde cul archivo y desde que lnea la llamada se origin. //En PostsController::index() pr( Debugger::trace() ); //despliege PostsController::index() APP/controllers/downloads_controller.php, line 48 5. Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 265 6. Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 237 7. [main] - APP/webroot/index.php, line 84 1. 2. 3. 4. Arriba se muestra una traza de ejecucin generada llamando a Debugger::trace() desde una accin de un controlador. Al leer la traza de ejecucin desde abajo hacia arriba se muestra el orden de las funciones actualmente en ejecucin (stack frames). En el ejemplo de arriba, index.php llam a Dispatcher::dispatch(), que a su vez llam a Dispatcher::_invoke(). Luego el mtodo _invoke() llam a PostsController::index(). Esta informacin es til cuando se trabaja con operaciones recursivas, ya que se identifican las funciones que estaban en ejecucin al momento de llamar a trace(). excerpt($file, $line, $context) Toma un extracto desde un archivo en $path (que es una ruta absoluta), destaca la lnea nmero $line con la cantidad de $context lneas a su alrededor. pr( Debugger::excerpt(ROOT.DS.LIBS.'debugger.php', 321, 2) ); //se despliegar lo siguiente Array ( [0] => <code><span style="color: #000000"> * @access public</span></code> 6. [1] => <code><span style="color: #000000"> */</span></code> 7. [2] => <code><span style="color: #000000"> function excerpt($file, $line, $context = 2) {</span></code> 8. [3] => <span class="code-highlight"><code><span style="color: #000000"> $data = $lines = array();</span></code></span> 9. [4] => <code><span style="color: #000000"> $data = @explode("\n", file_get_contents($file));</span></code> 10.) 1. 2. 3. 4. 5. Aunque este mtodo es usado internamente, te puede ser prctico si estas creando tus propios mensajes de error o entradas de log en ocasiones especiales. exportVar($var, $recursion = 0) Convierte una variable de cualquier tipo a un string para su uso en el despliegue del depurador. Este mtodo tambin es usado mucho por Debugger para conversiones internas de variables, y puede ser usado tambin en tus propios Debuggers. invoke($debugger) Reemplazar el Debugger de CakePHP con un nuevo Administrador de Errores.

4.4.3 Clase Debugger

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La clase Debugger es nueva en CakePHP 1.2, ofrece muchas opciones para obtener informacin de depuracin. Tiene muchos mtodos que pueden ser invocados de forma esttica, proveyendo volcado, trazabilidad, y funciones de gestin de errores. La clase Debugger sobreescribe el manejo de errores por defecto de PHP, reemplazndolo con informacin de errores mucho ms til. La depuracin de errores est activa por defecto en CakePHP. Al igual que con todas las funciones de depuracin, se debe establecer Configure::debug a un valor mayor que 0. Cuando ocurre un error, el depurador genera dos salidas de informacin, una a la pgina y la otra crea una entrada en el archivo error.log. El reporte de errores generado contiene tanto la pila de llamadas como un extracto del cdigo donde ocurri el error. Haga clic en el enlace "Error" para ver la pila de llamadas, y el enlace "Code" para ver las lneas de cdigo causantes del error. 4.5 Caching Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Almacenamiento en cach se puede hacer en diferentes niveles en una aplicacin de CakePHP. Para obtener ms informacin, consulte cmo deshabilitar la memoria cach del navegador, pgina completa o elemento de cach, el almacenamiento en cach de consultas o la memoria cach o tambin la funcin - cach a cualquier cosa. Para ms informacin. 4.6 Logging Editar Ver slo esta seccin Historia

Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Aunque los ajustes de Configuracin de la clase desde el corazn de CakePHP realmente puede ayudarle a ver qu pasa en el fondo, usted necesitar algn tiempo para grabar datos en el disco para saber lo que pasa. En un mundo cada vez ms dependientes de tecnologas como SOAP y AJAX, la depuracin puede ser difcil. . La grabacin (registro) puede ser tambin una manera de descubrir es que ocurri en su solicitud en cualquier momento. Qu trminos de bsqueda se utilizaron? Qu tipo de errores de mis usuarios que han visto? Con qu frecuencia se ejecuta una consulta? En CakePHP la grabacin (registro) es fcil - la funcin log () es un elemento de la clase Object, que es el ancestro comn de la mayora de las clases CakePHP. Si el contexto es una clase CakePHP (Modelo, Controlador, Componente ... lo que sea), puede guardar sus datos.
4.6.1 Uso de la funcin log

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La funcin log() toma dos parmetros. El primero es el mensaje que se desea escribir en el archivo de log. Por defecto, este mensaje de error es escrito en el log de errores ubicado en app/tmp/logs/error.log. 1. 2. 3. 4. //Ejecutando esto dentro de una clase CakePHP: $this->log("Algo que no hace nada!"); //El resultado de esto se agrega a app/tmp/logs/error.log 2007-11-02 10:22:02 Error: Algo que no hace nada!

El segundo parmetro es usado para definir el tipo de log con el se quiere escribir el mensaje. Si no se suministra, el valor por defecto es LOG_ERROR, el cual escribe en el log de errores previamente mensionado. Como alternativa, Se puede establecer este segundo parmetro a LOG_DEBUG, para escribir su mensaje en el log de depuracin ubicado en app/tmp/logs/debug.log: 1. ///Ejecutando esto dentro de una clase CakePHP: 2. $this->log('Un mensaje de depuracin.', LOG_DEBUG); 3. //El resultado de esto se agrega a app/tmp/logs/debug.log (en lugar de error.log) 4. 2007-11-02 10:22:02 Error: Un mensaje de depuracin.

El usuario del servidor web debe poder escribir en el directorio app/tmp para que el log pueda funcionar correctamente.
4.6.2 Using the default FileLog class

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones While CakeLog can be configured to write to a number of user configured logging adapters, it also comes with a default logging configuration. This configuration is identical to how CakeLog behaved in CakePHP 1.2. The default logging configuration will be used any time there are no other logging adapters configured. Once a logging adapter has been configured you will need to also configure FileLog if you want file logging to continue. As its name implies FileLog writes log messages to files. The type of log message being written determines the name of the file the message is stored in. If a type is not supplied, LOG_ERROR is used which writes to the error log. The default log location is app/tmp/logs/$type.log 1. 2. 3. 4. //Executing this inside a CakePHP class: $this->log("Something didn't work!"); //Results in this being appended to app/tmp/logs/error.log 2007-11-02 10:22:02 Error: Something didn't work!

You can specify a custom log names, using the second parameter. The default built-in FileLog class will treat this log name as the file you wish to write logs to. 1. //called statically 2. CakeLog::write('activity', 'A special message for activity logging'); 3. //Results in this being appended to app/tmp/logs/activity.log (rather than error.log) 4. 2007-11-02 10:22:02 Activity: A special message for activity logging The configured directory must be writable by the web server user in order for logging to work correctly. You can configure additional/alternate FileLog locations using CakeLog::config(). FileLog accepts a path which allows for custom paths to be used. 1. 2. 3. 4. CakeLog::config('custom_path', array( 'engine' => 'FileLog', 'path' => '/path/to/custom/place/' ));

4.6.3 Creating and configuring log streams

Traducir Ver slo esta seccin Historia

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Log stream handlers can be part of your application, or part of plugins. If for example you had a database logger called DataBaseLogger as part of your application it would be placed in app/libs/log/data_base_logger.php; as part of a plugin it would be placed in app/plugins/my_plugin/libs/log/data_base_logger.php. When configured, CakeLog will attempt to load. Configuring log streams is done by calling CakeLog::config(). Configuring our DataBaseLogger would look like 1. //for app/libs 2. CakeLog::config('otherFile', array( 3. 'engine' => 'DataBaseLogger', 4. 'model' => 'LogEntry', 5. ... 6. )); 7. //for plugin called LoggingPack 8. CakeLog::config('otherFile', array( 9. 'engine' => 'LoggingPack.DataBaseLogger', 10.'model' => 'LogEntry', 11.... 12.)); When configuring a log stream the engine parameter is used to locate and load the log handler. All of the other configuration properties are passed to the log stream's constructor as an array. 1. 2. 3. 4. 5. class DataBaseLogger { function __construct($options = array()) { //... } }

CakePHP has no requirements for Log streams other than that they must implement a write method. This write method must take two parameters $type, $message in that order. $type is the string type of the logged message, core values are error, warning, info and debug. In addition you can define your own types by using them when you call CakeLog::write. It should be noted that you will encounter errors when trying to configure application level loggers from app/config/core.php. This is because paths are not yet bootstrapped. Configuring of loggers should be done in app/config/bootstrap.php to ensure classes are properly loaded.
4.6.4 Interacting with log streams

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones You can introspect the configured streams with CakeLog::configured(). The return of configured() is an array of all the currently configured streams. You can remove streams using CakeLog::drop($key). Once a log stream has been dropped it will no longer receive messages.

4.6.5 Error logging

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Errors are now logged when Configure::write('debug', 0);. You can use Configure::write('log', $val), to control which errors are logged when debug is off. By default all errors are logged. 1. Configure::write('log', E_WARNING); Would log only warning and fatal errors. Setting Configure::write('log', false); will disable error logging when debug = 0. 4.7 Testing Editar Ver slo esta seccin Historia Comparar con el contenido original

A partir de CakePHP 1.2 disponemos de soporte para un completo entorno de testing incorporado en CakePHP. Este entorno es una extensin del entorno SimpleTest para PHP. En esta seccin discutiremos cmo preparar la aplicacin para testing y cmo construir y ejecutar tus tests.
4.7.1 Preparndose para el testing

Editar Ver slo esta seccin Historia Comparar con el contenido original

Preparado/a para empezar a hacer test? Bien! Vamos all entonces!


4.7.1.1 Installing SimpleTest

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El entorno de testing provisto con CakePHP 1.2 est construido sobre el entorno de testing SimpleTest. SimpleTest no se distribuye con la instalacin por defecto de CakePHP por lo que debemos descargarlo

primero. Lo puedes encontrar aqu: http://simpletest.sourceforge.net/ Consigue la ltima versin y descomprime el cdigo en tu carpeta cake/vendors, o en tu carpeta app/vendors, segn tus preferencias. Ahora deberas tener un directorio vendors/simpletest con todos los archivos y carpetas de SimpleTest dentro. Recuerda tener el nivel de DEBUG al menos a 1 en tu archivo app/config/core.php antes de ejecutar cualquier test! Si no tienes una conexin de base de datos para test definida en app/config/database.php, las tablas de test se crearn con un prefijo test_suite_. Puedes crear una conexin de base de adtos $test para que contenga slo las tablas de test como la que te mostramos debajo: 1. 2. 3. 4. 5. 6. 7. 8. var $test = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'dbhost', 'login' => 'dblogin', 'password' => 'dbpassword', 'database' => 'databaseName' );

Si la base de datosd e test est disponible y CakePHP puede conectarse a ella, todas las tablas sern creadas en esta base de datos.
4.7.1.2 Ejecutando los test-cases incorporados

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones CakePHP 1.2 se distribuye con un gran paquete de test-cases sobre la funcionalidad del ncleo de CakePHP Puedes acceder a estos test navegando a http://your.cake.domain/cake_folder/test.php - dependiendo de como sea la disposicin especfica de tu aplicacin. Intenta ejecutar alguno de los grupos de test del ncleo haciendo click en el enlace correspondiente. Ejecutar un test puede llevar un rato, pero deberas ver algo parecido a "2/2 test casese complete: 49 passes, 0 fails and 0 exceptions.". Felicidades, ya ests listo/a para empezar a escribir tests!
4.7.2 Introduccin a los test - Unit testing vs. Web testing

Editar Ver slo esta seccin Historia Comparar con el contenido original

El entorno de test de CakePHP soporta dos tipos de testing. Uno es el Unit Testing, en el cual t pruebas pequeas partes de tu cdigo, como pueden ser un mtodo en un componente o una accin en un controlador. El otro tipo de testing soportado es el Web Testing, en el cual automatizas el trabajo de evaluar tu aplicacin mediante la navegacin por las pginas, relleno de formularios, hacer clic en enlaces y dems.
4.7.3 Preparando datos de prueba

Editar Ver slo esta seccin Historia Comparar con el contenido original

4.7.3.1 Acerca de las fixtures

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Cuando pruebes cdigo que dependa de modelos y datos, puedes usar fixtures como una forma de generar tablas temporales de datos cargados con datos de ejemplo que pueden ser utilizados por el test. El beneficio de usar fixtures es que tus test no pueden de ningn modo alterar los datos de la aplicacin en marcha. Adems, as puedes empezar a probar tu cdigo antes de desarrollar contenido en vivo para tu aplicacin. CakePHP intenta utilizar la conexin denominada $test en tu archivo app/config/database.php. Si esta conexin no es utilizable, usar la configuracin de base de datos $default y crear las tablas de test en la base de datos definida en esa configuracin. En cualquier caso, aadir el prefijo "test_suite_" a tu propio prefijo para las tablas (si es que hay alguno) para evitar colisiones con las tablas existentes. CakePHP realiza los siguientes pasos durante el curso de un test case basado en fixture: 1. 2. 3. 4. 5. Crea tablas para cada una de las fixtures necesarias Rellena las tablas con datos, si es que se han proporcionado stos en la fixture Ejecuta los mtodos de los test Vaca las tablas fixture Elimina las tablas fixture de la base de datos

4.7.3.2 Creando fixtures

Editar Ver slo esta seccin Historia

Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Cuando se crea un fixture se deben definir 2 cosas: 1) cmo se crea la tabla (que campos sern parte de la tabla) 2) cmo se guardarn los registros en la tabla de prueba. Luego podremos crear nuestro primer fixture, que utilizaremos para testear nuestro modelo Article. Creamos un archivo llamado article_fixture.php en la carpeta app/tests/fixtures, con el siguiente cdigo: <?php class ArticleFixture extends CakeTestFixture { var $name = 'Article'; var $fields = array( 'id' => array('type' => 'integer', 'key' => 'primary'), 'title' => array('type' => 'string', 'length' => 255, 'null' => false), 7. 'body' => 'text', 8. 'published' => array('type' => 'integer', 'default' => '0', 'null' => false), 9. 'created' => 'datetime', 10.'updated' => 'datetime' 11.); 12.var $records = array( 13.array ('id' => 1, 'title' => 'First Article', 'body' => 'First Article Body', 'published' => '1', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'), 14.array ('id' => 2, 'title' => 'Second Article', 'body' => 'Second Article Body', 'published' => '1', 'created' => '200703-18 10:41:23', 'updated' => '2007-03-18 10:43:31'), 15.array ('id' => 3, 'title' => 'Third Article', 'body' => 'Third Article Body', 'published' => '1', 'created' => '2007-03-18 10:43:23', 'updated' => '2007-03-18 10:45:31') 16.); 17.} 18.?> 1. 2. 3. 4. 5. 6. Usamos $fields para indicar los campos que sern parte de la tabla, y cmo sern definidos. El formato que se usa para definir los campos es el mismo que usamos en la funcion generateColumnSchema() definida en el motor de base de datos de Cake (por ejemplo en dbo_mysql.php.) Los atributos que un campo puede tenes son los siguientes: type es el tipo de dato de CakePHP. Actualmente los soportados son: string (mapea como VARCHAR), text (mapea como TEXT), integer (mapea como INT), float (mapea como FLOAT), datetime (mapea como DATETIME), timestamp (mapea como TIMESTAMP), time (mapea

como TIME), date (mapea como DATE), y binary (mapea como BLOB) key setea el campo como primary para hacerlo auto-incrementable (AUTO_INCREMENT), y clave primaria (PRIMARY KEY) de la tabla. length setea el tamao del campo. null setea true o false. Si puede ser nulo indicamos true, si no se permiten nulos va false default el valor por defecto del campo. Finalmente podemos setear un conjunto de registros que seran cargados luego de que la tabla de testeo se crea. El formato es bastante simple, sin embargo necesita un poco ms de expilcacin. Solo ten en cuenta que cada registro del array $records debe tener una key para cada campo del array $fields. Si un campo para un registro en particular necesita tener el valor nulo, solo especifica el valor de ese campo como nulo (NULL true).
4.7.3.3 Importar informacin de tabla y registros

Editar Ver slo esta seccin Historia Comparar con el contenido original

Tu aplicacin puede tener ya modelos funcionando con datos reales asociados, y puedes decidir probar tu modelo con esos datos. Sera entonces un esfuerzo doble tener que definir la tabla y/o los registros en tus fixtures. Por suerte, hay una forma de hacer que la definicin de la tabla y/o los registros para una fixture en particular vengan de un modelo o una tabla ya existentes. Comencemos con un ejemplo. Asumiento que tienes un modelo llamado Article disponible en tu aplicacin (que se corresponde con una tabla llamada articles), cambiamos la fixture de ejemplo que dimos en la seccin anterior (app/tests/fixtures/article_fixture.php) a: 1. 2. 3. 4. 5. 6. <?php class ArticleFixture extends CakeTestFixture { var $name = 'Article'; var $import = 'Article'; } ?>

Esta sentencia le dice a la test suite que importe tu definicin de tabla de la tabla asociada al modelo llamado Article. Puedes usar cualquier modelo disponible en tu aplicacin. La expresin anterior no importa registros, pero puedes hacerlo cambiandola para que sea: 1. 2. 3. 4. 5. 6. <?php class ArticleFixture extends CakeTestFixture { var $name = 'Article'; var $import = array('model' => 'Article', 'records' => true); } ?>

Si, por otro lado, tienes una tabla creada pero no un modelo disponible para ella, puedes especificar que

tu importacin consistir en leer la informacin de la tabla. Por ejemplo: 1. 2. 3. 4. 5. 6. <?php class ArticleFixture extends CakeTestFixture { var $name = 'Article'; var $import = array('table' => 'articles'); } ?>

Esto importar la definicin de una tabla llamada 'articles' usando tu conexin de base de datos denominada 'default'. Si quieres cambiar la conexin slo tienes que hacer: <?php class ArticleFixture extends CakeTestFixture { var $name = 'Article'; var $import = array('table' => 'articles', 'connection' => 'other'); 5. } 6. ?> 1. 2. 3. 4. Ya que se usa tu conexin a la base de datos, si hay algn prefijo de tabla declarado, este ser usado automticamente al recabar la informacin de tabla. Los dos fragmentos anteriores no importan registros de la tabla. Para forzar a la fixture a importar tambin los registros, cambialo a: 1. 2. 3. 4. 5. 6. <?php class ArticleFixture extends CakeTestFixture { var $name = 'Article'; var $import = array('table' => 'articles', 'records' => true); } ?>

Naturalmente puedes importar tus definiciones de tabla de un modelo o tabla existente, pero tener tus registros definidos directamente en la fixture, como se mostraba en la seccin anterior. Por ejemplo: <?php class ArticleFixture extends CakeTestFixture { var $name = 'Article'; var $import = 'Article'; var $records = array( array ('id' => 1, 'title' => 'First Article', 'body' => 'First Article Body', 'published' => '1', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'), 7. array ('id' => 2, 'title' => 'Second Article', 'body' => 'Second Article Body', 'published' => '1', 'created' => '2007-03-18 10:41:23', 'updated' => '2007-03-18 10:43:31'), 8. array ('id' => 3, 'title' => 'Third Article', 'body' => 'Third Article Body', 'published' => '1', 'created' => '2007-03-18 10:43:23', 'updated' => '2007-03-18 10:45:31') 9. ); 10.} 11.?> 1. 2. 3. 4. 5. 6.

4.7.4 Creando los tests

Editar Ver slo esta seccin Historia Comparar con el contenido original

En primer lugar, revisar una serie de normas y directrices para los tests: 1. Los archivos de PHP que contiene los tests deben estar en : app/tests/cases/[algun_ archivo]. 2. Los nombres de estos archivos deben terminar con un .test.php en lugar de slo .php. 3. Las clases que contienen los tests debe extender o heredar de CakeTestCase o CakeWebTestCase. 4. El nombre de cualquier mtodo que contenga un test (por ejemplo, que contiene una afirmacin) debera comenzar con test, como en testPublished(). Cuando se crea un caso test, puede ejecutarce por medio del navegador en la siguiente direccin http://tu.dominio.cake/carpeta_cake/test.php (dependiendo de cmo se ve especficamente tu configuracin) y haciendo clic en App casos de test, y a continuacin, haga clic en el enlace a su archivo.
4.7.4.1 CakeTestCase Callback Methods

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If you want to sneak in some logic just before or after an individual CakeTestCase method, and/or before or after your entire CakeTestCase, the following callbacks are available: start() First method called in a test case. end() Last method called in a test case. startCase() called before a test case is started. endCase() called after a test case has run. before($method) Announces the start of a test method. after($method) Announces the end of a test method. startTest($method) Called just before a test method is executed. endTest($method) Called just after a test method has completed.

4.7.5 Testing models

Traducir Ver slo esta seccin Historia


4.7.5.1 Creating a test case

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Let's say we already have our Article model defined on app/models/article.php, which looks like this: 1. <?php 2. class Article extends AppModel { 3. var $name = 'Article'; 4. function published($fields = null) { 5. $params = array( 6. 'conditions' => array( 7. $this->name . '.published' => 1 8. ), 9. 'fields' => $fields 10.); 11.return $this->find('all',$params); 12.} 13.} 14.?> We now want to set up a test that will use this model definition, but through fixtures, to test some functionality in the model. CakePHP test suite loads a very minimum set of files (to keep tests isolated), so we have to start by loading our parent model (in this case the Article model which we already defined), and then inform the test suite that we want to test this model by specifying which DB configuration it should use. CakePHP test suite enables a DB configuration named test_suite that is used for all models that rely on fixtures. Setting $useDbConfig to this configuration will let CakePHP know that this model uses the test suite database connection. CakePHP Models will only use the test_suite DB config if they rely on fixtures in your testcase! Since we also want to reuse all our existing model code we will create a test model that will extend from Article, set $useDbConfig and $name appropiately. Let's now create a file named article.test.php in your app/tests/cases/models directory, with the following contents: 1. 2. 3. 4. 5. 6. <?php App::import('Model','Article'); class ArticleTestCase extends CakeTestCase { var $fixtures = array( 'app.article' ); } ?>

We have created the ArticleTestCase. In variable $fixtures we define the set of fixtures that we'll use. If your model is associated with other models, you will need to include ALL the fixtures for each associated model even if you don't use them. For example: A hasMany B hasMany C hasMany D. In ATestCase you will have to include fixtures for a, b, c and d.
4.7.5.2 Creating a test method

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Let's now add a method to test the function published() in the Article model. Edit the file app/tests/cases/models/article.test.php so it now looks like this: <?php App::import('Model', 'Article'); class ArticleTestCase extends CakeTestCase { var $fixtures = array( 'app.article' ); function testPublished() { $this->Article =& ClassRegistry::init('Article'); $result = $this->Article->published(array('id', 'title')); $expected = array( array('Article' => array( 'id' => 1, 'title' => 'First Article' )), 10.array('Article' => array( 'id' => 2, 'title' => 'Second Article' )), 11.array('Article' => array( 'id' => 3, 'title' => 'Third Article' )) 12.); 13.$this->assertEqual($result, $expected); 14.} 15.} 16.?> 1. 2. 3. 4. 5. 6. 7. 8. 9. You can see we have added a method called testPublished(). We start by creating an instance of our fixture based Article model, and then run our published() method. In $expected we set what we expect should be the proper result (that we know since we have defined which records are initally populated to the article table.) We test that the result equals our expectation by using the assertEqual method. See the section Creating Tests for information on how to run the test.
4.7.6 Testing controllers

Traducir Ver slo esta seccin Historia

4.7.6.1 Creando un test case

Editar Ver slo esta seccin Historia Comparar con el contenido original

Digamos que tienes un tpico controlador de artculos, con su correspondiente modelo, y que se parece a ste: 1. <?php 2. class ArticlesController extends AppController { 3. var $name = 'Articles'; 4. var $helpers = array('Ajax', 'Form', 'Html'); 5. function index($short = null) { 6. if (!empty($this->data)) { 7. $this->Article->save($this->data); 8. } 9. if (!empty($short)) { 10.$result = $this->Article->findAll(null, array('id', 11.'title')); 12.} else { 13.$result = $this->Article->findAll(); 14.} 15.if (isset($this->params['requested'])) { 16.return $result; 17.} 18.$this->set('title', 'Articles'); 19.$this->set('articles', $result); 20.} 21.} 22.?> Crea un archivo llamado articles_controller.test.php y pon lo siguiente dentro: 1. <?php 2. class ArticlesControllerTest extends CakeTestCase { 3. function startCase() { 4. echo '<h1>Comenzando Test Case</h1>'; 5. } 6. function endCase() { 7. echo '<h1>Terminado Test Case</h1>'; 8. } 9. function startTest($method) { 10.echo '<h3>Comenzando mtodo ' . $method . '</h3>'; 11.} 12.function endTest($method) { 13.echo '<hr />'; 14.} 15.function testIndex() { 16.$result = $this->testAction('/articles/index');

17.debug($result); 18.} 19.function testIndexShort() { 20.$result = $this->testAction('/articles/index/short'); 21.debug($result); 22.} 23.function testIndexShortGetRenderedHtml() { 24.$result = $this->testAction('/articles/index/short', 25.array('return' => 'render')); 26.debug(htmlentities($result)); 27.} 28.function testIndexShortGetViewVars() { 29.$result = $this->testAction('/articles/index/short', 30.array('return' => 'vars')); 31.debug($result); 32.} 33.function testIndexFixturized() { 34.$result = $this->testAction('/articles/index/short', 35.array('fixturize' => true)); 36.debug($result); 37.} 38.function testIndexPostFixturized() { 39.$data = array('Article' => array('user_id' => 1, 'published' 40.=> 1, 'slug'=>'new-article', 'title' => 'New Article', 'body' => 'New Body')); 41.$result = $this->testAction('/articles/index', 42.array('fixturize' => true, 'data' => $data, 'method' => 'post')); 43.debug($result); 44.} 45.} 46.?>
4.7.6.2 El mtodo testAction

Editar Ver slo esta seccin Historia Comparar con el contenido original

La novedad aqu es el mtodo testAction. El primer argumento de este mtodo es la URL "en formato Cake" de la accin del controlador que se quiere probar, como en '/articles/index/short'. El segundo argumento es un array de parmetros, consistente en: return Indica lo que se va a devolver. Los valores vlidos son: 'vars' - Obtienes las variables de la vista disponibles tras ejecutar la accin 'view' - Obtienes la vista generada, sin layout

'contents' - Obtienes todo el html de la vista, incluyendo layout 'result' - Obtienes el valor de retorno de la accin como cuando se usa $this>params['requested']. El valor por defecto es 'result'. fixturize Ponlo a true si quieres que tus modelos se "auto-simulen" (de modo que las tablas de la aplicacin se copian, junto con los registros, para que al probar las tablas si cambias datos no afecten a tu aplicacin real.) Si en 'fixturize' pones un array de modelos, entonces slo esos modelos se auto-simularn mientras que los dems utilizarn las tablas reales. Si quieres usar tus archivos de fixtures con testAction() no uses fixturize, y en su lugar usa las fixtures como haras normalmente. method Ajustalo a 'post' o 'get' si quieres pasarle datos al controlador data Los datos que se pasarn. Ser un array asociativo consistente en pares de campo => valor. chale un vistazo a function testIndexPostFixturized() en el case test de arriba para ver cmo emulamos pasar datos de formulario como post para un nuevo artculo.
4.7.6.3 Pitfalls

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If you use testAction to test a method in a controller that does a redirect, your test will terminate immediately, not yielding any results. See http://mark-story.com/posts/view/testing-cakephp-controllers-the-hard-way for a possible fix.
4.7.7 Testing Helpers

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Since a decent amount of logic resides in Helper classes, it's important to make sure those classes are covered by test cases. Helper testing is a bit similar to the same approach for Components. Suppose we have a helper called CurrencyRendererHelper located in app/views/helpers/currency_renderer.php with its accompanying test case file located in app/tests/cases/helpers/currency_renderer.test.php
4.7.7.1 Creating Helper test, part I

Traducir Ver slo esta seccin

Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones First of all we will define the responsibilities of our CurrencyRendererHelper. Basically, it will have two methods just for demonstration purpose: function usd($amount) This function will receive the amount to render. It will take 2 decimal digits filling empty space with zeros and prefix 'USD'. function euro($amount) This function will do the same as usd() but prefix the output with 'EUR'. Just to make it a bit more complex, we will also wrap the result in span tags: 1. <span class="euro"></span> Let's create the tests first: <?php //Import the helper to be tested. //If the tested helper were using some other helper, like Html, //it should be impoorted in this line, and instantialized in startTest(). 5. App::import('Helper', 'CurrencyRenderer'); 6. class CurrencyRendererTest extends CakeTestCase { 7. private $currencyRenderer = null; 8. //Here we instantiate our helper, and all other helpers we need. 9. public function startTest() { 10.$this->currencyRenderer = new CurrencyRendererHelper(); 11.} 12.//testing usd() function. 13.public function testUsd() { 14.$this->assertEqual('USD 5.30', $this->currencyRenderer>usd(5.30)); 15.//We should always have 2 decimal digits. 16.$this->assertEqual('USD 1.00', $this->currencyRenderer->usd(1)); 17.$this->assertEqual('USD 2.05', $this->currencyRenderer>usd(2.05)); 18.//Testing the thousands separator 19.$this->assertEqual('USD 12,000.70', $this->currencyRenderer>usd(12000.70)); 20.} 21.} 1. 2. 3. 4. Here, we call usd() with different parameters and tell the test suite to check if the returned values are equal to what is expected. Executing the test now will result in errors (because currencyRendererHelper doesn't even exist yet) showing that we have 3 fails. Once we know what our method should do, we can write the method itself:

1. 2. 3. 4. 5. 6.

<?php class CurrencyRendererHelper extends AppHelper { public function usd($amount) { return 'USD ' . number_format($amount, 2, '.', ','); } }

Here we set the decimal places to 2, decimal separator to dot, thousands separator to comma, and prefix the formatted number with 'USD' string. Save this in app/views/helpers/currency_renderer.php and execute the test. You should see a green bar and messaging indicating 4 passes.
4.7.8 Probando componentes

Editar Ver slo esta seccin Historia Comparar con el contenido original

Supongamos que queremos hacer test a un componente llamado TransporterComponent, el cual usa un modelo llamado Transporter para proporcionar funcionalidad a otros controladores. Utilizaremos cuatro archivos: Un componente llamado Transporters que se encuentra en app/controllers/components/transporter.php Un modelo llamado Transporte que est en app/models/transporter.php Una fixture llamada TransporterTestFixture situada en app/tests/fixtures/transporter_fixture.php El cdigo para el test, en app/tests/cases/transporter.test.php
4.7.8.1 Initializing the component

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Ya que CakePHP desaliante importar modelos directamente en los componentes necesitamos un controlador para acceder a los datos en el mmodelo. Si el mtodo startup() del componente tiene este aspecto: 1. public function startup(&$controller){ 2. $this->Transporter = $controller->Transporter; 3. }

entonces podemos simplemente crear una clase sencilla: 1. class FakeTransporterController {} y asignarle valores dentro de ella como aqu: 1. 2. 3. 4. $this->TransporterComponentTest = new TransporterComponent(); $controller = new FakeTransporterController(); $controller->Transporter = new TransporterTest(); $this->TransporterComponentTest->startup(&$controller);

4.7.8.2 Creando un mtodo de prueba

1. 2. 3. 4. 5. 6. 7. 8.

Editar Ver slo esta seccin Historia Comparar con el contenido original

Simplemente crea una clase que extienda CakeTestCase y comienza a escribir tests! class TransporterTestCase extends CakeTestCase { var $fixtures = array('transporter'); function testGetTransporter() { $this->TransporterComponentTest = new TransporterComponent(); $controller = new FakeTransporterController(); $controller->Transporter = new TransporterTest(); $this->TransporterComponentTest->startup(&$controller); $result = $this->TransporterComponentTest>getTransporter("12345", "Sweden", "54321", "Sweden"); 9. $this->assertEqual($result, 1, "SP is best for 1xxxx-5xxxx"); 10.$result = $this->TransporterComponentTest>getTransporter("41234", "Sweden", "44321", "Sweden"); 11.$this->assertEqual($result, 2, "WSTS is best for 41xxx-44xxx"); 12.$result = $this->TransporterComponentTest>getTransporter("41001", "Sweden", "41870", "Sweden"); 13.$this->assertEqual($result, 3, "GL is best for 410xx-419xx"); 14.$result = $this->TransporterComponentTest>getTransporter("12345", "Sweden", "54321", "Norway"); 15.$this->assertEqual($result, 0, "Noone can service Norway"); 16.} 17.} 18.
4.7.9 Web testing - Testeando las vistas

Editar Ver slo esta seccin Historia Comparar con el contenido original

La mayoria, si no es que lo son todos, los proyectos CakePHP son aplicaciones web. Aunque el testeo unitario es una excelente manera de testear pequeas porciones de nuestro cdigo, hay ocaciones en la

que querriamos hacer un testeo a gran escala. La clase CakeWebTestCase nos brinda una muy buena manera de hacer ste tipo de testing, desde el punto de vista del usuario.
4.7.9.1 About CakeWebTestCase

Editar Ver slo esta seccin Historia Comparar con el contenido original

CakeWebTestCase es una extensin directa de SimpleTest WebTestCase, sin ninguna funcionalidad extra. Toda la funcionalidad encontrada en la documentacin de SimpleTest para Testeo Web (Web testing) tambien estn disponibles aqui. Esto quiere decir que no se pueden usar los fixtures, y que todos los casos de testeo involucrados en un ABM (alta, baja o modificacin) a la base de datos modificarn permanentemente los valores. Los resultados del Test son comparados frecuentemente con los qe tiene la base de datos, por lo tanto, asegurarse que la bd tenga los valores que se esperan, es parte del proceso de construccin del test.
4.7.9.2 Creando un test

Editar Ver slo esta seccin Historia Comparar con el contenido original

Manteniendo las convenciones de los otros tests, los archivos de testeo de vistas se debern crear en la carpeta tests/cases/views. Claro que se podrian guardar en otra ubicacin, pero siempre es bueno seguir las convenciones. Entonces, crearemos el archivo: tests/cases/views/complete_web.test.php Para escribir testeos web, debers extender la clase CakeWebTestCase y no CakeTestCase, tal como era en los otros tests: 1. class CompleteWebTestCase extends CakeWebTestCase Si necesitas hacer alguna inicializacin antes de que comience el test, crea el constructor: 1. function CompleteWebTestCase(){ 2. //Do stuff here 3. } Cuando escribes los test cases, lo primero que vas a necesitar hacer es capturar algun tipo de salida o resultado donde ver y analizar. sto puede ser realizado haciendo un request get o post, usando los mtodos get() o post() respectivamente. A ambos mtodos se le pasa como primer parmetro la url, aunque puede ser traida dinmicamente si asumimos que script de testing est en http://your.domain/cake/folder/webroot/test.php tipeando: 1. $this->baseurl = current(split("webroot", $_SERVER['PHP_SELF'])); Entonces podremos hacer gets y posts usando las urls de Cake, por ejemplo: 1. $this->get($this->baseurl."/products/index/"); 2. $this->post($this->baseurl."/customers/login", $data); El segundo parmetro del mtodo post, $data, es un array asociativo que contiene post data en el

formato de Cake: 1. $data = array( 2. "data[Customer][mail]" => "user@user.com", 3. "data[Customer][password]" => "userpass"); Una vez que se hizo el request a la pgina, se pueden utilizar todos los mismos asserts que veniamos usando en SimpleTest.
4.7.9.3 Walking through a page

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones CakeWebTest also gives you an option to navigate through your page by clicking links or images, filling forms and clicking buttons. Please refer to the SimpleTest documentation for more information on that.
4.7.10 Testing plugins

Traducir Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Tests for plugins are created in their own directory inside the plugins folder.
/app /plugins /pizza /tests /cases /fixtures /groups

They work just like normal tests but you have to remember to use the naming conventions for plugins when importing classes. This is an example of a testcase for the PizzaOrder model from the plugins chapter of this manual. A difference from other tests is in the first line where 'Pizza.PizzaOrder' is imported. You also need to prefix your plugin fixtures with 'plugin.plugin_name.'. 1. 2. 3. 4. 5. 6. 7. 8. <?php App::import('Model', 'Pizza.PizzaOrder'); class PizzaOrderCase extends CakeTestCase { // Plugin fixtures located in /app/plugins/pizza/tests/fixtures/ var $fixtures = array('plugin.pizza.pizza_order'); var $PizzaOrderTest; function testSomething() { // ClassRegistry makes the model use the test database

connection 9. $this->PizzaOrderTest =& ClassRegistry::init('PizzaOrder'); 10.// do some useful test here 11.$this->assertTrue(is_object($this->PizzaOrderTest)); 12.} 13.} 14.?> If you want to use plugin fixtures in the app tests you can reference them using 'plugin.pluginName.fixtureName' syntax in the $fixtures array. That is all there is to it.
4.7.11 Miscellaneous

Traducir Ver slo esta seccin Historia


4.7.11.1 Customizing the test reporter

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The standard test reporter is very minimalistic. If you want more shiny output to impress someone, fear not, it is actually very easy to extend. By creating a new reporter and making a request with a matching output GET parameter you can get test results with a custom reporter. Reporters generate the visible output from the test suite. There are two built in reporters: Text and Html. By default all web requests use the Html reporter. You can create your own reporters by creating files in your app/libs. For example you could create the file app/libs/test_suite/reporters/my_reporter.php and in it create the following: 1. require_once CAKE_TEST_LIB . 'reporter' . DS . 'cake_base_reporter.php'; 2. class MyReporter extends CakeBaseReporter { 3. //methods go here. 4. } Extending CakeBaseReporter or one of its subclasses is not required, but strongly suggested as you may get missing errors otherwise. CakeBaseReporter encapsulates a few common test suite features such as test case timing and code coverage report generation. You can use your custom reporter by setting the output query string parameter to the reporter name minus 'reporter'. For the example above you would set output=my to use your custom reporter.
4.7.11.2 Test Reporter methods

Traducir Ver slo esta seccin

Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Reporters have a number of methods used to generate the various parts of a Test suite response. paintDocumentStart() Paints the start of the response from the test suite. Used to paint things like head elements in an html page. paintTestMenu() Paints a menu of available test cases. testCaseList() Retrieves and paints the list of tests cases. groupCaseList() Retrieves and paints the list of group tests. paintHeader() Prints before the test case/group test is started. paintPass() Prints everytime a test case has passed. Use $this->getTestList() to get an array of information pertaining to the test, and $message to get the test result. Remember to call parent::paintPass($message). paintFail() Prints everytime a test case has failed. Remember to call parent::paintFail($message). paintSkip() Prints everytime a test case has been skipped. Remember to call parent::paintSkip($message). paintException() Prints everytime there is an uncaught exception. Remember to call parent::paintException($message).paintError() Prints everytime an error is raised. Remember to call parent::paintError($message). paintFooter() Prints when the test case/group test is over, i.e. when all test cases has been executed. paintDocumentEnd() Paints the end of the response from the test suite. Used to paint things like footer elements in an html page.
4.7.11.3 Grouping tests

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If you want several of your test to run at the same time, you can try creating a test group. Create a file in /app/tests/groups/ and name it something like your_test_group_name.group.php. In this file, extend TestSuite and import test as follows: 1. <?php 2. class TryGroupTest extends TestSuite { 3. var $label = 'try';

4. function tryGroupTest() { 5. TestManager::addTestCasesFromDirectory($this, APP_TEST_CASES . DS . 'models'); 6. } 7. } 8. ?> The code above will group all test cases found in the /app/tests/cases/models/ folder. To add an individual file, use TestManager::addTestFile($this, filename).
4.7.12 Running tests in the Command Line

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If you have simpletest installed you can run your tests from the command line of your application. from app/
cake testsuite help Usage:

cake testsuite category test_type file - category - "app", "core" or name of a plugin - test_type - "case", "group" or "all" - test_file - file name with folder prefix and without the (test| group).php suffix Examples: cake testsuite app all cake testsuite core all cake testsuite app case behaviors/debuggable cake testsuite app case models/my_model cake testsuite app case controllers/my_controller cake testsuite core case file cake testsuite core case router cake testsuite core case set cake testsuite app group mygroup cake testsuite core group acl cake testsuite core group socket cake // cake // testsuite bugs for the plugin testsuite bugs for the plugin case models/bug 'bugs' and its test case 'models/bug' group bug bugs and its test group 'bug'

Code Coverage Analysis: Append 'cov' to any of the above in order to enable code coverage analysis

As the help menu suggests, you'll be able to run all, part, or just a single test case from your app, plugin, or core, right from the command line. If you have a model test of test/models/my_model.test.php you'd run just that test case by running:
cake testsuite app models/my_model

4.7.13 Test Suite changes in 1.3

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The TestSuite harness for 1.3 was heavily refactored and partially rebuilt. The number of constants and global functions have been greatly reduced. Also the number of classes used by the test suite has been reduced and refactored. You must update app/webroot/test.php to continue using the test suite. We hope that this will be the last time that a change is required to app/webroot/test.php. Removed Constants CAKE_TEST_OUTPUT RUN_TEST_LINK BASE CAKE_TEST_OUTPUT_TEXT CAKE_TEST_OUTPUT_HTML

These constants have all been replaced with instance variables on the reporters and the ability to switch reporters. Removed functions CakePHPTestHeader() CakePHPTestSuiteHeader() CakePHPTestSuiteFooter() CakeTestsGetReporter() CakePHPTestRunMore() CakePHPTestAnalyzeCodeCoverage() CakePHPTestGroupTestList() CakePHPTestCaseList()

These methods and the logic they contained have been refactored/rewritten into CakeTestSuiteDispatcher and the relevant reporter classes. This made the test suite more modular and easier to extend. Removed Classes HtmlTestManager TextTestManager CliTestManager These classes became obsolete as logic was consolidated into the reporter classes.

Modified methods/classes The following methods have been changed as noted. TestManager::getExtension() is no longer static. TestManager::runAllTests() is no longer static. TestManager::runGroupTest() is no longer static. TestManager::runTestCase() is no longer static. TestManager::getTestCaseList() is no longer static. TestManager::getGroupTestList() is no longer static.

testsuite Console changes The output of errors, exceptions, and failures from the testsuite console tool have been updated to remove redundant information and increase readability of the messages. If you have other tools built upon the testsuite console, be sure to update those tools with the new formatting. CodeCoverageManager changes CodeCoverageManager::start()'s functionality has been moved to CodeCoverageManager::init() CodeCoverageManager::start() now starts coverage generation. CodeCoverageManager::stop() pauses collection CodeCoverageManager::clear() stops and clears collected coverage reports. 4.8 Internacionalizacin & Localizacin Editar Ver slo esta seccin Historia Comparar con el contenido original

Una de las mejores maneras para que tus aplicaciones lleguen a un pblico ms amplio es brindarlo en varios idiomas. Esto a menudo puede resultar ser una tarea de enormes proporciones, pero las funciones de internacionalizacin y localizacin en CakePHP lo hace mucho ms fcil. En primer lugar, es importante comprender algunos trminos. Internacionalizacin se refiere a la capacidad de una aplicacin para ser localiza. El trmino localizacin se refiere a la adaptacin de una aplicacin para responder a los requerimientos de un lenguaje (o cultura) especfico (es decir, un "lugar"). La internacionalizacin y localizacin son a menudo abreviados como i18n y l10n, respectivamente, 18 y 10 son el nmero de caracteres entre el primero y el ltimo carcter.
4.8.1 Internacionalizando su aplicacin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones Hay slo unos pocos pasos para pasar de una aplicacin de un solo idioma a una aplicacin multiidioma, la primera de ellas es hacer uso de la funcin __() en su cdigo. A continuacin se muestra un ejemplo de cdigo para una aplicacin de un solo idioma: 1. <h2>Posts</h2> Para internacionalizar su cdigo todo lo que necesitas hacer es envolver las cadenas de texto en la funcin translate como se muestra a continuacin: 1. <h2><?php __('Posts') ?></h2> Si no hace nada ms, estos dos ejemplos de cdigo son funcionalmente idnticos ambos envan el mismo contenido al navegador. La funcin __() traducir la cadena de texto que se pasa si la traduccin est disponible, si no, devolver la cadena sin modificar. Funciona de manera similar a otras implementaciones de Gettext (igual que otras funciones de traduccin como __d(), __n() etc) Con el cdigo listo para ser multi-idioma, el siguiente paso es crear su archivo pot, que es el modelo para todas las cadenas de texto traducibles en su aplicacin. Para generar archivos pot(s) todo lo que necesita es ejecutar la tarea i18n en la consola, que buscar las funciones translate utilizadas en su cdigo y crear los archivos por usted. Usted puede y debe volver a ejecutar esta tarea cada vez que se produzca algn cambio de las traducciones en el cdigo. Los archivos pot(s) en si mismos no son utilizados por CakePHP, son las plantillas utilizadas para crear o actualizar los archivos po, que contienen las traducciones. Cake buscar los archivos po en la siguiente ubicacin: 1. /app/locale/<locale>/LC_MESSAGES/<domain>.po El dominio por defecto es 'default', por lo tanto en su carpeta locale se ver algo como esto: 1. /app/locale/eng/LC_MESSAGES/default.po (English) 2. /app/locale/fre/LC_MESSAGES/default.po (French) 3. /app/locale/por/LC_MESSAGES/default.po (Portuguese) Para crear o editar su archivo po no se recomienda que utilice su editor favorito. Para crear un archivo po por primera vez es recomendable copiar el archivo pot a la ubicacin correcta y cambiar la extensin, a menos que usted est familiarizado con su formato. Es muy fcil crear un archivo po invlido o guardarlos con una codificacin errnea (si est editando manualmente el archivo po use UTF-8 para evitar problemas). Existen herramientas gratuitas como PoEdit que hacen de la edicin y actualizacin de sus archivos po una tarea fcil. Los cdigos de localizacin correctos son los de tres caracteres conforme al estandar ISO 639-2 aunque si crea locales regionales (en_US, en_GB, etc.) Cake los utiliza si procede. hay un lmite de 1.014 caracteres para cada valor msgstr. Recuerde que los archivos po son tiles para mensajes cortos, si necesita traducir prrafos largos, o incluso pginas completas, debe considerar aplicar una solucin diferente. Por ejemplo: 1. 2. 3. 4. // App Controller Code. function beforeFilter() { $locale = Configure::read('Config.language'); if ($locale && file_exists(VIEWS . $locale . DS . $this-

5. 6. 7. 8. o

>viewPath)) { // e.g. use /app/views/fre/pages/tos.ctp instead of /app/views/pages/tos.ctp $this->viewPath = $locale . DS . $this->viewPath; } }

1. // View code 2. echo $this->element(Configure::read('Config.language') . '/tos')


4.8.2 Localizacin en CakePHP

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para cambiar o definir el idioma para su aplicacin slo necesita hacer lo siguiente: 1. Configure::write('Config.language', 'fre'); Esto le dice a Cake qu localizacin debe usar (si usa una localizacin regional como fr_FR, como alternativa en caso que no exista, se utilizar la localizacin de la norma ISO 639-2). Puede cambiar el idioma en cualquier momento, por ejemplo en el bootstrap si desea definir el idioma por defecto para su aplicacin, en el beforeFilter del controlador si el idioma es especfico para una peticin o un usuario o en cualquier otro momento si desea mostrar un mensaje en un idioma diferente. Es una buena idea mostrar contenido disponible en varios idiomas a partir de una URL diferente esto hace que sea fcil para los usuarios (y los motores de bsqueda) encontrar lo que estn buscando en el idioma esperado. Hay varias formas de hacer esto, puede ser utilizando subdominios especficos para cada idioma, (en.example.com, fra.example.com, etc), o usando un prefijo en la URL, como se hace en esta aplicacin. Usted tambin podra obtener la informacin del navegador del usuario, entre otras cosas. Como se menciona en la seccin anterior, para mostrar el contenido localizado se utiliza la funcin __() o una de las funciones de traduccin disponibles a nivel mundial. El primer parmetro de la funcin se utiliza como msgid definidos en los archivos .po. Recuerde que debe usar el parmetro return de la funcin __() si no desea que se muestre la cadena de texto directamente. Por ejemplo: 1. 2. 3. 4. <?php echo $form->error( 'Card.cardNumber', __("errorCardNumber", true),

5. array('escape' => false) 6. ); 7. ?> Si a usted le gusta tener todos los mensajes de error de validacin traducidos por defecto, una solucin simple sera aadir el siguiente cdigo en el app_model.php: 1. function invalidate($field, $value = true) { 2. return parent::invalidate($field, __($value, true)); 3. } La tarea i18n de la consola no ser capaz de determinar el id del mensaje del ejemplo anterior, lo que significa que tendr que aadir las entradas a su archivo po manualmente (o a travs de su propio script). Para evitar la necesidad de editar los archivos default.po cada vez que ejecute la tarea i18n de la consola, puede utilizar un dominio diferente, tal como: 1. function invalidate($field, $value = true) { 2. return parent::invalidate($field, __d('validation_errors', $value, true)); 3. } Hay otro aspecto de la localizacin de su aplicacin que no est cubierto por el uso de las funciones de traduccin, estos son los formatos de fecha y moneda. No olvide que CakePHP es PHP :), por lo tanto para establecer los formatos para este tipo de cosas deber utilizar setlocale. Si pasa una localizacin que no existe en su computadora a setlocale, no tendr ningn efecto. Puede encontrar la lista de localizaciones disponibles ejecutando el comando $locale -a 4.9 Paginacin Editar Ver slo esta seccin Historia Comparar con el contenido original

Uno de los obstculos principales al crear aplicaciones web flexibles y amigables al usuario (userfriendly) es disear una Interfaz de Usuario intuitiva. Muchas aplicaciones tienden a crecer en tamao y complejidad rpidamente, y tanto diseadores como programadores se encuentran conque no pueden arreglrselas para visualizar cientos o miles de registros. Refactorizar lleva tiempo, y el rendimiento y la satisfaccin del usuario pueden sufrir. Visualizar un nmero razonable de registros por pgina ha sido siempre una parte crtica de toda aplicacin y sola causar muchos dolores de cabeza a los desarrolladores. CakePHP aligera la carga del desarrollador proveyendo una manera rpida y fcil de paginar los datos. El ayudante PaginatorHelper ofrece una genial solucin porque es fcil de usar. Adems de paginacin, empaqueta algunas caractersticas de ordenacin muy fciles de usar. Por ltimo, pero no menos importante, tambin estn soportados el paginado y la ordenacin Ajax.
4.9.1 Preparacin del controlador

Editar Ver slo esta seccin Historia

Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones En el controlador comenzamos definiendo los valores de paginacin por defecto en la variable $paginate. Es importante sealar que la clave 'order' debe estar definida en la estructura de array dada. 1. 2. 3. 4. 5. 6. 7. 8. 1. 2. 3. 4. 5. 6. 7. 8. 9. class RecipesController extends AppController { var $paginate = array( 'limit' => 25, 'order' => array( 'Post.title' => 'asc' ) ); } class RecipesController extends AppController { var $paginate = array( 'fields' => array('Post.id', 'Post.created'), 'limit' => 25, 'order' => array( 'Post.title' => 'asc' ) ); }

Tambin puedes incluir otras opciones para find(), como fields

Pueden incluirse otras claves en el array $paginate similares a los parmetos del mtodo Model>find('all'), esto es: conditons, fields, order, limit, page, contain y recursive. De hecho, puedes definir ms de un conjunto de valores de paginacin por defecto en el controllador, simplemente nombra cada parte del array segn el modelo que desees configurar: 1. 2. 3. 4. 5. 6. 1. 2. 3. 4. 5. 6. class RecipesController extends AppController { var $paginate = array( 'Recipe' => array (...), 'Author' => array (...) ); } class RecipesController extends AppController { var $paginate = array( 'limit' => 25, 'contain' => array('Article') ); }

Ejemplo de sintaxis usando Containable Behavior:

Una vez que la variable $paginate ha sido definida, podemos llamar al mtodo paginate() en las acciones del controlador. Este mtodo devuelve los resultados de find('all') del modelo (aplicndoles los parmetros de la paginacin), y obtiene algunas estadsticas de paginacin adicionales, que son pasadas a la Vista de forma invisible. Este mtodo tambin aade PaginatorHelper a la lista de helpers en tu controlador, si es que no estaba ya. 1. 2. 3. 4. 5. function list_recipes() { // similar to findAll(), but fetches paged results $data = $this->paginate('Recipe'); $this->set(compact('data')); }

Puedes filtrar los registros pasando condiciones como segundo parmetro al mtodo paginate() 1. $data = $this->paginate('Recipe', array('Recipe.title LIKE' => 'a%')); O tambin puedes ajustar la clave conditions en la variable paginate.
4.9.2 Pagination in Views

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Es cosa tuya decidir cmo mostrar los registros al usuario, aunque lo ms habitual es hacerlo mediante tablas HTML. Los ejemplos que siguen asumen una disposicin tabular, pero el PaginatorHelper, disponible en las vistas, no siempre necesita restringirse de ese modo. Como ya se ha dicho, PaginatorHelper ofrece capacidades para ordenacin que pueden integrarse fcilmente en las cabeceras de las columnas de tus tablas: 1. // app/views/recipes/list_recipes.ctp 2. <table> 3. <tr> 4. <th><?php echo $paginator->sort('ID', 'id'); ?></th> 5. <th><?php echo $paginator->sort('Title', 'title'); ?></th> 6. </tr> 7. <?php foreach($data as $recipe): ?> 8. <tr> 9. <td><?php echo $recipe['Recipe']['id']; ?> </td> 10.<td><?php echo $recipe['Recipe']['title']; ?> </td> 11.</tr> 12.<?php endforeach; ?> 13.</table>

Los enlaces generados por el mtodo sort() de PaginatorHelper permiten a los usuarios hacer click en las cabeceras de las tablas y alternar la ordenacin de los datos por un campo dado. Tambin es posible ordenar una columna en base a asociaciones: <table> <tr> <th><?php echo $paginator->sort('Title', 'title'); ?></th> <th><?php echo $paginator->sort('Author', 'Author.name'); ? ></th> 5. </tr> 6. <?php foreach($data as $recipe): ?> 7. <tr> 8. <td><?php echo $recipe['Recipe']['title']; ?> </td> 9. <td><?php echo $recipe['Author']['name']; ?> </td> 10.</tr> 11.<?php endforeach; ?> 12.</table> 1. 2. 3. 4. El ingrediente final de la paginacin en las vistas es aadir la navegacin de pginas, que tambin viene proporcionada por PaginationHelper. 1. 2. 3. 4. 5. 6. 7. 8. 9. <!-- Muestra los nmeros de pgina --> <?php echo $paginator->numbers(); ?> <!-- Muestra los enlaces para Anterior y Siguiente --> <?php echo $paginator->prev(' Previous ', null, null, array('class' => 'disabled')); echo $paginator->next(' Next ', null, null, array('class' => 'disabled')); ?> <!-- Muestra X de Y, donde X es la pgina actual e Y el total del pginas --> <?php echo $paginator->counter(); ?>

El texto generado por el mtodo counter() puede personalizarse usando marcadores especiales: 1. <?php 2. echo $paginator->counter(array( 3. 'format' => 'Page %page% of %pages%, showing %current% records out of 4. %count% total, starting on record %start%, ending on %end%' 5. )); 6. ?> Para pasar todos los argumentos de la URL a las funciones del paginador, aade lo siguiente a tu vista: 1. $paginator->options(array('url' => $this->passedArgs)); Tambin puedes especificar qu parmetros pasar manualmente: 1. $paginator->options(array('url' => array("0", "1")));

4.9.3 Paginacin AJAX

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Es muy fcil incorporar funcionalidad Ajax en la paginacin. El nico cdigo extra que necesitas es incluir la librera JavaScript Prototype, ajustar el indicador (el icono de carga dentro la DIV) y especificar la DIV que ser actualizada en lugar de recargar la pgina. No olvides aadir el componente RequestHandler para poder usar llamadas Ajax en tu controlador: 1. var $components = array('RequestHandler');
# Configuring the PaginatorHelper to use a custom helper

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones By default in 1.3 the PaginatorHelper uses JsHelper to do ajax features. However, if you don't want that and want to use the AjaxHelper or a custom helper for ajax links, you can do so by changing the $helpers array in your controller. After running paginate() do the following. 1. $this->set('posts', $this->paginate()); 2. $this->helpers['Paginator'] = array('ajax' => 'Ajax'); Will change the PaginatorHelper to use the AjaxHelper for ajax operations. You could also set the 'ajax' key to be any helper, as long as that class implements a link() method that behaves like HtmlHelper::link()
4.9.4 Custom Query Pagination

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Fix me: Please add an example where overriding paginate is justified A good example of when you would need this is if the underlying DB does not support the SQL LIMIT syntax. This is true of IBM's DB2. You can still use the CakePHP pagination by adding the custom query to the model.

Should you need to create custom queries to generate the data you want to paginate, you can override the paginate() and paginateCount() model methods used by the pagination controller logic. Before continuing check you can't achieve your goal with the core model methods. The paginate() method uses the same parameters as Model::find(). To use your own method/logic override it in the model you wish to get the data from. 1. /** 2. * Overridden paginate method - group by week, away_team_id and home_team_id 3. */ 4. function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) { 5. $recursive = -1; 6. $group = $fields = array('week', 'away_team_id', 'home_team_id'); 7. return $this->find('all', compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive', 'group')); 8. } You also need to override the core paginateCount(), this method expects the same arguments as Model::find('count'). The example below uses some Postgres-specifc features, so please adjust accordingly depending on what database you are using. 1. 2. 3. 4. 5. 6. 7. 8. 9. /** * Overridden paginateCount method */ function paginateCount($conditions = null, $recursive = 0, $extra = array()) { $sql = "SELECT DISTINCT ON(week, home_team_id, away_team_id) week, home_team_id, away_team_id FROM games"; $this->recursive = $recursive; $results = $this->query($sql); return count($results); }

The observant reader will have noticed that the paginate method we've defined wasn't actually necessary - All you have to do is add the keyword in controller's $paginate class variable. 1. /** 2. * Add GROUP BY clause 3. */ 4. var $paginate = array( 5. 'MyModel' => array('limit' => 20, 6. 'order' => array('week' => 'desc'), 7. 'group' => array('week', 'home_team_id', 'away_team_id')) 8. ); 9. /** 10.* Or on-the-fly from within the action 11.*/ 12.function index() {

13.$this->paginate = array( 14.'MyModel' => array('limit' => 20, 15.'order' => array('week' => 'desc'), 16.'group' => array('week', 'home_team_id', 'away_team_id')) 17.); However, it will still be necessary to override the paginateCount() method to get an accurate value. 4.10 REST Editar Ver slo esta seccin Historia Comparar con el contenido original

Muchos de los nuevos programadores de aplicaciones se estn percatando de la necesidad de liberar las funcionalidades de su aplicacin a una audiencia ms amplia. Proporcionar un acceso fcil y sin restricciones al ncleo de tu aplicacin puede ayudar a que esta sea mayormente aceptada, adems de facilitar la realizacin de mashups que la integren y permitir una sencilla integracin con otros sistemas. Aunque existen otras soluciones, REST es una buena forma de proveer fcil acceso a la capa lgica de tu aplicacin. Es simple, est basado normalmente en el lenguaje de marcado XML (XML simple, nada de complicados envoltorios SOAP), y se vale de las cabeceras HTTP para el direccionamiento. Exponer una API va REST en CakePHP es simple.
4.10.1 Una configuracin simple

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La forma ms rpida de iniciar y utilizar REST es aadir una pocas lineas a tu fichero routes.php, situado en app/config. El objeto Router contiene un mtodo llamado mapResources() que es utilizado para configurar un nmero determinado de rutas para el acceso REST a tus controladores. Si queremos permitir a REST acceder a una base de datos de recetas, haramos algo como esto: 1. //En app/config/routes.php... 2. Router::mapResources('recetas'); 3. Router::parseExtensions(); La primera linea establece varias rutas por defecto para un fcil acceso REST donde el mtodo especifica el formato deseado del resultado (p.ej. xml, json, rss). Estas rutas son sensibles a los

Mtodos de Peticin HTTP. Mtodo HTTP URL.method Accin invocada del Controlador GET /recetas.method RecetasController::index() GET /recetas/123.method RecetasController::view(123) POST /recetas.method RecetasController::add() PUT /recetas/123.method RecetasController::edit(123) DELETE /recetas/123.method RecetasController::delete(123) POST /recetas/123.method RecetasController::edit(123) La clase Router de CakePHP usa diferentes indicadores para detectar el motod HTTO que est siendo utilizado. Aqu estn por orden de preferencia: 1. La variable POST _method 2. X_HTTP_METHOD_OVERRIDE 3. La cabecera REQUEST_METHOD La variable POST _method es til cuando se utiliza un navegador como cliente REST (o cualquier cosa que pueda hacer facilmente POST). Establece el valor de _method al nombre del mtodo de peticin HTTP que desees emular. Una vez que se ha configurado el router para mapear solicitudes REST hacia determinadas acciones del controlador, podemos pasar a crear la lgica de nuestras acciones de controlador. Un controlador bsico puede ser algo como esto: 1. // controllers/recetas_controller.php 2. class RecetasController extends AppController { 3. var $components = array('RequestHandler'); 4. function index() { 5. $recetas = $this->Receta->find('all'); 6. $this->set(compact('recetas')); 7. } 8. function view($id) { 9. $receta = $this->Receta->findById($id); 10.$this->set(compact('receta')); 11.} 12.function edit($id) { 13.$this->Receta->id = $id; 14.if ($this->Receta->save($this->data)) { 15.$message = 'Saved'; 16.} else { 17.$message = 'Error'; 18.} 19.$this->set(compact("message")); 20.} 21.function delete($id) { 22.if($this->Receta->delete($id)) { 23.$message = 'Deleted'; 24.} else { 25.$message = 'Error'; 26.}

27.$this->set(compact("message")); 28.} 29.} Como hemos aadido una llamada a Router::parseExtensions(), el router CakePHP tiene aun como prioridad servir vistas diferentes basadas en diferentes tipos de peticiones. Como estamos tratando con peticiones REST, el tipo de vista es XML. Situamos las vistas REST para nuestro Recetas Controller dentro de app/views/xml. Tambin podemos utilizar XmlHelper para una salida rpida y facil de estas vistas. Aqu puedes ver cmo sera nuestra vista index: 1. 2. 3. 4. // app/views/recetas/xml/index.ctp <recetas> <?php echo $xml->serialize($recetas); ?> </recetas>

Usuarios con experiencia en CakePHP pueden notar que no hemos incluido XmlHelper en nuestro array $helpers en RecetasController. Esto tiene un propsito - cuando se sirve un tipo de contenido especfico usando parseExtensions(), CakePHP busca automticamente una vista de helper que coincida con el tipo. Como estamos usando XML como tipo de contenido, XmlHelper es cargado automticamente para su uso en nuestras vistas. La renderizacin del XML sera as: <posts> <post id="234" created="2008-06-13" modified="2008-06-14"> <author id="23423" first_name="Billy" last_name="Bob"></author> <comment id="245" body="Esto es un comentario a esta entrada."></comment> 5. </post> 6. <post id="3247" created="2008-06-15" modified="2008-06-15"> 7. <author id="625" first_name="Nate" last_name="Johnson"></author> 8. <comment id="654" body="Esto es un comentario a esta entrada."></comment> 9. </post> 10.</posts> 1. 2. 3. 4. Crear la lgica para la accin edit es un poco ms complicado, pero no demasiado. Como ests aportando una API que imprime XML, es una eleccin natural recibir XML como entrada. No te preocupes, Since you're providing an API that outputs XML, it's a natural choice to receive XML as input. Not to worry, however: the RequestHandler and Router classes make things much easier. If a POST or PUT request has an XML content-type, then the input is taken and passed to an instance of Cake's Xml object, which is assigned to the $data property of the controller. Because of this feature, handling XML and POST data in parallel is seamless: no changes are required to the controller or model code. Everything you need should end up in $this->data.
4.10.2 Custom REST Routing

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre

traduciones If the default routes created by mapResources() don't work for you, use the Router::connect() method to define a custom set of REST routes. The connect() method allows you to define a number of different options for a given URL. The first parameter is the URL itself, and the second parameter allows you to supply those options. The third parameter allows you to specify regex patterns to help CakePHP identify certain markers in the specified URL. We'll provide a simple example here, and allow you to tailor this route for your other RESTful purposes. Here's what our edit REST route would look like, without using mapResources(): 1. 2. 3. 4. 5. Router::connect( "/:controller/:id", array("action" => "edit", "[method]" => "PUT"), array("id" => "[0-9]+") )

Advanced routing techniques are covered elsewhere, so we'll focus on the most important point for our purposes here: the [method] key of the options array in the second parameter. Once that key has been set, the specified route works only for that HTTP request method (which could also be GET, DELETE, etc.)

5 Componentes del Ncleo


Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones CakePHP posee una serie de componentes integrados. stos proveen distintas funcionalidades para tareas realizadas comunmente. El componente Acl provee una sencilla interfaz para listas de control de acceso (access control list) basadas en archivos ini o base de datos. El componente Auth provee un sistema de autenticacin fcil de utilizar usando Auth diferentes procesos de validacin, como ser callbacks en los controladores, Acl u callbacks en los objetos. El componente Session provee un wrapper de almacenamiento independiente a las Session sesiones de PHP. El componente RequestHandler permite analizar las peticiones HTTP para RequestHandler informarle a la aplicacin acerca del tipo de contenido y la informacin requerida por el usuario. El componente Security permite aumentar la seguridad y gestionar autenticacin Security HTTP. Acl

Una interfaz que puede ser utilizada para enviar emails usando distintos MTA (mail transfer agent) incluyendo la funcin mail() de PHP y el protocolo SMTP. El componente Cookie se comporta en cierta forma similar al Session ya que provee Cookie un wrapper para el soporte nativo de cookies en PHP. Para aprender ms acerca de cada componente mira en el menu a la izquierda, o aprende acerca de cmo crear tus propios componentes. Email 5.1 Listas de Control de Acceso Editar Ver slo esta seccin Historia Comparar con el contenido original

La funcionalidad de listas de control de acceso en CakePHP es una de las ms comentadas, en parte porque es una de las ms solicitadas, y en parte porque puede ser algo confusa al principio. Si ests buscando un buen lugar para comenzar a utilizar ACL en general, contina leyendo. Debes ser valiente, incluso cuando las cosas se compliquen. Una vez que asimiles estos conceptos, las listas de control de acceso son una herramienta extremadamente poderosa para tener a mano al desarrollar tu aplicacin.
5.1.1 Entendiendo cmo funciona ACL

Editar Ver slo esta seccin Historia Comparar con el contenido original

Las listas de control de acceso permiten gestionar detalladamente los permisos de una aplicacin de forma sencilla y escalable. Las listas de control de acceso, o ACL, manejan principalmente dos cosas: las entidades que solicitan el control de algo y las entidades que se quiere controlar. En la jerga de ACL, las entidades que quieren controlar algo, que la mayora de las veces son los usuarios, son los ARO (en ingls access request objects), y las entidades del sistema que se quiere controlar, que normalmente son acciones o datos, son los ACO (en ingls access control objects). A los ARO se les llama 'objetos' porque quien realiza la peticin no siempre es una persona; los ACO son cualquier cosa que desees controlar: desde la accin de un controlador o un servicio Web, hasta el diario en lnea ntimo de tu abuela. En resumen: ACO - Access Control Object - Objeto que se quiere controlar ARO - Access Request Object - Objeto que solicita el control de algo Esencialmente, las ACL se utilizan para decidir cundo un ARO puede acceder a un ACO. Vamos a utilizar un ejemplo prctico para ver cmo encajan todas estas piezas. Imaginemos que el grupo de aventureros de la novela de fantasa El seor de los Anillos trabaja con una aplicacin CakePHP, y que el lder, Gandalf, se encarga de gestionar los elementos del grupo. Para garantizar la privacidad y la seguridad de los miembros del grupo, pues, lo primero que hace Gandalf es crear la lista de AROs involucrados:

Gandalf Aragorn Bilbo Frodo Gollum Legolas Gimli Pippin Merry

Fjate que ACL no es lo mismo que la autenticacin; ACL es lo que ocurre despus de que el usuario se autentica. Aunque suelen utilizarse los dos a la vez, es importante ver la diferencia entre saber quin es alguien (autenticacin) y saber qu puede hacer (ACL). A continuacin, Gandalf tiene que crear una lista con las cosas, o ACOs, que el sistema maneja. Esta lista puede ser como la siguiente: Armas El Anillo Jamn Diplomacia Cerveza Armas El Anillo Jamn Diplomacia Cerveza Gandalf Aragorn Permitir Bilbo Frodo Gollum Legolas Permitir Gimli Pippin Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir Permitir

Merry Permitir A simple vista, parece que este tipo de sistema funciona bastante bien. En efecto, las asignaciones garantizan la seguridad (slo Frodo puede acceder al anillo) y previenen los accidentes (los Hobbits se mantienen lejos del jamn y de las armas). Parece bastante detallado y fcil de leer, verdad? Sin embargo, una matriz como esta slo funciona en un sistema pequeo; en un sistema que tenga previsto crecer, o que tenga muchos recursos (ACOs) y usuarios (AROs), es difcil mantenerla. Ciertamente, te imaginas, en este ejemplo, cmo se controlara el acceso a cientos de campamentos de guerra, gestionndolos por unidad? Otro inconveniente de las matrices es que no permiten formar grupos lgicos de usuarios ni aplicar cambios de permiso en cascada a estos grupos. En otras palabras, estara muy bien que, una vez terminada la batalla, los hobbits pudieran acceder a la cerveza y al jamn; en otras palabras, otorgar individualmente permisos a hobbits es tedioso y propenso a errores, mientras que aplicarles un cambio en cascada es mucho ms fcil. ACL se suele implementar en una estructura de rbol, y, generalmente, existe un rbol de AROs y un

rbol de ACOs. Organizando los objetos as, los permisos se gestionan de forma granular y se mantiene una visin general; en consecuencia, siendo el sabio lder que es, Gandalf decide utilizar ACL en su sistema y organiza los objetos de la siguiente manera: Comunidad del Anillo Guerreros Aragorn Legolas Gimli MAgos Gandalf Hobbits Frodo Bilbo Merry Pippin Visitantes Gollum Utilizar una estructura de rbol en los AROs permite a Gandalf definir permisos que se aplican a un grupo de usuarios, de una sola vez. Por lo tanto, Gandalf aade ahora estos permisos a los grupos: Comunidad del Anillo (Denegar: todo) Guerreros (Permitir: Armas, Cerveza, Raciones, Jamn) Aragorn Legolas Gimli Magos (Permitir: Jamn, Diplomacia, Cerveza) Gandalf Hobbits (Permitir: Cerveza) Frodo Bilbo Merry Pippin Visitantes (Permitir: Jamn) Gollum Para ver si Pippin tiene acceso a la cerveza, lo primero que tenemos que hacer es obtener su camino en el rbol: Comunidad del Anillo->Hobbits->Pippin. A continuacin, hay que ver los permisos que residen en cada uno de esos puntos, y, finalmente, se utiliza el ms especfico relacionado con Pippin y la Cerveza. Nodo ARO Informacin de Permisos Resultado Comunidad del Anillo Denegar todo Acceso a la Cerveza denegado.

Hobbits Permitir 'Cerveza' Acceso a la Cerveza permitido! Pippin -Todava se le permite la Cerveza! Como el nodo de 'Pippin' del rbol ACL no deniega especficamente el acceso al ACO 'Cerveza', el resultado final es que se permite el acceso a ese ACO. Adems, el rbol permite realizar ajustes ms finos para tener un control ms granular y no pierda la capacidad de realizar cambios importantes en los grupos de AROs: Comunidad del Anillo (Denegar: todo) Guerreros (Permitir: Armas, Cerveza, Raciones, Jamn) Aragorn (Permitir: Diplomacia) Legolas Gimli MAgos (Permitir: Jamn, Diplomacia, Cerveza) Gandalf Hobbits (Permitir: Cerveza) Frodo (Permitir: Anillo) Bilbo Merry (Denegar: Cerveza) Pippin (Permitir: Diplomacia) Visitantes (Permitir: Jamn) Gollum Esta aproximacin permite realizar cambios de permisos globales y, al mismo tiempo, ajustes granulares. Por lo tanto, podemos decir que, a excepcin de Merry, todos los hobbits tienen acceso a la cerveza. De nuevo, para saber si Merry tiene acceso a la Cerveza, primero debemos encontrar su camino en el rbol, Comunidad del Anillo->Hobbits->Merry, bajar, y analizar los premisos relacionados con la Cerveza: Nodo ARO Comunidad del Anillo Hobbits Merry Informacin de Permisos Resultado Denegar todo Acceso a la Cerveza denegado. Permitir 'Cerveza' Acceso a la Cerveza permitido! Denegar 'Cerveza' Cerveza denegada.

5.1.2 Definiendo Permisos: ACL basado en INI

Editar Ver slo esta seccin Historia Comparar con el contenido original

La primer implementacin de ACL en Cake fue basada en archivos INI almacenados en el directorio de instalacin de Cake. Si bien es til y estable, recomendamos que utilices la solucin de ACL apoyada en la base de datos, sobre todo por la posibilidad de crear nuevos ACOs y AROs dentro de la aplicacin. La implementacin con archivos INI fue pensada para ser utilizada en aplicaciones simples, especialmente en aquellas que por alguna razn podran no utilizar una base de datos. Por defecto, CakePHP utiliza el sistema de ACL apoyado en la base de datos. Para habilitar el uso de ACL con archivos INI, tiene que decirle a CakePHP qu sistema vas a usar editando las siguientes lneas en app/config/core.php 1. 2. 3. 4. 5. 6. //Cambiar stas lneas: Configure::write('Acl.classname', 'DbAcl'); Configure::write('Acl.database', 'default'); //Para que se vean como stas: Configure::write('Acl.classname', 'IniAcl'); //Configure::write('Acl.database', 'default');

Los permisos ARO/ACO son especificados en /app/config/acl.ini.php. Bsicamente los AROs se deben especificar en la seccin del INI que tiene tres propiedades: grupos, permitir y denegar. grupos: nombres de los grupos de AROs a los que pertenece este ARO. permitir: nombres de los ACOs a los que tiene acceso este ARO. denegar: nombres de los ACOs a los que este ARO no tiene acceso. Los ACOs se definen en la seccin del INI que slo incluye las propiedades permitir y denegar. Como ejemplo, veamos cmo se vera la estructura de AROs de la Comunidad del Anillo en la sintaxis del INI:
;------------------------------------; AROs ;------------------------------------[aragorn] grupos = guerreros permitir = diplomacia [legolas] grupos = guerreros [gimli] grupos = guerreros [gandalf] grupos = magos [frodo] grupos = hobbits permitir = ring [bilbo] grupos = hobbits [merry] grupos = hobbits deny = cerveza [pippin]

grupos = hobbits [gollum] grupos = visitantes ;------------------------------------; ARO Groups ;------------------------------------[guerreros] permitir = armas, cerveza, jamn [magos] permitir = jamn, diplomacia, cerveza [hobbits] permitir = cerveza [visitantes] permitir = jamn

Ahora que ya has definido los permisos, puede saltar a la seccin de verificacin de permisos utilizando el componente ACL.
5.1.3 Definiendo Permisos: ACL en la base de datos

Editar Ver slo esta seccin Historia Comparar con el contenido original

Ahora que ya hemos cubierto los permisos de ACL basados en archivos INI, veamos los permisos (ms comnmente utilizados) basados en base de datos.
5.1.3.1 Comenzando

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La implementacin de ACL por defecto est basada en la base de datos. sta consiste en un conjunto de modelos y una aplicacin de consola que viene con la instalacin de Cake. Los modelos son usados por Cake para interactuar con la base de datos para poder almacenar y recuperar los nodos en forma de rbol. La aplicacin de consola se utiliza para inicializar la base de datos e interacturar con los rboles de ACOs y AROs Para comenzar, lo primero que deber asegurarte es que /app/config/database.php exista y

est correctamente configurado. Referirse a la seccin 4.1 para ms informacin acerca de la configuracin de la base de datos. Una vez que hayas hecho esto, tienes que utilizar la consola de CakePHP para crear las tablas de ACL:
$ cake schema run create DbAcl

Ejecutando este comando recrear las tablas necesarias para almacenar los rbols de ACOs y AROs (si las tablas ya existan, este comando las elimina y las vuelve a crear). La salida de la consola debera verse algo as:
--------------------------------------------------------------Cake Schema Shell --------------------------------------------------------------The following tables will be dropped. acos aros aros_acos Are you sure you want to drop the tables? (y/n) [n] > y Dropping tables. acos updated. aros updated. aros_acos updated. The following tables will be created. acos aros aros_acos Are you sure you want to create the tables? (y/n) [y] > y Creating tables. acos updated. aros updated. aros_acos updated. End create.

sto reemplaza al viejo comando "initdb", el cul ya es obsoleto. Tambin puedes utilizar el archivo SQL que se encuentra en app/config/sql/db_acl.sql, pero est lejos de ser tan divertido. Cuando finalices, deberas tener tres nuevas tablas en tu sistema: acos, aros, and aros_acos (la tabla de la relacin n a n donde se definen los permisos entre los dos rboles). Si eres curioso en saber cmo Cake almacena la informacin de los rboles en esas tablas, debes leer acerca del recorrido de rboles en bases de datos (en ingls modified database tree traversal). El componente ACL utiliza el Comportamiento de rbol para gestionar la herencia dentro del rbol. Las clases pertenecientes a los modelos de ACL estn contenidas en un nico archivo db_acl.php. Ahora que ya hemos configurado todo, creemos algunos rboles de AROs y ACOs
5.1.3.2 Creando Access Request Objects (AROs) y Access Control Objects (ACOs)

Editar

Ver slo esta seccin Historia Comparar con el contenido original Al crear nuevos objetos ACL (ACOs y AROs), hay dos formas de nombrar y acceder a los nodos. El primer mtodo consiste en realizar un enlace entre el objeto ACL directamente con el registro de la base de datos, especificando el nombre del modelo y el valor de la clave externa. El segundo mtodo puede usarse cuando un objeto no tiene relacin con un registro en la base de datos; puedes proveer un alias para este tipo de objetos. En general, cuando ests creando un grupo o un nivel ms alto de objetos, deber usar un alias. Si ests gestionando el acceso a un registro especfico de la base de datos, debes usar el mtodo de modelo/clave externa. Para crear nuevos objetos ACL debes utilizar los modelos de ACL provistos por CakePHP, en los cuales existen algunos campos que necesitas conocer para almacenar la informacin: model, foreign_key, alias, y parent_id. Los campos model y foreign_key de un objeto ACL te permiten enlazar directamente el objeto con el correspondiente registro de la base de datos (si existe alguno). Por ejemplo, muchos AROs tendrn su correspondencia con registros de Usuarios en la base de datos. Estableciendo el campo foreign_key del ARO con el ID del Usuario te permitir enlazar la informacin del ARO y del Usuario con una simple llamada find() del modelo del Usuario si las relaciones fueron configuradas correctamente. En cambio, si lo que quieres es gestionar las operaciones de editar en un post especfico en un blog o un listado de recetas, podras elegir enlazar un ACO a ese registro en particular. El campo alias de un objeto ACL es slo una etiqueta que puede ser fcilmente interpretada por un ser humano, y se utiliza para identificar un objeto ACL que no tiene una correlacin directa con algn registro de un modelo. Los alias son muy tiles para nombrar grupos de usuarios en colecciones de ACOs. El campo parent_id de un objeto ACL te permite completar la estructura del rbol. Debes proveer el ID del nodo padre en el rbol para crear un nuevo hijo. Antes de crear nuevos objetos ACL, necesitamos cargar las respectivas clases. La forma ms fcil de hacer esto es incluir el componente ACL en el array $components de tu controlador: 1. var $components = array('Acl'); Una vez que haz hecho esto, veamos ejemplos de cmo sera la creacin de algunos objetos. El cdigo siguiente puede ser colocado en la accin de algn controlador: Mientras los ejemplos se enfocan en la creacin de AROs, las mismas tcnicas pueden ser usadas para crear el rbol de ACOs. Siguiendo con la configuracin de la Comunidad, creemos primero nuestro grupo de AROs. Debido a que nuestros grupos no tendrn registros especficos asociados a ellos, usaremos alias en la creacin de los objetos ACL. Lo que estamos haciendo aqu es desde la perspectiva de la accin de un controlador, pero puede realizarse en otro lugar. Lo que vamos a usar es una aproximacin algo artificial, pero deberas sentirte cmodo usando estas tcnicas para crear AROs y ACOs al vuelo. Esto no debera ser algo drsticamente nuevo, slo estamos utilizando los modelos para guardar los datos como siempre hacemos: 1. function algunaAccion() 2. {

3. $aro = new Aro(); 4. //Aqu tenemos la informacin de nuestros grupos en un array sobre el cual iteraremos luego 5. $groups = array( 6. 0 => array( 7. 'alias' => 'guerreros' 8. ), 9. 1 => array( 10.'alias' => 'magos' 11.), 12.2 => array( 13.'alias' => 'hobbits' 14.), 15.3 => array( 16.'alias' => 'visitantes' 17.), 18.); 19.//Iterar para crear los ARO de los grupos 20.foreach($groups as $data) 21.{ 22.//Recuerda llamar a create() cuando ests guardando informacin dentro de bucles... 23.$aro->create(); 24.//Guardar datos 25.$aro->save($data); 26.} 27.//Aqu va otra lgica de la accin... 28.} Una vez creados, podemos utilizar la aplicacin de consola de ACL para verificar la estructura de los rboles.
$ cake acl view aro Aro tree: --------------------------------------------------------------[1]guerreros [2]magos [3]hobbits [4]visitantes ---------------------------------------------------------------

Supongo que no se parece mucho a un rbol en este punto, pero al menos pudimos verificar que tenemos los cuatro nodos de primer nivel. Agreguemos algunos hijos a esos nodos agregando nuestros AROs especficos de cada usuario dentro de esos grupos. Todo buen ciudadano de la Tierra Media tiene una cuenta en nuestro nuevo sistema, entonces nosotros referiremos esos AROs a los registros dentro del modelo especfico en la base de datos.

Cuando agregue hijos al rbol, asegrese de utilizar el ID del nodo ACL y no un valor de foreign_key. function algunaAccion() { $aro = new Aro(); //Aqu tenemos nuestros registros de usuario, listos para ser relacionados con nuevos registros ARO 5. //Estos datos pueden venir de un modelo, pero en este caso estamos usando arrays estticos 6. //con propsitos de demostracin. 7. $users = array( 8. 0 => array( 9. 'alias' => 'Aragorn', 10.'parent_id' => 1, 11.'model' => 'User', 12.'foreign_key' => 2356, 13.), 14.1 => array( 15.'alias' => 'Legolas', 16.'parent_id' => 1, 17.'model' => 'User', 18.'foreign_key' => 6342, 19.), 20.2 => array( 21.'alias' => 'Gimli', 22.'parent_id' => 1, 23.'model' => 'User', 24.'foreign_key' => 1564, 25.), 26.3 => array( 27.'alias' => 'Gandalf', 28.'parent_id' => 2, 29.'model' => 'User', 30.'foreign_key' => 7419, 31.), 32.4 => array( 33.'alias' => 'Frodo', 34.'parent_id' => 3, 35.'model' => 'User', 36.'foreign_key' => 7451, 37.), 38.5 => array( 39.'alias' => 'Bilbo', 40.'parent_id' => 3, 41.'model' => 'User', 42.'foreign_key' => 5126, 43.), 44.6 => array( 1. 2. 3. 4.

45.'alias' => 'Merry', 46.'parent_id' => 3, 47.'model' => 'User', 48.'foreign_key' => 5144, 49.), 50.7 => array( 51.'alias' => 'Pippin', 52.'parent_id' => 3, 53.'model' => 'User', 54.'foreign_key' => 1211, 55.), 56.8 => array( 57.'alias' => 'Gollum', 58.'parent_id' => 4, 59.'model' => 'User', 60.'foreign_key' => 1337, 61.), 62.); 63.//Iterar y crear los AROs (como hijos) 64.foreach($users as $data) 65.{ 66.///Recuerda llamar a create() cuando ests guardando informacin dentro de bucles... 67.$aro->create(); 68.//Guardar datos 69.$aro->save($data); 70.} 71.//Aqu va otra lgica de la accin... 72.} Tpicamente no usars el alias y los campos model/foreing_key al mismo tiempo, pero aqu estamos utilizando los dos para que la estructura sea ms fcil de leer y para propsitos de demostracin. La salida de la aplicacin de consola ahora debera ser un poco ms interesante. Veamos:
$ cake acl view aro Aro tree: --------------------------------------------------------------[1]guerreros [5]Aragorn [6]Legolas [7]Gimli [2]magos [8]Gandalf [3]hobbits

[9]Frodo [10]Bilbo [11]Merry [12]Pippin [4]visitantes [13]Gollum ---------------------------------------------------------------

Ahora que ya tenemos nuestro rbol de AROs configurado apropiadamente, discutamos una posible aproximacin para la estructura del rbol de ACOs. Mientras que podemos estructurar ms de una representacin abstracta de nuestros ACOs, a menudo es ms prctico modelar un rbol de ACOs despus de configurar los controladores y acciones. Tenemos cindo objetos principales que queremos manejar en este escenario, y la configuracin natural para una aplicacin Cake es un grupo de modelos y en segundo lugar, los controladores que los manipulan. Es en stos controladores donde queremos controlar el acceso a algunas acciones especficas. Basndonos en esa idea, vamos a crear un rbol de ACOs que imite una aplicacin Cake. Como tenenos cinco ACOs, vamos a crear un rbol de ACOs que se ver algo as: Armas Anillo Jamn EsfuerzosDiplomticos Cervezas

Una buena caracterstica de la implementacin de ACL en Cake, es que cada ACO automticamente contiene cuatro propiedades relacionadas con las acciones CRUD (en ingls create, read, update, and delete). Puedes crear nodos dentro de cada uno de esos ACOs principales, pero usando la gestin de acciones que provee Cake abarcars las operaciones bsicas de CRUD sobre un objeto dado. Teniendo esto en mente har que tu rbol de ACOs sea ms pequeo y fcil de mantener. Veremos cmo usadas esas propiedades cuando hablemos acerca de cmo asignar permisos. Como ya eres un profesional creando AROs, usa las mismas tcnicas para crear este rbol de ACOs. Crea esos grupos de nivel superior usando el modelo bsico de Aco
5.1.3.3 Asignando Permisos

Editar Ver slo esta seccin Historia Comparar con el contenido original

Despus de crear los ACOs y los AROs, finalmente podremos asignar los permisos entre los dos grupos. Esto se realiza utilizando el componente ACL de Cake. Sigamos con nuestro ejemplo En este ejemplo trabajaremos en el contexto de una accin de un controlador. Tenemos que hacer esto debido a que los permisos son manejados por el componente ACL 1. class AlgunController extends AppController

2. 3. 4. 5. 6.

{ // Podras colocar esta declaracin en AppController // para que sea heredada por todos los controladores var $components = array('Acl'); }

Asignemos algunos permisos bsicos utilizando el componente ACL in la accin dentro de este controlador 1. function index() 2. { 3. //Permitirle a los guerreros acceso total a las armas 4. //Ambos ejemplos usan la sintaxis de alias vista anteriormente 5. $this->Acl->allow('guerreros', 'Armas'); 6. //Aunque el Rey puede no querer que todo el mundo tenga 7. //acceso irrestricto 8. $this->Acl->deny('guerreros/Legolas', 'Armas', 'delete'); 9. $this->Acl->deny('guerreros/Gimli', 'Armas', 'delete'); 10.die(print_r('hecho', 1)); 11.} En la primer llamada que hicimos al componente ACL permitimos que cualquier usuario dentro del grupo ARO denominado "guerreros" tenga acceso irrestricto a cualquier arma dentro del grupo ACO denominado "Armas". Esto lo realizamos referenciando a ambos grupos por sus alias. Has notado el uso del tercer parmetro? Ah es donde utilizamos esas acciones pre-contruidos para todos los ACOs dentro de Cake. La opcin por defecto para ese parmetro son create, read, update, y delete, pero puedes agregar una columna en la tabla aros_acos (comenzando con el prefijo "_", por ejemplo _admin) y utilizarla junto con las otras acciones. La segunda llamada es un intento de realizar una asignacin de permisos mucho ms granular. Nosotros queremos que Aragorn tenga acceso irrestricto, pero no queremos que los otros guerreros pertenecientes al grupo tengan la habilidad de borrar registros de Armas. En el ejemplo utilizamos la sintaxis de alias, pero se puede usar tambin de la forma model/foreign_key. El ejemplo anterior es equivalente a este: 1. // 6342 = Legolas 2. // 1564 = Gimli 3. $this->Acl->deny(array('model' => 'User', 'foreign_key' => 6342), 'Armas', 'delete'); 4. $this->Acl->deny(array('model' => 'User', 'foreign_key' => 1564), 'Armas', 'delete'); Para acceder a un nodo utilizando la sintaxis de alias, debemos usar una cadena de caracteres delimitada por barras ('/usuarios/empleados/desarrolladores'). Para acceder a un nodo utilizando la sintaxis model/foreign_key debes utilizar un arreglo con dos parmetros: array('model' => 'Usuario', 'foreign_key' => 8282). La prxima seccin nos ayudar a validar nuestra configuracin utilizando el componente ACL para verificar los permisos que acabamos de asignar.

5.1.3.4 Verificando Permisos: El Componente ACL

Editar Ver slo esta seccin Historia Comparar con el contenido original

Vamos a utilizar el componente ACL para asegurarnos que ni los enanos ni los elfos pueden quitas armas de la armera. En este punto, deberamos ser capaces de utilizar AclComponent para verificar los permisos entre los ACOs y AROs que hemos creado. La sintaxis bsica para realizar una verificacin de permisos es: 1. $this->Acl->check( $aro, $aco, $action = '*'); Vamos a intentarlo dentro de una accin en un controlador: function index() { //Todos estos devuelven true $this->Acl->check('guerreros/Aragorn', 'Armas'); $this->Acl->check('guerreros/Aragorn', 'Armas', 'create'); $this->Acl->check('guerreros/Aragorn', 'Armas', 'read'); $this->Acl->check('guerreros/Aragorn', 'Armas', 'update'); $this->Acl->check('guerreros/Aragorn', 'Armas', 'delete'); //Recuerda que tambin podemos utilizar la sintaxis model/foreign_key 10.//para los AROs de nuestro usuario 11.$this->Acl->check(array('model' => 'User', 'foreign_key' => 2356), 'Armas'); 12.//Estos tambin deben devolver true: 13.$result = $this->Acl->check('guerreros/Legolas', 'Armas', 'create'); 14.$result = $this->Acl->check('guerreros/Gimli', 'Armas', 'read'); 15.//Pero estos devuelven false: 16.$result = $this->Acl->check('guerreros/Legolas', 'Armas','delete'); 17.$result = $this->Acl->check('guerreros/Gimli', 'Armas', 'delete'); 18.} 1. 2. 3. 4. 5. 6. 7. 8. 9. El uso que le dimos aqu es solamente con propsitos de demostracin, pero esperamos que puedas ver cmo la verificacin de permisos de esta forma puede ser utilizada para decidir cundo permitir o no determinada accin, mostrar un mensaje de error o redirigir al usuario a la pantalla de autenticacin. 5.2 Autenticacin Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este

differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Un sistema de autenticacin de usuarios es una parte comn de muchas aplicaciones web. En CakePHP hay muchas formas para autenticar usuarios, cada una de estas provee diferentes opciones. La esencia de componente de autenticacin es comprobar si el usuario tiene una cuenta con el sitio. De ser as, el componente da al usuario acceso completo a sitio. Este componente se puede combinar con el componente ACL (access control lists) para crear niveles ms complejos de acceso al sitio. El componente ACL, por ejemplo, podra permitir acceso a un usuario a reas publicas del sitio, mientras que concede a otro usuario acceso a porciones administrativas protegidas del sitio. El AuthComponent de CakePHP se puede usar para crear un sistema fcil y rpidamente. Veamos como construir un sistema de autenticacin simple. Al igual que todos los componentes, se utiliza mediante la incorporacin de 'Auth' a la lista de componentes en el controlador: 1. class FooController extends AppController { 2. var $components = array('Auth'); O aadelo al AppController si todos tus controladores lo van a usar: 1. class AppController extends Controller { 2. var $components = array('Auth'); Ahora, hay unas pocas convenciones en las que pensar cuando se usa el AuthComponent. Por defecto, el AuthComponent espera que se tenga una tabla llamada 'users' con campos llamados 'username' y 'password'. En algunos casos, las bases de datos no permiten usar 'password' como nombre de columna, mas tarde, veremos como cambiar el nombre por defecto de los campos para trabajar con nuestro propio entorno. Vamos a crear nuestra tabla 'users' usando el siguiente SQL: 1. 2. 3. 4. 5. 6. CREATE TABLE users ( id integer auto_increment, username char(50), password char(50), PRIMARY KEY (id) );

Algo a tener en cuenta a la hora de crear una tabla para almacenar todos los datos de autenticacin del usuario es que el AuthComponent espera el valor del password almacenado est encriptado en vez de estar almacenado en texto plano. Asegrese de que el campo que utilizar para almacenar la contrasea sea suficientemente largo para almacenar el hash (40 caracteres para SHA1, por ejemplo). Para la configuracin ms bsica usted solo tiene que crear dos acciones en el controlador: 1. class UsersController extends AppController { 2. var $name = 'Users'; 3. var $components = array('Auth'); //No es necesario si se declaro en el app controller

4. /** 5. * El AuthComponent proporciona la funcionalidad necesaria 6. * para el acceso (login), por lo que se puede dejar esta funcin en blanco. 7. */ 8. function login() { 9. } 10.function logout() { 11.$this->redirect($this->Auth->logout()); 12.} 13.} Si bien usted puede dejar la funcin login() en blanco, necesitara crear la vista para la accin login (guardela en app/views/users/login.ctp). Esta es la nica vista del UsersController que es necesario crear, sin embargo. El siguiente ejemplo asume que ya est familiarizado con el uso del Form helper: 1. 2. 3. 4. 5. 6. 7. <?php echo $session->flash('auth'); echo $form->create('User', array('action' => 'login')); echo $form->input('username'); echo $form->input('password'); echo $form->end('Login'); ?>

Esta vista crea un simple formulario de login en el cual introducir el nombre de usuario y la clave. Una vez enviado este formulario, el AuthComponent se encargar del resto por usted. El session flash message mostrara cualquier informacin generada por el AuthComponent. Lo creas o no, ya est! Esta es la manera de implementar una increiblemente simple, base de datos de autenticacin usando el componente Auth. Sin embargo, hay mucho ms que podemos hacer. Echemos un vistazo a algunos usos ms avanzados del componente.
5.2.1 Configurando las variables del componente Auth

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para cambiar las opciones predeterminadas de AuthComponent tienes que crear el mtodo beforeFilter() en el controlador, llamar a varios mtodos predefinidos, y configurar algunas variables del componente. Para cambiar el nombre del campo que se utiliza para guardar las contraseas, 'password', a 'secretword', por ejemplo, haramos lo siguiente:

1. 2. 3. 4. 5. 6. 7. 8. 9.

class UsersController extends AppController { var $components = array('Auth'); function beforeFilter() { $this->Auth->fields = array( 'username' => 'username', 'password' => 'secretword' ); } }

En este caso, no olvidemos que tambin hay que cambiar en la vista el nombre del campo! Las variables del componente Auth tambin se utilizan para que los usuarios que no han entrado en el sistema puedan acceder a determinados mtodos. Por ejemplo, si queremos que todos los usuarios puedan acceder solamente a los mtodos index y view, hacemos lo siguiente: 1. function beforeFilter() { 2. $this->Auth->allow('index','view'); 3. }
5.2.2 Mostrando Mensajes de Error en la Autentificacin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Con el objetivo de desplegar los mensajes de error que la Autentificacion muestra, necesitas aadir el siguiente codigo en tu vista. En este caso, el mensaje aparecer debajo de los mensajes flash regulares: 1. 2. 3. 4. 5. 6. 7. 8. <?php if ($session->check('Message.flash')) { $session->flash(); } if ($session->check('Message.auth')) { $session->flash('auth'); } ?>

5.2.3 Problemas comunes con Auth

Editar Ver slo esta seccin

Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones A veces puede ser difcil diagnosticar problemas cuando encuentras comportamientos inesperados. Recordar estos puntos te puede ayudar. Password hashing Al enviar informacin a travs de un formulario, el componente Auth encripta automticamente el contenido del campo contrasea, si tambin hay datos en el campo nombre de usuario. As que si ests intentando crear algn tipo de pgina de registro de nuevo usuario, asegrate de que el usuario rellene un campo "confirmar contrasea" que puedas comparar. Aqu va un cdigo de ejemplo: <?php function register() { if ($this->data) { if ($this->data['User']['password'] == $this->Auth>password($this->data['User']['password_confirm'])) { 5. $this->User->create(); 6. $this->User->save($this->data); 7. } 8. } 9. } 10.?> 1. 2. 3. 4. Loop Infinito Otro proplema que puede ocurir es un Loop infinito que termina por dar el siguiente Error en el navegador: 1. Error 310 (net::ERR_TOO_MANY_REDIRECTS): Demasiados redireccionamientos. Esto ocurre cuando por ejemplo tenemos un element que recibe datos de algn mtodo de un controlador, como la ejecucin de este mtodo requiere que se realice el login, se creara un Loop infinito que finalmente har que el Navegador rechace las redirecciones. Para solucionarlo debemos agregar : 1. function beforeFilter() { 2. $this->Auth->allow('listMenu'); 3. } Al controlador que este enviando datos al element a travs del mtodo (en este caso) listMenu.
5.2.3.1 Password Hashing

Traducir Ver slo esta seccin

Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The automatic hashing of your password input field happens only if posted data also contains username and password fields When posting information to an action via a form, the Auth component automatically hashes the contents of your password input field if posted data also contains username field. So, if you are trying to create some sort of registration page, make sure to have the user fill out a 'confirm password' field so that you can compare the two. Here's some sample code: <?php function register() { if ($this->data) { if ($this->data['User']['password'] == $this->Auth>password($this->data['User']['password_confirm'])) { 5. $this->User->create(); 6. $this->User->save($this->data); 7. } 8. } 9. } 10.?> 1. 2. 3. 4.
5.2.4 Cambiar la Funcin Hash

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones AuthComponent usa la clase Security para encriptar una contrasea. La clase Security usa el esquema SHA1 por defecto. Para cambiar a otra funcin hash usada por el componente Auth, usa el mtodo setHash pasndole md5, sha1 o sha256 como primer y nico parmetro. 1. Security::setHash('md5'); // o sha1 o sha256. La clase Security usa el valor de inicializacin (salt value, que se encuentras en /app/config/core.php) para el hashing de la contrasea. Si quieres usar una lgica diferente para el hashing de la contrasea ms all de md5/sha1 con el valor salt de la aplicacion, necesitar reescribir el mecanismo estandar hashPassword - podras necesitar hacer esto si, por ejemplo, tuvieses una base de datos existente que anteriormente usaba un esquema de hashing sin un valor de salt. Para hacer esto, crea el metodo hashPasswords en la clase que quieras que se haga a cargo del hashing de las contraseas (normalmente el modelo User ) y establece el

atributo authenticate de Auth al objeto contra el que se est autenticando (normalmente es User) de este modo: 1. 2. 3. 4. 5. function beforeFilter() { $this->Auth->authenticate = ClassRegistry::init('User'); ... parent::beforeFilter(); }

Con el cdigo anterior, el mtodo hashPasswords() del modelo User ser llamado cada vez que Cake llame a AuthComponent::hashPasswords(). Aqu est un ejemplo del mtodo hashPasswords, apropiado si ya tienes una tabla de usuarios repleta de contraseas de hash 'plain md5': 1. 2. 3. 4. 5. 6. 7. 8. 9. class User extends AppModel { function hasPasswords($data) { if (isset($data['User']['password'])) { $data['User']['password'] = md5($data['User']['password']); return $data; } return $data; } }

5.2.5 Mtodos de AuthComponent

Editar Ver slo esta seccin Historia Comparar con el contenido original

5.2.5.1 action

Editar Ver slo esta seccin Historia Comparar con el contenido original

action (string $action = ':controller/:action') Si estas usando ACOs como parte de tu estructura ACL, puedes obtener la ruta al nodo del ACO que est enlazado a un par controlador/accin particular. 1. $acoNode = $this->Auth->action('users/delete'); Si no le pasas valores, utilizar el par controlador/accin actual (el que se est ejecutando).
5.2.5.2 allow

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Si tienes acciones en tu controlador que no necesitas que se autentiquen contra ellas (como una accin de registro de usuarios), puedes agregar mtodos que debe ignorar AuthComponent. El siguiente ejemplo muestra como permitir una accin llamada 'register'. 1. 2. 3. 4. function beforeFilter() { ... $this->Auth->allow('register'); }

Si deseas permitir que mltiples acciones no usen autenticacin, las pasas como parmetros al mtodo allow(): 1. 2. 3. 4. 1. 2. 3. 4. function beforeFilter() { ... $this->Auth->allow('foo', 'bar', 'baz'); } function beforeFilter() { ... $this->Auth->allow('*'); }

Atajo: tambin puedes permitir todas las acciones en un controlador usando '*'.

Si ests usando requestAction en tu layout o en tus elementos, deberas permitir esas acciones para poder abrir la pgina de login correctamente. El componente auth supone que tus nombres de acciones siguen las convenciones y usan guiones bajos.
5.2.5.3 deny

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Habr algunas veces que quieras eliminar acciones de la lista de acciones permitidas (aadidas usando $this->Auth->allow()). He aqu un ejemplo: 1. function beforeFilter() { 2. $this->Auth->authorize = 'controller';

3. $this->Auth->allow('delete'); 4. } 5. function isAuthorized() { 6. if ($this->Auth->user('role') != 'admin') { 7. $this->Auth->deny('delete'); 8. } 9. ... 10.}


5.2.5.4 hashPasswords

Editar Ver slo esta seccin Historia Comparar con el contenido original

hashPasswords ($data) Este mtodo verifica si $data contiene los campos nombre de usuario(username) y contrasea(password), tal y como est especificado en la variable $fields indexados por el nombre del modelo especificado en $userModel. Si el array $data contiene el nombre de usuario y la contrasea, realiza el hash del campo contrasea en el array y devuelve el array $data con el mismo formato. Esta funcin debe ser usada antes de realizar llamadas de insercin o actualizacin de los datos del usuario cuando afecta al campo contrasea. 1. $data['User']['username'] = 'me@me.com'; 2. $data['User']['password'] = 'changeme'; 3. $hashedPasswords = $this->Auth->hashPasswords($data); 4. pr($hashedPasswords); 5. /* devuelve: 6. Array 7. ( 8. [User] => Array 9. ( 10.[username] => me@me.com 11.[password] => 8ed3b7e8ced419a679a7df93eff22fae 12.) 13.) 14.*/ En el campo $hashedPasswords['User']['password'] ahora debera ser realizado el 'hash' usando el mtodo password del componente. Si tu controlador usa el compoente Auth y los datos recibidos por POST contienen los campos explicados arriba, automticamente realizar el hash al campo contrasea usando esta funcin.
5.2.5.5 mapActions

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si ests utilizando Acl en modo CRUD, tal vez desees asignar ciertas acciones no predeterminadas a cada parte de CRUD. 1. 2. 3. 4. 5. 6. 7. 8. $this->Auth->mapActions( array( 'create' => array('ciertaAccion'), 'read' => array('ciertaAccion', 'ciertaAccion2'), 'update' => array('ciertaAccion'), 'delete' => array('ciertaAccion') ) );

5.2.5.6 login

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones login($data = null) Si ests haciendo algn tipo de login basada en Ajax, puedes usar este mtodo para identificar manualmente a alguien en el sistema. Si no pasas ningn valor para $data, automticamente usar los datos enviados mediante POST al controlador. Por ejemplo, en una aplicacin tal vez desees asignar a un usuario una contrasea y autoidentificarlo en el sistema tras el registro. En un ejemplo muy simplificado: Vista: 1. echo $form->create('User',array('action'=>'registrar')); 2. echo $form->input('username'); 3. echo $form->end('Regstrame'); Controlador: function registrar() { if(!empty($this->data)) { $this->User->create(); $contrasena_asignada = "ConTr4senna"; $this->data['User']['password'] = $contrasena_asignada; if($this->User->save($this->data)) { // enviar el email de registro conteniendo la contrasea al nuevo usuario 8. $this->Auth->login($this->data); 9. $this->redirect("inicio"); 10.} 1. 2. 3. 4. 5. 6. 7.

11.} Una cosa a remarcar es que has de redirigir manualmente al usuario tras el login ya que no se invoca loginRedirect(). $this->Auth->login($data) devuelve 1 tras un login exitoso, 0 en caso de fallo.
5.2.5.7 logout

Editar Ver slo esta seccin Historia Comparar con el contenido original

Provee de una manera rpida de 'deautenticar' a alguien y redirigirlo a donde necesite ir. Este mtodo tambin es til si deseas proporcionar un enlace 'Cerrar sesin' dentro de una seccin para usuarios registrados de tu aplicacin. Ejemplo: 1. $this->redirect($this->Auth->logout());
5.2.5.8 password

Editar Ver slo esta seccin Historia Comparar con el contenido original

password (string $password) Psale una cadena de texto, y obtendrs la contrasea 'hasheada'. Esta es una funcionalidad esencial si ests creando una pantala de registro de usuario donde los usuarios han de insertar sus contraseas una segunda vez para confirmarlas. if ($this->data['User']['password'] == $this->Auth->password($this>data['User']['password2'])) { // Las contraseas concuerdan, continuar procesando ... } else { $this>flash('Las contraseas introducidas no concuerdan', 'users/registrar'); } if ($this->data['User']['password'] == $this->Auth->password($this->data['User']['password2'])) { // Las contraseas concuerdan, continuar procesando ... } else { $this->flash('Las contraseas introducidas no concuerdan', 'users/registrar'); 7. } 1. 2. 3. 4. 5. 6. El componente Auth automticamente aplicar el hash al campo contrasea (password) si tambin est presente el campo nombre de usuario (username) en los datos recibidos en la peticin. Cake aade tu cadena contrasea a un valor salt y despus realiza el hash. La funcin de hash utilizada depende de la seleccionada por la clase utilidad del ncleo Security (sha1 por defecto). Puedes utilizar la funcin Security::setHash para cambiar el mtodo para calcular el hash. El valor salt es el indicado en la configuracin de tu aplicacin definido en tu core.php.

5.2.5.9 user

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones user(string $key = null) Este mtodo proporciona informacin sobre el usuario actualmente identificado. La informacin es tomada de la sesin. Por ejemplo: 1. if ($this->Auth->user('rol') == 'admin') { 2. $this->flash('Tienes acceso de administrador'); 3. } Tambin puede ser usado para obtener todos los datos de sesin del usuario as: 1. $data['User'] = $this->Auth->user(); Si este mtodo devuelve null es que el usuario no se ha identificado (logged in). En la vista puedes utilizar el helper Session para obtener la informacin del usuario actualmente autenticado: 1. $session->read('Auth.User'); // devuelve el registro completo del usuario 2. $session->read('Auth.User.nombre') //devuelve el valor particular de un campo La clave de la sesin puede ser diferente dependiendo de qu modelo se ha configurado para ser utilizado por Auth. P.e., si usas el modelo Cuenta en vez de User, entonces la clave de sesin sera Auth.Cuenta.
5.2.6 Atributos de AuthComponent

Editar Ver slo esta seccin Historia Comparar con el contenido original

Ahora hay varias variables relacionadas con Auth que tambin puedes utilizar. Normalmente aades esta configuracin en el mtodo beforeFilter() de tu controlador. Si necesitas aplicar dicha configuracin a todo el sitio, deberas aadirla a beforeFilter() de AppController.
5.2.6.1 userModel

Editar

Ver slo esta seccin Historia Comparar con el contenido original No deseas utilizar un modelo User contra el que autenticar? No hay problema. Simplemente cmbialo configurando este valor con el nombre del modelo que deseas usar. 1. <?php 2. $this->Auth->userModel = 'Miembro'; 3. ?>
5.2.6.2 fields

Editar Ver slo esta seccin Historia Comparar con el contenido original

Sobreescribe los campos de usuario y contrasea por defecto usados para la autenticacin. 1. <?php 2. $this->Auth->fields = array('username' => 'email', 'password' => 'passwd'); 3. ?>
5.2.6.3 userScope

Editar Ver slo esta seccin Historia Comparar con el contenido original

Utiliza esto para aadir requisitos adicionales para que la autenticacin sea exitosa. 1. <?php 2. $this->Auth->userScope = array('User.activo' => true); 3. ?>
5.2.6.4 loginAction

Editar Ver slo esta seccin Historia Comparar con el contenido original

Puedes cambiar el login por defecto de /users/login para que sea cualquier accin a tu eleccin. 1. <?php 2. $this->Auth->loginAction = array('admin' => false, 'controller'

=> 'miembros', 'action' => 'inicio_sesion'); 3. ?>


5.2.6.5 loginRedirect

Editar Ver slo esta seccin Historia Comparar con el contenido original

El componente AuthComponent recuerda qu par controlador/accin estabas tratando de ejecutar antes de que pedirte que te autenticaras, almacenando el valor en Session bajo la clave Auth.redirect. Sin embargo, si este valor de la sesin no est definido (si vienes de la pgina de login de un enlace externo, por ejemplo), entonces el usuario ser redirigido a la URL indicada en loginRedirect. Ejemplo: 1. <?php 2. $this->Auth->loginRedirect = array('controller' => 'miembros', 'action' => 'inicio'); 3. ?>
5.2.6.6 logoutRedirect

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones You can also specify where you want the user to go after they are logged out, with the default being the login action. 1. <?php 2. $this->Auth->logoutRedirect = array(Configure::read('Routing.admin') => false, 'controller' => 'members', 'action' => 'logout'); 3. ?>
5.2.6.7 loginError

Editar Ver slo esta seccin Historia Comparar con el contenido original

Cambia el mensaje de error por defecto que se mostrar, cuando el login no sea exitoso. 1. <?php

2. $this->Auth->loginError = "No, you fool! That's not the right password!"; 3. ?>
5.2.6.8 authError

Editar Ver slo esta seccin Historia Comparar con el contenido original

Cambia el mensaje de error por defecto que ser mostrado, cuando intenten acceder a un objeto o a una accin a la que no autorizada. 1. <?php 2. $this->Auth->authError = "Sorry, you are lacking access."; 3. ?>
5.2.6.9 autoRedirect

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Normally, the AuthComponent will automatically redirect you as soon as it authenticates. Sometimes you want to do some more checking before you redirect users: <?php function beforeFilter() { ... $this->Auth->autoRedirect = false; } ... function login() { //-- code inside this function will execute only when autoRedirect was set to false (i.e. in a beforeFilter). 9. if ($this->Auth->user()) { 10.if (!empty($this->data['User']['remember_me'])) { 11.$cookie = array(); 12.$cookie['username'] = $this->data['User']['username']; 13.$cookie['password'] = $this->data['User']['password']; 14.$this->Cookie->write('Auth.User', $cookie, true, '+2 weeks'); 15.unset($this->data['User']['remember_me']); 16.} 17.$this->redirect($this->Auth->redirect()); 18.} 19.if (empty($this->data)) { 20.$cookie = $this->Cookie->read('Auth.User'); 1. 2. 3. 4. 5. 6. 7. 8.

21.if (!is_null($cookie)) { 22.if ($this->Auth->login($cookie)) { 23.// Clear auth message, just in case we use it. 24.$this->Session->delete('Message.auth'); 25.$this->redirect($this->Auth->redirect()); 26.} 27.} 28.} 29.} 30.?> The code in the login function will not execute unless you set $autoRedirect to false in a beforeFilter. The code present in the login function will only execute after authentication was attempted. This is the best place to determine whether or not a successful login occurred by the AuthComponent (should you desire to log the last successful login timestamp, etc.). With autoRedirect set to false, you can also inject additional code such as keeping track of the last successful login timestamp 1. 2. 3. 4. 5. 6. 7. 8. 9. <?php function login() { if( !(empty($this->data)) && $this->Auth->user() ){ $this->User->id = $this->Auth->user('id'); $this->User->saveField('last_login', date('Y-m-d H:i:s') ); $this->redirect($this->Auth->redirect()); } } ?>

5.2.6.10 authorize

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Normally, the AuthComponent will attempt to verify that the login credentials you've entered are accurate by comparing them to what's been stored in your user model. However, there are times where you might want to do some additional work in determining proper credentials. By setting this variable to one of several different values, you can do different things. Here are some of the more common ones you might want to use. 1. <?php 2. $this->Auth->authorize = 'controller'; 3. ?>

When authorize is set to 'controller', you'll need to add a method called isAuthorized() to your controller. This method allows you to do some more authentication checks and then return either true or false. 1. <?php 2. function isAuthorized() { 3. if ($this->action == 'delete') { 4. if ($this->Auth->user('role') == 'admin') { 5. return true; 6. } else { 7. return false; 8. } 9. } 10.return true; 11.} 12.?> Remember that this method will be checked after you have already passed the basic authentication check against the user model. 1. <?php 2. $this->Auth->authorize = array('model'=>'User'); 3. ?> Don't want to add anything to your controller and might be using ACO's? You can get the AuthComponent to call a method in your user model called isAuthorized() to do the same sort of thing: 1. <?php 2. class User extends AppModel { 3. ... 4. function isAuthorized($user, $controller, $action) { 5. switch ($action) { 6. case 'default': 7. return false; 8. break; 9. case 'delete': 10.if ($user['User']['role'] == 'admin') { 11.return true; 12.} 13.break; 14.} 15.} 16.} 17.?> Lastly, you can use authorize with actions such as below 1. <?php 2. $this->Auth->authorize = 'actions'; 3. ?>

By using actions, Auth will make use of ACL and check with AclComponent::check(). An isAuthorized function is not needed. 1. <?php 2. $this->Auth->authorize = 'crud'; 3. ?> By using crud, Auth will make use of ACL and check with AclComponent::check(). Actions should be mapped to CRUD (see mapActions).
5.2.6.11 sessionKey

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Name of the session array key where the record of the current authed user is stored. Defaults to "Auth", so if unspecified, the record is stored in "Auth. {$userModel name}". 1. <?php 2. $this->Auth->sessionKey = 'Authorized'; 3. ?>
5.2.6.12 ajaxLogin

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si ests haciendo solicitudes basadas en Ajax o Javascript que requieren sesiones autenticadas, establece en esta variable el nombre del elemento vista que deseas mostrar y retornar cuando la sesin es invlida o ha expirado. Como con cualquier parte de CakePHP, asegrate de revisar la clase AuthComponent para mayores detalles.
5.2.6.13 authenticate

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones This variable holds a reference to the object responsible for hashing

passwords if it is necessary to change/override the default password hashing mechanism. See Changing the Encryption Type for more info.
5.2.6.14 actionPath

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If using action-based access control, this defines how the paths to action ACO nodes is computed. If, for example, all controller nodes are nested under an ACO node named 'Controllers', $actionPath should be set to 'Controllers/'.
5.2.6.15 flashElement

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones In case you want to have another layout for your Authentication error message you can define with the flashElement variable that another element will be used for display. 1. <?php 2. $this->Auth->flashElement = "message_error"; 3. ?> In this newly defined element to ensure your authError and loginError messages are displayed ensure you echo $message. Here's an example: 1. 2. 3. 4. // Code in /app/views/elements/message_error.ctp <div class="ui-state-error"> <?php echo $message; ?> </div>

Now authError & loginError messages will be displayed using jQuery UI's custom theme. Obviously, you can change the HTML element to fit whatever need you have. The important thing here being that the $message variable was echo'd and the user will see the appropriate information...instead of a blank div.
5.2.7 allowedActions

Traducir Ver slo esta seccin Historia

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Set the default allowed actions to allow if setting the component to 'authorize' => 'controller' 1. 2. 3. 4. 5. 6. var $components = array( 'Auth' => array( 'authorize' => 'controller', 'allowedActions' => array('index','view','display'); ) );

index, view, and display actions are now allowed by default. 5.3 Cookies Editar Ver slo esta seccin Historia Comparar con el contenido original

El componente Cookie es una abstraccin para acceder al mtodo nativo de PHP setcookie(). Tambin incluye una serie de funcionalidades muy tiles para agilizar la escritura de cookies. Antes de tratar de utilizar el componente Cookie, debe asegurarse que se encuentra habilitado en el arreglo $components: si est habilitado uno de los elementos del arreglo debe ser 'Cookie'
5.3.1 Configuracin del Controlador

Editar Ver slo esta seccin Historia Comparar con el contenido original

Hay una serie de variables que se configuran en el controlador, y te permiten modificar la forma en que las cookies son creadas y gestionadas. Estas variables especiales generalmente se setean en el mtodo beforeFilter() de tu controlador. Variable por defecto descripcin Cookie string 'CakeCookie' El nombre de la cookie. $name Esta cadena es utilizada para encriptar el valor escrito en la cookie. La string $key null cadena debera ser aleatoria y difcil de adivinar. string El nombre de dominio habilitado para acceder a la cookie, ej. Use '' $domain '.tudominio.com' para permitir acceso desde todos los subdominios. int o string '5 Days' El tiempo en que expirar la cookie. Los enteros son interpretados como $time segundos, y un valor 0 es equivalente a 'cookie de sesin', es decir, la cookie

expira cuando se cierra el navegador. Si el valor es una cadena, ser interpretada con la funcin de PHP strtotime(). Puedes configurar esto directamente dentro del mtodo de escritura write(). La ruta del servidor donde la cookie ser aplicada. Si $cookiePath est seteada a '/foo/', la cookie estar disponible slo dentro del directorio /foo/ y string '/' todos los subdirectorios (como por ejemplo /foo/bar/) de tu dominio. La $path opcin por defecto es en todo el dominio. Puedes configurar esto directamente dentro del mtodo de escritura write(). Indica que la cookie deber ser transmitida nicamente por una conexin boolean segura HTTPS. Cuando este valor sea true, la cookie ser creada slo si false $secure existe una conexin segura. Puedes configurar esto directamente dentro del mtodo de escritura write() El siguiente recorte del cdigo de un controlador muestra cmo incluir el componente Cookie y cmo configurar las variables necesarias para enviar una cookie llamada 'baker_id' para el dominio 'example.com' que a su vez necesita una conexin segura, debe estar disponible para la ruta /bakers/preferencias/, y expira en una hora. var $components = array('Cookie'); function beforeFilter() { $this->Cookie->name = 'baker_id'; $this->Cookie->time = 3600; // o '1 hour' $this->Cookie->path = '/bakers/preferencias/'; $this->Cookie->domain = 'example.com'; $this->Cookie->secure = true; //enviar slo por una conexin segura HTTPS 8. $this->Cookie->key = 'qSI232qs*&sXOw!'; 9. } 1. 2. 3. 4. 5. 6. 7. A continuacin, veremos cmo utilizar los diferentes mtodos del componente Cookie.
5.3.2 Utilizando el Componente

Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta seccin resume los mtodos del componente Cookie. write(mixed $key, mixed $value, boolean $encrypt, mixed $expires) El mtodo write() es el corazn del componente, $key es la variable que se quiere guardar en la cookie y $value es el dato para almacenar. 1. $this->Cookie->write('nombre','Pepito'); Tambin puedes agrupar variables utilizando la notacin de 'punto' en el parmetro $key.

1. $this->Cookie->write('Usuario.nombre', 'Pepito'); 2. $this->Cookie->write('Usuario.rol','Lider'); Si deseas escribir ms de un valor a la vez en la cookie, puedes pasar un arreglo: 1. $this->Cookie->write( 2. array('nombre'=>'Pepito','rol'=>'Lider') 3. ); 4. Todos los valores de las cookis son encriptados por defecto. Si desea almacenar valores en texto puro, cambie el tecer parmetro del mtodo write() a false. 1. $this->Cookie->write('nombre','Pepito',false); El ltimo parmetro del mtodo es $expires: el nmero de segundos antes de que la cookie expire. Por convenienia, este parmetro puede ser pasado como una cadena que entienda la funcin strtotime() de PHP: 1. //Ambas cookies expiran en una hora. 2. $this->Cookie->write('nombre','Pepito',false, 3600); 3. $this->Cookie->write('Apellido','Gonzales',false, '1 hour'); read(mixed $key) Este mtodo es utilizado para leer el valor de una variable almacenada en una cookie. La variable a leer debe ser especificada en el parmetro $key. 1. 2. 3. 4. 5. 6. 7. 8. //Muestra Pepito echo $this->Cookie->read('name'); //Tambin se puede utilizar la notacin de 'punto' para leer echo $this->Cookie->read('Usuario.nombre'); //Para obtener las variables que has agrupado utilizando //la notacin de 'punto' como un arreglo debes usar $this->Cookie->read('Usuario'); //esto devuelve un arreglo similar a array('nombre' => 'Pepito', 'rol'=>'Lider')

del(mixed $key) Borra el contenido de la variable $key almacenada en una cookie. Tambin funciona con la notacin de 'punto'. 1. 2. 3. 4. //Borrar una variable $this->Cookie->del('bar') //Borrar la variable bar, pero no todas las contenidas en foo $this->Cookie->del('foo.bar')

destroy() Destruye la cookie actual.

5.4 Email Editar Ver slo esta seccin Historia Comparar con el contenido original

El componente Email es una manera simple de agregarle a tu aplicacin CakePHP la funcionalidad de envo de mails, usando los mismos conceptos de layouts, vistas, archivos .ctp, etc, formateados como texto, html, o ambos. Puede enviar mails por medio de las funciones propias de PHP, va servidor SMTP o en modo DEBUG en el que escribe el mensaje en un mensaje flash de sesin. Tambin soporta archivos adjuntados y inclusin/filtrado simple de encabezados. Hay un montn de cosas que no hace por t, pero te pondr en movimiento.
5.4.1 Atributos y Variables de la clase

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Estos son los valores que puedes configurar antes de hacer la llamada EmailComponent::send() direccin a la que se dirige el mensaje (string) arreglo de direcciones a enviar copias del mensaje (CC) arreglo de direcciones a enviar las copias ocultas del mensaje (CCO) direccin de respuesta(string) direccin remitente (string) asunto del mensaje (string) Elemento email a usar para el mensaje(ubicado en template app/views/elements/email/html/ y en app/views/elements/email/text/) Layout usado por el mail (ubicado en app/views/layouts/email/html/ y en layout app/views/layouts/email/text/) lineLength Longitud (en caracteres) en la que corta las lneas largas. Por defecto es 70. (integer) Como quieres mandar el mensaje: text(texto), html(cdigo HTML) o both(ambos). sendAs attachments Arreglo de archivos a enviar (rutas absolutas y relativas) delivery Como enviar el mensaje (mail, smtp [requerir el campo smtpOptions explicado to cc bcc replyTo from subject

abajo] y debug) Arreglo asociativo de opciones para el envo por SMTP. (port(puerto), smtpOptions host(servidor), timeout(tiempo de espera), username(nombre de usuario), password(contrasea)) Hay algunas opciones ms para configurar, para mayor informacin consulta la documentacin de CakePHP.
5.4.1.1 Envo mltiple de emails en bucle

Editar Ver slo esta seccin Historia Comparar con el contenido original

Si lo que quieres es enviar varios emails usando un bucle, debers resetear los campos de mails usando el mtodo reset() del componente Email. Necesitars resetearlo antes de setear nuevamente las propiedades del email. 1. $this->Email->reset()
5.4.1.2 Debugging Emails

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If you do not want to actually send an email and instead want to test out the functionality, you can use the following delivery option: 1. $this->Email->delivery = 'debug'; In order to view those debugging information you need to create an extra line in your view or layout file (e.g. underneath your normal flash message in /layouts/default.ctp): 1. <?php echo $this->Session->flash(); ?> 2. <?php echo $this->Session->flash('email'); ?>
5.4.2 Envo de un mensaje simple

Editar Ver slo esta seccin Historia Comparar con el contenido original

Para enviar un mensaje sin usar ningn template, slo pasa el cuerpo del mensaje como una cadena (string) o un arreglo de lneas al mtodo send(). Por ejemplo: 1. $this->Email->from = 'Alguien <alguien@ejemplo.com>';

2. $this->Email->to = 'Alguien ms <alguien.mas@ejemplo.com>'; 3. $this->Email->subject = 'Prueba'; 4. $this->Email->send('Hola cuerpo de mensaje!!!');


5.4.2.1 Configurando el Layout

Editar Ver slo esta seccin Historia Comparar con el contenido original

Para usar tanto texto como html en el email necesitars crear los archivos de layout para ellos. Tal como lo hayas hecho para tu layout default para las vistas en un navegador, precisas establecer los layouts default para tus emails. En la carpeta app/views/layouts/ precisas tener (como mnimo) esta estructura 1. 2. 3. 4. 5. email/ html/ default.ctp text/ default.ctp

Estos son los archivos que conservan los valores por defecto para los templates de layout para tus mensajes. Un simple ejemplo de contenido: email/text/default.ctp 1. <?php echo $content_for_layout; ?> email/html/default.ctp 1. 2. 3. 4. 5. 6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <body> <?php echo $content_for_layout; ?> </body> </html>

5.4.2.2 Configurar un elemento Email para el cuerpo del mensaje

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones

En el directorio app/views/elements/email/ debes configurar carpetas para text(mails modo texto) y html(mails modo HTML) a menos que quieras usar slo uno de ellos. En cada una de estas carpetas debes crear templates para poder utilizar con el contenido que le enves a la vista ya sea usando $this->set() o usando el parmetro $contents del mtodo send(). Algunos ejemplos simples a continuacin, usando el template simple_message.ctp text 1. Estimado <?php echo $User['first']. ' ' . $User['last'] ?>, 2. Gracias por su inters. html 1. <p>Estimado <?php echo $User['first']. ' ' . $User['last'] ? >,<br /> 2. &nbsp;&nbsp;&nbsp;Gracias por su inters.</p>
5.4.2.3 Controlador

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones En tu controlador necesitas agregar el componente a tu array $components o agregar un array $components a tu controlador de la forma: 1. <?php 2. var $components = array('Email'); 3. ?> En este ejemplo configuraremos un mtodo privado para manejar el envo de mensajes de email a un usuario identificado por un $id. En nuestro controlador (usemos el controlador User en este ejemplo): <?php function _sendNewUserMail($id) { $User = $this->User->read(null,$id); $this->Email->to = $User['User']['email']; $this->Email->bcc = array('secreto@ejemplo.com'); $this->Email->subject = 'Bienvenido a nuestra cosa genial'; $this->Email->replyTo = 'support@ejemplo.com'; $this->Email->from = 'Cool Web App <app@ejemplo.com>'; $this->Email->template = 'simple_message'; // NOTAR QUE NO HAY '.ctp' 10.//Enviar como 'html', 'text' or 'both' (ambos) - (por defecto es 'text') 1. 2. 3. 4. 5. 6. 7. 8. 9.

11.$this->Email->sendAs = 'both'; // queremos enviar un lindo email 12.//Variables de la vista 13.$this->set('User', $User); 14.//NO PASAMOS ARGUMENTOS A SEND() 15.$this->Email->send(); 16.} 17.?> Has enviado un mensaje, podras llamarlo desde otro mtodo de esta forma: 1. $this->_sendNewUserMail( $this->User->id );
5.4.2.4 Attachments

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Here's how you can send file attachments along with your message. You set an array containing the paths to the files to attach to the attachments property of the component. 1. 2. 3. 4. $this->Email->attachments = array( TMP . 'foo.doc', 'bar.doc' => TMP . 'some-temp-name' );

The first file foo.doc will be attached with the same filename. For the second file we specify an alias bar.doc will be be used for attaching instead of its actual filename some-temp-name
5.4.3 Enviar un mail por SMTP

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para enviar un mail usando servidor SMTP, los pasos a seguir son similares a los del mensaje bsico. Configurar el mtodo de entrega (delivery) a smtp y asignar las opciones a las propiedades del objeto de Email smtpOptions. Tambin puedes obtener los errores SMTP generados durante la sesin leyendo la propiedad smtpError del componente. 1. /* Opciones SMTP*/ 2. $this->Email->smtpOptions = array( 3. 'port'=>'25',

4. 'timeout'=>'30', 5. 'host' => 'tu.servidor.smtp', 6. 'username'=>'tu_nombre_usuario_smtp', 7. 'password'=>'tu_contrasea_smtp'); 8. /* Configurar mtodo de entrega */ 9. $this->Email->delivery = 'smtp'; 10./* No le pases ningn argumento a send() */ 11.$this->Email->send(); 12./* Chequeo de errores SMTP. */ 13.$this->set('smtp-errors', $this->Email->smtpError); Si tu servidor SMTP requiere autenticacin, asegrate de especificar los parmetros de nombre de usuario y contrasea en smtpOptions como se ve en el ejemplo. 5.5 Request Handling Editar Ver slo esta seccin Historia Comparar con el contenido original

El componente Request Handler (manejador de la peticin) es usado en CakePHP para obtener informacin adicional sobre las peticiones HTTP que son realizadas a tus aplicaciones. Puedes usarlo para informar a tus controladores sobre Ajax, como tambin para obtener informacin adicional sobre tipos de contenido que el cliente acepta y cambiar automticamente al layout apropiado cuando estn activadas las extensiones de ficheros. Por defecto, RequestHandler detectar automticamente las peticiones Ajax basadas en la cabecera HTTP-X-Requested-With que utilizan muchas libreras javascript. Cuando se utiliza junto con Router::parseExtensions(), RequestHandler cambiar automticamente los ficheros de layout y vista a aquellos que coincidan con el tipo pedido. Adems, si existe un helper con el mismo nombre que la extensin pedida, se aadir al array de helpers del controlador. Finalmente, si son "POSTeados" datos XML a tus controladores, se parsearn en un objecto XML que se asigna a Controller::data, y que puede entonces ser salvado como datos de modelo. Para poder hacer uso de Request handler, debe ser includo en tu array $components. 1. 2. 3. 4. 5. 6. <?php class WidgetController extends AppController { var $components = array('RequestHandler'); //resto del controlador } ?>

5.5.1 Obtaining Request Information

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

Request Handler has several methods that provide information about the client and its request. accepts ( $type = null) $type can be a string, or an array, or null. If a string, accepts will return true if the client accepts the content type. If an array is specified, accepts return true if any one of the content types is accepted by the client. If null returns an array of the content-types that the client accepts. For example: class PostsController extends AppController { var $components = array('RequestHandler'); function beforeFilter () { if ($this->RequestHandler->accepts('html')) { // Execute code only if client accepts an HTML (text/html) response 6. } elseif ($this->RequestHandler->accepts('xml')) { 7. // Execute XML-only code 8. } 9. if ($this->RequestHandler->accepts(array('xml', 'rss', 'atom'))) { 10.// Executes if the client accepts any of the above: XML, RSS or Atom 11.} 12.} 13.} 1. 2. 3. 4. 5. Other request 'type' detection methods include: isAjax() Returns true if the request contains the X-Requested-Header equal to XMLHttpRequest. isSSL() Returns true if the current request was made over an SSL connection. isXml() Returns true if the current request accepts XML as a response. isRss() Returns true if the current request accepts RSS as a response. isAtom() Returns true if the current call accepts an Atom response, false otherwise. isMobile() Returns true if user agent string matches a mobile web browser, or if the client accepts WAP content. The supported Mobile User Agent strings are: iPhone MIDP AvantGo BlackBerry J2ME

Opera Mini DoCoMo NetFront Nokia PalmOS PalmSource portalmmm Plucker ReqwirelessWeb SonyEricsson Symbian UP.Browser Windows CE Xiino

isWap() Returns true if the client accepts WAP content. All of the above request detection methods can be used in a similar fashion to filter functionality intended for specific content types. For example when responding to Ajax requests, you often will want to disable browser caching, and change the debug level. However, you want to allow caching for nonajax requests. The following would accomplish that: 1. 2. 3. 4. 5. 6. 7. 1. 2. 3. 4. if ($this->RequestHandler->isAjax()) { Configure::write('debug', 0); $this->header('Pragma: no-cache'); $this->header('Cache-control: no-cache'); $this->header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); } //Continue Controller action if ($this->RequestHandler->isAjax()) { $this->disableCache(); } //Continue Controller action

You could also disable caching with the functionally analogous Controller::disableCache

5.5.2 Deteccin del tipo de peticin

Editar Ver slo esta seccin Historia Comparar con el contenido original

RequestHandler tambin proporciona informacin sobre qu tipo de peticin HTTP se ha hecho y lo que le permite responder a cada tipo de solicitud. isPost() Devuelve true si la solicitud es una peticin POST.

isPut() Devuelve true si la solicitud es una peticin PUT. isGet() Devuelve true si la solicitud es una peticin GET. isDelete() Devuelve true si la solicitud es una peticin DELETE.
5.5.3 Obtaining Additional Client Information

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones getClientIP() Get the remote client IP address getReferer() Returns the domain name from which the request originated getAjaxVersion() Gets Prototype version if call is Ajax, otherwise empty string. The Prototype library sets a special "Prototype version" HTTP header.
5.5.4 Responding To Requests

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones In addition to request detection RequestHandler also provides easy access to altering the output and content type mappings for your application. setContent($name, $type = null) $name string - The name or file extension of the Content-type ie. html, css, json, xml. $type mixed - The mime-type(s) that the Content-type maps to. setContent adds/sets the Content-types for the given name. Allows content-types to be mapped to friendly aliases and or extensions. This allows RequestHandler to automatically respond to requests of each type in its startup method. If you are using Router::parseExtension, you should use the file extension as the name of the Content-type. Furthermore, these content types are used by prefers() and accepts(). setContent is best used in the beforeFilter() of your controllers, as this will best leverage the automagicness of content-type aliases.

The default mappings are: javascript text/javascript js text/javascript json application/json css text/css html text/html, */* text text/plain txt text/plain csv application/vnd.ms-excel, text/plain form application/x-www-form-urlencoded file multipart/form-data xhtml application/xhtml+xml, application/xhtml, text/xhtml xhtml-mobile application/vnd.wap.xhtml+xml xml application/xml, text/xml rss application/rss+xml atom application/atom+xml amf application/x-amf wap text/vnd.wap.wml, text/vnd.wap.wmlscript, image/vnd.wap.wbmp wml text/vnd.wap.wml wmlscript text/vnd.wap.wmlscript wbmp image/vnd.wap.wbmp pdf application/pdf zip application/x-zip tar application/x-tar

prefers($type = null) Determines which content-types the client prefers. If no parameter is given the most likely content type is returned. If $type is an array the first type the client accepts will be returned. Preference is determined primarily by the file extension parsed by Router if one has been provided, and secondly by the list of content-types in HTTP_ACCEPT. renderAs($controller, $type) $controller - Controller Reference $type - friendly content type name to render content for ex. xml, rss. Change the render mode of a controller to the specified type. Will also append the appropriate helper to the controller's helper array if available and not already in the array. respondAs($type, $options) $type - Friendly content type name ex. xml, rss or a full content type like application/xshockwave $options - If $type is a friendly type name that has more than one content association, $index is used to select the content type. Sets the response header based on content-type map names. If DEBUG is greater than 1, the header is not set. responseType()

Returns the current response type Content-type header or null if one has yet to be set. mapType($ctype) Maps a content-type back to an alias 5.6 El Componente Security Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El componente Security provee una forma fcil de aumentar la seguridad en tu aplicacin. Con el componente Security se puede crear una intefaz para manejar autenticaciones HTTP. Se configura en el mtodo beforeFilter() de tus controladores, y tiene distintos parmetros para ajustar. Todas esas propiedades pueden configurarse directamente con los mtodos creados para tal fin, y que se llaman de la misma manera.
5.6.1 Configuracin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones $blackHoleCallback Un callback del controlador que se encargar de manejar las peticiones que hayan sido enviadas al "agujero negro". $requirePost Una lista de acciones del controlador que requieren una peticin POST para ejecutarse. Un arreglo de acciones del controlador o '*' para forzar que todas las acciones requieran POST. $requireSecure Lista de acciones que requieren una conexin SSL para ejecutarse. Un arreglo de acciones del controlador o '*' para forzar que todas las acciones requieran una conexin SSL. $requireAuth Una lista de acciones que requieren una clave de autenticacin vlida. Esta clave es configurada por el componente Security.

$requireLogin Una lista de acciones que requieren autenticacin HTTP (basic o diges). Tambin acepta '*' indicando que todas las acciones del controlador requieren autenticacin HTTP. $loginOptions Opciones para la autenticacin HTTP. Permite definir que tipo de autenticacin utilizar, y los callbacks del controlador para el proceso de autenticacin. $loginUsers Un arreglo asociativo de usuarios => passords que sonusados para autenticaciones HTTP. Si ests utilizando autenticacion digest, los passwords deben ser encryptados con el algoritmo MD5. $allowedControllers Una lista de controladores desde los cuales la accin del controlador actual puede recibir peticiones. Tambin puede utilizarse para peticiones entre controladores. $allowedActions Una lista de acciones desde las cuales las acciones del controlador actual pueden para recibir peticiones. Tambin puede utilizarse para peticiones entre controladores. $disabledFields Campos del formulario que se necesitan deshabilitar para una peticin dada.
5.6.2 Mtodos

Editar Ver slo esta seccin Historia Comparar con el contenido original

5.6.2.1 requirePost()

Editar Ver slo esta seccin Historia Comparar con el contenido original

Define las acciones que requieren una peticin POST. Acepta cualquier nmero de argumentos. Puede ser llamado sin argumentos para forzar a que todas las acciones requieran una peticin POST.
5.6.2.2 requireSecure()

Editar Ver slo esta seccin Historia Comparar con el contenido original

Define las acciones que requieren una conexin SSL presente. Acepta cualquier cantidad de argumentos. Puede ser llamado sin argumentos para forzar que todas las acciones requieran una conexin SSL.
5.6.2.3 requireAuth()

Editar Ver slo esta seccin

Historia Comparar con el contenido original Define las acciones que requieren un token vlido generado por el componente Security. Acepta cualquier nmero de argumentos. Puede ser llamado sin argumentos para forzar que todas las acciones requieran una autenticacin vlida.
5.6.2.4 requireLogin()

Editar Ver slo esta seccin Historia Comparar con el contenido original

Define las acciones que requieren una autenticacin HTTP vlida. Acepta cualquier nmero de argumentos. Puede ser llamada sin argumentos para forzar que todas las acciones requieran una autenticacin HTTP vlida.
5.6.2.5 loginCredentials(string $type)

Editar Ver slo esta seccin Historia Comparar con el contenido original

Trata de validar las credenciales para una peticin de autenticacin HTTP. $type es el tipo de autenticacin que se desea verificar. Puede ser 'basic', o 'digest'. Si se deja como null o vaci, tratar de verificar las dos. Devuelve un arreglo con el nombre de usuario y el password si tuvo xtito.
5.6.2.6 loginRequest(array $options)

Editar Ver slo esta seccin Historia Comparar con el contenido original

Genera el texto de la cabecera para una peticin de autenticacin HTTP desde un array $options. $options contiene normalmente las variables 'type', 'realm' . Type indica el mtodo de autenticacin HTTP a usar. Realm ajusta al entorno HTTP actual del servidor.
5.6.2.7 parseDigestAuthData(string $digest)

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Parse an HTTP digest authentication request. Returns and array of digest data as an associative array if succesful, and null on failure.

5.6.2.8 generateDigestResponseHash(array $data)

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Creates a hash that to be compared with an HTTP digest-authenticated response. $data should be an array created by SecurityComponent::parseDigestAuthData().
5.6.2.9 blackHole(object $controller, string $error)

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Black-hole an invalid request with a 404 error or a custom callback. With no callback, the request will be exited. If a controller callback is set to SecurityComponent::blackHoleCallback, it will be called and passed any error information.
5.6.3 Uso

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones EL uso del componente security generalmente se hace en el mtodo beforeFilter() del controlador. Usted especifica las restricciones de seguridad que desee y el componente Security las hara cumplir en el arranque. 1. 2. 3. 4. 5. 6. 7. 8. <?php class WidgetController extends AppController { var $components = array('Security'); function beforeFilter() { $this->Security->requirePost('delete'); } } ?>

En este ejemplo la accion delete solo puede ser lanzada satisfactoriamente si se recive una solicitud POST.

1. <?php 2. class WidgetController extends AppController { 3. var $components = array('Security'); 4. function beforeFilter() { 5. if(isset($this->params[Configure::read('Routing.admin')])){ 6. $this->Security->requireSecure(); 7. } 8. } 9. } 10.?> Este ejemplo forzara todas las acciones que tengan enrrutamiento admin a requerir peticiones seguras del SSL.
5.6.4 Basic HTTP Authentication

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The SecurityComponent has some very powerful authentication features. Sometimes you may need to protect some functionality inside your application using HTTP Basic Authentication. One common usage for HTTP Auth is protecting a REST or SOAP API. This type of authentication is called basic for a reason. Unless you're transferring information over SSL, credentials will be transferred in plain text. Using the SecurityComponent for HTTP authentication is easy. The code example below includes the SecurityComponent and adds a few lines of code inside the controller's beforeFilter method. 1. class ApiController extends AppController { 2. var $name = 'Api'; 3. var $uses = array(); 4. var $components = array('Security'); 5. function beforeFilter() { 6. $this->Security->loginOptions = array( 7. 'type'=>'basic', 8. 'realm'=>'MyRealm' 9. ); 10.$this->Security->loginUsers = array( 11.'john'=>'johnspassword', 12.'jane'=>'janespassword' 13.); 14.$this->Security->requireLogin(); 15.} 16.function index() { 17.//protected application logic goes here... 18.} 19.}

The loginOptions property of the SecurityComponent is an associative array specifying how logins should be handled. You only need to specify the type as basic to get going. Specify the realm if you want display a nice message to anyone trying to login or if you have several authenticated sections (= realms) of your application you want to keep separate. The loginUsers property of the SecurityComponent is an associative array containing users and passwords that should have access to this realm. The examples here use hard-coded user information, but you'll probably want to use a model to make your authentication credentials more manageable. Finally, requireLogin() tells SecurityComponent that this Controller requires login. As with requirePost(), above, providing method names will protect those methods while keeping others open. 5.7 Sesiones Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El componente Session de CakePHP provee una forma de persistir datos entre las peticiones de las pginas. Acta como una abstraccin para acceder a las variables $_SESSION, y a su vez, agrega distintos mtodos tiles relacionados con este arreglo. Las sesiones pueden persistirse de diferentes maneras. Por defecto se utilizan los mtodos provistos por PHP; sin embargo, existen otras opciones: cake Guarda los archivos de la sesin en el directorio temporal de tu aplicacin tmp/sessions. database Guarda la informacin dentro de la base de datos. php La opcin por defecto. Guarda la informacin como se indica en php.ini Para cambiar el mtodo por defecto de gestin de sesiones, debes modificar el parmetro de configuracin Session.save para reflejar la opcin deseada. Si eliges 'database', tambin deberas descomentar el parmetro Session.database y ejecutar el archivo SQL perteneciente a la sesin localizado en app/config En views/elements la sesin puede ser accedida por medio del helper Session
5.7.1 Mtodos

Editar Ver slo esta seccin Historia Comparar con el contenido original

El componente Session es usado para interactuar con la informacin de la sesin. Incluye operaciones bsicas de ABM (Alta, Baja y Modificacin) como tambin opciones para comunicarse con los usuarios. Debe notarse que se pueden crear estructuras de arreglos en las sesiones utilizando la notacin de 'punto'. De esta forma, Usuario.email equivaldr a: 1. array('Usuario' => 2. array('email' => 'clarkKent@dailyplanet.com') 3. ); Los puntos son usados para indicar arreglos anidados.
5.7.1.1 write

Editar Ver slo esta seccin Historia Comparar con el contenido original

write($name, $value) Guarda en la sesin una variable llamada $name con el valor $value. $name puede utilizar la notacin de 'punto'. Por ejemplo: 1. $this->Session->write('Persona.colorOjos', 'Verde'); Escribe el valor 'Verde' en la sesin, dentro de Persona => colorOjos.
5.7.1.2 setFlash

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones setFlash($message, $layout = 'default', $params = array(), $key = 'flash') Se utiliza para guardar una variable de sesin que puede ser mostrada en la vista. $layout permite controlar qu layout (ubicado en /app/views/layouts) se utilizar para mostrar el mensaje. Si la variable $layout queda configurada con su valor por defecto, 'default', el mensaje se mostrar como se ve a continuacin: 1. <div id="flashMessage" class="message"> [message] </div> $params permite pasar variables adicionales para mostrar en el layout. $key es utilizado para modificar el ndice del arreglo $message en el arreglo de mensajes (por defecto es 'flash'). $message es el texto que se quiere cargar en la sesin.

Los parmetros puede afectar el div que se muestre, por ejemplo pasando un parmetro 'class' en el arreglo $params, se modificar el div resultante de utilizar el mtodo $session->flash() en la vista. 1. setFlash('Mensaje de ejemplo', 'default', array('class' => 'clase_ejemplo')) La salida de $session->flash() del ejemplo anterior ser: 1. <div id="flashMessage" class="clase_ejemplo">Mensaje de ejemplo</div>
5.7.1.3 read

Editar Ver slo esta seccin Historia Comparar con el contenido original

read($name) Devuelve el contenido de la variable $name dentro de la sesin. Si $name es null, se devolver todo el contenido de la sesin. Ej. 1. $verde = $this->Session->read('Persona.colorOjos'); Recupera el valor 'Verde' de la sesin.
5.7.1.4 check

Editar Ver slo esta seccin Historia Comparar con el contenido original

check($name) Se utiliza para verificar si una variable ha sido seteada en la sesin. Devuelve true en caso afirmativo, y false si la variable nunca fue seteada.
5.7.1.5 delete

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones delete($name) /*o*/ del($name)

Borra los datos de la variable $name dentro de la sesin. Ej. 1. $this->Session->del('Persona.colorOjos'); Nuestra informacin de sesin ya no tiene el valor 'Verde', ni siquiera la clave 'colorOjos'. Sin embardo, Persona todava existe en la sesin. Para eliminar la variable completa de la sesin se debe usar: 1. $this->Session->del('Persona');
5.7.1.6 destroy

Editar Ver slo esta seccin Historia Comparar con el contenido original

El mtodo destroy eliminar la cookie de sesin y todos los datos almacenados en los archivos temporales del sistema. Destruir la sesin de PHP y crear una sesin nueva. 1. $this->Session->destroy()
5.7.1.7 error

Editar Ver slo esta seccin Historia Comparar con el contenido original

error() Se utiliza para determinar el ltimo error en una sesin.

6 Core Behaviors (Comportamientos Basicos)


Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los comportamientos (Behaviors) agregan funcionalidad extra a tus modelos. CakePHP viene con un numero de comportamientos incorporados tales como el Arbol (Tree) y Contenible (Containable). 6.1 ACL Editar Ver slo esta seccin Historia

Comparar con el contenido original El comportamiento Acl provee una forma de integrar un modelo con tu sistema ACL. Puede crear tanto los AROs o los ACOs transparentemente. Para usar el nuevo comportamiento, puedes aadirlo a la propiedad $actsAs de tu modelo. Cuando lo agregas al arreglo $actsAs, se pueden elegir entre hacer la entrada actual como un ARO o un ACO. El valor por defecto es para crear AROs. 1. class User extends AppModel { 2. var $actsAs = array('Acl' => array('type' => 'requester')); 3. } Esto incluye el comportamiento de Acl en el modo ARO. Para que el comportamiento ACL sea ACO, se debe usar: 1. class Post extends AppModel { 2. var $actsAs = array('Acl' => array('type' => 'controlled')); 3. } Se puede agregar el comportamiento ACL al vuelo, de la siguiente forma: 1. $this->Post->Behaviors->attach('Acl', array('type' => 'controlled'));
6.1.1 Using the AclBehavior

Editar Ver slo esta seccin Historia Comparar con el contenido original

Muchos de los comportamientos ACL funcionan transparentemente en el mtodo afterSave() del Modelo. Sin embargo, usarlo requiere que tu Modelo tenga el mtodo parentNode() definido. Esto es usado por el comportamiento ACL para determinar las relaciones padre-hijo. El mtodo parentNode() del modelo debe retornar null, o bien, retornar una referencia al modelo padre. 1. function parentNode() { 2. return null; 3. } Si se quiere setear un nodo ACO o ARO como padre del modelo, parentNode() debe retornar el alias del nodo ACO o ARO. 1. function parentNode() { 2. return 'root_node'; 3. } Un ejemplo ms completo. Usando un modelo User, donde User tiene la relacin belongsTo con el modelo Group. 1. 2. 3. 4. 5. function parentNode() { if (!$this->id && empty($this->data)) { return null; } $data = $this->data;

6. if (empty($this->data)) { 7. $data = $this->read(); 8. } 9. if (!$data['User']['group_id']) { 10.return null; 11.} else { 12.$this->Group->id = $data['User']['group_id']; 13.$groupNode = $this->Group->node(); 14.return array('Group' => array('id' => $groupNode[0]['Aro'] ['foreign_key'])); 15.} 16.} En el ejemplo de arriba el valor de retorno es un arreglo que tiene la misma estructura que el resultado de la operacin find() del modelo. Es importante setear el valor del id o la relacion parentNode fallar. El comportamiento Acl usa esta data para construir la estructura del rbol.
6.1.2 node()

Editar Ver slo esta seccin Historia Comparar con el contenido original

El comportamiento ACL tambin permite rescatar el nodo ACL asociado al registro del modelo. Despues de setear $model->id se puede utilizar $model->node() para rescatar el nodo ACL asociado. Tambien se puede rescatar el nodo ACL de cualquier fila, pasandolo dentro de un arreglo. 1. 2. 3. 4. 5. 6. $this->User->id = 1; $node = $this->User->node(); $user = array('User' => array( 'id' => 1 )); $node = $this->User->node($user);

Ambos retornaran la misma informacin del nodo ACL. 6.2 Containable Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones A new addition to the CakePHP 1.2 core is the ContainableBehavior. This model behavior allows you to filter and limit model find operations. Using Containable will help you cut down on needless wear and tear on your database, increasing the speed and overall performance of your application. The class will also help you search and filter your data for your users in a clean and consistent way.

Containable allows you to streamline and simplify operations on your model bindings. It works by temporarily or permanently altering the associations of your models. It does this by using the supplied containments to generate a series of bindModel and unbindModel calls. To use the new behavior, you can add it to the $actsAs property of your model: 1. class Post extends AppModel { 2. var $actsAs = array('Containable'); 3. } You can also attach the behavior on the fly: 1. $this->Post->Behaviors->attach('Containable');
# Using Containable

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones To see how Containable works, let's look at a few examples. First, we'll start off with a find() call on a model named Post. Let's say that Post hasMany Comment, and Post hasAndBelongsToMany Tag. The amount of data fetched in a normal find() call is rather extensive: 1. debug($this->Post->find('all'));
[0] => Array ( [Post] => Array ( [id] => 1 [title] => First article [content] => aaa [created] => 2008-05-18 00:00:00 ) [Comment] => Array ( [0] => Array ( [id] => 1 [post_id] => 1 [author] => Daniel [email] => dan@example.com [website] => http://example.com [comment] => First comment [created] => 2008-05-18 00:00:00 ) [1] => Array ( [id] => 2 [post_id] => 1 [author] => Sam [email] => sam@example.net [website] => http://example.net [comment] => Second comment

[created] => 2008-05-18 00:00:00 ) [Tag] => Array ( [0] => Array ( [id] => 1 [name] => Awesome ) [1] => Array ( [id] => 2 [name] => Baking ) ) )

) [1] => Array ( [Post] => Array (...

For some interfaces in your application, you may not need that much information from the Post model. One thing the ContainableBehavior does is help you cut down on what find() returns. For example, to get only the post-related information, you can do the following: 1. $this->Post->contain(); 2. $this->Post->find('all'); You can also invoke Containable's magic from inside the find() call: 1. $this->Post->find('all', array('contain' => false)); Having done that, you end up with something a lot more concise:
[0] => Array ( [Post] => Array ( [id] => 1 [title] => First article [content] => aaa [created] => 2008-05-18 00:00:00 ) ) [1] => Array ( [Post] => Array ( [id] => 2 [title] => Second article [content] => bbb [created] => 2008-05-19 00:00:00 ) )

This sort of help isn't new: in fact, you can do that without the ContainableBehavior doing

something like this: 1. $this->Post->recursive = -1; 2. $this->Post->find('all'); Containable really shines when you have complex associations, and you want to pare down things that sit at the same level. The model's $recursive property is helpful if you want to hack off an entire level of recursion, but not when you want to pick and choose what to keep at each level. Let's see how it works by using the contain() method. The contain method's first argument accepts the name, or an array of names, of the models to keep in the find operation. If we wanted to fetch all posts and their related tags (without any comment information), we'd try something like this: 1. $this->Post->contain('Tag'); 2. $this->Post->find('all'); Again, we can use the contain key inside a find() call: 1. $this->Post->find('all', array('contain' => 'Tag')); Without Containable, you'd end up needing to use the unbindModel() method of the model, multiple times if you're paring off multiple models. Containable creates a cleaner way to accomplish this same task.
# Containing deeper associations

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Containable also goes a step deeper: you can filter the data of the associated models. If you look at the results of the original find() call, notice the author field in the Comment model. If you are interested in the posts and the names of the comment authors and nothing else you could do something like the following: 1. 2. 3. 4. $this->Post->contain('Comment.author'); $this->Post->find('all'); //or.. $this->Post->find('all', array('contain' => 'Comment.author'));

Here, we've told Containable to give us our post information, and just the author field of the associated Comment model. The output of the find call might look something like this:
[0] => Array ( [Post] => Array ( [id] => 1 [title] => First article [content] => aaa [created] => 2008-05-18 00:00:00 ) [Comment] => Array

( [0] => Array ( [author] => Daniel [post_id] => 1 ) [1] => Array ( [author] => Sam [post_id] => 1 ) ) [1] => Array (... )

As you can see, the Comment arrays only contain the author field (plus the post_id which is needed by CakePHP to map the results). You can also filter the associated Comment data by specifying a condition: 1. 2. 3. 4. $this->Post->contain('Comment.author = "Daniel"'); $this->Post->find('all'); //or... $this->Post->find('all', array('contain' => 'Comment.author = "Daniel"'));

This gives us a result that gives us posts with comments authored by Daniel:
[0] => Array ( [Post] => Array ( [id] => 1 [title] => First article [content] => aaa [created] => 2008-05-18 00:00:00 ) [Comment] => Array ( [0] => Array ( [id] => 1 [post_id] => 1 [author] => Daniel [email] => dan@example.com [website] => http://example.com [comment] => First comment [created] => 2008-05-18 00:00:00 ) ) )

Additional filtering can be performed by supplying the standard Model->find() options: 1. $this->Post->find('all', array('contain' => array( 2. 'Comment' => array(

3. 4. 5. 6.

'conditions' => array('Comment.author =' => "Daniel"), 'order' => 'Comment.created DESC' ) )));

Here's an example of using the ContainableBehavior when you've got deep and complex model relationships. Let's consider the following model associations:
User->Profile User->Account->AccountSummary User->Post->PostAttachment->PostAttachmentHistory->HistoryNotes User->Post->Tag

This is how we retrieve the above associations with Containable: 1. $this->User->find('all', array( 2. 'contain'=>array( 3. 'Profile', 4. 'Account' => array( 5. 'AccountSummary' 6. ), 7. 'Post' => array( 8. 'PostAttachment' => array( 9. 'fields' => array('id', 'name'), 10.'PostAttachmentHistory' => array( 11.'HistoryNotes' => array( 12.'fields' => array('id', 'note') 13.) 14.) 15.), 16.'Tag' => array( 17.'conditions' => array('Tag.name LIKE' => '%happy%') 18.) 19.) 20.) 21.)); Keep in mind that contain key is only used once in the main model, you don't need to use 'contain' again for related models When using 'fields' and 'contain' options - be careful to include all foreign keys that your query directly or indirectly requires. Please also note that because Containable must to be attached to all models used in containment, you may consider attaching it to your AppModel.
6.2.1 Using Containable with pagination

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre

traduciones By including the 'contain' parameter in the $paginate property it will apply to both the find('count') and the find('all') done on the model See the section Using Containable for further details. Here's an example of how to contain associations when paginating. 1. 2. 3. 4. 5. $this->paginate['User'] = array( 'contain' => array('Profile', 'Account'), 'order' => 'User.username' ); $users = $this->paginate('User');

# ContainableBehavior options

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The ContainableBehavior has a number of options that can be set when the Behavior is attached to a model. The settings allow you to fine tune the behavior of Containable and work with other behaviors more easily. recursive (boolean, optional) set to true to allow containable to automatically determine the recursiveness level needed to fetch specified models, and set the model recursiveness to this level. setting it to false disables this feature. The default value is true. notices (boolean, optional) issues E_NOTICES for bindings referenced in a containable call that are not valid. The default value is true. autoFields: (boolean, optional) auto-add needed fields to fetch requested bindings. The default value is true. You can change ContainableBehavior settings at run time by reattaching the behavior as seen in Using behaviors ContainableBehavior can sometimes cause issues with other behaviors or queries that use aggregate functions and/or GROUP BY statements. If you get invalid SQL errors due to mixing of aggregate and non-aggregate fields, try disabling the autoFields setting. 1. $this->Post->Behaviors->attach('Containable', array('autoFields' => false)); 6.3 Translate Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes:

Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones TranslateBehavior es bastante fcil de configurar y trabaja fuera de la caja con muy poca configuracin. En esta seccin, usted aprender cmo aadir y configurar el comportamiento (behavior) para usarlo en cualquier modelo.
6.3.1 Inicializando las tablas de la Base de datos i18n

Editar Ver slo esta seccin Historia Comparar con el contenido original

Puede utilizar la consola de CakePHP o puede crearlo manualmente. Se recomienda utilizar la consola para esto, por que podran pasar que hallan cambios de diseo en las futuras versiones de CakePHP. Si lo haces por consola, puedes estar seguro que tiene el correcto diseo. 1. ./cake i18n Seleccione [I] y se ejecuta el script e inicializa la Base de datos i18n. Se le preguntar si desea eliminar cualquiera que exista y si desea crearla.Responde un S, si usted esta seguro de que no existe una tabla i18n, y responda con S para crear la tabla de nuevo.
6.3.2 Adjuntando el Comportamiento de Traduccin a tus Modelos

1. 2. 3. 4. 5. 6. 7. 8.

Editar Ver slo esta seccin Historia Comparar con el contenido original <?php class Post extends AppModel { var $name = 'Post'; var $actsAs = array( 'Translate' ); } ?>

Se debe incorporar al modelo haciendo uso de la propiedad $actsAs como en el siguiente ejemplo.

Esto no har nada an, pues es necesario configurar algunas opciones antes de comenzar a funcionar. Se deben definir qu campos de el modelo actual sern rastreados en la tabla de traducciones creada en el paso anterior.
6.3.3 Definiendo los Campos

Editar Ver slo esta seccin Historia

Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Se pueden establecer los campos simplemente extendiendo el valor 'Translate' con otro array, por ejemplo: 1. <?php 2. class Post extends AppModel { 3. var $name = 'Post'; 4. var $actsAs = array( 5. 'Translate' => array( 6. 'campoUno', 'campoDos', 'campoN' 7. ) 8. ); 9. } 10.?> Luego de haber hecho esto (por ejemplo poner "nombre" como uno de los campos) ya has terminado la configuracin bsica. Genial! De acuerdo con el ejemplo anterior, ahora el modelo debera verse algo as: 1. <?php 2. class Post extends AppModel { 3. var $name = 'Post'; 4. var $actsAs = array( 5. 'Translate' => array( 6. 'nombre' 7. ) 8. ); 9. } 10.?>
6.3.4 Conclusiones

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones

Desde ahora en cada actualizacin/creacin de un registro har que TranslateBehavior copie el valor "nombre" en la tabla de traducciones (por defecto: i18n) de acuerdo a la localizacin actual. Una localizacin corresponde al identificador de una lengua La localizacin actual es el valor actual de Configure::read('Config.language'). El valor de Config.language es establecido en la Clase L10n - a no ser que ya se haya establecido. Sin embargo, TranlateBehavior te permite invalidar esto ltimo 'al vuelo', lo cual permite al usuario de tus pginas crear multiples versiones sin la necesidad de que este cambie sus preferencias. Ms sobre esto en la siguiente seccin.
6.3.5 Obtener todos los registros de traduccin para un campo determinado

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Si se desea obtener todos los registros de traduccin asociados al modelo actual, simplemente se extiende el arreglo de campos en la configuracion como se muestra abajo. El nombre se puede definir sin restricciones 1. <?php 2. class Post extends AppModel { 3. var $name = 'Post'; 4. var $actsAs = array( 5. 'Translate' => array( 6. 'name' => 'nameTranslation' 7. ) 8. ); 9. } 10.?> Con esta configuracin el resultado de find() se ver similar a esto: 1. Array 2. ( 3. [Post] => Array 4. ( 5. [id] => 1 6. [name] => Beispiel Eintrag 7. [body] => lorem ipsum... 8. [locale] => de_de 9. ) 10.[nameTranslation] => Array 11.(

12.[0] => Array 13.( 14.[id] => 1 15.[locale] => en_us 16.[model] => Post 17.[foreign_key] => 1 18.[field] => name 19.[content] => Example entry 20.) 21.[1] => Array 22.( 23.[id] => 2 24.[locale] => de_de 25.[model] => Post 26.[foreign_key] => 1 27.[field] => name 28.[content] => Beispiel Eintrag 29.) 30.) 31.) Nota: El registro del modelo contiene un campo virtual llamado "locale", el cual indica que "locale" es usado en el resultado.
6.3.5.1 Using the bindTranslation method

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones You can also retrieve all translations, only when you need them, using the bindTranslation method bindTranslation($fields, $reset) $fields is a named-key array of field and association name, where the key is the translatable field and the value is the fake association name. 1. $this->Post->bindTranslation(array ('name' => 'nameTranslation')); 2. $this->Post->find('all', array ('recursive'=>1)); // need at least recursive 1 for this to work. With this setup the result of your find() should look something like this: 1. 2. 3. 4. 5. 6. Array ( [Post] => Array ( [id] => 1 [name] => Beispiel Eintrag

7. [body] => lorem ipsum... 8. [locale] => de_de 9. ) 10.[nameTranslation] => Array 11.( 12.[0] => Array 13.( 14.[id] => 1 15.[locale] => en_us 16.[model] => Post 17.[foreign_key] => 1 18.[field] => name 19.[content] => Example entry 20.) 21.[1] => Array 22.( 23.[id] => 2 24.[locale] => de_de 25.[model] => Post 26.[foreign_key] => 1 27.[field] => name 28.[content] => Beispiel Eintrag 29.) 30.) 31.)
6.3.6 Saving in another language

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones You can force the model which is using the TranslateBehavior to save in a language other than the on detected. To tell a model in what language the content is going to be you simply change the value of the $locale property on the model before you save the data to the database. You can do that either in your controller or you can define it directly in the model. Example A: In your controller 1. 2. 3. 4. 5. 6. <?php class PostsController extends AppController { var $name = 'Posts'; function add() { if ($this->data) { $this->Post->locale = 'de_de'; // we are going to save the german version

7. $this->Post->create(); 8. if ($this->Post->save($this->data)) { 9. $this->redirect(array('action' => 'index')); 10.} 11.} 12.} 13.} 14.?> Example B: In your model 1. <?php 2. class Post extends AppModel { 3. var $name = 'Post'; 4. var $actsAs = array( 5. 'Translate' => array( 6. 'name' 7. ) 8. ); 9. // Option 1) just define the property directly 10.var $locale = 'en_us'; 11.// Option 2) create a simple method 12.function setLanguage($locale) { 13.$this->locale = $locale; 14.} 15.} 16.?>
6.3.7 Multiple Translation Tables

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If you expect a lot entries you probably wonder how to deal with a rapidly growing database table. There are two properties introduced by TranslateBehavior that allow to specify which "Model" to bind as the model containing the translations. These are $translateModel and $translateTable. Lets say we want to save our translations for all posts in the table "post_i18ns" instead of the default "i18n" table. To do so you need to setup your model like this: 1. 2. 3. 4. 5. 6. <?php class Post extends AppModel { var $name = 'Post'; var $actsAs = array( 'Translate' => array( 'name'

7. ) 8. ); 9. // Use a different model (and table) 10.var $translateModel = 'PostI18n'; 11.} 12.?> Important is that you have to pluralize the table. It is now a usual model and can be treated as such and thus comes with the conventions involved. The table schema itself must be identical with the one generated by the CakePHP console script. To make sure it fits one could just initialize a empty i18n table using the console and rename the table afterwards.
6.3.7.1 Create the TranslateModel

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones For this to work you need to create the actual model file in your models folder. Reason is that there is no property to set the displayField directly in the model using this behavior yet. Make sure that you change the $displayField to 'field'. 1. 2. 3. 4. 5. 6. <?php class PostI18n extends AppModel { var $displayField = 'field'; // important } // filename: post_i18n.php ?>

That's all it takes. You can also add all other model stuff here like $useTable. But for better consistency we could do that in the model which actually uses this translation model. This is where the optional $translateTable comes into play.
6.3.7.2 Changing the Table

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If you want to change the name of the table you simply define $translateTable in your model, like so: 1. 2. 3. 4. 5. 6. <?php class Post extends AppModel { var $name = 'Post'; var $actsAs = array( 'Translate' => array( 'name'

7. ) 8. ); 9. // Use a different model 10.var $translateModel = 'PostI18n'; 11.// Use a different table for translateModel 12.var $translateTable = 'post_translations'; 13.} 14.?> Please note that you can't use $translateTable alone. If you don't intend to use a custom $translateModel then leave this property untouched. Reason is that it would break your setup and show you a "Missing Table" message for the default I18n model which is created in runtime. 6.4 Arboles (Tree) Editar Ver slo esta seccin Historia Comparar con el contenido original Hay un cambio pendiente para esta seccin

Es muy comn que se desea almacenar datos jerrquicos en una tabla de base de datos. Ejemplos de estos datos pueden ser: categoras con subcategoras ilimitadas, los datos relativos a un sistema de mens multinivel o una representacin literal de la jerarqua tal como se utiliza para almacenar objetos de control de acceso con la lgica ACL. Para pequeos rboles de datos, o cuando los datos son de slo unos pocos niveles de profundidad es simple aadir un campo parent_id a su tabla de base de datos y utilizar este para hacer un seguimiento de cual item es padre de quien. Sin embargo, Cake Viene equipado con este paquete, pero con un comportamiento de gran alcance que le permite utilizar los beneficios de la lgica MPTT sin preocuparse de cualquiera de los entresijos de la tcnica - a menos que ud lo desee ;).
6.4.1 Requerimientos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para poder usar la funcionalidad de rbol, la tabla de la base de datos debe tener los 3 campos listados a continuacin (enteros todos): padre - el nombre por defecto del campo es parent_id, para almacenar el id del objeto padre izquierda - el nombre por defecto del campo es lft, para almacenar el valor lft de la fila actual. derecha - el nombre por defecto del campo es rght, para almacenar el valor rght de la fila

actual. Si esta familiarizado con la lgina MPTT ud puede preguntarse por que el campos parent existe simplemente es ms facil de realizar ciertas tareas si existe un enlace directo al padre almacenado en la base de datos - tales como la bsquera de los hijos directos.
6.4.2 Uso Bsico

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El comportamiento de arbol tiene muchas cosas incluidas, pero empecemos con un simple ejemplo crearemos una pequea tabla en una base de datos y le agregaremos algunos datos:
CREATE TABLE categories ( id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, parent_id INTEGER(10) DEFAULT NULL, lft INTEGER(10) DEFAULT NULL, rght INTEGER(10) DEFAULT NULL, name VARCHAR(255) DEFAULT '', PRIMARY KEY (id) ); INSERT INTO `categories` (`id`, Categorias', NULL, 1, 30); INSERT INTO `categories` (`id`, 'Diversion', 1, 2, 15); INSERT INTO `categories` (`id`, 'Deportes', 2, 3, 8); INSERT INTO `categories` (`id`, 'Surfing', 3, 4, 5); INSERT INTO `categories` (`id`, 'Alpinismo', 3, 6, 7); INSERT INTO `categories` (`id`, 'Amigos', 2, 9, 14); INSERT INTO `categories` (`id`, 'Gerald', 6, 10, 11); INSERT INTO `categories` (`id`, 'Gwendolyn', 6, 12, 13); INSERT INTO `categories` (`id`, 'Trabajo', 1, 16, 29); INSERT INTO `categories` (`id`, 'Reportes', 9, 17, 22); INSERT INTO `categories` (`id`, 'Anual', 10, 18, 19); INSERT INTO `categories` (`id`, 'Status', 10, 20, 21); `name`, `parent_id`, `lft`, `rght`) VALUES(1, 'Mis `name`, `parent_id`, `lft`, `rght`) VALUES(2, `name`, `parent_id`, `lft`, `rght`) VALUES(3, `name`, `parent_id`, `lft`, `rght`) VALUES(4, `name`, `parent_id`, `lft`, `rght`) VALUES(5, `name`, `parent_id`, `lft`, `rght`) VALUES(6, `name`, `parent_id`, `lft`, `rght`) VALUES(7, `name`, `parent_id`, `lft`, `rght`) VALUES(8, `name`, `parent_id`, `lft`, `rght`) VALUES(9, `name`, `parent_id`, `lft`, `rght`) VALUES(10, `name`, `parent_id`, `lft`, `rght`) VALUES(11, `name`, `parent_id`, `lft`, `rght`) VALUES(12,

INSERT INTO `categories` 'Viajes', 9, 23, 28); INSERT INTO `categories` 'Nacional', 13, 24, 25); INSERT INTO `categories` 'Internacional', 13, 26,

(`id`, `name`, `parent_id`, `lft`, `rght`) VALUES(13, (`id`, `name`, `parent_id`, `lft`, `rght`) VALUES(14, (`id`, `name`, `parent_id`, `lft`, `rght`) VALUES(15, 27);

Para el propsito de verificar que todo est configurado correctamente, podemos crear un metodo de testeo y obtener los contenidos de nuestro arbol de categorias para ver como queda. Con un simple controlador: 1. 2. 3. 4. 5. 6. 7. 8. 9. 1. 2. 3. 4. 5. 6. 7. <?php class CategoriesController extends AppController { var $name = 'Categories'; function index() { $this->data = $this->Category->generatetreelist(null, null, null, '&nbsp;&nbsp;&nbsp;'); debug ($this->data); die; } } ?> <?php // app/models/category.php class Category extends AppModel { var $name = 'Category'; var $actsAs = array('Tree'); } ?>

y un metodo aun mas simple en el modelo:

Podemos verificar como se ve que nuestro arbol de categoria visitando /categories Deberias ver algo como: Mis Categorias Diversion Deportes Surfing Alpinismo Amigos Gerald Gwendolyn Trabajo Reportes Anual Status Viajes Nacional Internacional

6.4.2.1 Agregando datos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones En la seccion anterior, usamos datos pre-existentes y chequeamos que se vieran en forma jerarquica con el mtodo generatetreelist. Sin embargo, usualmente agregaramos los datos de la misma forma que lo hariamos con cualquier modelo. Por ejemplo: 1. 2. 3. 4. // pseudo cdigo del controlador $data['Category']['parent_id'] = 3; $data['Category']['name'] = 'Skating'; $this->Category->save($data);

Cuando se usa el comportamiento de arbol no es necesario hacer nada mas que configurar el parent_id, y el comportamiento de arbol se encargara del resto. Si no se setea el parent_id el comportamiento de arbol lo agregara al arbol como una entrada en el nivel superior: 1. 2. 3. 4. // pseudo codigo controlador $data = array(); $data['Category']['name'] = 'Otra Categoria'; $this->Category->save($data);

Ejecutando estos dos trozos de cdigo alterar el rbol como sigue: Mis Categorias Diversion Deportes Surfing Alpinismo Skating New Amigos Gerald Gwendolyn Trabajo Reportes Anual Status Viajes Nacional Internacional Otra Categoria New

6.4.2.2 Modificando datos

Editar Ver slo esta seccin Historia Comparar con el contenido original

Modificar datos es tan transparente como agregar nuevos datos. Si modificas algo, pero no modificas el campo parent_id - la estructura de tus datos permanecera inalterada. Por ejemplo: 1. // pseudo codigo de controlador 2. $this->Category->id = 5; // id de Apinismo 3. $this->Category->save(array('name' =>'Pesca')); El codigo anterior no modifica el parent_id - incluso si el parent_id es incluido en los datos que son pasados al mtodo save, si el valor no ha sido cambiado, tampoco lo hace la estructura de datos. Entonces, el arbol de datos queda: Mis Categorias Diversion Deportes Surfing Pesca Updated Skating Amigos Gerald Gwendolyn Trabajo Reportes Anual Status Viajes Nacional Internacional Otra Categoria Mover un dato a traves del arbol tambien es simple. Digamos que Pesca no pertenece a Deportes, sino que deberia estar en Otra Categoria. Con el siguiente cdigo: 1. // pseudo codigo de controlador 2. $this->Category->id = 5; // id of Pesca 3. $newParentId = $this->Category->field('id', array('name' => 'Otra Categoria')); 4. $this->Category->save(array('parent_id' => $newParentId)); Como es de esperar la estructura queda modificada a: Mis Categorias Diversion Deportes Surfing Skating

Amigos Gerald Gwendolyn Trabajo Reportes Anual Status Viajes Nacional Internacional Otra Categoria Pesca Movido
6.4.2.3 Borrando datos

Editar Ver slo esta seccin Historia Comparar con el contenido original

El comportamiento de arbol provee algunas formas para manejar la eliminacin de datos. Para comenzar con un ejemplo simple, diremos que la categoria reportes ya no es necesaria. Para eliminarla y cualquier hijo que ella tenga basta llamar a delete tal como lo harias en cualquier modelo. Por ejemplo, en el siguiente cdigo: 1. // pseudo codigo de controlador 2. $this->Category->id = 10; 3. $this->Category->delete(); El arbol de categorias sera modificado como sigue: Mis Categorias Diversion Deportes Surfing Skating Amigos Gerald Gwendolyn Trabajo Viajes Nacional Internacional Otras Categorias Pesca
6.4.2.4 Haciendo consultas y usando tus datos

Editar Ver slo esta seccin

Historia Comparar con el contenido original Usar y manipular datos jerarquicos puede ser algo complejo. Ademas de los metodos de busqueda del nucleo como find(), con los arboles tenemos unos cuantos metodos ms para su manipulacion. Muchos metodos del comportamiento de arbol devuelven y se apoyan en el orden del campo lft. Si llamas a find() y no ordenas por el campo lft, o llamas algun metodo de arboles entregandole un tipo de ordenamiento, quizas obtengas resultados no deseados.
6.4.2.4.1 El mtodo children

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El mtodo children toma la llave primaria (id) de una fila y retorna los hijos, por defecto en el roden en que aparecen en el rbol. El segundo parmetro es opcional y define si se entregan o no slo los hijos directos. Usando el ejemplo de la seccin anterior: 1. $allChildren = $this->Category->children(1); // un arreglo plano con 11 valores 2. // -- o bien -3. $this->Category->id = 1; 4. $allChildren = $this->Category->children(); // un arreglo plano con 11 valores 5. // Retornar solo los hijos directos 6. $directChildren = $this->Category->children(1, true); //un arreglo plano con 2 valores Si quieres un arreglo recursivo utiliza find('threaded')
6.4.2.4.2 Contando los hijos

Editar Ver slo esta seccin Historia Comparar con el contenido original

Tal como el mtodo children, childCount toma la llave primaria (id) y retorna cuantos hijos tiene. El segundo parmetro es opcional y define si se contarn o no los hijos directos. Usando los datos del ejemplo anterior: 1. $totalChildren = $this->Category->childCount(1); // entrega 11 2. // -- o bien --

3. 4. 5. 6.

$this->Category->id = 1; $directChildren = $this->Category->childCount(); // entrega 11 //Solo los hijos directos $numChildren = $this->Category->childCount(1, true); // entrega 2

6.4.2.4.3 generatetreelist

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones generatetreelist ($conditions=null, $keyPath=null, $valuePath=null, $spacer= '_', $recursive=null) This method will return data similar to find('list'), with an indented prefix to show the structure of your data. Below is an example of what you can expect this method to return. $conditions - Uses the same conditional options as find(). $keyPath - Path to the field to use for the key. $valuePath - Path to the field to use for the label. $spacer - The string to use in front of each item to indicate depth. $recursive - The number of levels deep to fetch associated records $conditions = null $keyPath = Model's primary key $valuePath = Model's displayField $spacer = '_' $recursive = Model's recursive setting

All the parameters are optional, with the following defaults:

1. $treelist = $this->Category->generatetreelist(); Output:


array( [1] => [2] => [3] => [4] => [16] => [6] => [7] => [8] => [9] => [13] => [14] => [15] => [17] => [5] => "My Categories", "_Fun", "__Sport", "___Surfing", "___Skating", "__Friends", "___Gerald", "___Gwendolyn", "_Work", "__Trips", "___National", "___International", "Other People's Categories", "_Extreme fishing"

6.4.2.4.4 getparentnode

Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta conveniente funcin, como su nombre lo indica, retorna el nodo padre de cualquier nodo, o false si el nodo no tiene padre (es el nodo raz). Por ejemplo: 1. $parent = $this->Category->getparentnode(2); //<- id de Fun 2. // $parent contiene My categories
6.4.2.4.5 getpath

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones getpath( $id = null, $fields = null, $recursive = null ) The 'path' when refering to hierachial data is how you get from where you are to the top. So for example the path from the category "International" is: My Categories ... Work Trips ... International Using the id of "International" getpath will return each of the parents in turn (starting from the top). 1. $parents = $this->Category->getpath(15);
// contents of $parents array( [0] => array('Category' Categories', ..)), [1] => array('Category' [2] => array('Category' [3] => array('Category' 'International', ..)), ) => array('id' => 1, 'name' => 'My => array('id' => 9, 'name' => 'Work', ..)), => array('id' => 13, 'name' => 'Trips', ..)), => array('id' => 15, 'name' =>

6.4.3 Uso Avanzado

Editar Ver slo esta seccin Historia Comparar con el contenido original

Este comportamiento de modelo no slo trabaja en segundo plano, hay una gran variedad de mtodos

especficos definidos en este comportamiento para antender todas tus necesidades de datos jerrquicos, y cualquier problema inesperado que pueda surgir en el proceso.
6.4.3.1 moveDown

Editar Ver slo esta seccin Historia Comparar con el contenido original

Utilizado para mover un nico nodo hacia abajo del rbol. Debes indicar el ID del elemento a mover y un nmero entero positivo de cuantas posiciones el nodo debera ser movido hacia abajo. Todos los nodos hijos del nodo a mover tambin sern movidos Un ejemplo de una accin de controlador (en un controlador llamado Categories) que mueve un nodo hacia abajo del arbol: function movedown($name = null, $delta = null) { $cat = $this->Category->findByName($name); if (empty($cat)) { $this->Session->setFlash('No hay una categora de nombre ' . $name); 5. $this->redirect(array('action' => 'index'), null, true); 6. } 7. $this->Category->id = $cat['Category']['id']; 8. if ($delta > 0) { 9. $this->Category->moveDown($this->Category->id, abs($delta)); 10.} else { 11.$this->Session->setFlash('Por favor indique el nmero de posiciones que el nodo debe ser movido hacia abajo.'); 12.} 13.$this->redirect(array('action' => 'index'), null, true); 14.} 1. 2. 3. 4. Por ejemplo, si quisieras mover la categora "Sport" un nivel hacia abajo, deberas llamar a: /categories/movedown/Sport/1.
6.4.3.2 moveUp

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Used to move a single node up the tree. You need to provide the ID of the element to be moved and a positive number of how many positions the node should be moved up. All child nodes will also be moved. If the node is the first child, or is a top level node with no previous node this method will return false. Here's an example of a controller action (in a controller named Categories) that moves a node up the tree:

1. function moveup($name = null, $delta = null){ 2. $cat = $this->Category->findByName($name); 3. if (empty($cat)) { 4. $this->Session->setFlash('There is no category named ' . $name); 5. $this->redirect(array('action' => 'index'), null, true); 6. } 7. $this->Category->id = $cat['Category']['id']; 8. if ($delta > 0) { 9. $this->Category->moveUp($this->Category->id, abs($delta)); 10.} else { 11.$this->Session->setFlash('Please provide a number of positions the category should be moved up.'); 12.} 13.$this->redirect(array('action' => 'index'), null, true); 14.} For example, if you would like to move the category "Gwendolyn" up one position you would request /categories/moveup/Gwendolyn/1. Now the order of Friends will be Gwendolyn, Gerald.
6.4.3.3 removeFromTree

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones removeFromTree($id=null, $delete=false) Using this method wil either delete or move a node but retain its sub-tree, which will be reparented one level higher. It offers more control than delete(), which for a model using the tree behavior will remove the specified node and all of its children. Taking the following tree as a starting point: My Categories Fun Sport Surfing Extreme knitting Skating Running the following code with the id for 'Sport' 1. $this->Node->removeFromTree($id); The Sport node will be become a top level node: My Categories Fun Surfing Extreme knitting Skating

Sport Moved This demonstrates the default behavior of removeFromTree of moving the node to have no parent, and re-parenting all children. If however the following code snippet was used with the id for 'Sport' 1. $this->Node->removeFromTree($id,true); The tree would become My Categories Fun Surfing Extreme knitting Skating This demonstrates the alternate use for removeFromTree, the children have been reparented and 'Sport' has been deleted.
6.4.3.4 reorder

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones reorder ( array('id' => null, 'field' => $Model->displayField, 'order' => 'ASC', 'verify' => true) ) Reorders the nodes (and child nodes) of the tree according to the field and direction specified in the parameters. This method does not change the parent of any node. 1. $model->reorder(array( 2. 'id' => , //id of record to use as top node for reordering, default: $Model->id 3. 'field' => , //which field to use in reordering, default: $Model->displayField 4. 'order' => , //direction to order, default: 'ASC' 5. 'verify' => //whether or not to verify the tree before reorder, default: true 6. )); If you have saved your data or made other operations on the model, you might want to set $model>id = null before calling reorder. Otherwise only the current node and it's children will be reordered.
6.4.4 Data Integrity

Editar Ver slo esta seccin Historia Comparar con el contenido original

Debido a la naturaleza de las estructuras complejas autorreferentes como los rboles y las listas enlazadas, ocasionalmente pueden romperse debido a una llamada poco cuidadosa. Tmalo con calma, no todo est perdido! Tree Behavior contiene varias caractersticas que antes no estaban documentadas, diseadas para recuperarse de tales situaciones.
6.4.4.1 Recover

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones recover(&$model, $mode = 'parent', $missingParentAction = null) The mode parameter is used to specify the source of info that is valid/correct. The opposite source of data will be populated based upon that source of info. E.g. if the MPTT fields are corrupt or empty, with the $mode 'parent' the values of the parent_id field will be used to populate the left and right fields. The missingParentAction parameter only applies to "parent" mode and determines what to do if the parent field contains an id that is not present. Available $mode options: 'parent' - use the existing parent_id's to update the lft and rght fields 'tree' - use the existing lft and rght fields to update parent_id Available missingParentActions options when using mode='parent': 1. 2. 3. 4. 5. 6. null - do nothing and carry on 'return' - do nothing and return 'delete' - delete the node int - set the parent_id to this id // Rebuild all the left and right fields based on the parent_id $this->Category->recover(); // or $this->Category->recover('parent'); // Rebuild all the parent_id's based on the lft and rght fields $this->Category->recover('tree');

6.4.4.2 Reorder

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones reorder(&$model, $options = array()) Reorders the nodes (and child nodes) of the tree according to the field and direction specified in the parameters. This method does not change the parent of any node.

Reordering affects all nodes in the tree by default, however the following options can affect the process: 'id' - only reorder nodes below this node. 'field' - field to use for sorting, default is the displayField for the model. 'order' - 'ASC' for ascending, 'DESC' for descending sort. 'verify' - whether or not to verify the tree prior to resorting.

$options is used to pass all extra parameters, and has the following possible keys by default, all of which are optional: 1. 2. 3. 4. 5. 6. array( 'id' => null, 'field' => $model->displayField, 'order' => 'ASC', 'verify' => true )

6.4.4.3 Verify

Editar Ver slo esta seccin Historia Comparar con el contenido original

verify(&$model) Retorna true si el rbol es valido de otro modo retorna un arreglo de errores, con campos para el tipo de error, indice incorrecto y el mensaje. Cada registro en al arreglo de salida es una arreglo de la forma (tipo, id, mensaje) type es bien 'index' o 'node' 'id' es el id del nodo errneo. 'message' depende del error 1. $this->Categories->verify(); Salida del ejemplo:
Array ( [0] => Array ( [0] => [1] => [2] => ) [1] => Array ( [0] => [1] => [2] => ) [10] => Array (

node 3 Valores left y right identicos

node 2 El nodo padre 999 no existe

[0] => index [1] => 123 [2] => Desaparecido ) [99] => Array ( [0] => node [1] => 163 [2] => left mayor que right ) )

7 Ayudantes del Core


Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Los Ayudantes o Helpers son clases a modo de componentes para la capa de presentacin de tu aplicacin. Contienen lgica de presentacin que puede ser compartida por muchas vistas, elementos y layouts. Esta seccin describe cada uno de los Helpers incluidos en CakePHP como Form, Html, JavaScript y RSS. Lee la seccin Helpers para aprender ms acerca de los helpers y cmo puedes crear los tuyos propios. 7.1 AJAX Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El AjaxHelper utilizas las populares libreras Prototype y script.aculo.us para operaciones Ajax y efectos en el lado del cliente. Para utilizar el AjaxHelper has de tener la versin actual de las libreras de JavaScript de www.prototypejs.org y http://script.aculo.us situadas en /app/webroot/js.

Adems has de incluir las libreras Prototype y script.aculo.us en los layouts o vistas que requieran las funcionalidades de AjaxHelper. Para poder cargar las libreras Prototype y script.aculo.us necesitars incluir los helpers Ajax y Javascript en tu controlador: 1. 2. 3. 4. class WidgetsController extends AppController { var $name = 'Widgets'; var $helpers = array('Html','Ajax','Javascript'); }

Una vez que hayas incluido el helper de javascript en tu controlador, puedes utilizar el mtodo link() de $javascript para incluir las liberas Prototype y script.aculo.us en la vista: 1. echo $javascript->link('prototype'); 2. echo $javascript->link('scriptaculous'); Ahora ya puedes puedes utilizar el helper Ajax en tu vista: 1. $ajax->loquesea(); Si se incluye el componente RequestHandler en el controlador, CakePHP automticamente aplicar el layout Ajax cuando se realize una peticin de una accin mediante AJAX. 1. 2. 3. 4. 5. class WidgetsController extends AppController { var $name = 'Widgets'; var $helpers = array('Html','Ajax','Javascript'); var $components = array( 'RequestHandler' ); }

7.1.1 AjaxHelper Options

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La mayora de los mtodos del AjaxHelper permiten suministrar un arreglo de opciones ($options). Puedes usar este arreglo para configurar el comportamiento del AjaxHelper. Antes de cubrir los mtodos especficos del helper, veamos las diferentes opciones disponibles a travs de este arreglo. Esta seccin ser de utilidad como referencia mientras inicias el uso de los mtodos del AjaxHelper.
7.1.1.1 General Options

Editar Ver slo esta seccin Historia

Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones $options['url'] La url del controlador/accin que se quiere llamar. $options['update'] El id del elemento DOM a ser actualizado con el contenido que retorne. $options['frequency'] El nmero de segundos entre intervalos de observacin. $options['type'] Indica si la peticin se realiza de forma sncrona asncrona (por omisin).
7.1.1.2 Opciones de retrollamadas (Callback Options)

Editar Ver slo esta seccin Historia Comparar con el contenido original

Las opciones de Callbacks te permiten llamar a las funciones de JavaScript en puntos especficos en el proceso de solicitud (request). Si ests buscando insertar un poco de lgica antes, despus, o durante tus operaciones de AjaxHelper, usa estas Callbacks para estableces las cosas. $options keys Description $options['conditi El fragmento de cdigo JavaScriptque necesita evaluar a true antes de que la solicitud on'] se inicie. $options['before' Se ejecuta antes de que una solicitud sea efectuada. Un uso comn de esta es permitir ] la visibilidad de un indicador de progreso. $options['confir Texto a mostrar en un cuadro de confirmacin de JavaScript antes de proceder. m'] $options['loadin Cdigo de la Callback que se ejecutar mientras que los datos se recuperan desde el g'] servidor. $options['after'] JavaScript llamado inmediatamente despus de que se ejecuta una solicitud; se dispare antes de que se ejecute la callback $options['loading']. $options['loaded' Cdigo de la Callback a ser ejecutado cuando un documento remoto es recivido por el ] cliente.

$options['interac Llamada cuando un usuario puede interactuar con el documento remoto, a pesar de tive'] que no ha terminado de cargar. $options['compl Callback JavaScript a ser ejecutada cuando se completa un XMLHttpRequest. ete']
7.1.2 Mtodos


7.1.2.1 link

Editar Ver slo esta seccin Historia Comparar con el contenido original

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones link(string $title, string $href, array $options, string $confirm, boolean $escapeTitle) Devuelve un enlace a una accin remota definida por $options['url'] o $href que se llama en background utilizando XMLHttpRequest cuando se hace clic en el enlace. El resultado de esa peticin puede ser insertada en un objeto DOM cuya identificacin se puede especificar con $options['update']. Si $options['url'] esta en blanco href es utilizado en su lugar Ejemplo: 1. 2. 3. 4. 5. 6. 7. 8. <div id="post"> </div> <?php echo $ajax->link( 'View Post', array( 'controller' => 'posts', 'action' => 'view', 1 ), array( 'update' => 'post' ) ); ?>

Por defecto, estas solicitudes son procesadas asincrnicamente mientras se utilizan diferentes callbacks Ejemplo: 1. <div id="post">

</div> <?php echo $ajax->link( 'View Post', array( 'controller' => 'posts', 'action' => 'post', 1 ), array( 'update' => 'post', 'complete' => 'alert( "Hello World" )' ) 7. ); 8. ?> 2. 3. 4. 5. 6. Para usa procesamiento sincrnico especificar $options['type'] = 'synchronous'. Para automatizar que el layout utilizado sea ajax incluir el componente RequestHandler en el controlador Por defecto el contenido del elemento es reemplazado. Para cambiar este comportamiento especificar $options['position'] Ejemplo: 1. 2. 3. 4. 5. 6. 7. 8. <div id="post"> </div> <?php echo $ajax->link( 'View Post', array( 'controller' => 'posts', 'action' => 'view', 1), array( 'update' => 'post', 'position' => 'top' ) ); ?>

$confirm puede ser usado para llamar un JavaScript confirm() message antes de que la peticin se efecte. Permite al usuario prever la ejecucin. Ejemplo: 1. 2. 3. 4. 5. 6. 7. 8. 9. <div id="post"> </div> <?php echo $ajax->link( 'Delete Post', array( 'controller' => 'posts', 'action' => 'delete', 1 ), array( 'update' => 'post' ), 'Do you want to delete this post?' ); ?>

7.1.2.2 remoteFunction

Editar Ver slo esta seccin Historia Comparar con el contenido original

remoteFunction(array $options); Esta funcion crea el codigo JavaScript necesario para hacer una llamada remota. Es usado principalmente como un helper(ayudante) para los enlaces(link). Esto no se utiliza muy a menudo a

menos que usted necesite generar algunos codigos personalizados. The $options for this function are the same as for the link method Example: <div id="post"> </div> <script type="text/javascript"> <?php echo $ajax->remoteFunction( array( 'url' => array( 'controller' => 'posts', 'action' => 'view', 1 ), 7. 'update' => 'post' 8. ) 9. ); ?> 10.</script> 1. 2. 3. 4. 5. 6. It can also be assigned to HTML Event Attributes: <?php $remoteFunction = $ajax->remoteFunction( array( 'url' => array( 'controller' => 'posts', 'action' => 'view', 1 ), 5. 'update' => 'post' ) 6. ); 7. ?> 8. <div id="post" onmouseover="<?php echo $remoteFunction; ?>" > 9. Mouse Over This 10.</div> 1. 2. 3. 4. If $options['update'] is not passed, the browser will ignore the server response.
7.1.2.3 remoteTimer

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones remoteTimer(array $options) Periodically calls the action at $options['url'], every $options['frequency'] seconds. Usually used to update a specific div (specified by $options['update']) with the result of the remote call. Callbacks can be used. remoteTimer is the same as the remoteFunction except for the extra $options['frequency'] Example: 1. <div id="post">

</div> <?php echo $ajax->remoteTimer( array( 'url' => array( 'controller' => 'posts', 'action' => 'view', 1 ), 7. 'update' => 'post', 'complete' => 'alert( "request completed" )', 8. 'position' => 'bottom', 'frequency' => 5 9. ) 10.); 11.?> 2. 3. 4. 5. 6. The default $options['frequency'] is 10 seconds
7.1.2.4 form

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones form(string $action, string $type, array $options) Returns a form tag that submits to $action using XMLHttpRequest instead of a normal HTTP request via $type ('post' or 'get'). Otherwise, form submission will behave exactly like normal: data submitted is available at $this->data inside your controllers. If $options['update'] is specified, it will be updated with the resulting document. Callbacks can be used. The options array should include the model name e.g. 1. $ajax>form('edit','post',array('model'=>'User','update'=>'UserInfoDiv ')); Alternatively, if you need to cross post to another controller from your form: 1. $ajax->form(array('type' => 'post', 2. 'options' => array( 3. 'model'=>'User', 4. 'update'=>'UserInfoDiv', 5. 'url' => array( 6. 'controller' => 'comments', 7. 'action' => 'edit' 8. ) 9. ) 10.)); You should not use the $ajax->form() and $ajax->submit() in the same form. If you want the form validation to work properly use the $ajax->submit() method as shown below.

7.1.2.5 submit

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones submit(string $title, array $options) Returns a submit button that submits the form to $options['url'] and updates the div specified in $options['update'] <div id='testdiv'> <?php echo $form->create('User'); echo $form->input('email'); echo $form->input('name'); echo $ajax->submit('Submit', array('url'=> array('controller'=>'users', 'action'=>'add'), 'update' => 'testdiv')); 7. echo $form->end(); 8. ?> 9. </div> 1. 2. 3. 4. 5. 6. Use the $ajax->submit() method if you want form validation to work properly. i.e. You want the messages you specify in your validation rules to show up correctly.
7.1.2.6 observeField

Editar Ver slo esta seccin Historia Comparar con el contenido original

observeField(string $fieldId, array $options) Observa el campo con el id DOM especificado por $field_id (cada $options['frequency'] segundos ) y realiza un XMLHttpRequest si su contenido ha cambiado. 1. <?php echo $form->create( 'Post' ); ?> 2. <?php $titles = array( 1 => 'Tom', 2 => 'Dick', 3 => 'Harry' ); ?> 3. <?php echo $form->input( 'title', array( 'options' => $titles ) ) ?> 4. </form> 5. <?php 6. echo $ajax->observeField( 'PostTitle', 7. array( 8. 'url' => array( 'action' => 'edit' ), 9. 'frequency' => 0.2, 10.) 11.);

12.?> observeField utiliza las mismas opciones que link El campo a enviar puede ser asignado utilizando $options['with']. Por defecto este contiene Form.Element.serialize('$fieldId'). Los datos enviados estn disponibles en $this>data de tu controlador. Los Callbacks pueden ser utilizados con esta funcin. Para enviar un formulario completo cuando el contenido cambie utilice $options['with'] = Form.serialize( $('Form ID') )
7.1.2.7 observeForm

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones observeForm(string $form_id, array $options) Similar to observeField(), but operates on an entire form identified by the DOM id $form_id. The supplied $options are the same as observeField(), except the default value of the $options['with'] option evaluates to the serialized (request string) value of the form.
7.1.2.8 autoComplete

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones autoComplete(string $fieldId, string $url, array $options) Renders a text field with $fieldId with autocomplete. The remote action at $url should return a suitable list of autocomplete terms. Often an unordered list is used for this. First, you need to set up a controller action that fetches and organizes the data you'll need for your list, based on user input: 1. function autoComplete() { 2. //Partial strings will come from the autocomplete field as 3. //$this->data['Post']['subject'] 4. $this->set('posts', $this->Post->find('all', array( 5. 'conditions' => array( 6. 'Post.subject LIKE' => $this->data['Post']['subject'].'%' 7. ), 8. 'fields' => array('subject') 9. ))); 10.$this->layout = 'ajax'; 11.} Next, create app/views/posts/auto_complete.ctp that uses that data and creates an unordered list in (X)HTML:

1. 2. 3. 4. 5.

<ul> <?php foreach($posts as $post): ?> <li><?php echo $post['Post']['subject']; ?></li> <?php endforeach; ?> </ul>

Finally, utilize autoComplete() in a view to create your auto-completing form field: 1. <?php echo $form->create('User', array('url' => '/users/index')); ?> 2. <?php echo $ajax->autoComplete('Post.subject', '/posts/autoComplete')?> 3. <?php echo $form->end('View Post')?> Once you've got the autoComplete() call working correctly, use CSS to style the auto-complete suggestion box. You might end up using something similar to the following:
div.auto_complete { position :absolute; width :250px; background-color :white; border :1px solid #888; margin :0px; padding :0px; } li.selected { background-color: #ffb; }

7.1.2.9 isAjax

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones isAjax() Allows you to check if the current request is a Prototype Ajax request inside a view. Returns a boolean. Can be used for presentational logic to show/hide blocks of content.
7.1.2.10 drag & drop

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones drag(string $id, array $options) Makes a Draggable element out of the DOM element specified by $id. For more information on the parameters accepted in $options see http://github.com/madrobby/scriptaculous/wikis/draggable. Common options might include:

$options keys

Description

Sets whether the element should only be draggable by an embedded handle. The value $options['han must be an element reference or element id or a string referencing a CSS class value. dle'] The first child/grandchild/etc. element found within the element that has this CSS class value will be used as the handle. $options['rev If set to true, the element returns to its original position when the drags ends. Revert can ert'] also be an arbitrary function reference, called when the drag ends. $options['con Constrains the drag to either 'horizontal' or 'vertical', leave blank for no constraints. straint'] drop(string $id, array $options) Makes the DOM element specified by $id able to accept dropped elements. Additional parameters can be specified with $options. For more information see http://github.com/madrobby/scriptaculous/wikis/droppables. Common options might include: Description Set to a string or javascript array of strings describing CSS classes that the $options['accept'] droppable element will accept. The drop element will only accept elements of the specified CSS classes. $options['contain The droppable element will only accept the dragged element if it is contained in the ment'] given elements (element ids). Can be a string or a javascript array of id references. $options['overlap' If set to 'horizontal' or 'vertical', the droppable element will only react to a draggable ] element if it is overlapping the droparea by more than 50% in the given axis. $options['onDrop' A javascript call back that is called when the dragged element is dropped on the ] droppable element. dropRemote(string $id, array $options) Makes a drop target that creates an XMLHttpRequest when a draggable element is dropped on it. The $options array for this function are the same as those specified for drop() and link().
7.1.2.11 slider

$options keys

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones slider(string $id, string $track_id, array $options) Creates a directional slider control. For more information see http://wiki.github.com/madrobby/scriptaculous/slider. Common options might include: $options keys $options['axis'] Description Sets the direction the slider will move in. 'horizontal' or 'vertical'. Defaults to

horizontal $options['handleIma The id of the image that represents the handle. This is used to swap out the image ge'] src with disabled image src when the slider is enabled. Used in conjunction with handleDisabled. $options['increment' Sets the relationship of pixels to values. Setting to 1 will make each pixel adjust ] the slider value by one. $options['handleDis The id of the image that represents the disabled handle. This is used to change the abled'] image src when the slider is disabled. Used in conjunction handleImage. $options['change'] JavaScript callback fired when the slider has finished moving, or has its value $options['onChange' changed. The callback function receives the slider's current value as a parameter. ] $options['slide'] JavaScript callback that is called whenever the slider is moved by dragging. It $options['onSlide'] receives the slider's current value as a parameter.
7.1.2.12 editor

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones editor(string $id, string $url, array $options) Creates an in-place editor at DOM id. The supplied $url should be an action that is responsible for saving element data. For more information and demos see http://github.com/madrobby/scriptaculous/wikis/ajax-inplaceeditor. Common options might include: $options keys Description $options['collection Activate the 'collection' mode of in-place editing. $options['collection'] takes an array which is turned into options for the select. To learn more '] about collection see http://github.com/madrobby/scriptaculous/wikis/ajaxinplacecollectioneditor. $options['callback'] A function to execute before the request is sent to the server. This can be used to format the information sent to the server. The signature is function(form, value) $options['okText'] Text of the submit button in edit mode

$options['cancelText The text of the link that cancels editing '] $options['savingText The text shown while the text is sent to the server '] $options['formId'] $options['externalCo ntrol'] $options['rows'] $options['cols'] $options['size'] The row height of the input field The number of columns the text area should span Synonym for cols when using single-line

$options['highlightc The highlight color olor'] $options['highlighte The color which the highlight fades to ndcolor'] $options['savingClas sName'] $options['formClassN ame'] $options['loadingTex t'] $options['loadTextUR L'] Example 1. <div id="in_place_editor_id">Text To Edit</div> 2. <?php 3. echo $ajax->editor( 4. "in_place_editor_id", 5. array( 6. 'controller' => 'Posts', 7. 'action' => 'update_title', 8. $id 9. ), 10.array() 11.);

12.?>
7.1.2.13 sortable

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones sortable(string $id, array $options) Makes a list or group of floated objects contained by $id sortable. The options array supports a number of parameters. To find out more about sortable see http://wiki.github.com/madrobby/scriptaculous/sortable. Common options might include: $options keys Description $options['tag'] Indicates what kind of child elements of the container will be made sortable. Defaults to 'li'. $options['only'] Allows for further filtering of child elements. Accepts a CSS class. $options['overla Either 'vertical' or 'horizontal'. Defaults to vertical. p'] $options['constr Restrict the movement of the draggable elements. accepts 'horizontal' or 'vertical'. aint'] Defaults to vertical. $options['handl Makes the created Draggables use handles, see the handle option on Draggables. e'] $options['onUp Called when the drag ends and the Sortable's order is changed in any way. When date'] dragging from one Sortable to another, the callback is called once on each Sortable. $options['hover Give the created droppable a hoverclass. class'] $options['ghosti If set to true, dragged elements of the sortable will be cloned and appear as a ghost, ng'] instead of directly manipulating the original element. 7.2 Cache Editar Ver slo esta seccin Historia Comparar con el contenido original

El helper Cache permite almacenar temporalmente (caching) layouts y vistas completas, ahorrando tiempo en descargar y retornar algunos datos. El caching de vistas en CakePHP almacena

temporalmente los layouts y vistas utilizando el motor de almacenamiento seleccionado. Es importante notar que el helper de Cache opera de manera diferente a otros helpers. No tiene metodos que se puedan llamar directamente. En vez de eso, una vista es marcada con tags, que permiten decirle cuales bloques no deben ser cacheados. Cuando una URL es requerida, CakePHP verifica si aquel requerimiento esta cacheado.Si lo est, el resto del proceso es saltado. Cualquier bloque no cacheado se procesa normalmente y la vista es entregada. Esto crea grandes ahorros en tiempos de proceso para cada requerimiento para una URL cacheada, asi tambien menos cdigo es ejecutado. Si CakePHP no encuentra una vista cacheada, o el cache ha expirado para la URL requerida, se contina normalmente con el requerimiento.
7.2.1 Generalidades en Caching

Editar Ver slo esta seccin Historia Comparar con el contenido original

El caching tiene como intencin ser un medio de almacenamiento temporal que reduce la carga del servidor. Por ejemplo podras almacenar el resultado de una consulta que requiere mucho tiempo de modo de no realizarla nuevamente en cada actualizacin de la pgina. El Caching no debe utilizarze nunca para almacenar datos en forma permanente. Solo debes cachear elementos que puedan ser eventualmente regenerados si es necesario.
7.2.2 Motores de Cache en Cake

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Lo nuevo en la version 1.2 de CakePHP son varios motores de cache. El helper de cache interactua transparentemente con estos motores, permitiendo almacenar vistas en multiples formas sin preocuparse de las caracteristicas especificas del medio de almacenamiento. La eleccin del motor de cache es controlada a traves del archivo app/config/core.php config. Muchas opciones para cada motor de cache son listados en el archivo de configuracion core.php, mas detalles acerca de cada motor se puede encontrar en la seccion de Caching. File APC XCache El File Engine es el motor por defecto en CakePHP. Escribe archivos planos en el sistema de archivos y cuenta con numerosos parmetros, pero funciona bien con los valores por defecto. EL motor APC implementa el mtodo Alternative PHP Cache. Asi como XCache, este motor almacena codigo ya compilado de PHP. El motor XCache opera en forma similar al APC, pero implementanto el mtodo XCache.

Requiere la autenticacion de usuarios para funcionar apropiadamente. El motor Memcache funciona utilizando un servidor de almacenamiento en memoria, lo Memcache que permite crear objetos cache en la memoria del sistema. Mas informacion acerca de este mtodo puede ser encontrada en php.net y memcached
7.2.3 Configuracion del Cache Helper

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El caching de vistas y el helper de cache tienen varioes elementos de configuracin importantes. Estos se detallan ms abajo. Para usar el cache helper en cualquier vista o controlador, debes primero configurar Configure::Cache.check a true en la linea 80 de core.php. Si no se configura a true, entonces el cache no sera verificado o creado.
7.2.4 Caching en los Controllers

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Cualquier controlador que utilice la funcionalidad de caching necesita incluir el CacheHelper en el arreglo $helpers. 1. var $helpers = array('Cache'); Necesitas ademas indicar cuales acciones necesitan caching, y cuanto tiempo durar cacheada cada accin. Esto se hace a traves de la variable $cacheAction en tus controladores. $cacheAction debera ser configurada como un arreglo el cual contiene las acciones a ser cacheadas y la duracion en segundos que deben permanecer en tal condicion. EL tiempo puede expresarse en formato strtotime(). (ie. "1 hour", o "3 minutes"). Usando como ejemplo ArticlesController, que recibe un gran trfico que necesita cachearse. Por ejemplo, cachear los articulos visitados frecuentemente por diversos periodos de tiempo

1. 2. 3. 4. 5.

var $cacheAction = array( 'view/23/' => 21600, 'view/48/' => 36000, 'view/52' => 48000 );

Hacer caching de una accin completa en este caso un listado de articulos 1. var $cacheAction = array( 2. 'archives/' => '60000' 3. ); Cachear todas las acciones del controlador usando un formato amigable strtotime() para indicar el tiempo de cacheo. 1. var $cacheAction = "1 hour";
7.2.5 Marking Non-Cached Content in Views

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones There will be times when you don't want an entire view cached. For example, certain parts of the page may look different whether a user is currently logged in or browsing your site as a guest. To indicate blocks of content that are not to be cached, wrap them in <cake:nocache> </cake:nocache> like so: 1. 2. 3. 4. 5. 6. 7. <cake:nocache> <?php if ($session->check('User.name')) : ?> Welcome, <?php echo $session->read('User.name')?>. <?php else: ?> <?php echo $html->link('Login', 'users/login')?> <?php endif; ?> </cake:nocache>

It should be noted that once an action is cached, the controller method for the action will not be called otherwise what would be the point of caching the page. Therefore, it is not possible to wrap <cake:nocache> </cake:nocache> around variables which are set from the controller as they will be null.
7.2.6 Clearing the Cache

Traducir Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

It is important to remember that the Cake will clear a cached view if a model used in the cached view is modified. For example, if a cached view uses data from the Post model, and there has been an INSERT, UPDATE, or DELETE query made to a Post, the cache for that view is cleared, and new content is generated on the next request. If you need to manually clear the cache, you can do so by calling Cache::clear(). This will clear all cached data, excluding cached view files. If you need to clear the cached view files, use clearCache(). 7.3 Formularios Editar Ver slo esta seccin Historia Comparar con el contenido original

El FormHelper es una nueva adicin a CakePHP. La mayor parte del trabajo de creacin de formularios recae sobre el uso de esta nueva clase, en lugar de los (ahora obsoletos) mtodos del HtmlHelper. El FormHelper se centra en la creacin de formularios rpidamente, de esta manera agiliza la validacin, el precargado y el diseo de la interfaz. El FormHelper es bastante flexible - este har casi todo automticamente por usted, o si lo desea puede usar mtodos especficos para hacer solo lo que necesite.
7.3.1 Creando Formularios

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El primer mtodo que necesitars para poder aprovecha el FormHelper es create(). Este mtodo se encarga de escribir la etiqueta de apertura del formulario. create(string $modelo = null, array $opciones = array()) Todos los parmetros son opcionales. Si create() es llamado sin parmetros, asume que ests construyendo un formulario que ser enviado al controlador actual, ya sea va la accin add() o edit(). El mtodo por omisin para el envo es POST. El elemento form es regresado con un ID DOM. El ID es generado usando el nombre del modelo y el nombre de la accin del controlador en formato CamelCased. Si fuera a llamar create() dentro de una vista de UsersController, vera algo como lo siguiente en la vista 1. <form id="UserAddForm" method="post" action="/users/add"> Puedes tambin pasar false para el parmetro $modelo. Esto pondr los datos de tu formulario en el array: $this->data (en lugar de ponerlos en en sub-array: $this->data['Model']). Esto

puede ser muy til para formularios cortos que quiz no representen nada en tu base de datos. The create() method allows us to customize much more using the parameters, however. First, you can specify a model name. By specifying a model for a form, you are creating that form's context. All fields are assumed to belong to this model (unless otherwise specified), and all models referenced are assumed to be associated with it. If you do not specify a model, then it assumes you are using the default model for the current controller. 1. <?php echo $form->create('Recipe'); ?> 2. //Output: 3. <form id="RecipeAddForm" method="post" action="/recipes/add"> This will POST the form data to the add() action of RecipesController. However, you can also use the same logic to create an edit form. The FormHelper uses the $this->data property to automatically detect whether to create an add or edit form. If $this->data contains an array element named after the form's model, and that array contains a non-empty value of the model's primary key, then the FormHelper will create an edit form for that record. For example, if we browse to http://site.com/recipes/edit/5, we might get the following: 1. // controllers/recipes_controller.php: 2. <?php 3. function edit($id = null) { 4. if (empty($this->data)) { 5. $this->data = $this->Recipe->findById($id); 6. } else { 7. // Save logic goes here 8. } 9. } 10.?> 11. 12.// views/recipes/edit.ctp: 13.// Since $this->data['Recipe']['id'] = 5, we should get an edit form 14.<?php echo $form->create('Recipe'); ?> 15. 16.//Output: 17.<form id="RecipeEditForm" method="post" action="/recipes/edit/5"> 18.<input type="hidden" name="_method" value="PUT" /> Since this is an edit form, a hidden input field is generated to override the default HTTP method. The $options array is where most of the form configuration happens. This special array can contain a number of different key-value pairs that affect the way the form tag is generated.
7.3.1.1 $options[type]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

This key is used to specify the type of form to be created. Valid values include post, get, file, put and delete. Supplying either post or get changes the form submission method accordingly. 1. <?php echo $this->Form->create('User', array('type' => 'get')); ?> 2. //Output: 3. <form id="UserAddForm" method="get" action="/users/add"> Specifying file changes the form submission method to post, and includes an enctype of multipart/form-data on the form tag. This is to be used if there are any file elements inside the form. The absence of the proper enctype attribute will cause the file uploads not to function. 1. <?php echo $this->Form->create('User', array('type' => 'file')); ?> 2. //Output: 3. <form id="UserAddForm" enctype="multipart/form-data" method="post" action="/users/add"> When using put or delete, your form will be functionally equivalent to a 'post' form, but when submitted, the HTTP request method will be overridden with 'PUT' or 'DELETE', respectively. This allows CakePHP to emulate proper REST support in web browsers.
7.3.1.2 $options[action]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The action key allows you to point the form to a specific action in your current controller. For example, if youd like to point the form to the login() action of the current controller, you would supply an $options array like the following: 1. <?php echo $this->Form->create('User', array('action' => 'login')); ?> 2. //Output: 3. <form id="UserLoginForm" method="post" action="/users/login"> 4. </form>
7.3.1.3 $options[url]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If the desired form action isnt in the current controller, you can specify a URL for the form action using the url key of the $options array. The supplied URL can be relative to your CakePHP application, or can point to an external domain.

1. <?php echo $this->Form->create(null, array('url' => '/recipes/add')); ?> 2. // or 3. <?php echo $this->Form->create(null, array('url' => array('controller' => 'recipes', 'action' => 'add'))); ?> 4. 5. //Output: 6. <form method="post" action="/recipes/add"> 7. <?php echo $this->Form->create(null, array( 8. 'url' => 'http://www.google.com/search', 9. 'type' => 'get' 10.)); ?> 11.//Output: 12.<form method="get" action="http://www.google.com/search"> Also check HtmlHelper::url method for more examples of different types of urls.
7.3.1.4 $options[default]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If default has been set to boolean false, the forms submit action is changed so that pressing the submit button does not submit the form. If the form is meant to be submitted via AJAX, setting default to false suppresses the forms default behavior so you can grab the data and submit it via AJAX instead.
7.3.1.5 $options['inputDefaults']

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones You can declare a set of default options for input() with the inputDefaults key to customize your default input creation. 1. 2. 3. 4. 5. 6. 7. 8. echo $this->Form->create('User', array( 'inputDefaults' => array( 'label' => false, 'div' => false, # define error defaults for the form 'error' => array( 'wrap' => 'span', 'class' => 'my-error-class'

9. ) 10.) 11.)); All inputs created from that point forward would inherit the options declared in inputDefaults. You can override the defaultOptions by declaring the option in the input() call. 1. echo $this->Form->input('password'); // No div, no label 2. echo $this->Form->input('username', array('label' => 'Username')); // has a label element
7.3.2 Closing the Form

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El FormHelper tambien incluye un mtodo end() que completa el cdigo del formulario. A menudo, el mtodo end() solo escribe la etiqueta de cierre del formulario, pero el usar end() tambin hace que el FormHelper inserte los elementos hidden necesarios en el formulario para los mtodos que dependen de este. 1. <?php echo $form->create(); ?> 2. <!-- Form elements go here --> 3. <?php echo $form->end(); ?> Si una cadena es colocada como primer parmetro del end(), el FormHelper agregar un boton submit llamado de esa manera adems de la etiqueta de cierre del formulario. 1. 2. 3. 4. 5. 6. <?php echo $form->end('Finish'); ?> Output: <div class="submit"> <input type="submit" value="Finish" /> </div> </form>

7.3.3 Creando Etiquetas Automagicamente

Editar Ver slo esta seccin Historia Comparar con el contenido original

Primero, demos una mirada a algunos de los mtodos de crecin ms automticos en el FormHelper. El Mtodo principal que veremos es input(). Este mtodo automaticamente inspecciona el modelo del

campo que ha sido proporcionado a fin de crear un elemento de entrada apropiado para ese campo. input(string $fieldName, array $options = array()) Column Type Resulting Form Field string (char, varchar, etc.) text boolean, tinyint(1) checkbox text textarea text, with name of password, passwd, or psword password date day, month, and year selects datetime, timestamp day, month, year, hour, minute, and meridian selects time hour, minute, and meridian selects For example, lets assume that my User model includes fields for a username (varchar), password (varchar), approved (datetime) and quote (text). I can use the input() method of the FormHelper to create appropriate inputs for all of these form fields. <?php echo $form->create(); ?> <?php echo $form->input('username'); //text echo $form->input('password'); //password echo $form->input('approved'); //day, month, year, hour, minute, meridian 6. echo $form->input('quote'); //textarea 7. ?> 8. <?php echo $form->end('Add'); ?> 1. 2. 3. 4. 5. A more extensive example showing some options for a date field: 1. 2. 3. 4. echo $form->input('birth_dt', array( 'label' => 'Date of birth' , 'dateFormat' => 'DMY' , 'minYear' => date('Y') - 70 , 'maxYear' => date('Y') - 18 ));

Besides the specific input options found below you can specify any html attribute (for instance onfocus). For more information on $options and $htmlAttributes see HTML Helper. And to round off, here's an example for creating a hasAndBelongsToMany select. Assume that User hasAndBelongsToMany Group. In your controller, set a camelCase plural variable (group -> groups in this case, or ExtraFunkyModel -> extraFunkyModels) with the select options. In the controller action you would put the following: 1. $this->set('groups', $this->User->Group->find('list')); And in the view a multiple select can be expected with this simple code: 1. echo $form->input('Group'); If you want to create a select field while using a belongsTo- or hasOne-Relation, you can add the following to your Users-controller (assuming your User belongsTo Group): 1. $this->set('groups', $this->User->Group->find('list')); Afterwards, add the following to your form-view: 1. echo $form->input('group_id');

If your model name consists of two or more words, e.g., "UserGroup", when passing the data using set() you should name your data in a pluralised and camelCased format as follows: 1. $this->set('userGroups', $this->UserGroup->find('list')); 2. // or 3. $this->set('reallyInappropriateModelNames', $this>ReallyInappropriateModelName->find('list'));
7.3.3.1 Field naming convention

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The Form helper is pretty smart. Whenever you specify a field name with the form helper methods, it'll automatically use the current model name to build an input with a format like the following: 1. <input type="text" id="ModelnameFieldname" name="data[Modelname] [fieldname]"> You can manually specify the model name by passing in Modelname.fieldname as the first parameter. 1. echo $this->Form->input('Modelname.fieldname'); If you need to specify multiple fields using the same field name, thus creating an array that can be saved in one shot with saveAll(), use the following convention: 1. 2. 3. 4. 5. 6. <?php echo $this->Form->input('Modelname.0.fieldname'); echo $this->Form->input('Modelname.1.fieldname'); ?>

<input type="text" id="Modelname0Fieldname" name="data[Modelname][0][fieldname]"> 7. <input type="text" id="Modelname1Fieldname" name="data[Modelname][1][fieldname]">


7.3.3.2 $options[type]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones You can force the type of an input (and override model introspection) by specifying a type. In addition to the field types found in the table above, you can also create file, and password inputs. 1. <?php echo $this->Form->input('field', array('type' => 'file')); ?> 2. Output:

3. <div class="input"> 4. <label for="UserField">Field</label> 5. <input type="file" name="data[User][field]" value="" id="UserField" /> 6. </div>
7.3.3.3 $options[before], $options[between], $options[separator] and $options[after]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Use these keys if you need to inject some markup inside the output of the input() method. 1. <?php echo $this->Form->input('field', array( 2. 'before' => '--before--', 3. 'after' => '--after--', 4. 'between' => '--between---' 5. ));?> 6. Output: 7. <div class="input"> 8. --before-9. <label for="UserField">Field</label> 10.--between--11.<input name="data[User][field]" type="text" value="" id="UserField" /> 12.--after-13.</div> For radio type input the 'separator' attribute can be used to inject markup to separate each input/label pair. 1. <?php echo $this->Form->input('field', array( 2. 'before' => '--before--', 3. 'after' => '--after--', 4. 'between' => '--between---', 5. 'separator' => '--separator--', 6. 'options' => array('1', '2') 7. ));?> 8. Output: 9. <div class="input"> 10.--before-11.<input name="data[User][field]" type="radio" value="1" id="UserField1" /> 12.<label for="UserField1">1</label> 13.--separator-14.<input name="data[User][field]" type="radio" value="2" id="UserField2" />

15.<label for="UserField2">2</label> 16.--between--17.--after-18.</div> For date and datetime type elements the 'separator' attribute can be used to change the string between select elements. Defaults to '-'.
7.3.3.4 $options[options]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones This key allows you to manually specify options for a select input, or for a radio group. Unless the type is specified as radio, the FormHelper will assume that the target output is a select input. 1. <?php echo $this->Form->input('field', array('options' => array(1,2,3,4,5))); ?> Output:
<div class="input"> <label for="UserField">Field</label> <select name="data[User][field]" id="UserField"> <option value="0">1</option> <option value="1">2</option> <option value="2">3</option> <option value="3">4</option> <option value="4">5</option> </select> </div>

Options can also be supplied as key-value pairs. 1. 2. 3. 4. 5. <?php echo $this->Form->input('field', array('options' => array( 'Value 1'=>'Label 1', 'Value 2'=>'Label 2', 'Value 3'=>'Label 3' ))); ?>

Output:
<div class="input"> <label for="UserField">Field</label> <select name="data[User][field]" id="UserField"> <option value="Value 1">Label 1</option> <option value="Value 2">Label 2</option> <option value="Value 3">Label 3</option> </select> </div>

If you would like to generate a select with optgroups, just pass data in hierarchical format. Works on multiple checkboxes and radio buttons too, but instead of optgroups wraps elements in fieldsets.

1. 2. 3. 4. 5. 6. 7. 8. 9.

<?php echo $this->Form->input('field', array('options' => array( 'Label1' => array( 'Value 1'=>'Label 1', 'Value 2'=>'Label 2' ), 'Label2' => array( 'Value 3'=>'Label 3' ) ))); ?>

Output:
<div class="input"> <label for="UserField">Field</label> <select name="data[User][field]" id="UserField"> <optgroup label="Label1"> <option value="Value 1">Label 1</option> <option value="Value 2">Label 2</option> </optgroup> <optgroup label="Label2"> <option value="Value 3">Label 3</option> </optgroup> </select> </div>

7.3.3.5 $options[multiple]

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Si multiple es puesto a true para una entrada de tipo select, el select admitir multiples selecciones. Alternativamente, poniendo multiple igual a checkbox la salida ser una lista de checkboxes relacionados. 1. $form->input('Modelo.campo', array( 'type' => 'select', 'multiple' => true )); 2. $form->input('Modelo.campo', array( 'type' => 'select', 'multiple' => 'checkbox' ));
7.3.3.6 $options[maxLength]

Traducir Ver slo esta seccin Historia

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Defines the maximum number of characters allowed in a text input.
7.3.3.7 $options[div]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Use this option to set attributes of the input's containing div. Using a string value will set the div's class name. An array will set the div's attributes to those specified by the array's keys/values. Alternatively, you can set this key to false to disable the output of the div. Setting the class name: 1. echo $this->Form->input('User.name', array('div' => 'class_name')); Output:
<div class="class_name"> <label for="UserName">Name</label> <input name="data[User][name]" type="text" value="" id="UserName" /> </div>

Setting multiple attributes: 1. echo $this->Form->input('User.name', array('div' => array('id' => 'mainDiv', 'title' => 'Div Title', 'style' => 'display:block'))); Output:
<div class="input text" id="mainDiv" title="Div Title" style="display:block"> <label for="UserName">Name</label> <input name="data[User][name]" type="text" value="" id="UserName" /> </div>

Disabling div output: 1. <?php echo $this->Form->input('User.name', array('div' => false));?> Output:
<label for="UserName">Name</label> <input name="data[User][name]" type="text" value="" id="UserName" />

7.3.3.8 $options[label]

Traducir Ver slo esta seccin Historia

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Set this key to the string you would like to be displayed within the label that usually accompanies the input. 1. <?php echo $this->Form->input( 'User.name', array( 'label' => 'The User Alias' ) );?> Output:
<div class="input"> <label for="UserName">The User Alias</label> <input name="data[User][name]" type="text" value="" id="UserName" /> </div>

Alternatively, set this key to false to disable the output of the label. 1. <?php echo $this->Form->input( 'User.name', array( 'label' => false ) ); ?> Output:
<div class="input"> <input name="data[User][name]" type="text" value="" id="UserName" /> </div>

Set this to an array to provide additional options for the label element. If you do this, you can use a text key in the array to customize the label text. 1. <?php echo $this->Form->input( 'User.name', array( 'label' => array('class' => 'thingy', 'text' => 'The User Alias') ) ); ?> Output:
<div class="input"> <label for="UserName" class="thingy">The User Alias</label> <input name="data[User][name]" type="text" value="" id="UserName" /> </div>

7.3.3.9 $options['legend']

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Some inputs like radio buttons will be automatically wrapped in a fieldset with a legend title derived from the fields name. The title can be overridden with this option. Setting this option to false will completely eliminate the fieldset.
7.3.3.10 $options[id]

Traducir Ver slo esta seccin

Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Set this key to force the value of the DOM id for the input.
7.3.3.11 $options['error']

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Using this key allows you to override the default model error messages and can be used, for example, to set i18n messages. It has a number of suboptions which control the wrapping element, wrapping element class name, and whether HTML in the error message will be escaped. To disable error message output set the error key to false. 1. $this->Form->input('Model.field', array('error' => false)); To modify the wrapping element type and its class, use the following format: 1. $this->Form->input('Model.field', array('error' => array('wrap' => 'span', 'class' => 'bzzz'))); To prevent HTML being automatically escaped in the error message output, set the escape suboption to false: 1. $this->Form->input('Model.field', array('error' => array('escape' => false))); To override the model error messages use an associate array with the keyname of the validation rule: 1. $this->Form->input('Model.field', array('error' => array('tooShort' => __('This is not long enough', true) ))); As seen above you can set the error message for each validation rule you have in your models. In addition you can provide i18n messages for your forms.
7.3.3.12 $options['default']

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Used to set a default value for the input field. The value is used if the data passed to the form does not contain a value for the field (or if no data is passed at all). Example usage: 1. <?php 2. echo $this->Form->input('ingredient',

array('default'=>'Sugar')); 3. ?> Example with select field (Size "Medium" will be selected as default): 1. <?php 2. $sizes = array('s'=>'Small', 'm'=>'Medium', 'l'=>'Large'); 3. echo $this->Form->input('size', array('options'=>$sizes, 'default'=>'m')); 4. ?> You cannot use default to check a checkbox - instead you might set the value in $this->data in your controller, $this->Form->data in your view, or set the input option checked to true. Date and datetime fields' default values can be set by using the 'selected' key.
7.3.3.13 $options[selected]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Used in combination with a select-type input (i.e. For types select, date, time, datetime). Set selected to the value of the item you wish to be selected by default when the input is rendered. 1. echo $this->Form->input('close_time', array('type' => 'time', 'selected' => '13:30:00')); The selected key for date and datetime inputs may also be a UNIX timestamp.
7.3.3.14 $options[rows], $options[cols]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones These two keys specify the number of rows and columns in a textarea input. 1. echo $this->Form->input('textarea', array('rows' => '5', 'cols' => '5')); Output: 1. <div class="input text"> 2. <label for="FormTextarea">Textarea</label> 3. <textarea name="data[Form][textarea]" cols="5" rows="5" id="FormTextarea" > 4. </textarea> 5. </div>

7.3.3.15 $options[empty]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones If set to true, forces the input to remain empty. When passed to a select list, this creates a blank option with an empty value in your drop down list. If you want to have a empty value with text displayed instead of just a blank option, pass in a string to empty. 1. <?php echo $this->Form->input('field', array('options' => array(1,2,3,4,5), 'empty' => '(choose one)')); ?> Output:
<div class="input"> <label for="UserField">Field</label> <select name="data[User][field]" id="UserField"> <option value="">(choose one)</option> <option value="0">1</option> <option value="1">2</option> <option value="2">3</option> <option value="3">4</option> <option value="4">5</option> </select> </div>

If you need to set the default value in a password field to blank, use 'value' => '' instead. Options can also supplied as key-value pairs.
7.3.3.16 $options[timeFormat]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Used to specify the format of the select inputs for a time-related set of inputs. Valid values include 12, 24, and none.
7.3.3.17 $options[dateFormat]

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Used to specify the format of the select inputs for a date-related set of inputs. Valid values include

DMY, MDY, YMD, and NONE.


7.3.3.18 $options['minYear'], $options['maxYear']

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Used in combination with a date/datetime input. Defines the lower and/or upper end of values shown in the years select field.
7.3.3.19 $options['interval']

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones This option specifies the number of minutes between each option in the minutes select box. 1. <?php echo $this->Form->input('Model.time', array('type' => 'time', 'interval' => 15)); ?> Would create 4 options in the minute select. One for each 15 minutes.
7.3.3.20 $options['class']

Traducir Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones You can set the classname for an input field using $options['class'] 1. echo $this->Form->input('title', array('class' => 'customclass'));
7.3.3.21 $options['hiddenField']

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones For certain input types (checkboxes, radios) a hidden input is created so that the key in $this->data will exist even without a value specified.

1. <input type="hidden" name="data[Post][Published]" id="PostPublished_" value="0" /> 2. <input type="checkbox" name="data[Post][Published]" value="1" id="PostPublished" /> This can be disabled by setting the $options['hiddenField'] = false. 1. echo $this->Form->checkbox('published', array('hiddenField' => false)); Which outputs: 1. <input type="checkbox" name="data[Post][Published]" value="1" id="PostPublished" /> If you want to create multiple blocks of inputs on a form that are all grouped together, you should use this parameter on all inputs except the first. If the hidden input is on the page in multiple places, only the last group of input's values will be saved In this example, only the tertiary colors would be passed, and the primary colors would be overridden 1. <h2>Primary Colors</h2> 2. <input type="hidden" name="data[Color][Color]" id="Colors_" value="0" /> 3. <input type="checkbox" name="data[Color][Color][]" value="5" id="ColorsRed" /> 4. <label for="ColorsRed">Red</label> 5. <input type="checkbox" name="data[Color][Color][]" value="5" id="ColorsBlue" /> 6. <label for="ColorsBlue">Blue</label> 7. <input type="checkbox" name="data[Color][Color][]" value="5" id="ColorsYellow" /> 8. <label for="ColorsYellow">Yellow</label> 9. <h2>Tertiary Colors</h2> 10.<input type="hidden" name="data[Color][Color]" id="Colors_" value="0" /> 11.<input type="checkbox" name="data[Color][Color][]" value="5" id="ColorsGreen" /> 12.<label for="ColorsGreen">Green</label> 13.<input type="checkbox" name="data[Color][Color][]" value="5" id="ColorsPurple" /> 14.<label for="ColorsPurple">Purple</label> 15.<input type="checkbox" name="data[Addon][Addon][]" value="5" id="ColorsOrange" /> 16.<label for="ColorsOrange">Orange</label> Disabling the 'hiddenField' on the second input group would prevent this behavior
7.3.4 File Fields

Traducir Ver slo esta seccin Historia

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones To add a file upload field to a form, you must first make sure that the form enctype is set to "multipart/form-data", so start off with a create function such as the following. 1. echo $this->Form->create('Document', array('enctype' => 'multipart/form-data') ); 2. // OR 3. echo $this->Form->create('Document', array('type' => 'file')); Next add either of the two lines to your form view file. 1. echo $this->Form->input('Document.submittedfile', array('between'=>'<br />','type'=>'file')); 2. // or 3. echo $this->Form->file('Document.submittedfile'); Due to the limitations of HTML itself, it is not possible to put default values into input fields of type 'file'. Each time the form is displayed, the value inside will be empty. Upon submission, file fields provide an expanded data array to the script receiving the form data. For the example above, the values in the submitted data array would be organized as follows, if the CakePHP was installed on a Windows server. 'tmp_name' will have a different path in a Unix environment. 1. 2. 3. 4. 5. 6. 7. $this->data['Document']['submittedfile'] = array( 'name' => conference_schedule.pdf 'type' => application/pdf 'tmp_name' => C:/WINDOWS/TEMP/php1EE.tmp 'error' => 0 'size' => 41737 );

This array is generated by PHP itself, so for more detail on the way PHP handles data passed via file fields read the PHP manual section on file uploads.
7.3.4.1 Validating Uploads

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Below is an example validation method you could define in your model to validate whether a file has been successfully uploaded. 1. // Based on comment 8 from: http://bakery.cakephp.org/articles/view/improved-advancevalidation-with-parameters 2. function isUploadedFile($params){ 3. $val = array_shift($params); 4. if ((isset($val['error']) && $val['error'] == 0) ||

5. 6. 7. 8. 9.

(!empty( $val['tmp_name']) && $val['tmp_name'] != 'none')) { return is_uploaded_file($val['tmp_name']); } return false; }

7.3.5 Form Element-Specific Methods

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The rest of the methods available in the FormHelper are for creating specific form elements. Many of these methods also make use of a special $options parameter. In this case, however, $options is used primarily to specify HTML tag attributes (such as the value or DOM id of an element in the form). 1. <?php echo $this->Form->text('username', array('class' => 'users')); ?> Will output:
<input name="data[User][username]" type="text" class="users" id="UserUsername" />

7.3.5.1 checkbox

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones checkbox(string $fieldName, array $options) Creates a checkbox form element. This method also generates an associated hidden form input to force the submission of data for the specified field. 1. <?php echo $this->Form->checkbox('done'); ?> Will output:
<input type="hidden" name="data[User][done]" value="0" id="UserDone_" /> <input type="checkbox" name="data[User][done]" value="1" id="UserDone" />

It is possible to specify the value of the checkbox by using the $options array: 1. <?php echo $this->Form->checkbox('done', array('value' => 555)); ?> Will output:
<input type="hidden" name="data[User][done]" value="0" id="UserDone_" /> <input type="checkbox" name="data[User][done]" value="555" id="UserDone" />

If you don't want the Form helper to create a hidden input: 1. <?php echo $this->Form->checkbox('done', array('hiddenField' => false)); ?> Will output:
<input type="checkbox" name="data[User][done]" value="1" id="UserDone" />

7.3.5.2 button

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones button(string $title, array $options = array()) Creates an HTML button with the specified title and a default type of "button". Setting $options['type'] will output one of the three possible button types: 1. submit: Same as the $this->Form->submit method - (the default). 2. reset: Creates a form reset button. 3. button: Creates a standard push button. 1. <?php 2. echo $this->Form->button('A Button'); 3. echo $this->Form->button('Another Button', array('type'=>'button')); 4. echo $this->Form->button('Reset the Form', array('type'=>'reset')); 5. echo $this->Form->button('Submit Form', array('type'=>'submit')); 6. ?> Will output:
<button <button <button <button type="submit">A Button</button> type="button">Another Button</button> type="reset">Reset the Form</button> type="submit">Submit Form</button>

The button input type allows for a special $option attribute called 'escape' which accepts a bool and determines whether to HTML entity encode the $title of the button. Defaults to false. 1. <?php 2. echo $this->Form->button('Submit Form', array('type'=>'submit','escape'=>true)); 3. ?>
7.3.5.3 year

Traducir Ver slo esta seccin

Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones year(string $fieldName, int $minYear, int $maxYear, mixed $selected, array $attributes) Creates a select element populated with the years from $minYear to $maxYear, with the $selected year selected by default. HTML attributes may be supplied in $attributes. If $attributes['empty'] is false, the select will not include an empty option. 1. <?php 2. echo $this->Form->year('purchased',2000,date('Y')); 3. ?> Will output:
<select <option <option <option <option <option <option <option <option name="data[User][purchased][year]" id="UserPurchasedYear"> value=""></option> value="2009">2009</option> value="2008">2008</option> value="2007">2007</option> value="2006">2006</option> value="2005">2005</option> value="2004">2004</option> value="2003">2003</option>

<option value="2002">2002</option> <option value="2001">2001</option> <option value="2000">2000</option> </select>

7.3.5.4 month

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones month(string $fieldName, mixed $selected, array $attributes) Creates a select element populated with month names. 1. <?php 2. echo $this->Form->month('mob'); 3. ?> Will output:
<select <option <option <option <option <option name="data[User][mob][month]" id="UserMobMonth"> value=""></option> value="01">January</option> value="02">February</option> value="03">March</option> value="04">April</option>

<option value="05">May</option> <option value="06">June</option> <option value="07">July</option> <option value="08">August</option> <option value="09">September</option> <option value="10">October</option> <option value="11">November</option> <option value="12">December</option> </select>

You can pass in your own array of months to be used by setting the 'monthNames' attribute, or have months displayed as numbers by passing false. (Note: the default months are internationalized and can be translated using localization.) 1. <?php 2. echo $this->Form->month('mob', null, array('monthNames' => false)); 3. ?>
7.3.5.5 dateTime

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones dateTime($fieldName, $dateFormat = 'DMY', $timeFormat = '12', $selected = null, $attributes = array()) Creates a set of select inputs for date and time. Valid values for $dateformat are DMY, MDY, YMD or NONE. Valid values for $timeFormat are 12, 24, and null. You can specify not to display empty values by setting "array('empty' => false)" in the attributes parameter. You also can pre-select the current datetime by setting $selected = null and $attributes = array("empty" => false).
7.3.5.6 day

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones day(string $fieldName, mixed $selected, array $attributes) Creates a select element populated with the (numerical) days of the month. To create an empty option with prompt text of your choosing (e.g. the first option is 'Day'), you can supply the text as the final parameter as follows: 1. <?php 2. echo $this->Form->day('created');

3. ?> Will output:


<select name="data[User][created][day]" id="UserCreatedDay"> <option value=""></option> <option value="01">1</option> <option value="02">2</option> <option value="03">3</option> ... <option value="31">31</option> </select>

7.3.5.7 hour

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones hour(string $fieldName, boolean $format24Hours, mixed $selected, array $attributes) Creates a select element populated with the hours of the day.
7.3.5.8 minute

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones minute(string $fieldName, mixed $selected, array $attributes) Creates a select element populated with the minutes of the hour. One of the possible values for $attributes is called 'interval'. To display an automagic select menu in 15-minute increments, add the following in the attributes array: 1. $this->Form->minute('example_time_field', null, array('interval' => 15));
7.3.5.9 meridian

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones meridian(string $fieldName, mixed $selected, array $attributes) Creates a select element populated with am and pm.

7.3.5.10 error

Traducir Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones error(string $fieldName, mixed $text, array $options) Shows a validation error message, specified by $text, for the given field, in the event that a validation error has occurred. Options: 'escape' bool Whether or not to html escape the contents of the error. 'wrap' mixed Whether or not the error message should be wrapped in a div. If a string, will be used as the HTML tag to use. 'class' string The classname for the error message
7.3.5.11 file

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones file(string $fieldName, array $options) Creates a file input. 1. 2. 3. 4. <?php echo $this->Form->create('User',array('type'=>'file')); echo $this->Form->file('avatar'); ?>

Will output:
<form enctype="multipart/form-data" method="post" action="/users/add"> <input name="data[User][avatar]" value="" id="UserAvatar" type="file">

When using $this->Form->file(), remember to set the form encoding-type, by setting the type option to 'file' in $this->Form->create()
7.3.5.12 hidden

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

hidden(string $fieldName, array $options) Creates a hidden form input. Example: 1. <?php 2. echo $this->Form->hidden('id'); 3. ?> Will output:
<input name="data[User][id]" value="" id="UserId" type="hidden">

7.3.5.13 isFieldError

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones isFieldError(string $fieldName) Returns true if the supplied $fieldName has an active validation error. 1. 2. 3. 4. 5. <?php if ($this->Form->isFieldError('gender')){ echo $this->Form->error('gender'); } ?>

When using $this->Form->input(), errors are rendered by default.


7.3.5.14 label

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones label(string $fieldName, string $text, array $attributes) Creates a label tag, populated with $text. 1. <?php 2. echo $this->Form->label('status'); 3. ?> Will output:
<label for="UserStatus">Status</label>

7.3.5.15 password

Traducir

Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones password(string $fieldName, array $options) Creates a password field. 1. <?php 2. echo $this->Form->password('password'); 3. ?> Will output:
<input name="data[User][password]" value="" id="UserPassword" type="password">

7.3.5.16 radio

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones radio(string $fieldName, array $options, array $attributes) Creates a radio button input. Use $attributes['value'] to set which value should be selected default. Use $attributes['separator'] to specify HTML in between radio buttons (e.g. <br />). Radio elements are wrapped with a label and fieldset by default. Set $attributes['legend'] to false to remove them. 1. 2. 3. 4. 5. <?php $options=array('M'=>'Male','F'=>'Female'); $attributes=array('legend'=>false); echo $this->Form->radio('gender',$options,$attributes); ?>
name="data[User][gender]" id="UserGender_" value="" type="hidden"> name="data[User][gender]" id="UserGenderM" value="M" type="radio"> for="UserGenderM">Male</label> name="data[User][gender]" id="UserGenderF" value="F" type="radio"> for="UserGenderF">Female</label>

Will output:
<input <input <label <input <label

If for some reason you don't want the hidden input, setting $attributes['value'] to a selected value or boolean false will do just that.
7.3.5.17 select

Traducir

Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones select(string $fieldName, array $options, mixed $selected, array $attributes) Creates a select element, populated with the items in $options, with the option specified by $selected shown as selected by default. If you wish to display your own default option, add your string value to the 'empty' key in the $attributes variable, or set it to false to turn off the default empty option 1. 2. 3. 4. <?php $options = array('M' => 'Male', 'F' => 'Female'); echo $this->Form->select('gender', $options) ?>

Will output:
<select name="data[User][gender]" id="UserGender"> <option value=""></option> <option value="M">Male</option> <option value="F">Female</option> </select>

The select input type allows for a special $option attribute called 'escape' which accepts a bool and determines whether to HTML entity encode the contents of the select options. Defaults to true. 1. <?php 2. $options = array('M' => 'Male', 'F' => 'Female'); 3. echo $this->Form->select('gender', $options, null, array('escape' => false)); 4. ?>
7.3.5.18 submit

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones submit(string $caption, array $options) Creates a submit button with caption $caption. If the supplied $caption is a URL to an image (it contains a . character), the submit button will be rendered as an image. It is enclosed between div tags by default; you can avoid this by declaring $options['div'] = false. 1. <?php 2. echo $this->Form->submit();

3. ?> Will output:


<div class="submit"><input value="Submit" type="submit"></div>

You can also pass a relative or absolute url to an image for the caption parameter instead of caption text. 1. <?php 2. echo $this->Form->submit('ok.png'); 3. ?> Will output:
<div class="submit"><input type="image" src="/img/ok.png"></div>

7.3.5.19 text

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones text(string $fieldName, array $options) Creates a text input field. 1. <?php 2. echo $this->Form->text('first_name'); 3. ?> Will output:
<input name="data[User][first_name]" value="" id="UserFirstName" type="text">

7.3.5.20 textarea

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones textarea(string $fieldName, array $options) Creates a textarea input field. 1. <?php 2. echo $this->Form->textarea('notes'); 3. ?> Will output:
<textarea name="data[User][notes]" id="UserNotes"></textarea>

The textarea input type allows for the $options attribute of 'escape' which determines whether or not the contents of the textarea should be escaped. Defaults to true. <?php echo $this->Form->textarea('notes', array('escape' => false)); // OR.... echo $this->Form->input('notes', array('type' => 'textarea', 'escape' => false)); 5. ?> 1. 2. 3. 4.
7.3.6 1.3 improvements

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The FormHelper is one of the most frequently used classes in CakePHP, and has had several improvements made to it. Entity depth limitations In 1.2 there was a hard limit of 5 nested keys. This posed significant limitations on form input creation in some contexts. In 1.3 you can now create infinitely nested form element keys. Validation errors and value reading for arbitrary depths has also been added. Model introspection Support for adding 'required' classes, and properties like maxlength to hasMany and other associations has been improved. In the past only 1 model and a limited set of associations would be introspected. In 1.3 models are introspected as needed, providing validation and additional information such as maxlength. Default options for input() In the past if you needed to use 'div' => false, or 'label' => false you would need to set those options on each and every call to input(). Instead in 1.3 you can declare a set of default options for input() with the inputDefaults key. 1. 2. 3. 4. 5. 6. echo $this->Form->create('User', array( 'inputDefaults' => array( 'label' => false, 'div' => false ) ));

All inputs created from that point forward would inherit the options declared in inputDefaults. You can override the defaultOptions by declaring the option in the input() call. 1. echo $this->Form->input('password'); // No div, no label 2. echo $this->Form->input('username', array('label' => 'Username')); // has a label element Omit attributes

You can now set any attribute key to null or false in an options/attributes array to omit that attribute from a particular html tag. 1. echo $this->Form->input('username', array( 2. 'div' => array('class' => false) 3. )); // Omits the 'class' attribute added by default to div tag Accept-charset Forms now get an accept-charset set automatically, it will match the value of App.encoding, it can be overridden or removed using the 'encoding' option when calling create(). 1. // To remove the accept-charset attribute. 2. echo $this->Form->create('User', array('encoding' => null)); Removed parameters Many methods such as select, year, month, day, hour, minute, meridian and datetime took a $showEmpty parameter, these have all been removed and rolled into the $attributes parameter using the 'empty' key. Default url The default url for forms either was add or edit depending on whether or not a primary key was detected in the data array. In 1.3 the default url will be the current action, making the forms submit to the action you are currently on. Disabling hidden inputs for radio and checkbox The automatically generated hidden inputs for radio and checkbox inputs can be disabled by setting the 'hiddenField' option to false. button() button() now creates button elements, these elements by default do not have html entity encoding enabled. You can enable html escaping using the escape option. The former features of FormHelper::button have been moved to FormHelper::submit. submit() Due to changes in button(), submit() can now generate reset, and other types of input buttons. Use the type option to change the default type of button generated. In addition to creating all types of buttons, submit() has before and after options that behave exactly like their counterparts in input(). $options['format'] The HTML generated by the form helper is now more flexible than ever before. The $options parameter to Form::input() now supports an array of strings describing the template you would like said element to follow. It's just been recently added to SCM, and has a few bugs for non PHP 5.3 users, but should be quite useful for all. The supported array keys are array('before', 'input', 'between', 'label', 'after', 'error'). 7.4 HTML Editar Ver slo esta seccin

Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El rol del HtmlHelper de CakePHP es hacer los tags referentes a HTML y sus opciones simples, rpidas, y ms resistentes al cambio. Usando este ayudante pondremos ms luz sobre tu aplicacin, y ms flexibilidad en cuanto a donde se encuentre en relacin al dominio principal. El rol del HtmlHelper ha cambiado significativamente desde CakePHP 1.1. Los metodos relacionados a Form ya no se usan y han sido movidos al nuevo FormHelper. Si tu estas buscando ayuda para los formularios HTML, Revisa lo nuevo de FormHelper. Antes de dar un vistaso a los metodos de HtmlHelper, vas a necesitar conocimientos sobre configuracin y usos en las situaciones que te puede ayudar esta clase. En primer lugar, en un esfuerzo para aliviar a aquellos que gustan de usar las etiquetas cortas (<?= ?>) o muchas llamadas a echo() en el codigo de sus vistas todos los metodos del HtmlHelper son pasados por el metodo output(). Si tu deseas activar automticamente la salida para generar HTML con el ayudante simplemente implementa output() en tu AppHelper. 1. function output($cadena) { 2. echo $cadena; 3. } Haciendo esto no necesitars agregar llamadas a echo en el codigo de tus vistas. Muchos metodos HtmlHelper incluyen parametros $htmlAttributes, esto te permite hilvanar cualquier atributo extra en tus tags. Aqu hay algunos ejemplos de como se usan los parmetros $htmlAttributes 1. 2. 3. 4. Atributos Deseados: <tag class="algunaClase" /> Arreglo de Parametros: array('class'=>'algunaClase') Atributos Deseados: <tag name="foo" value="bar" /> Arreglo de Parametros: array('name' => 'foo', 'value' => 'bar')

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

Editar Ver slo esta seccin Historia Comparar con el contenido original

La tarea ms importante que realiza el HtmlHelper (Ayudante Html) es la creacin de etiquetas html bien formadas. No tengas miedo de usarlo a menudo - puedes almacenar en cach las vistas en CakePHP con el fin de ahorrar unos pocos de ciclos de CPU cuando las vistas estn siendo renderizadas y entregadas. Esta seccin cubrir algunos de los mtodos del HtmlHelper y cmo usarlos.

7.4.1.1 charset

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones charset(string $charset=null) Usada para crear metadatos que especificarn la codificacin de los caracteres del documento. El valor por defecto es UTF-8. 1. <?php echo $html->charset(); ?> Generar como salida:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

O sino tambien: 1. <?php echo $html->charset('ISO-8859-1'); ?> Generar como salida:


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

7.4.1.2 css

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones css(mixed $path, string $rel = null, array $htmlAttributes = array(), boolean $inline = true) Crea un enlace a una o ms hojas de estilos CSS. Si $inline est en false, los tags de enlace son agregados en la variable $scripts_for_layout, la cual puedes imprimir dentro del tag head del documento. Este mtodo de inclusin de CSS asume que el archivo CSS especificado est en el directorio /app/webroot/css.

1. <?php echo $html->css('forms'); ?> Har la salida:


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

El primer parmetro puede ser un arreglo para incluir varios archivos. 1. <?php echo $html->css(array('forms','tables','menu')); ?> Har la salida:
<link rel="stylesheet" type="text/css" href="/es/css/forms.css" /> <link rel="stylesheet" type="text/css" href="/es/css/tables.css" /> <link rel="stylesheet" type="text/css" href="/es/css/menu.css" />

7.4.1.3 meta

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones meta(string $type, string $url = null, array $attributes = array(), boolean $inline = true) Este mtodo es til para vincular a los recursos externos como los feeds RSS / Atom y favicons. Como CSS (), puede especificar si desea o no que esta etiqueta a aparezca en la lnea o en la etiqueta de la cabecera con el cuarto parmetro. Si establece el atributo "type" usando el parmetro $htmlAttributes, CakePHP contiene algunos atajos: type valor traducido html text/html rss application/rss+xml atom application/atom+xml icon image/x-icon 1. <?php echo $html->meta( 2. 'favicon.ico', 3. '/favicon.ico', 4. array('type' => 'icon') 5. );?> //Salida (saltos de linea aadidos) </p> 6. <link 7. href="http://example.com/favicon.ico" 8. title="favicon.ico" type="image/x-icon" 9. rel="alternate"

10./> 11.<?php echo $html->meta( 12.'Comments', 13.'/comments/index.rss', 14.array('type' => 'rss')); 15.?> 16.//Salida (saltos de linea aadidos) 17.<link 18.href="http://example.com/comments/index.rss" 19.title="Comments" 20.type="application/rss+xml" 21.rel="alternate" 22./> Este mtodo tambin puede utilizarse para agregar las etiquetas "meta" para las palabras claves y las descripciones. Ejemplo: <?php echo $html->meta( 'keywords', 'ingrese las palabas claves aqu' );?> //Salida <meta name="keywords" content="ingrese las palabas claves aqu"/> 6. // 7. <?php echo $html->meta( 8. 'description', 9. 'ingrese alguna descripcion meta aqu' 10.);?> 11.//Salida <meta name="description" content="ingrese alguna descripcion meta aqu"/> 1. 2. 3. 4. 5. Si deseas aadir una etiqueta meta personalizada en el primer parmetro se debe establecer una matriz. Para una salida de la etiqueta "robots noindex" debe utilizar el siguiente cdigo: 1. echo $html->meta(array('name' => 'robots', 'content' => 'noindex'));
7.4.1.4 docType

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones docType(string $type = 'xhtml-strict') Returns a (X)HTML doctype tag. Supply the doctype according to the following table: type html translated value text/html

type translated value html4-strict HTML4 Strict html4-trans HTML4 Transitional html4-frame HTML4 Frameset xhtml-strict XHTML1 Strict xhtml-trans XHTML1 Transitional xhtml-frame XHTML1 Frameset xhtml11 XHTML 1.1 1. <?php echo $this->Html->docType(); ?> 2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 3. <?php echo $this->Html->docType('html4-trans'); ?> 4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
7.4.1.5 style

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones style(array $data, boolean $oneline = true) Construye una definicin de estilo CSS basada en las claves y valores del vector pasado al metodo. Especialmente util si tu archivo CSS es dinamico. 1. 2. 3. 4. 5. <?php echo $html->style(array( 'background' => '#633', 'border-bottom' => '1px solid #000', 'padding' => '10px' )); ?>

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

7.4.1.6 image

Editar Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones image(string $path, array $htmlAttributes = array()) Crea una etiqueta de imagen, la ruta especificada ser relativa a /app/webroot/img/. 1. <?php echo $html->image('cake_logo.png', array('alt' => 'CakePHP'))?> Mostrar:
<img src="/img/cake_logo.png" alt="CakePHP" />

Si desea crear un link asociado a la imagen especifique el link de destino usando la opcin url option en $htmlAttributes. 1. 2. 3. 4. <?php echo $html->image("recipes/6.jpg", array( "alt" => "Bizcochos", 'url' => array('controller' => 'recipes', 'action' => 'view', 6) )); ?>

Mostrar:
<a href="/es/recipes/view/6"> <img src="/img/recipes/6.jpg" alt="Bizcochos" /> </a>

7.4.1.7 link

Traducir Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones link(string $title, mixed $url = null, array $options = array(), string $confirmMessage = false) General purpose method for creating HTML links. Use $options to specify attributes for the element and whether or not the $title should be escaped. 1. <?php echo $this->Html->link('Enter', '/pages/home', array('class' => 'button', 'target' => '_blank')); ?> Will output:

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

Specify $confirmMessage to display a javascript confirm() dialog. 1. 2. 3. 4. 5. 6. <?php echo $this->Html->link( 'Delete', array('controller' => 'recipes', 'action' => 'delete', 6), array(), "Are you sure you wish to delete this recipe?" );?>

Will output:
<a href="/es/recipes/delete/6" onclick="return confirm('Are you sure you wish to delete this recipe?');">Delete</a>

Query strings can also be created with link(). 1. 2. 3. 4. 5. 6. <?php echo $this->Html->link('View image', array( 'controller' => 'images', 'action' => 'view', 1, '?' => array('height' => 400, 'width' => 500)) );

Will output:
<a href="/es/images/view/1?height=400&width=500">View image</a>

HTML special characters in $title will be converted to HTML entities. To disable this conversion, set the escape option to false in the $options array. 1. 2. 3. 4. 5. 6. 7. <?php echo $this->Html->link( $this->Html->image("recipes/6.jpg", array("alt" => "Brownies")), "recipes/view/6", array('escape' => false) ); ?>

Will output:
<a href="/es/recipes/view/6"> <img src="/img/recipes/6.jpg" alt="Brownies" /> </a>

Also check HtmlHelper::url method for more examples of different types of urls.

7.4.1.8 tag

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones tag(string $tag, string $text, array $htmlAttributes) Returns text wrapped in a specified tag. If no text is specified then only the opening <tag> is returned. 1. <?php echo $this->Html->tag('span', 'Hello World.', array('class' => 'welcome'));?> 2. //Output 3. <span class="welcome">Hello World</span> 4. //No text specified. 5. <?php echo $this->Html->tag('span', null, array('class' => 'welcome'));?> 6. //Output 7. <span class="welcome"> Text is not escaped by default but you may use $htmlOptions['escape'] = true to escape your text. This replaces a fourth parameter boolean $escape = false that was available in previous versions.
7.4.1.9 div

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones div(string $class, string $text, array $options) Used for creating div-wrapped sections of markup. The first parameter specifies a CSS class, and the second is used to supply the text to be wrapped by div tags. If the last parameter has been set to true, $text will be printed HTML-escaped. 1. <?php echo $this->Html->div('error', 'Please enter your credit card number.');?> 2. 3. //Output 4. <div class="error">Please enter your credit card number.</div> If $text is set to null, only an opening div tag is returned. 1. <?php echo $this->Html->div('', null, array('id' => 'register'));?> 2.

3. //Output 4. <div id="register" class="register">


7.4.1.10 para

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones para(string $class, string $text, array $htmlAttributes, boolean $escape = false) Returns a text wrapped in a CSS-classed <p> tag. If no text is supplied, only a starting <p> tag is returned. 1. <?php echo $this->Html->para(null, 'Hello World.');?> 2. //Output 3. <p>Hello World.</p>
7.4.1.11 script

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones script(mixed $url, mixed $options) Creates link(s) to a javascript file. If key inline is set to false in $options, the link tags are added to the $scripts_for_layout variable which you can print inside the head tag of the document. Include a script file into the page. $options['inline'] controls whether or not a script should be returned inline or added to $scripts_for_layout. $options['once'] controls, whether or not you want to include this script once per request or more than once. You can also use $options to set additional properties to the generated script tag. If an array of script tags is used, the attributes will be applied to all of the generated script tags. This method of javascript file inclusion assumes that the javascript file specified resides inside the /app/webroot/js directory. 1. <?php echo $this->Html->script('scripts'); ?> Will output:
<script type="text/javascript" href="/es/js/scripts.js"></script>

You can link to files with absolute paths as well to link files that

are not in app/webroot/js 1. <?php echo $this->Html->script('/otherdir/script_file'); ?> The first parameter can be an array to include multiple files. 1. <?php echo $this->Html>script(array('jquery','wysiwyg','scripts')); ?> Will output:
<script type="text/javascript" href="/es/js/jquery.js"></script> <script type="text/javascript" href="/es/js/wysiwyg.js"></script> <script type="text/javascript" href="/es/js/scripts.js"></script>

7.4.1.12 scriptBlock

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones scriptBlock($code, $options = array()) Generate a code block containing $code set $options['inline'] to false to have the script block appear in $scripts_for_layout. Also new is the ability to add attributes to script tags. $this->Html>scriptBlock('stuff', array('defer' => true)); will create a script tag with defer="defer" attribute.
7.4.1.13 scriptStart

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones scriptStart($options = array()) Begin a buffering code block. This code block will capture all output between scriptStart() and scriptEnd() and create an script tag. Options are the same as scriptBlock()
7.4.1.14 scriptEnd

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones scriptEnd()

End a buffering script block, returns the generated script element or null if the script block was opened with inline = false. An example of using scriptStart() and scriptEnd() would be: 1. $this->Html->scriptStart(array('inline' => false)); 2. echo $this->Js->alert('I am in the javascript'); 3. $this->Html->scriptEnd();
7.4.1.15 tableHeaders

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones tableHeaders(array $names, array $trOptions = null, array $thOptions = null) Crea una fila de encabezados de tabla para ser usados dentro de la etiqueta <table>. 1. <?php echo $html>tableHeaders(array('Fecha','Nombre','Activo'));?> 2. 3. //Salida 4. <tr> 5. <th>Fecha</th> 6. <th>Nombre</th> 7. <th>Activo</th> 8. </tr> 9. <?php echo $html->tableHeaders( 10.array('Fecha','Nombre','Activo'), 11.array('class' => 'estado'), 12.array('class' => 'tabla_productos') 13.);?> 14.//Salida 15.<tr class="estado"> 16.<th class="tabla_productos">Fecha</th> 17.<th class="tabla_productos">Nombre</th> 18.<th class="tabla_productos">Activo</th> 19.</tr>

7.4.1.16 tableCells

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones tableCells(array $data, array $oddTrOptions = null, array $evenTrOptions = null, $useCount = false, $continueOddEven = true) Creates table cells, in rows, assigning <tr> attributes differently for odd- and even-numbered rows. Wrap a single table cell within an array() for specific <td>-attributes. <?php echo $this->Html->tableCells(array( array('Jul 7th, 2007', 'Best Brownies', 'Yes'), array('Jun 21st, 2007', 'Smart Cookies', 'Yes'), array('Aug 1st, 2006', 'Anti-Java Cake', 'No'), )); ?> //Output <tr><td>Jul 7th, 2007</td><td>Best Brownies</td><td>Yes</td></tr> 9. <tr><td>Jun 21st, 2007</td><td>Smart Cookies</td><td>Yes</td></tr> 10.<tr><td>Aug 1st, 2006</td><td>Anti-Java Cake</td><td>No</td></tr> 11.<?php echo $this->Html->tableCells(array( 12.array('Jul 7th, 2007', array('Best Brownies', array('class'=>'highlight')) , 'Yes'), 13.array('Jun 21st, 2007', 'Smart Cookies', 'Yes'), 14.array('Aug 1st, 2006', 'Anti-Java Cake', array('No', array('id'=>'special'))), 15.)); 16.?> 17.//Output 18.<tr><td>Jul 7th, 2007</td><td class="highlight">Best Brownies</td><td>Yes</td></tr> 19.<tr><td>Jun 21st, 2007</td><td>Smart Cookies</td><td>Yes</td></tr> 20.<tr><td>Aug 1st, 2006</td><td>Anti-Java Cake</td><td id="special">No</td></tr> 21.<?php echo $this->Html->tableCells( 22.array( 23.array('Red', 'Apple'), 24.array('Orange', 'Orange'), 25.array('Yellow', 'Banana'), 26.), 27.array('class' => 'darker') 1. 2. 3. 4. 5. 6. 7. 8.

28.); 29.?> 30.//Output 31.<tr class="darker"><td>Red</td><td>Apple</td></tr> 32.<tr><td>Orange</td><td>Orange</td></tr> 33.<tr class="darker"><td>Yellow</td><td>Banana</td></tr> View more details about the tableCells function in the API
7.4.1.17 url

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones url(mixed $url = NULL, boolean $full = false) Devuelve un URL que apunta a alguna combinacin de controlador y accin. Si $url est vaco devuelve el valor de REQUEST_URI, en caso contrario genera el URL para la combinacin de controlador y accin. Si $full es true, se antepondr el URL base del sitio al resultado. 1. 2. 3. 4. 5. 6. <?php echo $html->url(array( "controller" => "posts", "action" => "view", "bar"));?> // Salida /posts/view/bar

Enseguida ms ejemplos de uso: URL con parmetros nombrados (named parameters) 1. 2. 3. 4. 5. 6. 7. <?php echo $html->url(array( "controller" => "posts", "action" => "view", "foo" => "bar")); ?> // Salida /posts/view/foo:bar

URL con extensin 1. <?php echo $html->url(array( 2. "controller" => "posts",

3. 4. 5. 6. 7.

"action" => "list", "ext" => "rss")); ?> // Salida /posts/list.rss

URL (empezando con '/') con el URL completo del sitio agregado al inicio. 1. <?php echo $html->url('/posts', true); ?> 2. 3. //Salida 4. http://www.example.com/posts URL con parmetros GET y ancla nombrada (named anchor) 1. 2. 3. 4. 5. 6. 7. 8. 9. <?php echo $html->url(array( "controller" => "posts", "action" => "buscar", "?" => array("foo" => "bar"), "#" => "primero")); ?> //Salida /posts/buscar?foo=bar#primero

Por mas info ver el Router::url en el API.


7.4.2 Changing the tags output by HtmlHelper

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The built in tag sets for HtmlHelper are XHTML compliant, however if you need to generate HTML for HTML4 you will need to create and load a new tags config file containing the tags you'd like to use. To change the tags used create app/config/tags.php containing: 1. 2. 3. 4. 5. $tags = array( 'metalink' => '<link href="%s"%s >', 'input' => '<input name="%s" %s >', //... );

You can then load this tag set by calling $this->Html>loadConfig('tags');

7.4.3 Creating breadcrumb trails with HtmlHelper

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones CakePHP has the built in ability to automatically create a breadcrumb trail in your app. To set this up, first add something similar to the following in your layout template. 1. echo $this->Html->getCrumbs(' > ','Home'); Now, in your view you'll want to add the following to start the breadcrumb trails on each of the pages. 1. $this->Html->addCrumb('Users', '/users'); 2. $this->Html->addCrumb('Add User', '/users/add'); This will add the output of "Home > Users > Add User" in your layout where getCrumbs was added. 7.5 Js Editar Ver slo esta seccin Historia Comparar con el contenido original

Desde el comienzo, el soporte de CakePHP para Javascript ha sido con Prototyp/Scriptaculous. Mientras seguimos pensando que estas son unas excelentes bibliotecas de Javascript, la comunidad ha estado pidiendo soporte hacia otras bibliotecas. En lugar de tirar Prototype en favor de otra biblioteca de Javascript. Hemos creado un adaptador basado en los ayudantes, e incluimos 3 de las bilbiotecas mas solicitadas. Prototype/Scriptaculous, Mootools/Mootools-more, y jQuery/jQuery UI. And while the API is not as expansive as the previous AjaxHelper we feel that the adapter based solution allows for a more extensible solution giving developers the power and flexibility they need to address their specific application needs. Javascript Engines form the backbone of the new JsHelper. A Javascript engine translates an abstract Javascript element into concrete Javascript code specific to the Javascript library being used. In addition they create an extensible system for others to use.
7.5.1 Using a specific Javascript engine

Traducir Ver slo esta seccin Historia

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones First of all download your preferred javascript library and place it in app/webroot/js Then you must include the library in your page. To include it in all pages, add this line to the <head> section of app/views/layouts/default.ctp (copy this file from cake/libs/view/layouts/default.ctp if you have not created your own). 1. echo $this->Html->script('jquery'); // Include jQuery library Replace jquery with the name of your library file (.js will be added to the name). By default scripts are cached, and you must explicitly print out the cache. To do this at the end of each page, include this line just before the ending </body> tag 1. echo $this->Js->writeBuffer(); // Write cached scripts You must include the library in your page and print the cache for the helper to function. Javascript engine selection is declared when you include the helper in your controller. 1. var $helpers = array('Js' => array('Jquery')); The above would use the Jquery Engine in the instances of JsHelper in your views. If you do not declare a specific engine, the jQuery engine will be used as the default. As mentioned before, there are three engines implemented in the core, but we encourage the community to expand the library compatibility.
# Using jQuery with other libraries

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The jQuery library, and virtually all of its plugins are constrained within the jQuery namespace. As a general rule, "global" objects are stored inside the jQuery namespace as well, so you shouldn't get a clash between jQuery and any other library (like Prototype, MooTools, or YUI). That said, there is one caveat: By default, jQuery uses "$" as a shortcut for "jQuery" To override the "$" shortcut, use the jQueryObject variable. 1. $this->Js->JqueryEngine->jQueryObject = '$j';

2. print $this->Html->scriptBlock('var $j = jQuery.noConflict();', 3. array('inline' => false)); //Tell jQuery to go into noconflict mode
7.5.1.1 Using the JsHelper inside customHelpers

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Declare the JsHelper in the $helpers array in your customHelper. 1. var $helpers = array('Js'); It is not possible to declare a javascript engine inside a custom helper. Doing that will have no effect. If you are willing to use an other javascript engine than the default, do the helper setup in your controller as follows: 1. 2. 3. 4. var $helpers = array( 'Js' => array('Prototype'), 'CustomHelper' );

Be sure to declare the JsHelper and its engine on top of the $helpers array in your controller. The selected javascript engine may disappear (replaced by the default) from the jsHelper object in your helper, if you miss to do so and you will get code that does not fit your javascript library.
7.5.2 Creating a Javascript Engine

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Javascript engine helpers follow normal helper conventions, with a few additional restrictions. They must have the Engine suffix. DojoHelper is not good, DojoEngineHelper is correct. Furthermore, they should extend JsBaseEngineHelper in order to leverage the most of the new API.
7.5.3 Javascript engine usage

Traducir Ver slo esta seccin Historia

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The JsHelper provides a few methods, and acts as a facade for the the Engine helper. You should not directly access the Engine helper except in rare occasions. Using the facade features of the JsHelper allows you to leverage the buffering and method chaining features built-in; (method chaining only works in PHP5). The JsHelper by default buffers almost all script code generated, allowing you to collect scripts throughout the view, elements and layout, and output it in one place. Outputting buffered scripts is done with $this->Js->writeBuffer(); this will return the buffer contents in a script tag. You can disable buffering wholesale with the $bufferScripts property or setting buffer => false in methods taking $options. Since most methods in Javascript begin with a selection of elements in the DOM, $this->Js->get() returns a $this, allowing you to chain the methods using the selection. Method chaining allows you to write shorter, more expressive code. It should be noted that method chaining Will not work in PHP4. 1. $this->Js->get('#foo')->event('click', $eventCode); Is an example of method chaining. Method chaining is not possible in PHP4 and the above sample would be written like: 1. $this->Js->get('#foo'); 2. $this->Js->event('click', $eventCode);
# Common options

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones In attempts to simplify development where Js libraries can change, a common set of options is supported by JsHelper, these common options will be mapped out to the library specific options internally. If you are not planning on switching Javascript libraries, each library also supports all of its native callbacks and options.
# Callback wrapping

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

By default all callback options are wrapped with the an anonymous function with the correct arguments. You can disable this behavior by supplying the wrapCallbacks = false in your options array.
7.5.3.1 Working with buffered scripts

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones One drawback to previous implementation of 'Ajax' type features was the scattering of script tags throughout your document, and the inability to buffer scripts added by elements in the layout. The new JsHelper if used correctly avoids both of those issues. It is recommended that you place $this->Js->writeBuffer() at the bottom of your layout file above the </body> tag. This will allow all scripts generated in layout elements to be output in one place. It should be noted that buffered scripts are handled separately from included script files. writeBuffer($options = array()) Writes all Javascript generated so far to a code block or caches them to a file and returns a linked script. Options inline - Set to true to have scripts output as a script block inline if cache is also true, a script link tag will be generated. (default true) cache - Set to true to have scripts cached to a file and linked in (default false) clear - Set to false to prevent script cache from being cleared (default true) onDomReady - wrap cached scripts in domready event (default true) safe - if an inline block is generated should it be wrapped in <![CDATA[ ... ]]> (default true) Creating a cache file with writeBuffer() requires that webroot/js be world writable and allows a browser to cache generated script resources for any page. buffer($content) Add $content to the internal script buffer. getBuffer($clear = true) Get the contents of the current buffer. Pass in false to not clear the buffer at the same time.

Buffering methods that are not normally buffered Some methods in the helpers are buffered by default. The engines buffer the following methods by default: event sortable drag drop slider

Additionally you can force any other method in JsHelper to use the buffering. By appending an boolean to the end of the arguments you can force other methods to go into the buffer. For example the each() method does not normally buffer. 1. $this->Js->each('alert("whoa!");', true); The above would force the each() method to use the buffer. Conversely if you want a method that does buffer to not buffer, you can pass a false in as the last argument. 1. $this->Js->event('click', 'alert("whoa!");', false); This would force the event function which normally buffers to return its result.
7.5.4 Methods

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The core Javascript Engines provide the same feature set across all libraries, there is also a subset of common options that are translated into library specific options. This is done to provide end developers with as unified an API as possible. The following list of methods are supported by all the Engines included in the CakePHP core. Whenever you see separate lists for Options and Event Options both sets of parameters are supplied in the $options array for the method. object($data, $options = array()) Converts values into JSON. There are a few differences between this method and JavascriptHelper::object(). Most notably there is no affordance for stringKeys or q options found in the JavascriptHelper. Furthermore $this->Js->object(); cannot make script tags. Options: prefix - String prepended to the returned data.

postfix - String appended to the returned data. Example Use: 1. $json = $this->Js->object($data); sortable($options = array()) Sortable generates a javascript snippet to make a set of elements (usually a list) drag and drop sortable. The normalized options are: Options containment - Container for move action handle - Selector to handle element. Only this element will start sort action. revert - Whether or not to use an effect to move sortable into final position. opacity - Opacity of the placeholder distance - Distance a sortable must be dragged before sorting starts. Event Options start - Event fired when sorting starts sort - Event fired during sorting complete - Event fired when sorting completes. Other options are supported by each Javascript library, and you should check the documentation for your javascript library for more detailed information on its options and parameters. Example use: 1. 2. 3. 4. 5. 6. 7. 8. 9. $this->Js->get('#my-list'); $this->Js->sortable(array( 'distance' => 5, 'containment' => 'parent', 'start' => 'onStart', 'complete' => 'onStop', 'sort' => 'onSort', 'wrapCallbacks' => false ));

Assuming you were using the jQuery engine, you would get the following code in your generated Javascript block: 1. $("#myList").sortable({containment:"parent", distance:5, sort:onSort, start:onStart, stop:onStop}); request($url, $options = array()) Generate a javascript snippet to create an XmlHttpRequest or 'AJAX' request.

Event Options complete - Callback to fire on complete. success - Callback to fire on success. before - Callback to fire on request initialization. error - Callback to fire on request failure.

Options method - The method to make the request with defaults to GET in more libraries async - Whether or not you want an asynchronous request. data - Additional data to send. update - Dom id to update with the content of the request. type - Data type for response. 'json' and 'html' are supported. Default is html for most libraries. evalScripts - Whether or not <script> tags should be eval'ed. dataExpression - Should the data key be treated as a callback. Useful for supplying $options['data'] as another Javascript expression. Example use 1. 2. 3. 4. 5. $this->Js->event('click', $this->Js->request(array( 'action' => 'foo', param1), array( 'async' => true, 'update' => '#element')));

get($selector) Set the internal 'selection' to a CSS selector. The active selection is used in subsequent operations until a new selection is made. 1. $this->Js->get('#element'); The JsHelper now will reference all other element based methods on the selection of #element. To change the active selection, call get() again with a new element. drag($options = array()) Make an element draggable. Options handle - selector to the handle element. snapGrid - The pixel grid that movement snaps to, an array(x, y) container - The element that acts as a bounding box for the draggable element. Event Options start - Event fired when the drag starts drag - Event fired on every step of the drag

stop - Event fired when dragging stops (mouse release) Example use 1. 2. 3. 4. 5. 6. 7. 8. 9. $this->Js->get('#element'); $this->Js->drag(array( 'container' => '#content', 'start' => 'onStart', 'drag' => 'onDrag', 'stop' => 'onStop', 'snapGrid' => array(10, 10), 'wrapCallbacks' => false ));

If you were using the jQuery engine the following code would be added to the buffer. 1. $("#element").draggable({containment:"#content", drag:onDrag, grid:[10,10], start:onStart, stop:onStop}); drop($options = array()) Make an element accept draggable elements and act as a dropzone for dragged elements. Options accept - Selector for elements this droppable will accept. hoverclass - Class to add to droppable when a draggable is over. Event Options drop - Event fired when an element is dropped into the drop zone. hover - Event fired when a drag enters a drop zone. leave - Event fired when a drag is removed from a drop zone without being dropped. Example use 1. 2. 3. 4. 5. 6. 7. 8. $this->Js->get('#element'); $this->Js->drop(array( 'accept' => '.items', 'hover' => 'onHover', 'leave' => 'onExit', 'drop' => 'onDrop', 'wrapCallbacks' => false ));

If you were using the jQuery engine the following code would be added to the buffer: 1. <code class= 2. "php">$("#element").droppable({accept:".items", drop:onDrop, out:onExit, over:onHover});</code>

''Note'' about MootoolsEngine::drop Droppables in Mootools function differently from other libraries. Droppables are implemented as an extension of Drag. So in addtion to making a get() selection for the droppable element. You must also provide a selector rule to the draggable element. Furthermore, Mootools droppables inherit all options from Drag. slider() Create snippet of Javascript that converts an element into a slider ui widget. See your libraries implementation for additional usage and features. Options handle - The id of the element used in sliding. direction - The direction of the slider either 'vertical' or 'horizontal' min - The min value for the slider. max - The max value for the slider. step - The number of steps or ticks the slider will have. value - The initial offset of the slider. Events change - Fired when the slider's value is updated complete - Fired when the user stops sliding the handle Example use 1. $this->Js->get('#element'); 2. $this->Js->slider(array( 3. 'complete' => 'onComplete', 4. 'change' => 'onChange', 5. 'min' => 0, 6. 'max' => 10, 7. 'value' => 2, 8. 'direction' => 'vertical', 9. 'wrapCallbacks' => false 10.)); If you were using the jQuery engine the following code would be added to the buffer: 1. $("#element").slider({change:onChange, max:10, min:0, orientation:"vertical", stop:onComplete, value:2}); effect($name, $options = array()) Creates a basic effect. By default this method is not buffered and returns its result. Supported effect names The following effects are supported by all JsEngines

show - reveal an element. hide - hide an element. fadeIn - Fade in an element. fadeOut - Fade out an element. slideIn - Slide an element in. slideOut - Slide an element out.

Options speed - Speed at which the animation should occur. Accepted values are 'slow', 'fast'. Not all effects use the speed option. Example use If you were using the jQuery engine. 1. $this->Js->get('#element'); 2. $result = $this->Js->effect('fadeIn'); 3. //$result contains $("#foo").fadeIn(); event($type, $content, $options = array()) Bind an event to the current selection. $type can be any of the normal DOM events or a custom event type if your library supports them. $content should contain the function body for the callback. Callbacks will be wrapped with function (event) { ... } unless disabled with the $options. Options wrap - Whether you want the callback wrapped in an anonymous function. (defaults to true) stop - Whether you want the event to stopped. (defaults to true) Example use 1. $this->Js->get('#some-link'); 2. $this->Js->event('click', $this->Js->alert('hey you!')); If you were using the jQuery library you would get the following Javascript code. 1. 2. 3. 4. $('#some-link').bind('click', function (event) { alert('hey you!'); return false; });

You can remove the return false; by passing setting the stop option to false. 1. $this->Js->get('#some-link'); 2. $this->Js->event('click', $this->Js->alert('hey you!'), array('stop' => false)); If you were using the jQuery library you would the following Javascript code would be added to the buffer. Note that the default

browser event is not cancelled. 1. $('#some-link').bind('click', function (event) { 2. alert('hey you!'); 3. }); domReady($callback) Creates the special 'DOM ready' event. writeBuffer() automatically wraps the buffered scripts in a domReady method. each($callback) Create a snippet that iterates over the currently selected elements, and inserts $callback. Example 1. $this->Js->get('div.message'); 2. $this->Js->each('$(this).css({color: "red"});'); Using the jQuery engine would create the following Javascript 1. $('div.message').each(function () { $(this).css({color: "red"});}); alert($message) Create a javascript snippet containing an alert() snippet. By default, alert does not buffer, and returns the script snippet. 1. $alert = $this->Js->alert('Hey there'); confirm($message) Create a javascript snippet containing a confirm() snippet. By default, confirm does not buffer, and returns the script snippet. 1. $alert = $this->Js->confirm('Are you sure?'); prompt($message, $default) Create a javascript snippet containing a prompt() snippet. By default, prompt does not buffer, and returns the script snippet. 1. $prompt = $this->Js->prompt('What is your favorite color?', 'blue'); submit() Create a submit input button that enables XmlHttpRequest submitted forms. Options can include both those for FormHelper::submit() and JsBaseEngine::request(), JsBaseEngine::event(); Forms submitting with this method, cannot send files. Files do not transfer over XmlHttpRequest and require an iframe, or other more specialized setups that are beyond the scope of this helper. Options

confirm - Confirm message displayed before sending the request. Using confirm, does not replace any before callback methods in the generated XmlHttpRequest. buffer - Disable the buffering and return a script tag in addition to the link. wrapCallbacks - Set to false to disable automatic callback wrapping. Example use 1. echo $this->Js->submit('Save', array('update' => '#content')); Will create a submit button with an attached onclick event. The click event will be buffered by default. 1. echo $this->Js->submit('Save', array('update' => '#content', 'div' => false, 'type' => 'json', 'async' => false)); Shows how you can combine options that both FormHelper::submit() and Js::request() when using submit. link($title, $url = null, $options = array()) Create an html anchor element that has a click event bound to it. Options can include both those for HtmlHelper::link() and JsBaseEngine::request(), JsBaseEngine::event(); $htmlAttributes is used to specify additional options that are supposed to be appended to the generated anchor element. If an option is not part of the standard attributes or $htmlAttributes it will be passed to request() as an option. If an id is not supplied, a randomly generated one will be created for each link generated. Options confirm - Generate a confirm() dialog before sending the event. id - use a custom id. htmlAttributes - additional non-standard htmlAttributes. Standard attributes are class, id, rel, title, escape, onblur and onfocus. buffer - Disable the buffering and return a script tag in addition to the link. Example use 1. echo $this->Js->link('Page 2', array('page' => 2), array('update' => '#content')); Will create a link pointing to /page:2 and updating #content with the response. You can use the htmlAttributes option to add in additional custom attributes. 1. echo $this->Js->link('Page 2', array('page' => 2), array( 2. 'update' =&gt; '#content',

3. 4. 5. 6.

'htmlAttributes' =&gt; array('other' =&gt; 'value') )); //Creates the following html <a href="/es/posts/index/page:2" other="value">Page 2</a>

serializeForm($options = array()) Serialize the form attached to $selector. Pass true for $isForm if the current selection is a form element. Converts the form or the form element attached to the current selection into a string/json object (depending on the library implementation) for use with XHR operations. Options isForm - is the current selection a form, or an input? (defaults to false) inline - is the rendered statement going to be used inside another JS statement? (defaults to false) Setting inline == false allows you to remove the trailing ;. This is useful when you need to serialize a form element as part of another Javascript operation, or use the serialize method in an Object literal. redirect($url) Redirect the page to $url using window.location. value($value) Converts a PHP-native variable of any type to a JSON-equivalent representation. Escapes any string values into JSON compatible strings. UTF-8 characters will be escaped.
7.5.5 Ajax Pagination

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Much like Ajax Pagination in 1.2, you can use the JsHelper to handle the creation of Ajax pagination links instead of plain HTML links.
7.5.5.1 Making Ajax Links

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

Before you can create ajax links you must include the Javascript library that matches the adapter you are using with JsHelper. By default the JsHelper uses jQuery. So in your layout include jQuery (or whichever library you are using). Also make sure to include RequestHandlerComponent in your components. Add the following to your controller: 1. var $components = array('RequestHandler'); 2. var $helpers = array('Js'); Next link in the javascript library you want to use. For this example we'll be using jQuery. 1. echo $this->Html->script('jquery'); Similar to 1.2 you need to tell the PaginatorHelper that you want to make Javascript enhanced links instead of plain HTML ones. To do so you use options() 1. 2. 3. 4. $this->Paginator->options(array( 'update' => '#content', 'evalScripts' => true ));

The PaginatorHelper now knows to make javascript enhanced links, and that those links should update the #content element. Of course this element must exist, and often times you want to wrap $content_for_layout with a div matching the id used for the update option. You also should set evalScripts to true if you are using the Mootools or Prototype adapters, without evalScripts these libraries will not be able to chain requests together. The indicator option is not supported by JsHelper and will be ignored. You then create all the links as needed for your pagination features. Since the JsHelper automatically buffers all generated script content to reduce the number of <script> tags in your source code you must call write the buffer out. At the bottom of your view file. Be sure to include: 1. echo $this->Js->writeBuffer(); If you omit this you will not be able to chain ajax pagination links. When you write the buffer, it is also cleared, so you don't have worry about the same Javascript being output twice.
# Adding effects and transitions

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Since indicator is no longer supported, you must add any indicator

effects yourself. 1. <html> 2. <head> 3. <?php echo $this->Html->script('jquery'); ?> 4. //more stuff here. 5. </head> 6. <body> 7. <div id="content"> 8. <?php echo $content_for_layout; ?> 9. </div> 10.<?php echo $this->Html->image('indicator.gif', array('id' => 'busy-indicator')); ?> 11.</body> 12.</html> Remember to folder. You immediately indicator { place the indicator.gif file inside app/webroot/img may see a situation where the indicator.gif displays upon the page load. You need to put in this css #busydisplay:none; } in your main css file.

With the above layout, we've included an indicator image file, that will display a busy indicator animation that we will show and hide with the JsHelper. To do that we need to update our options() function. $this->Paginator->options(array( 'update' => '#content', 'evalScripts' => true, 'before' => $this->Js->get('#busy-indicator')->effect('fadeIn', array('buffer' => false)), 5. 'complete' => $this->Js->get('#busy-indicator')>effect('fadeOut', array('buffer' => false)), 6. )); 1. 2. 3. 4. This will show/hide the busy-indicator element before and after the #content div is updated. Although indicator has been removed, the new features offered by JsHelper allow for more control and more complex effects to be created. 7.6 Javascript Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original

Mas info sobre traduciones EL ayudante Javascript es usado para en la creacin de etiquetas y bloques de cdigo javascript bien formados. Existen varios mtodos algunos de los cuales estn diseados para trabajar con el framework Javascript Prototype.
7.6.1 Methods

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones codeBlock($script, $options = array('allowCache'=>true,'safe'=>true,'inline'=>true), $safe) string $script - The JavaScript to be wrapped in SCRIPT tags array $options - Set of options: allowCache: boolean, designates whether this block is cacheable using the current cache settings. safe: boolean, whether this block should be wrapped in CDATA tags. Defaults to helper's object configuration. inline: whether the block should be printed inline, or written to cached for later output (i.e. $scripts_for_layout). boolean $safe - DEPRECATED. Use $options['safe'] instead codeBlock returns a formatted script element containing $script. But can also return null if Javascript helper is set to cache events. See JavascriptHelper::cacheEvents(). And can write in $scripts_for_layout if you set $options['inline'] to false. blockEnd() Ends a block of cached Javascript. Can return either a end script tag, or empties the buffer, adding the contents to the cachedEvents array. Its return value depends on the cache settings. See JavascriptHelper::cacheEvents() link($url, $inline = true) mixed $url - String URL to JavaScript file, or an array of URLs. boolean $inline If true, the <script> tag will be printed inline, otherwise it will be printed in $scripts_for_layout Creates a javascript link to a single or many javascript files. Can output inline or in $scripts_for_layout. If the filename is prefixed with "/", the path will be relative to the base path of your application. Otherwise, the path will be relative to your JavaScript path, usually webroot/js.

escapeString($string) string $script - String that needs to get escaped. Escape a string to be JavaScript friendly. Allowing it to safely be used in javascript blocks. The characters that are escaped are: "\r\n" => '\n' "\r" => '\n' "\n" => '\n' '"' => '\"' "'" => "\\'"

event($object, $event, $observer, $useCapture) string $object - DOM Object to be observed. string $event - type of event to observe ie 'click', 'over'. string $observer - Javascript function to call when event occurs. array $options - Set options: useCapture, allowCache, safe boolean $options['useCapture'] - Whether to fire the event in the capture or bubble phase of event handling. Defaults false boolean $options['allowCache'] - See JavascriptHelper::cacheEvents() boolean $options['safe'] - Indicates whether <script /> blocks should be written 'safely,' i.e. wrapped in CDATA blocks Attach a javascript event handler specified by $event to an element DOM element specified by $object. Object does not have to be an ID reference it can refer to any valid javascript object or CSS selectors. If a CSS selector is used the event handler is cached and should be retrieved with JavascriptHelper::getCache(). This method requires the Prototype library. cacheEvents($file, $all) boolean $file - If true, code will be written to a file boolean $all - If true, all code written with JavascriptHelper will be sent to a file Allows you to control how the JavaScript Helper caches event code generated by event(). If $all is set to true, all code generated by the helper is cached and can be retrieved with getCache() or written to file or page output with writeCache(). getCache($clear) boolean $clear - If set to true the cached javascript is cleared. Defaults to true.

Gets (and clears) the current JavaScript event cache writeEvents($inline) boolean $inline - If true, returns JavaScript event code. Otherwise it is added to the output of $scripts_for_layout in the layout. Returns cached javascript code. If $file was set to true with cacheEvents(), code is cached to a file and a script link to the cached events file is returned. If inline is true, the event code is returned inline. Else it is added to the $scripts_for_layout for the page. includeScript($script) string $script - File name of script to include. Includes the named $script. If $script is left blank the helper will include every script in your app/webroot/js directory. Includes the contents of each file inline. To create a script tag with an src attribute use link(). object($data, $options) array $data - Data to be converted array $options - Set of options: block, prefix, postfix, stringKeys, quoteKeys, q boolean $options['block'] - Wraps return value in a <script /> block if true. Defaults to false. string $options['prefix'] - Prepends the string to the returned data. string $options['postfix'] - Appends the string to the returned data. array $options['stringKeys'] - A list of array keys to be treated as a string. boolean $options['quoteKeys'] - If false, treats $stringKey as a list of keys *not* to be quoted. Defaults to true. string $options['q'] - The type of quote to use. Generates a JavaScript object in JavaScript Object Notation (JSON) from $data array. 7.7 Number Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The NumberHelper contains convenience methods that enable display

numbers in common formats in your views. These methods include ways to format currency, percentages, data sizes, format numbers to specific precisions and also to give you more flexibility with formating numbers. All of these functions return the formated number; They do not automatically echo the output into the view.
7.7.1 currency

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones currency(mixed $number, string $currency= 'USD', $options = array()) This method is used to display a number in common currency formats (EUR,GBP,USD). Usage in a view looks like: 1. <?php echo $this->Number->currency($number,$currency); ?> The first parameter, $number, should be a floating point number that represents the amount of money you are expressing. The second parameter is used to choose a predefined currency formatting scheme: $currency 1234.56, formatted by currency type EUR 1.236,33 GBP 1,236.33 USD $ 1,236.33 The third parameter is an array of options for further defining the output. The following options are available: Option Description before The currency symbol to place before whole numbers ie. '$' The currency symbol to place after decimal numbers ie. 'c'. Set to boolean false to use no after decimal symbol. eg. 0.35 => $0.35. zero The text to use for zero values, can be a string or a number. ie. 0, 'Free!' places Number of decimal places to use. ie. 2 thousands Thousands separator ie. ',' decimals Decimal separator symbol ie. '.' negative Symbol for negative numbers. If equal to '()', the number will be wrapped with ( and ) escape Should the output be htmlentity escaped? Defaults to true If a non-recognized $currency value is supplied, it is prepended to a USD formatted number. For example: 1. <?php echo $this->Number->currency('1234.56', 'FOO'); ?> 2. //Outputs: 3. FOO 1,234.56

7.7.2 precision

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones precision (mixed $number, int $precision = 3) This method displays a number with the specified amount of precision (decimal places). It will round in order to maintain the level of precision defined. 1. <?php echo $this->Number->precision(456.91873645, 2 ); ?> 2. //Outputs: 3. 456.92
7.7.3 toPercentage

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones toPercentage(mixed $number, int $precision = 2) Like precision(), this method formats a number according to the supplied precision (where numbers are rounded to meet the given precision). This method also expresses the number as a percentage and prepends the output with a percent sign. 1. <?php echo $this->Number->toPercentage(45.691873645); ?> 2. //Outputs: 3. 45.69%
7.7.4 toReadableSize

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones toReadableSize(string $data_size) This method formats data sizes in human readable forms. It provides a shortcut way to convert bytes to KB, MB, GB, and TB. The size is displayed with a two-digit precision level, according to the size of data supplied (i.e. higher sizes are expressed in larger terms): 1. echo $this->Number->toReadableSize(0); // 0 Bytes

2. echo $this->Number->toReadableSize(1024); // 1 KB 3. echo $this->Number->toReadableSize(1321205.76); // 1.26 MB 4. echo $this->Number->toReadableSize(5368709120); // 5.00 GB


7.7.5 format

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones format (mixed $number, mixed $options=false) This method gives you much more control over the formatting of numbers for use in your views (and is used as the main method by most of the other NumberHelper methods). Using this method might looks like: 1. $this->Number->format($number, $options); The $number parameter is the number that you are planning on formatting for output. With no $options supplied, the number 1236.334 would output as 1,236. Note that the default precision is zero decimal places. The $options parameter is where the real magic for this method resides. If you pass an integer then this becomes the amount of precision or places for the function. If you pass an associated array, you can use the following keys: places (integer): the amount of desired precision before (string): to be put before the outputted number escape (boolean): if you want the value in before to be escaped decimals (string): used to delimit the decimal places in a number thousands (string): used to mark off thousand, millions, places 1. 2. 3. 4. 5. 6. 7. 8. echo $this->Number->format('123456.7890', array( 'places' => 2, 'before' => ' ', 'escape' => false, 'decimals' => '.', 'thousands' => ',' )); // output ' 123,456.79'

7.8 Paginator Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El Paginator helper, se usa para imprimir los controles de los nmeros de pgina y de los links siguiente y previo. Ve tambin Tareas comunes con CakePHP - Paginacion para ms informacin.
7.8.1 Mtodos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones options($options = array()) options() : Opciones por defecto de la paginacin para los links. Si se suministra un string, ste se usa como el id del elemento DOM a updatear. Vea #options para la lista de las llaves posibles. options() configura todas las opciones para el Paginator Helper. Las opciones soportadas son: format Formato del contador. Los formatos soportados son 'range' y 'pages' y custon (personalizado) que es el por defecto. En el modo por defecto el string proporcionado es parseado y los tokens son reemplazados por sus verdaderos valores. Los tokens disponibles son: %page% - la pgina actual. %pages% - nmero total de pginas. %current% - nmero actual de registros mostrados.

%count% - nmero total de registros en el conjunto resultado. %start% - numero del primer registro mostrado. %end% - numero del ultimo registro mostrado. Ahora que sabes los tokens disponibles, puedes usar el mtodo counter() para mostrar todos tipo de informacin retornada en los resultados, por ejemplo: 1. 2. 3. 4. 5. echo $paginator->counter(array( 'format' => 'Pagina %page% de %pages%, mostrando %current% registros de un total de %count%, comenzando en el registro %start%, terminando en el %end%' ));

separator El separador entre la pagina actual y el numero de paginas. El valor por defecto es ' of '. Esto se usa en conjunto con formato = 'pages' url La url de la accion de paginacin. url tiene algunas sub opciones tambin sort - la llave por la cual los registros estan ordenados direction - la direccin en la cual se ordena. Valor por defecto 'ASC' page - el nmero de pgina a mostrar model El nombre del modelo que esta siendo paginado. escape Define si el campo de ttulo de los links debera ser sin HTML. Valor por defecto true. update El id del elemento DOM a updatear con los resultados de una llamada AJAX.. Si no esta especificada, se crearn links regulares. indicator El id del elemento DOM que ser mostrado como indicador de descarga o trabajo en curso mientras se ejecuta la llamada AJAX. link($title, $url = array(), $options = array()) string $title - El ttulo del link. mixed $url Url para la accin. Ver Router::url() array $options Opciones para el link. ver options() para la lista de llaves. Crea un link regular o AJAX con los parametros de paginacin. 1. echo $paginator->link('Ordenados por ttulo en pagina 5',

2. array('sort' => 'title', 'page' => 5, 'direction' => 'desc')); Si se cre en la vista en /posts/index Debera crear un link apuntando a '/posts/index/page:5/sort:title/direction:desc' 7.9 RSS Editar Ver slo esta seccin Historia Comparar con el contenido original

El helper RSS hace que generar XML para un RSS feed sea muy fcil.
7.9.1 Creando un RSS feed con el RssHelper

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Este ejemplo asume que tu tienes creados un controlador de Posts y un modelo de Post y que quieres hacer una vista alternativa para RSS. Crear una version xml/rss de posts/index es algo muy fcil con CakePHP 1.2. Despues de unos simples pasos puedes aadir la extension .rss a post/index haciendo tu URL posts/index.rss. Antes de adelantarnos tratando de conseguir que nuestro servicio web quede listo, debemos hacer algunas pequeas cosas. Primero debemos activar parseExtensions, esto se hace en app/config/routes.php 1. Router::parseExtensions('rss'); En segundo lugar una buena idea es agregar RequestHandler al arreglo de componentes $components de PostsController. Esto permitir que ocurra mucha automagia. En la llamanda anterior hemos activado la extension .rss. Cuando usamos Router::parseExtensions() podemos pasar tantos argumentos o extensiones como queramos. Esto activar cada 'extension/content-type' para el uso de nuestra aplicacin. Ahora, cuando la direccin posts/index.rss sea requerida obtendrs una versin xml de posts/index. Sin embargo, lo primero que necesitamos es hacer que los archivos de vista que crearn nuestro rss/xml feed.
7.9.1.1 Cdigo para el Controlador

Editar

Ver slo esta seccin Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Antes de crear nuestra version RSS de posts/index necesitamos poner algunas cosas en orden. Es tentador poner el canal de metadatos en la accion del controlador y pasarlo a nuestas vistas usando la funcin Controller::set() pero es es inapropiado. Esta informacin tambin ir a la vista. Pero eso vendr despus, por ahora si tienes alguna lgica diferente para los datos usados en el RSS feed y los datos que se usan en la vista html puedes usar el mtodo RequestHandler::isRss(), de otra forma tu controlador puede quedar igual. // Modificar la accion del controlador de Posts que corresponde // a la cual entrega el rss feed, que en nuestro caso // es la accion index public function index(){ if( $this->RequestHandler->isRss() ){ $posts = $this->Post->find('all', array('limit' => 20, 'order' => 'Post.created DESC')); 7. $this->set(compact('posts')); 8. } else { 9. // esta no es una llamada Rss, entonces entregamos 10.// usamos los datos para la salida html 11.$this->paginate['Post'] = array('order' = 'Post.created DESC', 'limit' => 10); 12.$posts = $this->paginate(); 13.$this->set(compact('posts')); 14.} 15.} 1. 2. 3. 4. 5. 6. Con todas las variables de vista configuradas necesitamos crear un layout rss.
7.9.1.1.1 Layout RSS

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes:

Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Un layout RSS es muy simple, escribe lo siguiente en app/view/layouts/rss/default.ctp: 1. echo $rss->header(); 2. if (!isset($documentData)) { 3. $documentData = array(); 4. } 5. if (!isset($channelData)) { 6. $channelData = array(); 7. } 8. if (!isset($channelData['title'])) { 9. $channelData['title'] = $title_for_layout; 10.} 11.$channel = $rss->channel(array(), $channelData, $content_for_layout); 12.echo $rss->document($documentData,$channel); No parece ser la gran cosa, sin embargo gracias al poder del RssHelper hara un monton de cosas por nosotros. No hemos configrado $documentData o $channelData en nuestro controlador, sin embargo, en CakePHP 1.2 tus vistas pueden pasar variables de vuelta al layout. En este momento nuestro arreglo $channelData entrar en accin para configurar todos los metadatos para nuestro feed. Lo siguiente es el archivo de vista de posts/index. As como necesitamos un layout, necesitamos crear el directorio views/posts/rss/ y crear un nuevo index.ctp dentro. El contenido de ese archivo est mas abajo.
7.9.1.1.2 La vista

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Nuestra vista comienza por configurar las variables $documentData y $channelData para el layout, estos contienen todos los metadatos para nuestro RSS feed. Esto se hace utilizando el mtodo View::set() el cual es anlogo al mtodo Controller::set(). Ac estamos pasando los

metadatos del canal de vuelta al layout. 1. 2. 3. 4. 5. 6. 7. $this->set('documentData', array( 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/')); $this->set('channelData', array( 'title' => __("Artculos ms ledos", true), 'link' => $html->url('/', true), 'description' => __("Artculos ms recientes.", true), 'language' => 'en-us'));

La segunda parte de la vista genera los elementos para los registros del feed. Esto se consigue haciendo un ciclo a los datos entregados a la vista ($items) y usando el mtodo RssHelper::item(). El otro mtodo que puedes usar es, RssHelper::items() el cual toma una llamada y un arreglo de items para el feed. (El metodo usado para las llamadas siempre a se ha llamado transformRss()). Hay un punto dbil en este mtodo, que es que no puedes usar ningn mtodo de otro helper para preparar los datos dentro del metodo de la llamada, porque el mbito dentro de la llamada no incluye nada que no se haya entregado desde afuera, lo que no da acceso al TimeHelper o cualquier otro que necesitemos. El metodo RssHelper::item() transforma el arreglo asociativo en un elemento para cada par llave-valor. 1. foreach ($entries as $entry) { 2. $postTime = strtotime($entry['Entry']['created']); 3. $entryLink = array( 4. 'controller' => 'entries', 5. 'action' => 'view', 6. 'year' => date('Y', $postTime), 7. 'month' => date('m', $postTime), 8. 'day' => date('d', $postTime), 9. $entry['Entry']['slug']); 10.// deberas importar Sanitize 11.App::import('Sanitize'); 12.// Ac es donde se limpia el cuerpo del texto para la salida como la descripcin 13.// de los items rss, esto necesita tener solo texto para asegurarnos de que valide el feed 14.$bodyText = preg_replace('=\(.*?)\=is', '', $entry['Entry'] ['body']); 15.$bodyText = $text->stripLinks($bodyText); 16.$bodyText = Sanitize::stripAll($bodyText); 17.$bodyText = $text->truncate($bodyText, 400, '...', true, true); 18.echo $rss->item(array(), array( 19.'title' => $entry['Entry']['title'], 20.'link' => $entryLink, 21.'guid' => array('url' => $entryLink, 'isPermaLink' => 'true'), 22.'description' => $bodyText, 23.'dc:creator' => $entry['Entry']['author'], 24.'pubDate' => $entry['Entry']['created']));

25.} Puedes ver que podemos usar el loop para preparar los datos para ser transformados en elementos XML. Es importante filtrar cuaquier caracter que no sea de texto plano, especialmente si estas usando un editor de html para el cuerpo de tu blog. En el codigo anterior usamos el mtodo TextHelper::stripLinks() y algunos pocos mtodos de la clase Sanitize, pero recomendamos escribir un helper especializado para dejar el texto realmente limpio. Una vez que hemos configurado los datos para el feed, podemos usar el mtodo RssHelper::item() para crear el XML del formato RSS. Una vez que hayas hecho todo esto, puedes probar tu RSS dirigindote a la direccion /entries/index.rss y vers tu nuevo feed. Siempre es importante que valides tu RSS feed antes de ponerlo en produccion. Esto se puede hacer visitando algunos sitios como FeedValidator o el sitio de w3c en http://validator.w3.org/feed/. 7.10 Sesin Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Como contraparte natural al Componente Session, el Helper Session refleja la mayora de las funcionalidades de los componentes y las hace disponible a las vistas. El Helper de Sesin se agrega automticamente a tu vista, no es necesario agregarlo en el arreglo $helpers en el controlador. La mayor diferencia entre el Helper y el Componente de Sesin es que el Helper no puede escribir en la sesin. Al igual que en el Componente de Sesin, los datos son escritos y ledos usando estructuras de arreglos separadas por puntos. 1. array('User' => 2. array('username' => 'super@ejemplo.com') 3. ); Dada la estructura de arreglo previa, el nodo sera accesado por User.username, con el punto indicando el arreglo enlazado. Esta notacin es usada por todos los mtodos del Helper de Sesin siempre que se utilice $key.

7.10.1 Methods

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones read($key ) id() check($ke y) flash($key ) error() Read from the Session. Returns a string or array depending on the contents of the session. Returns the current session ID. Check to see if a key is in the Session. Returns a boolean on the key's existence. This will return the contents of the $_SESSION.Message. It is used in conjunction with the Session Component's setFlash() method. Returns the last error in the session if one exists.

7.10.2 flash

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The flash method uses the default key set by setFlash(). You can also retrieve specific keys in the session. For example, the Auth component sets all of its Session messages under the 'auth' key // Controller code $this->Session->setFlash('My Message'); // In view echo $this->Session->flash(); // outputs "<div id='flashMessage' class='message'>My Message</div>" 6. // output the AuthComponent Session message, if set. 7. echo $this->Session->flash('auth'); 1. 2. 3. 4. 5.
# Using Flash for Success and Failure

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones In some web sites, particularly administration backoffice web applications it is often expected that the result of an operation requested by the user has associated feedback as to whether the operation succeeded or not. This is a classic usage for the flash

mechanism since we only want to show the user the result once and not keep the message. One way to achieve this is to use Session->flash() with the layout parameter. With the layout parameter we can be in control of the resultant html for the message. In the controller you might typically have code: 1. if ($user_was_deleted) { 2. $this->Session->setFlash('The user was deleted successfully.', 'flash_success'); 3. } else { 4. $this->Session->setFlash('The user could not be deleted.', 'flash_failure'); 5. } The flash_success and flash_failure parameter represents an element file to place in the root app/views/elements folder, e.g. app/views/elements/flash_success.ctp, app/views/elements/flash_failure.ctp Inside the flash_success element file would be something like this: 1. <div class="flash flash_success"> 2. <?php echo $message ?> 3. </div> The final step is in your main view file where the result is to be displayed to add simply 1. <?php echo $this->Session->flash(); ?> And of course you can then add to your CSS a selector for div.flash, div.flash_success and div.flash_failure 7.11 Text Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The TextHelper contains methods to make text more usable and friendly in your views. It aids in enabling links, formatting urls, creating excerpts of text around chosen words or phrases, highlighting key words in blocks of text, and to gracefully truncating long stretches of text.
# autoLinkEmails

Traducir Ver slo esta seccin

Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones autoLinkEmails(string $text, array $htmlOptions=array()) Adds links to the well-formed email addresses in $text, according to any options defined in $htmlOptions (see HtmlHelper::link()). 1. $my_text = 'For more information regarding our world-famous pastries and desserts, contact info@example.com'; 2. $linked_text = $this->Text->autoLinkEmails($my_text); Output:
For more information regarding our world-famous pastries and desserts, contact <a href="mailto:info@example.com">info@example.com</a>

# autoLinkUrls

Editar Ver slo esta seccin Historia Comparar con el contenido original

autoLinkUrls(string $text, array $htmlOptions=array()) Igual que con autoLinkEmails(), la nica diferencia es que este mtodo busca las cadenas de texto que empiezan con https, http, ftp, o nntp y las enlaza correctamente.
# autoLink

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones autoLink(string $text, array $htmlOptions=array()) Performs the functionality in both autoLinkUrls() and autoLinkEmails() on the supplied $text. All URLs and emails are linked appropriately given the supplied $htmlOptions.
# excerpt

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

excerpt(string $haystack, string $needle, int $radius=100, string $ending="...") Extracts an excerpt from $haystack surrounding the $needle with a number of characters on each side determined by $radius, and suffixed with $ending. This method is especially handy for search results. The query string or keywords can be shown within the resulting document. 1. echo $this->Text->excerpt($last_paragraph, 'method', 50); Output:
mined by $radius, and suffixed with $ending. This method is especially handy for search results. The query...

# highlight

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones highlight(string $haystack, string $needle, array $options = array() ) Highlights $needle in $haystack using the $options['format'] string specified or a default string. Options 'format' - string The piece of html with that the phrase will be highlighted 'html' - bool If true, will ignore any HTML tags, ensuring that only the correct text is highlighted 1. echo $this->Text->highlight($last_sentence, 'using',array('format'=>'<span class="highlight">\1</span>'); Output:
Highlights $needle in $haystack <span class="highlight">using</span> the $options['format'] string specified or a default string.

# stripLinks

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones stripLinks($text)

Strips the supplied $text of any HTML links.


# toList

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones toList(array $list, $and='and', $separator=', ') Creates a comma-separated list where the last two items are joined with and. 1. echo $this->Text->toList($colors); Output:
red, orange, yellow, green, blue, indigo and violet

# truncate

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones truncate(string $text, int $length=100, array $options) Cuts a string to the $length and adds a suffix with 'ending' if the text is longer than $length. If 'exact' is passed as false, the truncation will occur after the next word ending. If 'html' is passed as true, html tags will be respected and will not be cut off. $options is used to pass all extra parameters, and has the following possible keys by default, all of which are optional: 1. 2. 3. 4. 5. 1. 2. 3. 4. 5. 6. 7. 8. array( 'ending' => '...', 'exact' => true, 'html' => false ) echo $this->Text->truncate( 'The killer crept forward and tripped on the rug.', 22, array( 'ending' => '...', 'exact' => false ) );

Output:
The killer crept...

# trim

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones trim() An alias for truncate. 7.12 Tiempo Editar Ver slo esta seccin Historia Comparar con el contenido original

El ayudante de tiempo (Time Helper), como su nombre lo indica, te ayuda a ahorrar tiempo. Permite que se haga un procesamiento rpido de la informacin relacionada con el tiempo. Este ayudante tiene dos tareas principales que puede realizar 1. Puede dar formato a textos de tiempo 2. Puede probar el tiempo (pero no pude doblarlo, lo sentimos).
7.12.1 Formatting

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones fromString( $date_string ) fromString toma una cadena de texto y la convierte en un objeto de tiempo. Si la cadena suministrada es un nmero, la convertir a un entero, siendo este el nmero de segundos que han transcurrido desde el Epoch de Unix (1 de Enero 1970 00:00:00 GMT). Pasarle un texto "20081231" crear un resultado indeseado ya que tratar de

convertirlo a segundos, lo que resultar en este caso "Vier, Ago 21 1970, 06:07" toQuarter( $date_string, $range = false ) toQuarter devolver 1, 2, 3 o 4 dependiendo de en qu trimestre del ao la fecha se encuantra. Si el $range es true, devolver un arreglo con dos elementos con las fechas de inicio y fin en el formato "200803-31" toUnix( $date_string ) toUnix es un sinnimo para fromString. toAtom( $date_string ) toAtom devuelve una texto de tiempo en el formato Atom "2008-0112T00:00:00Z" toRSS( $date_string ) toRSS devuelve un texto de tiempo en el formato RSS "Sat, 12 Jan 2008 00:00:00 -0500" nice( $date_string = null ) nice toma una texto de tiempo y lo devuelve en el formato "Tue, Jan 1st 2008, 19:25". niceShort( $date_string = null ) niceShort toma un texto de tiempo y lo devuelve en el formato "Jan 1st 2008, 19:25". Si la fecha es el da actual el formato ser "Hoy, 19:25". Si la fecha ayer, devolver en el formato "Ayer, 19:25". daysAsSql( $begin, $end, $field_name ) daysAsSql devuelve una cadena de texto en el formato "($campo >= '2008-01-21 00:00:00') AND ($campo <= '2008-01-25 23:59:59')". dayAsSql( $date_string, $field_name ) dayAsSql crea una cadena de texto en el mismo formato que daysAsSql, pero solo necesita un nico objeto de tiempo timeAgoInWords( $date_string, $options = array(), $backwards = null ) timeAgoInWords toma una cadena de texto que representa uan fecha y lo convierte a un formato amigable como "Hace 3 semanas, 3 das". Pasarle true en $backwards har que se declare el tiempo en el futuro, lo que devolver el formato "el 31/12/08". Opcin Descripcin format un formato de fechas; por defecto "on 31/12/08" determina el el punto de corte en el que no uar ms palabras y usar el formato de fechas en end su lugar, por defecto "+1 month" relativeTime( $date_string, $format = 'j/n/y' ) relativeTime es un bsicamente un sinnimo para timeAgoInWords.

gmt( $date_string = null ) gmt devolver la fecha como un entero fijado al tiempo medio de Greenwich (GMT). format( $format = 'd-m-Y', $date_string) format es un sinnimo para la funcin date de php. Funcin nice Formato Mar, Enero 1 2008, 19:25 Enero 1 2008, 19:25 niceShort Hoy, 19:25 Ayer, 19:25 daysAsSql ($campo >= '2008-01-21 00:00:00') AND ($campo <= '2008-01-25 23:59:59') dayAsSql ($campo >= '2008-01-21 00:00:00') AND ($campo <= '2008-01-21 23:59:59') el 21/01/08 timeAgoInWords Hace 3 mese, 3 semanas, 2 das relativeTime Hace 7 minutos Hace 2 segundos gmt 1200787200
7.12.2 Testing Time

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones isToday (es Hoy) isThisWeek (es esta Semana) isThisMonth (es este MEs) isThisYear (es este Ao) wasYesterday (fue Ayer) isTomorrow (es Maana) wasWithinLast (sucedi dentro del rango de tiempo)

Todas las funciones anteriores devuelve true o false al pasarle una cadena de texto que represente una fecha. wasWithinLast toma el parmetro adicional $time_interval (intervalo de tiempo): $time->wasWithinLast( $time_interval, $date_string ) wasWithinLast toma un intervalo de tiempo que es un texto en el formato "3 months" y acepta un intervalo de tiempo en segundos,

minutos, horas, das, semanas, meses, aos. Si un intervalo de tiempo no es reconocido (por ejemplo se tipe errneamente), se usar por defecto das 7.13 XML Editar Ver slo esta seccin Historia Comparar con el contenido original

El helper XML simplifica la salida de documentos XML.


7.13.1 serialize

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El mtodo serialize toma un arreglo y crea una cadena XML de los datos. Esto es usado comnmente para serializar datos de modelos. 1. 2. 3. 4. 5. <?php echo $xml->serialize($data); // El formato ser similar a: // <model_name id="1" field_name="content" /> ?>

El mtodo serialize actua como un atajo para instanciar la clase XML incorporada en CakePHP, y usar el mtodo toString de la misma. Si necesitas ms control sobre la serializacin, quizs quieras invocar la clase XML directamente.
7.13.2 elem

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones El mtodo elem permite construir una cadena-nodo XML con atributos y tambin contenido interno. string elem (string $name, $attrib = array(), mixed $content = null, $endTag = true) 1. echo $xml->elem('count', array('namespace' => 'myNameSpace'), 'contenido'); 2. // genera: <myNameSpace:count>contenido</count> Si quieres empaquetar tu nodo de texto con CDATA, el tercer argumento debera ser un arreglo con dos llaves: 'cdata' y 'value' 1. echo $xml->elem('count', null, array('cdata'=>true,'value'=>'contenido'); 2. // genera: <count><![CDATA[contenido]]></count>
7.13.3 header

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones El mtodo header() se usa para escribir la declaracin de XML. 1. 2. 3. 4. <?php echo $xml->header(); // genera: <?xml version="1.0" encoding="UTF-8" ?> ?>

Puedes entregar el nmero de la versin y tipo de codificacin como parmetros del metodo header. 1. 2. 3. 4. <?php echo $xml->header(array('version'=>'1.1')); // genera: <?xml version="1.1" encoding="UTF-8" ?> ?>

8 Librerias de utilidades del ncleo


Editar Ver slo esta seccin

Historia Comparar con el contenido original CakePHP incluye libreras de utilidades de propsito general que se pueden invocar desde cualquier lugar de la aplicacin. Por ejemplo, Set y HttpSocket. 8.1 App Traducir Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones App is a very small utility library. It only contains the import method. But, with the import method, you can accomplish a lot. // examples App::Import('Core','File'); App::Import('Model','Post'); App::import('Vendor', 'geshi'); App::import('Vendor', 'flickr/flickr'); App::import('Vendor', 'SomeName', array('file' => 'some.name.php')); 7. App::import('Vendor', 'WellNamed', array('file' => 'services'.DS.'well.named.php')); 1. 2. 3. 4. 5. 6. You can read more about it in the book or the API documentation 8.2 Inflector Editar Ver slo esta seccin Historia Comparar con el contenido original

La clase Inflector toma una cadena y puede manipularla produciendo variaciones en las palabras tales como pluralizacion y notacion de CaMeLlo, siendo accedida normalmente de forma esttica. Ejemplo: Inflector::pluralize('ejemplo') retorna "ejemplos".
8.2.1 Class methods

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

pluralize singularize camelize underscore humanize tableize classify variable slug

Input Output Apple, Orange, Person, Man Apples, Oranges, People, Men Apples, Oranges, People, Men Apple, Orange, Person, Man Apple_pie, some_thing, people_person ApplePie, SomeThing, PeoplePerson It should be noted that underscore will only convert camelCase formatted words. Words that contains spaces will be lower-cased, but will not contain an underscore. applePie, someThing apple_pie, some_thing apple_pie, some_thing, people_person Apple Pie, Some Thing, People Person Apple, UserProfileSetting, Person apples, user_profile_settings, people apples, user_profile_settings, people Apple, UserProfileSetting, Person apples, user_result, people_people apples, userResult, peoplePeople Slug converts special characters into latin versions and converting unmatched characters and spaces to underscores. The slug method expects UTF-8 encoding. apple pure apple_puree

8.3 Cadenas (String) Editar Ver slo esta seccin Historia Comparar con el contenido original

La clase String incluye mtodos para crear y manipular cadenas cmodamente. Estos mtodos se acceden normalmente de forma esttica; por ejemplo: String::uuid().
8.3.1 uuid

Editar Ver slo esta seccin Historia Comparar con el contenido original

El mtodo uuid se utiliza para generar identificadores nicos de acuerdo a la especificacin RFC 4122. El uuid es una cadena de 128 bits con el formato 485fc381-e790-47a3-9794-1337c0a8fe68. 1. String::uuid(); // 485fc381-e790-47a3-9794-1337c0a8fe68
8.3.2 tokenize

Editar Ver slo esta seccin Historia Comparar con el contenido original

string tokenize ($data, $separator = ',', $leftBound = '(', $rightBound = ')')

Divide una cadena en subcadenas (tokens), ignorando cualquier instancia de $separator que aparece entre $leftBound y $rightBound.
8.3.3 insert

Editar Ver slo esta seccin Historia Comparar con el contenido original

string insert ($string, $data, $options = array()) El mtodo insert se utiliza para sustituir las claves de una plantilla (basada en una cadena de caracteres) por los valores de una matriz asociativa. 1. String::insert('Mi nombre es :nombre y tengo :edad aos de edad.', array('nombre' => 'Bob', 'edad' => '65')); 2. // genera: "Mi nombre es Bob y tengo 65 aos de edad."
8.3.4 cleanInsert

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones string cleanInsert ($string, $options = array()) Limpia la cadena String::insert de acuerdo a las opciones de la matriz $options, en funcin de la clave 'clean' de $options. El mtodo que se utiliza por defecto es texto, pero tambin est disponible html. El objetivo de esta funcin es sustituir, alrededor de los marcadores, los espacios en blanco y las marcas innecesarias que no sustituye Set::insert. 8.4 Xml Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes:

Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Con la clase Xml podemos generar y analizar cmodamente fragmentos y documentos XML. Esta solucin, ntegra en PHP, slo necesita que la extensin Xml/Expat est instalada.
8.4.1 Anlisis Xml

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para analizar un documento con la clase Xml, necesitamos una cadena con el Xml que queremos analizar. 1. $input = '<' . '?xml version="1.0" encoding="UTF-8" ?' . '> 2. <container> 3. <element id="first-el"> 4. <name>My element</name> 5. <size>20</size> 6. </element> 7. <element> 8. <name>Your element</name> 9. <size>30</size> 10.</element> 11.</container>'; 12.$xml = new Xml($input); Esto crea un objeto de tipo documento Xml. A partir de este momento, el objeto se puede leer, manipular, y convertir en una cadena de caracteres. . Con el ejemplo anterior podemos hacer lo siguiente: 1. echo $xml->children[0]->children[0]->name; 2. // outputs 'element' 3. echo $xml->children[0]->children[0]->children[0]->children[0]>value; 4. // outputs 'My Element' 5. echo $xml->children[0]->child('element')->attributes['id']; 6. //outputs 'first-el'

8.5 Set Editar Ver slo esta seccin Historia Comparar con el contenido original

Gestionar correctamente las matrices puede ser una herramienta muy til, poderosa y puede ayudar a construir un cdigo ms optimizado y elegante. Para esto, CakePHP ofrece un conjunto muy til de utilidades estticas en la clase Set. Se puede llamar a la clase Set de CakePHP desde cualquier modelo o controlador, del mismo modo que se llama a Inflector. Por ejemplo, Set::combine().
8.5.1 Set-compatible Path syntax

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The Path syntax is used by (for example) sort, and is used to define a path. Usage example (using Set::sort()): 1. $a = array( 2. 0 => array('Person' => array('name' => 'Jeff')), 3. 1 => array('Shirt' => array('color' => 'black')) 4. ); 5. $result = Set::sort($a, '{n}.Person.name', 'asc'); 6. /* $result now looks like: 7. Array 8. ( 9. [0] => Array 10.( 11.[Shirt] => Array 12.( 13.[color] => black 14.) 15.) 16.[1] => Array 17.( 18.[Person] => Array 19.( 20.[name] => Jeff 21.) 22.)

23.) 24.*/ As you can see in the example above, some things are wrapped in {}'s, others not. In the table below, you can see which options are available. Expression Definition {n} Represents a numeric key {s} Represents a string Foo Any string (without enclosing brackets) is treated like a string literal. Any string enclosed in brackets (besides {n} and {s}) is interpreted as a regular {[a-z]+} expression. This section needs to be expanded.
8.5.2 insert

Editar Ver slo esta seccin Historia Comparar con el contenido original

array Set::insert ($list, $path, $data = null) Inserta $data en un arreglo segun es definido en $path. 1. $a = array( 2. 'pages' => array('name' => 'page') 3. ); 4. $result = Set::insert($a, 'files', array('name' => 'files')); 5. /* $result ahora queda como: 6. Array 7. ( 8. [pages] => Array 9. ( 10.[name] => page 11.) 12.[files] => Array 13.( 14.[name] => files 15.) 16.) 17.*/ 18.$a = array( 19.'pages' => array('name' => 'page') 20.); 21.$result = Set::insert($a, 'pages.name', array()); 22./* $result ahora queda: 23.Array 24.(

25.[pages] => Array 26.( 27.[name] => Array 28.( 29.) 30.) 31.) 32.*/ 33.$a = array( 34.'pages' => array( 35.0 => array('name' => 'main'), 36.1 => array('name' => 'about') 37.) 38.); 39.$result = Set::insert($a, 'pages.1.vars', array('title' => 'page title')); 40./* $result ahora queda como: 41.Array 42.( 43.[pages] => Array 44.( 45.[0] => Array 46.( 47.[name] => main 48.) 49.[1] => Array 50.( 51.[name] => about 52.[vars] => Array 53.( 54.[title] => page title 55.) 56.) 57.) 58.) 59.*/
8.5.3 sort

Editar Ver slo esta seccin Historia Comparar con el contenido original

array Set::sort ($data, $path, $dir) Ordena un arreglo segn cualquier valor, determinado por una ruta compatible con Set. 1. $a = array(

2. 0 => array('Person' => array('name' => 'Jeff')), 3. 1 => array('Shirt' => array('color' => 'black')) 4. ); 5. $result = Set::sort($a, '{n}.Person.name', 'asc'); 6. /* $result ahora queda: 7. Array 8. ( 9. [0] => Array 10.( 11.[Shirt] => Array 12.( 13.[color] => black 14.) 15.) 16.[1] => Array 17.( 18.[Person] => Array 19.( 20.[name] => Jeff 21.) 22.) 23.) 24.*/ 25.$result = Set::sort($a, '{n}.Shirt', 'asc'); 26./* $result ahora queda: 27.Array 28.( 29.[0] => Array 30.( 31.[Person] => Array 32.( 33.[name] => Jeff 34.) 35.) 36.[1] => Array 37.( 38.[Shirt] => Array 39.( 40.[color] => black 41.) 42.) 43.) 44.*/ 45.$result = Set::sort($a, '{n}', 'desc'); 46./* $result ahora queda: 47.Array 48.( 49.[0] => Array

50.( 51.[Shirt] => Array 52.( 53.[color] => black 54.) 55.) 56.[1] => Array 57.( 58.[Person] => Array 59.( 60.[name] => Jeff 61.) 62.) 63.) 64.*/ 65.$a = array( 66.array(7,6,4), 67.array(3,4,5), 68.array(3,2,1), 69.); 70.$result = Set::sort($a, '{n}.{n}', 'asc'); 71./* $result ahora queda: 72.Array 73.( 74.[0] => Array 75.( 76.[0] => 3 77.[1] => 2 78.[2] => 1 79.) 80.[1] => Array 81.( 82.[0] => 3 83.[1] => 4 84.[2] => 5 85.) 86.[2] => Array 87.( 88.[0] => 7 89.[1] => 6 90.[2] => 4 91.) 92.) 93.*/
8.5.4 reverse

Editar

Ver slo esta seccin Historia Comparar con el contenido original array Set::reverse ($object) Set::reverse es bsicamente el opuesto de Set::map. Convierte un objeto en un arreglo. Si $object no es un objeto, reverse simplemente retornar $object. 1. $result = Set::reverse(null); 2. // Null 3. $result = Set::reverse(false); 4. // false 5. $a = array( 6. 'Post' => array('id'=> 1, 'title' => 'First Post'), 7. 'Comment' => array( 8. array('id'=> 1, 'title' => 'First Comment'), 9. array('id'=> 2, 'title' => 'Second Comment') 10.), 11.'Tag' => array( 12.array('id'=> 1, 'title' => 'First Tag'), 13.array('id'=> 2, 'title' => 'Second Tag') 14.), 15.); 16.$map = Set::map($a); // Convierte $a en un objeto de clase 17./* $map ahora queda como: 18.stdClass Object 19.( 20.[_name_] => Post 21.[id] => 1 22.[title] => First Post 23.[Comment] => Array 24.( 25.[0] => stdClass Object 26.( 27.[id] => 1 28.[title] => First Comment 29.) 30.[1] => stdClass Object 31.( 32.[id] => 2 33.[title] => Second Comment 34.) 35.) 36.[Tag] => Array 37.( 38.[0] => stdClass Object 39.(

40.[id] => 1 41.[title] => First Tag 42.) 43.[1] => stdClass Object 44.( 45.[id] => 2 46.[title] => Second Tag 47.) 48.) 49.) 50.*/ 51.$result = Set::reverse($map); 52./* $result ahora queda como: 53.Array 54.( 55.[Post] => Array 56.( 57.[id] => 1 58.[title] => First Post 59.[Comment] => Array 60.( 61.[0] => Array 62.( 63.[id] => 1 64.[title] => First Comment 65.) 66.[1] => Array 67.( 68.[id] => 2 69.[title] => Second Comment 70.) 71.) 72.[Tag] => Array 73.( 74.[0] => Array 75.( 76.[id] => 1 77.[title] => First Tag 78.) 79.[1] => Array 80.( 81.[id] => 2 82.[title] => Second Tag 83.) 84.) 85.) 86.) 87.*/

88.$result = Set::reverse($a['Post']); // Slo retorna un arreglo 89./* $result ahora queda como: 90.Array 91.( 92.[id] => 1 93.[title] => First Post 94.) 95.*/ 96.
8.5.5 combine

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones array Set::combine ($data, $path1 = null, $path2 = null, $groupPath = null) Crea un arreglo asociativo usando un $path1 como la ruta para construir las llaves, y opcionalmente $path2 como la ruta para obtener los valores. Si $path2 no es especificado, todos los valores sern inicializados como null (lo cual es til para Set::merge). Opcionalmente se pueden agrupar los valores obtenidos segn la ruta especificada en $groupPath. $result = Set::combine(array(), '{n}.User.id', '{n}.User.Data'); // $result == array(); $result = Set::combine('', '{n}.User.id', '{n}.User.Data'); // $result == array(); $a = array( array('User' => array('id' => 2, 'group_id' => 1, 'Data' => array('user' => 'mariano.iglesias','name' => 'Mariano Iglesias'))), 8. array('User' => array('id' => 14, 'group_id' => 2, 9. 'Data' => array('user' => 'phpnut', 'name' => 'Larry E. Masters'))), 10.array('User' => array('id' => 25, 'group_id' => 1, 11.'Data' => array('user' => 'gwoo','name' => 'The Gwoo')))); 12.$result = Set::combine($a, '{n}.User.id'); 13./* $result ahora queda como: 14.Array 1. 2. 3. 4. 5. 6. 7.

15.( 16.[2] => 17.[14] => 18.[25] => 19.) 20.*/ 21.$result = Set::combine($a, '{n}.User.id', '{n}.User.nonexistant'); 22./* $result ahora queda como: 23.Array 24.( 25.[2] => 26.[14] => 27.[25] => 28.) 29.*/ 30.$result = Set::combine($a, '{n}.User.id', '{n}.User.Data'); 31./* $result ahora queda como: 32.Array 33.( 34.[2] => Array 35.( 36.[user] => mariano.iglesias 37.[name] => Mariano Iglesias 38.) 39.[14] => Array 40.( 41.[user] => phpnut 42.[name] => Larry E. Masters 43.) 44.[25] => Array 45.( 46.[user] => gwoo 47.[name] => The Gwoo 48.) 49.) 50.*/ 51.$result = Set::combine($a, '{n}.User.id', '{n}.User.Data.name'); 52./* $result ahora queda como: 53.Array 54.( 55.[2] => Mariano Iglesias 56.[14] => Larry E. Masters 57.[25] => The Gwoo 58.) 59.*/ 60.$result = Set::combine($a, '{n}.User.id', '{n}.User.Data',

'{n}.User.group_id'); 61./* $result ahora queda como: 62.Array 63.( 64.[1] => Array 65.( 66.[2] => Array 67.( 68.[user] => mariano.iglesias 69.[name] => Mariano Iglesias 70.) 71.[25] => Array 72.( 73.[user] => gwoo 74.[name] => The Gwoo 75.) 76.) 77.[2] => Array 78.( 79.[14] => Array 80.( 81.[user] => phpnut 82.[name] => Larry E. Masters 83.) 84.) 85.) 86.*/ 87.$result = Set::combine($a, '{n}.User.id', '{n}.User.Data.name', '{n}.User.group_id'); 88./* $result ahora queda como: 89.Array 90.( 91.[1] => Array 92.( 93.[2] => Mariano Iglesias 94.[25] => The Gwoo 95.) 96.[2] => Array 97.( 98.[14] => Larry E. Masters 99.) 100.) 101.*/ 102.$result = Set::combine($a, '{n}.User.id'); 103./* $result ahora queda como: 104.Array 105.( 106.[2] =>

107.[14] => 108.[25] => 109.) 110.*/ 111.$result = Set::combine($a, '{n}.User.id', '{n}.User.Data'); 112./* $result ahora queda como: 113.Array 114.( 115.[2] => Array 116.( 117.[user] => mariano.iglesias 118.[name] => Mariano Iglesias 119.) 120.[14] => Array 121.( 122.[user] => phpnut 123.[name] => Larry E. Masters 124.) 125.[25] => Array 126.( 127.[user] => gwoo 128.[name] => The Gwoo 129.) 130.) 131.*/ 132.$result = Set::combine($a, '{n}.User.id', '{n}.User.Data.name'); 133./* $result ahora queda como: 134.Array 135.( 136.[2] => Mariano Iglesias 137.[14] => Larry E. Masters 138.[25] => The Gwoo 139.) 140.*/ 141.$result = Set::combine($a, '{n}.User.id', '{n}.User.Data', '{n}.User.group_id'); 142./* $result ahora queda como: 143.Array 144.( 145.[1] => Array 146.( 147.[2] => Array 148.( 149.[user] => mariano.iglesias 150.[name] => Mariano Iglesias 151.) 152.[25] => Array

153.( 154.[user] => gwoo 155.[name] => The Gwoo 156.) 157.) 158.[2] => Array 159.( 160.[14] => Array 161.( 162.[user] => phpnut 163.[name] => Larry E. Masters 164.) 165.) 166.) 167.*/ 168.$result = Set::combine($a, '{n}.User.id', '{n}.User.Data.name', '{n}.User.group_id'); 169./* $result ahora queda como: 170.Array 171.( 172.[1] => Array 173.( 174.[2] => Mariano Iglesias 175.[25] => The Gwoo 176.) 177.[2] => Array 178.( 179.[14] => Larry E. Masters 180.) 181.) 182.*/ 183.$result = Set::combine($a, '{n}.User.id', array('{0}: {1}', '{n}.User.Data.user', '{n}.User.Data.name'), '{n}.User.group_id'); 184./* $result ahora queda como: 185.Array 186.( 187.[1] => Array 188.( 189.[2] => mariano.iglesias: Mariano Iglesias 190.[25] => gwoo: The Gwoo 191.) 192.[2] => Array 193.( 194.[14] => phpnut: Larry E. Masters 195.) 196.) 197.*/

198.$result = Set::combine($a, array('{0}: {1}', '{n}.User.Data.user', '{n}.User.Data.name'), '{n}.User.id'); 199./* $result ahora queda como: 200.Array 201.( 202.[mariano.iglesias: Mariano Iglesias] => 2 203.[phpnut: Larry E. Masters] => 14 204.[gwoo: The Gwoo] => 25 205.) 206.*/ 207.$result = Set::combine($a, array('{1}: {0}', '{n}.User.Data.user', '{n}.User.Data.name'), '{n}.User.id'); 208./* $result ahora queda como: 209.Array 210.( 211.[Mariano Iglesias: mariano.iglesias] => 2 212.[Larry E. Masters: phpnut] => 14 213.[The Gwoo: gwoo] => 25 214.) 215.*/ 216.$result = Set::combine($a, array('%1$s: %2$d', '{n}.User.Data.user', '{n}.User.id'), '{n}.User.Data.name'); 217./* $result ahora queda como: 218.Array 219.( 220.[mariano.iglesias: 2] => Mariano Iglesias 221.[phpnut: 14] => Larry E. Masters 222.[gwoo: 25] => The Gwoo 223.) 224.*/ 225.$result = Set::combine($a, array('%2$d: %1$s', '{n}.User.Data.user', '{n}.User.id'), '{n}.User.Data.name'); 226./* $result ahora queda como: 227.Array 228.( 229.[2: mariano.iglesias] => Mariano Iglesias 230.[14: phpnut] => Larry E. Masters 231.[25: gwoo] => The Gwoo 232.) 233.*/
8.5.6 normalize

Editar Ver slo esta seccin Historia Comparar con el contenido original

array Set::normalize ($list, $assoc = true, $sep = ',', $trim = true)

Normaliza un string o arreglo lista. $a = array('Tree', 'CounterCache', 'Upload' => array( 'folder' => 'products', 'fields' => array('image_1_id', 'image_2_id', 'image_3_id', 'image_4_id', 'image_5_id'))); 5. $b = array('Cacheable' => array('enabled' => false), 6. 'Limit', 7. 'Bindable', 8. 'Validator', 9. 'Transactional'); 10.$result = Set::normalize($a); 11./* $result ahora queda como: 12.Array 13.( 14.[Tree] => 15.[CounterCache] => 16.[Upload] => Array 17.( 18.[folder] => products 19.[fields] => Array 20.( 21.[0] => image_1_id 22.[1] => image_2_id 23.[2] => image_3_id 24.[3] => image_4_id 25.[4] => image_5_id 26.) 27.) 28.) 29.*/ 30.$result = Set::normalize($b); 31./* $result ahora queda como: 32.Array 33.( 34.[Cacheable] => Array 35.( 36.[enabled] => 37.) 38.[Limit] => 39.[Bindable] => 40.[Validator] => 41.[Transactional] => 42.) 43.*/ 44.$result = Set::merge($a, $b); // Ahora mezclamos ambos y luego normalizamos 1. 2. 3. 4.

45./* $result ahora queda como: 46.Array 47.( 48.[0] => Tree 49.[1] => CounterCache 50.[Upload] => Array 51.( 52.[folder] => products 53.[fields] => Array 54.( 55.[0] => image_1_id 56.[1] => image_2_id 57.[2] => image_3_id 58.[3] => image_4_id 59.[4] => image_5_id 60.) 61.) 62.[Cacheable] => Array 63.( 64.[enabled] => 65.) 66.[2] => Limit 67.[3] => Bindable 68.[4] => Validator 69.[5] => Transactional 70.) 71.*/ 72.$result = Set::normalize(Set::merge($a, $b)); 73./* $result ahora queda: 74.Array 75.( 76.[Tree] => 77.[CounterCache] => 78.[Upload] => Array 79.( 80.[folder] => products 81.[fields] => Array 82.( 83.[0] => image_1_id 84.[1] => image_2_id 85.[2] => image_3_id 86.[3] => image_4_id 87.[4] => image_5_id 88.) 89.) 90.[Cacheable] => Array 91.( 92.[enabled] =>

93.) 94.[Limit] => 95.[Bindable] => 96.[Validator] => 97.[Transactional] => 98.) 99.*/
8.5.7 countDim

Editar Ver slo esta seccin Historia Comparar con el contenido original

integer Set::countDim ($array = null, $all = false, $count = 0) Cuenta las dimensiones de un arreglo. Si $all est seteado como falso (su valor por defecto) slo se considerarn las dimensiones del primer elemento en el arreglo. $data = array('one', '2', 'three'); $result = Set::countDim($data); // $result == 1 $data = array('1' => '1.1', '2', '3'); $result = Set::countDim($data); // $result == 1 $data = array('1' => array('1.1' => '1.1.1'), '2', '3' => array('3.1' => '3.1.1')); 8. $result = Set::countDim($data); 9. // $result == 2 10.$data = array('1' => '1.1', '2', '3' => array('3.1' => '3.1.1')); 11.$result = Set::countDim($data); 12.// $result == 1 13.$data = array('1' => '1.1', '2', '3' => array('3.1' => '3.1.1')); 14.$result = Set::countDim($data, true); 15.// $result == 2 16.$data = array('1' => array('1.1' => '1.1.1'), '2', '3' => array('3.1' => array('3.1.1' => '3.1.1.1'))); 17.$result = Set::countDim($data); 18.// $result == 2 19.$data = array('1' => array('1.1' => '1.1.1'), '2', '3' => array('3.1' => array('3.1.1' => '3.1.1.1'))); 20.$result = Set::countDim($data, true); 21.// $result == 3 22.$data = array('1' => array('1.1' => '1.1.1'), array('2' => array('2.1' => array('2.1.1' => '2.1.1.1'))), '3' => array('3.1' => array('3.1.1' => '3.1.1.1'))); 1. 2. 3. 4. 5. 6. 7.

23.$result = Set::countDim($data, true); 24.// $result == 4 25.$data = array('1' => array('1.1' => '1.1.1'), array('2' => array('2.1' => array('2.1.1' => array('2.1.1.1')))), '3' => array('3.1' => array('3.1.1' => '3.1.1.1'))); 26.$result = Set::countDim($data, true); 27.// $result == 5 28.$data = array('1' => array('1.1' => '1.1.1'), array('2' => array('2.1' => array('2.1.1' => array('2.1.1.1' => '2.1.1.1.1')))), '3' => array('3.1' => array('3.1.1' => '3.1.1.1'))); 29.$result = Set::countDim($data, true); 30.// $result == 5 31.$set = array('1' => array('1.1' => '1.1.1'), array('2' => array('2.1' => array('2.1.1' => array('2.1.1.1' => '2.1.1.1.1')))), '3' => array('3.1' => array('3.1.1' => '3.1.1.1'))); 32.$result = Set::countDim($set, false, 0); 33.// $result == 2 34.$result = Set::countDim($set, true); 35.// $result == 5 36.
8.5.8 diff

Editar Ver slo esta seccin Historia Comparar con el contenido original

array Set::diff ($val1, $val2 = null) Calcula la diferencia entre un Set y un arreglo, dos Sets, o dos arreglos 1. $a = array( 2. 0 => array('name' => 'main'), 3. 1 => array('name' => 'about') 4. ); 5. $b = array( 6. 0 => array('name' => 'main'), 7. 1 => array('name' => 'about'), 8. 2 => array('name' => 'contact') 9. ); 10.$result = Set::diff($a, $b); 11./* $result ahora queda: 12.Array 13.( 14.[2] => Array 15.(

16.[name] => contact 17.) 18.) 19.*/ 20.$result = Set::diff($a, array()); 21./* $result ahora queda: 22.Array 23.( 24.[0] => Array 25.( 26.[name] => main 27.) 28.[1] => Array 29.( 30.[name] => about 31.) 32.) 33.*/ 34.$result = Set::diff(array(), $b); 35./* $result ahora queda: 36.Array 37.( 38.[0] => Array 39.( 40.[name] => main 41.) 42.[1] => Array 43.( 44.[name] => about 45.) 46.[2] => Array 47.( 48.[name] => contact 49.) 50.) 51.*/ 52.$b = array( 53.0 => array('name' => 'me'), 54.1 => array('name' => 'about') 55.); 56.$result = Set::diff($a, $b); 57./* $result ahora queda: 58.Array 59.( 60.[0] => Array 61.( 62.[name] => main 63.)

64.) 65.*/
8.5.9 check

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones boolean Set::check ($data, $path = null) Verifica si una ruta particular est seteada en un arreglo $set = array( 'My Index 1' => array('First' => 'The first item') ); $result = Set::check($set, 'My Index 1.First'); // $result == True $result = Set::check($set, 'My Index 1'); // $result == True $result = Set::check($set, array()); // $result == array('My Index 1' => array('First' => 'The first item')) 10.$set = array( 11.'My Index 1' => array('First' => 12.array('Second' => 13.array('Third' => 14.array('Fourth' => 'Heavy. Nesting.')))) 15.); 16.$result = Set::check($set, 'My Index 1.First.Second'); 17.// $result == True 18.$result = Set::check($set, 'My Index 1.First.Second.Third'); 19.// $result == True 20.$result = Set::check($set, 'My Index 1.First.Second.Third.Fourth'); 21.// $result == True 22.$result = Set::check($set, 'My Index 1.First.Seconds.Third.Fourth'); 23.// $result == False 1. 2. 3. 4. 5. 6. 7. 8. 9.
8.5.10 remove

Editar

Ver slo esta seccin Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones boolean Set::remove ($list, $path = null) Elimina un elemento de un Set o arreglo segn sea definido en una ruta en la variable $path. 1. $a = array( 2. 'pages' => array('name' => 'page'), 3. 'files' => array('name' => 'files') 4. ); 5. $result = Set::remove($a, 'files', array('name' => 'files')); 6. /* $result ahora queda como: 7. Array 8. ( 9. [pages] => Array 10.( 11.[name] => page 12.) 13.) 14.*/
8.5.11 classicExtract

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones array Set::classicExtract ($data, $path = null) Obtiene un valor desde un arreglo u objeto que est contenido en una ruta entregada usando una sintxis de ruta de arreglo, es decir: "{n}.Person.{[a-z]+}" - Donde "{n}" representa una llave numrica, "Person" representa una cadena literal

"{[a-z]+}" (es decir, cualquier string literal encerrado en llaves junto a {n} y {s}) es interpretado como una expresin regular. Ejemplo 1 1. $a = array( 2. array('Article' => array('id' => 1, 'title' => 'Article 1')), 3. array('Article' => array('id' => 2, 'title' => 'Article 2')), 4. array('Article' => array('id' => 3, 'title' => 'Article 3'))); 5. $result = Set::extract($a, '{n}.Article.id'); 6. /* $result ahora queda: 7. Array 8. ( 9. [0] => 1 10.[1] => 2 11.[2] => 3 12.) 13.*/ 14.$result = Set::extract($a, '{n}.Article.title'); 15./* $result ahora queda: 16.Array 17.( 18.[0] => Article 1 19.[1] => Article 2 20.[2] => Article 3 21.) 22.*/ 23.$result = Set::extract($a, '1.Article.title'); 24.// $result == "Article 2" 25.$result = Set::extract($a, '3.Article.title'); 26.// $result == null Ejemplo 2 1. $a = array( 2. 0 => array('pages' => array('name' => 'page')), 3. 1 => array('fruites'=> array('name' => 'fruit')), 4. 'test' => array(array('name' => 'jippi')), 5. 'dot.test' => array(array('name' => 'jippi')) 6. ); 7. $result = Set::extract($a, '{n}.{s}.name'); 8. /* $result ahora queda como: 9. Array 10.( 11.[0] => Array 12.( 13.[0] => page 14.) 15.[1] => Array

16.( 17.[0] => fruit 18.) 19.) 20.*/ 21.$result = Set::extract($a, '{s}.{n}.name'); 22./* $result ahora queda como: 23.Array 24.( 25.[0] => Array 26.( 27.[0] => jippi 28.) 29.[1] => Array 30.( 31.[0] => jippi 32.) 33.) 34.*/ 35.$result = Set::extract($a,'{\w+}.{\w+}.name'); 36./* $result ahora queda como: 37.Array 38.( 39.[0] => Array 40.( 41.[pages] => page 42.) 43.[1] => Array 44.( 45.[fruites] => fruit 46.) 47.[test] => Array 48.( 49.[0] => jippi 50.) 51.[dot.test] => Array 52.( 53.[0] => jippi 54.) 55.) 56.*/ 57.$result = Set::extract($a,'{\d+}.{\w+}.name'); 58./* $result ahora queda como: 59.Array 60.( 61.[0] => Array 62.( 63.[pages] => page

64.) 65.[1] => Array 66.( 67.[fruites] => fruit 68.) 69.) 70.*/ 71.$result = Set::extract($a,'{n}.{\w+}.name'); 72./* $result Ahora queda como: 73.Array 74.( 75.[0] => Array 76.( 77.[pages] => page 78.) 79.[1] => Array 80.( 81.[fruites] => fruit 82.) 83.) 84.*/ 85.$result = Set::extract($a,'{s}.{\d+}.name'); 86./* $result ahora queda como: 87.Array 88.( 89.[0] => Array 90.( 91.[0] => jippi 92.) 93.[1] => Array 94.( 95.[0] => jippi 96.) 97.) 98.*/ 99.$result = Set::extract($a,'{s}'); 100./* $result ahora queda como: 101.Array 102.( 103.[0] => Array 104.( 105.[0] => Array 106.( 107.[name] => jippi 108.) 109.) 110.[1] => Array 111.(

112.[0] => Array 113.( 114.[name] => jippi 115.) 116.) 117.) 118.*/ 119.$result = Set::extract($a,'{[a-z]}'); 120./* $result ahora queda como: 121.Array 122.( 123.[test] => Array 124.( 125.[0] => Array 126.( 127.[name] => jippi 128.) 129.) 130.[dot.test] => Array 131.( 132.[0] => Array 133.( 134.[name] => jippi 135.) 136.) 137.) 138.*/ 139.$result = Set::extract($a, '{dot\.test}.{n}'); 140./* $result ahora queda como: 141.Array 142.( 143.[dot.test] => Array 144.( 145.[0] => Array 146.( 147.[name] => jippi 148.) 149.) 150.) 151.*/
8.5.12 matches

Editar Ver slo esta seccin Historia Comparar con el contenido original

boolean Set::matches ($conditions, $data=array(), $i = null,

$length=null) Set::matches puede ser usado para ver su un item o una ruta calza con ciertas condiciones. 1. $a = array( 2. array('Article' => array('id' => 1, 'title' => 'Article 1')), 3. array('Article' => array('id' => 2, 'title' => 'Article 2')), 4. array('Article' => array('id' => 3, 'title' => 'Article 3'))); 5. $res=Set::matches(array('id>2'), $a[1]['Article']); 6. // returns false 7. $res=Set::matches(array('id>=2'), $a[1]['Article']); 8. // returns true 9. $res=Set::matches(array('id>=3'), $a[1]['Article']); 10.// returns false 11.$res=Set::matches(array('id<=2'), $a[1]['Article']); 12.// returns true 13.$res=Set::matches(array('id<2'), $a[1]['Article']); 14.// returns false 15.$res=Set::matches(array('id>1'), $a[1]['Article']); 16.// returns true 17.$res=Set::matches(array('id>1', 'id<3', 'id!=0'), $a[1] ['Article']); 18.// returns true 19.$res=Set::matches(array('3'), null, 3); 20.// returns true 21.$res=Set::matches(array('5'), null, 5); 22.// returns true 23.$res=Set::matches(array('id'), $a[1]['Article']); 24.// returns true 25.$res=Set::matches(array('id', 'title'), $a[1]['Article']); 26.// returns true 27.$res=Set::matches(array('non-existant'), $a[1]['Article']); 28.// returns false 29.$res=Set::matches('/Article[id=2]', $a); 30.// returns true 31.$res=Set::matches('/Article[id=4]', $a); 32.// returns false 33.$res=Set::matches(array(), $a); 34.// returns true
8.5.13 extract

Editar Ver slo esta seccin Historia Comparar con el contenido original

array Set::extract ($path, $data=null, $options=array())

Set::extract utiliza la sintxis bsica XPath 2.0 para retornar subconjuntos de la data resultante de un find(). Esta funcin permite extraer datos rpidamente sin tener que hacer un ciclo a travs de un arreglos multidimensionales o de estructuras de rbol. Si $path es un arreglo o $data es vaco la llamada se redirigir a la funcin Set::classicExtract. 1. 2. 3. 4. 5. // Uso comn: $users = $this->User->find("all"); $results = Set::extract('/User/id', $users); // results retorna: // array(1,2,3,4,5,...); Seleccionador /User/id /User[2]/name /User[id<2] /User[id>2][<5] / Post/Comment[author_name=jo hn]/../name /Posts[title] /Comment/.[1] /Comment/.[:last] /Comment/.[:first] Descripcin Similar al clsico {n}.User.id Selecciona el nombre del segundo User Selecciona todos los Users con un id < 2 Selecciona todos los Users con un id > 2 pero < 5 Selecciona los nombres de todos los Posts que tienen al menos un comentario escrito por john

Los seleccionadores implementados actualmente son:

Selecciona todos los Post que tienen la llave 'title' Selecciona el contenido del primer comentario Selecciona el ltimo comentario Selecciona el primer comentario Selecciona todos los comentarios que tienen un texto que calce con la /Comment[text=/cakephp/i] expresin regular (regex) /cakephp/i /Comment/@* Selecciona todos los nombres clave de todos los comentarios Actualmente, solo las rutas absolutas con un solo '/' estn soportadas. Por favor reporte cualquier bug que encuentre en ellas, y tambin las sugerencias para futuras funcionalidades son bien recibidas. Para aprender ms acerca de Set::extract refirase a la funcin testExtract() en /cake/tests/cases/libs/set.test.php.
8.5.14 format

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones array Set::format ($data, $format, $keys) Returns a series of values extracted from an array, formatted in a

format string. 1. $data = array( 2. array('Person' => array('first_name' => 'Nate', 'last_name' => 'Abele', 'city' => 'Boston', 'state' => 'MA', 'something' => '42')), 3. array('Person' => array('first_name' => 'Larry', 'last_name' => 'Masters', 'city' => 'Boondock', 'state' => 'TN', 'something' => '{0}')), 4. array('Person' => array('first_name' => 'Garrett', 'last_name' => 'Woodworth', 'city' => 'Venice Beach', 'state' => 'CA', 'something' => '{1}'))); 5. $res = Set::format($data, '{1}, {0}', array('{n}.Person.first_name', '{n}.Person.last_name')); 6. /* 7. Array 8. ( 9. [0] => Abele, Nate 10.[1] => Masters, Larry 11.[2] => Woodworth, Garrett 12.) 13.*/ 14.$res = Set::format($data, '{0}, {1}', array('{n}.Person.city', '{n}.Person.state')); 15./* 16.Array 17.( 18.[0] => Boston, MA 19.[1] => Boondock, TN 20.[2] => Venice Beach, CA 21.) 22.*/ 23.$res = Set::format($data, '{{0}, {1}}', array('{n}.Person.city', '{n}.Person.state')); 24./* 25.Array 26.( 27.[0] => {Boston, MA} 28.[1] => {Boondock, TN} 29.[2] => {Venice Beach, CA} 30.) 31.*/ 32.$res = Set::format($data, '{%2$d, %1$s}', array('{n}.Person.something', '{n}.Person.something')); 33./* 34.Array 35.( 36.[0] => {42, 42}

37.[1] => {0, {0}} 38.[2] => {0, {1}} 39.) 40.*/ 41.$res = Set::format($data, '%2$d, %1$s', array('{n}.Person.first_name', '{n}.Person.something')); 42./* 43.Array 44.( 45.[0] => 42, Nate 46.[1] => 0, Larry 47.[2] => 0, Garrett 48.) 49.*/ 50.$res = Set::format($data, '%1$s, %2$d', array('{n}.Person.first_name', '{n}.Person.something')); 51./* 52.Array 53.( 54.[0] => Nate, 42 55.[1] => Larry, 0 56.[2] => Garrett, 0 57.) 58.*/
8.5.15 enum

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones string Set::enum ($select, $list=null) The enum method works well when using html select elements. It returns a value from an array list if the key exists. If a comma separated $list is passed arrays are numeric with the key of the first being 0 $list = 'no, yes' would translate to $list = array(0 => 'no', 1 => 'yes'); If an array is used, keys can be strings example: array('no' => 0, 'yes' => 1); $list defaults to 0 = no 1 = yes if param is not passed 1. 2. 3. 4. $res = Set::enum(1, 'one, two'); // $res is 'two' $res = Set::enum('no', array('no' => 0, 'yes' => 1)); // $res is 0

5. $res = Set::enum('first', array('first' => 'one', 'second' => 'two')); 6. // $res is 'one'
8.5.16 numeric

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones boolean Set::numeric ($array=null) Checks to see if all the values in the array are numeric 1. $data = array('one'); 2. $res = Set::numeric(array_keys($data)); 3. // $res is true 4. $data = array(1 => 'one'); 5. $res = Set::numeric($data); 6. // $res is false 7. $data = array('one'); 8. $res = Set::numeric($data); 9. // $res is false 10.$data = array('one' => 'two'); 11.$res = Set::numeric($data); 12.// $res is false 13.$data = array('one' => 1); 14.$res = Set::numeric($data); 15.// $res is true 16.$data = array(0); 17.$res = Set::numeric($data); 18.// $res is true 19.$data = array('one', 'two', 'three', 'four', 'five'); 20.$res = Set::numeric(array_keys($data)); 21.// $res is true 22.$data = array(1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five'); 23.$res = Set::numeric(array_keys($data)); 24.// $res is true 25.$data = array('1' => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five'); 26.$res = Set::numeric(array_keys($data)); 27.// $res is true 28.$data = array('one', 2 => 'two', 3 => 'three', 4 => 'four', 'a' => 'five'); 29.$res = Set::numeric(array_keys($data)); 30.// $res is false

8.5.17 map

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones object Set::map ($class = 'stdClass', $tmp = 'stdClass') This method Maps the contents of the Set object to an object hierarchy while maintaining numeric keys as arrays of objects. Basically, the map function turns array items into initialized class objects. By default it turns an array into a stdClass Object, however you can map values into any type of class. Example: Set::map($array_of_values, 'nameOfYourClass'); 1. $data = array( 2. array( 3. "IndexedPage" => array( 4. "id" => 1, 5. "url" => 'http://blah.com/', 6. 'hash' => '68a9f053b19526d08e36c6a9ad150737933816a5', 7. 'get_vars' => '', 8. 'redirect' => '', 9. 'created' => "1195055503", 10.'updated' => "1195055503", 11.) 12.), 13.array( 14."IndexedPage" => array( 15."id" => 2, 16."url" => 'http://blah.com/', 17.'hash' => '68a9f053b19526d08e36c6a9ad150737933816a5', 18.'get_vars' => '', 19.'redirect' => '', 20.'created' => "1195055503", 21.'updated' => "1195055503", 22.), 23.) 24.); 25.$mapped = Set::map($data); 26./* $mapped now looks like: 27.Array 28.( 29.[0] => stdClass Object 30.( 31.[_name_] => IndexedPage 32.[id] => 1

33.[url] => http://blah.com/ 34.[hash] => 68a9f053b19526d08e36c6a9ad150737933816a5 35.[get_vars] => 36.[redirect] => 37.[created] => 1195055503 38.[updated] => 1195055503 39.) 40.[1] => stdClass Object 41.( 42.[_name_] => IndexedPage 43.[id] => 2 44.[url] => http://blah.com/ 45.[hash] => 68a9f053b19526d08e36c6a9ad150737933816a5 46.[get_vars] => 47.[redirect] => 48.[created] => 1195055503 49.[updated] => 1195055503 50.) 51.) 52.*/ Using Set::map() with a custom class for second parameter: 1. 2. 3. 4. 5. 6. 7. 8. 9. class MyClass { function sayHi() { echo 'Hi!'; } } $mapped = Set::map($data, 'MyClass'); //Now you can access all the properties as in the example above, //but also you can call MyClass's methods $mapped->[0]->sayHi();

8.5.18 pushDiff

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones array Set::pushDiff ($array1, $array2) This function merges two arrays and pushes the differences in array2 to the bottom of the resultant array. Example 1 1. $array1 = array('ModelOne' => array('id'=>1001, 'field_one'=>'a1.m1.f1', 'field_two'=>'a1.m1.f2')); 2. $array2 = array('ModelOne' => array('id'=>1003,

'field_one'=>'a3.m1.f1', 'field_two'=>'a3.m1.f2', 'field_three'=>'a3.m1.f3')); 3. $res = Set::pushDiff($array1, $array2); 4. /* $res now looks like: 5. Array 6. ( 7. [ModelOne] => Array 8. ( 9. [id] => 1001 10.[field_one] => a1.m1.f1 11.[field_two] => a1.m1.f2 12.[field_three] => a3.m1.f3 13.) 14.) 15.*/ Example 2 1. $array1 = array("a"=>"b", 1 => 20938, "c"=>"string"); 2. $array2 = array("b"=>"b", 3 => 238, "c"=>"string", array("extra_field")); 3. $res = Set::pushDiff($array1, $array2); 4. /* $res now looks like: 5. Array 6. ( 7. [a] => b 8. [1] => 20938 9. [c] => string 10.[b] => b 11.[3] => 238 12.[4] => Array 13.( 14.[0] => extra_field 15.) 16.) 17.*/
8.5.19 filter

Editar Ver slo esta seccin Historia Comparar con el contenido original

array Set::filter ($var, $isArray=null) Filtra los elementos vacos de una ruta de arreglo, excluyendo el cero '0'. 1. $res = Set::filter(array('0', false, true, 0, array('una cosa', 'Te digo', 'es asi', false)));

2. /* $res now looks like: 3. Array ( 4. [0] => 0 5. [2] => 1 6. [3] => 0 7. [4] => Array 8. ( 9. [0] => una cosa 10.[1] => Te digo 11.[2] => es asi 12.[3] => 13.) 14.) 15.*/
8.5.20 merge

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones array Set::merge ($arr1, $arr2=null) Esta funcin se puede considerar como un hbrido entre las funciones array_merge y arraymerge_recursive, ambas de PHP. La diferencia esta en que si un arreglo de llaves contiene otro arreglo entonces la funcin se comporta recursivamente, a diferencia de array_merge, pero no lo hace si las llaves que contienen strings, a diferencia de array_merge_recursive. Verifica el test de unidad para mas informacin. Esta funcin trabaja sobre un numero ilimitado de argumentos y hace un casting como arreglos a los argumentos que no lo sean. 1. 2. 3. 4. 5. 6. 7. 8. 9. $arry1 = array( array( 'id' => '48c2570e-dfa8-4c32-a35e-0d71cbdd56cb', 'name' => 'mysql raleigh-workshop-08 < 2008-09-05.sql ', 'description' => 'Importing an sql dump' ), array( 'id' => '48c257a8-cf7c-4af2-ac2f-114ecbdd56cb', 'name' => 'pbpaste | grep -i Impago | pbcopy',

10.'description' => 'Eliminar las lineas que dicen "Impago".', 11.) 12.); 13.$arry2 = 4; 14.$arry3 = array(0=>"Arreglo de prueba", "gatos"=>"perros"); 15.$res = Set::merge($arry1, $arry2, $arry3); 16./* $res ahora queda como: 17.Array 18.( 19.[0] => Array 20.( 21.[id] => 48c2570e-dfa8-4c32-a35e-0d71cbdd56cb 22.[name] => mysql raleigh-workshop-08 < 2008-09-05.sql 23.[description] => Importing an sql dump 24.) 25.[1] => Array 26.( 27.[id] => 48c257a8-cf7c-4af2-ac2f-114ecbdd56cb 28.[name] => pbpaste | grep -i Impago | pbcopy 29.[description] => Eliminar las lineas que dicen "Impago". 30.) 31.[2] => 4 32.[3] => Arreglo de prueba 33.[gatos] => perros 34.) 35.*/
8.5.21 contains

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones boolean Set::contains ($val1, $val2 = null) Determines if one Set or array contains the exact keys and values of another. 1. 2. 3. 4. 5. 6. 7. 8. 9. $a = array( 0 => array('name' 1 => array('name' ); $b = array( 0 => array('name' 1 => array('name' 2 => array('name' 'a' => 'b' => 'main'), => 'about') => 'main'), => 'about'), => 'contact'),

10.); 11.$result = Set::contains($a, $a); 12.// True 13.$result = Set::contains($a, $b); 14.// False 15.$result = Set::contains($b, $a); 16.// True 8.6 Security Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The security library handles basic security measures such as providing methods for hashing and encrypting data. 8.7 Cache Editar Ver slo esta seccin Historia Comparar con el contenido original

La clase Cache en CakePHP provee una interfaz generica con varios metodos de cache. Es posible tener varias configuraciones y motores en el archivo app/config/core.php
8.7.1 Cache::read()

Editar Ver slo esta seccin Historia Comparar con el contenido original

Cache::read($key, $config = null) El mtodo Cache::read() se utiliza para leer el valor guardado en el cache con el nombre $key de la configuracin $config. Si $config es null se utiliza el configuracin por defecto. Cache::read() retornar el valor almacenado si es un cache valido o false si el cache expir o no existe. Los contenidos del cache podran evaluarse como false, as que asegrate de usar el operador de comparacin estricta === o ! ==. Por ejemplo: 1. $cloud = Cache::read('cloud'); 2. if ($cloud !== false) {

3. 4. 5. 6. 7. 8. 9.

return $cloud; } // generate cloud data // ... // store data in cache Cache::write('cloud', $cloud); return $cloud;

8.7.2 Cache::write()

Editar Ver slo esta seccin Historia Comparar con el contenido original

Cache::write($key, $value, $config = null); Cache::write() escribir un valor $value en el Cache. Puedes leer o borrar ese valor ms adelante refirindote a l por $key. Puedes especificar opcionalmente una configuracin para guardar el cache. Si no se especifica $config se usar la configuracin por defecto. Cache::write() puede almacenar cualquier tipo de objeto y es ideal para guardar resultados de bsquedas de modelos. 1. 2. 3. 4. if (($posts = Cache::read('posts')) === false) { $posts = $this->Post->find('all'); Cache::write('posts', $posts); }

Usa Cache::write() y Cache::read() para reducir con facilidad la cantidad de viajes a la base de datos para recuperar registros.
8.7.3 Cache::delete()

Editar Ver slo esta seccin Historia Comparar con el contenido original

Cache::delete($key, $config = null) Cache::delete() te permitir eliminar completamente cualquier objeto que tengas guardado en el Cache.
8.7.4 Cache::config()

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor

ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Cache::config() se usa para crear configuraciones de Cache adicionales. Estas configuraciones a mayores pueden tener diferente duracin, motores, rutas, o prefijos de los que tiene tu configuracin por defecto. Usar configuraciones mltiples te puede ayudar a reducir la cantidad de veces que necesitas usar Cache::set() as como centralizar todos tus ajustes de Cache. Debes especificar qu motor usar. No se pone por defecto a File. 1. Cache::config('short', array( 2. 'engine' => 'File', 3. 'duration'=> '+1 hours', 4. 'path' => CACHE, 5. 'prefix' => 'cake_short_' 6. )); 7. // long 8. Cache::config('long', array( 9. 'engine' => 'File', 10.'duration'=> '+1 week', 11.'probability'=> 100, 12.'path' => CACHE . 'long' . DS, 13.)); Aadiendo el cdigo anterior en tu app/config/core.php tendrs dos configuraciones de Cache adicionales. El nombre de estas configuraciones 'short' o 'long' se usa como parmetro $config para Cache::write() y Cache::read().
8.7.5 Cache::set()

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Cache::set() te permite puentear temporalmente los ajustes de configuracin de Cache para una operacin (normalmente read o write). Si usas Cache::set() para cambiar los ajustes para una escritura,

deberas usar Cache::set() antes de leer los datos ms tarde. Si no haces eso, se usar la configuracin por defecto cuando se lea la clave de la cache. 1. 2. 3. 4. 5. Cache::set(array('duration' => '+30 days')); Cache::write('results', $data); // Later on Cache::set(array('duration' => '+30 days')); $results = Cache::read('results');

Si usar repetidamente Cache::set() quizs deberas crear una nueva configuracin de Cache. Esto eliminar la necesidad de llamar a Cache::set(). 8.8 HttpSocket Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones CakePHP includes an HttpSocket class which can be used easily for making requests, such as those to web services.
8.8.1 get

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The get method makes a simple HTTP GET request returning the results. string get($uri, $query, $request) $uri is the web address where the request is being made; $query is any query string parameters, either in string form: "param1=foo&param2=bar" or as a keyed array: array('param1' => 'foo', 'param2' => 'bar'). 1. App::import('Core', 'HttpSocket'); 2. $HttpSocket = new HttpSocket(); 3. $results = $HttpSocket->get('http://www.google.com/search', 'q=cakephp'); 4. //returns html for Google's search results for the query "cakephp" 5. // Example response array 6. // Responses will include varying header and cookie fields 7. debug($HttpSocket->response);

8. /* 9. Array 10.( 11.[raw] => Array 12.( 13.[status-line] => HTTP/1.1 200 OK 14.[header] => -- Headers except for status-line header -15.[body] => -- response body (i.e. <!doctype html><head></head> etc) -16.[response] => -- Full HTTP response, including all headers and body -17.) 18.[status] => Array 19.( 20.[http-version] => HTTP/1.1 21.[code] => 200 22.[reason-phrase] => OK 23.) 24.[header] => Array 25.( 26.[Date] => Wed, 02 Mar 2011 17:16:10 GMT 27.[Expires] => -1 28.[Cache-Control] => private, max-age=0 29.[Content-Type] => text/html; charset=ISO-8859-1 30.[Set-Cookie] => Array 31.( 32.[0] => PREF=ID=pReFvAlUeHeRe; expires=Fri, 01-Mar-2013 17:16:10 GMT; path=/; domain=.google.com 33.[1] => NID=44=gOoGlEsPeCiFicCoOkIeVaLuEsHeRe; expires=Thu, 01Sep-2011 17:16:10 GMT; path=/; domain=.google.com; HttpOnly 34.) 35.[Server] => gws 36.[X-Xss-Protection] => 1; mode=block 37.[Connection] => close 38.) 39.[body] => -- response body (i.e. <!doctype html><head></head> etc) -40.[cookies] => Array 41.( 42.[PREF] => Array 43.( 44.[value] => ID=pReFvAlUeHeRe 45.[expires] => Fri, 01-Mar-2013 17:16:10 GMT 46.[path] => / 47.[domain] => .google.com 48.) 49.[NID] => Array 50.(

51.[value] => 44=gOoGlEsPeCiFicCoOkIeVaLuEsHeRe 52.[expires] => Thu, 01-Sep-2011 17:16:10 GMT 53.[path] => / 54.[domain] => .google.com 55.[httponly] => 1 56.) 57.) 58.) 59.*/
8.8.2 post

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The post method makes a simple HTTP POST request returning the results. string function post ($uri, $data, $request) The parameters for the post method are almost the same as the get method, $uri is the web address where the request is being made; $query is the data to be posted, either in string form: "param1=foo&param2=bar" or as a keyed array: array('param1' => 'foo', 'param2' => 'bar'). 1. App::import('Core', 'HttpSocket'); 2. $HttpSocket = new HttpSocket(); 3. $results = $HttpSocket->post('www.somesite.com/add', array('name' => 'test', 'type' => 'user')); 4. //$results contains what is returned from the post.
8.8.3 request

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones The base request method, which is called from all the wrappers (get, post, put, delete). Returns the results of the request. string function request($request) $request is a keyed array of various options. Here is the format and default settings: 1. var $request = array(

2. 'method' => 'GET', 3. 'uri' => array( 4. 'scheme' => 'http', 5. 'host' => null, 6. 'port' => 80, 7. 'user' => null, 8. 'pass' => null, 9. 'path' => null, 10.'query' => null, 11.'fragment' => null 12.), 13.'auth' => array( 14.'method' => 'Basic', 15.'user' => null, 16.'pass' => null 17.), 18.'version' => '1.1', 19.'body' => '', 20.'line' => null, 21.'header' => array( 22.'Connection' => 'close', 23.'User-Agent' => 'CakePHP' 24.), 25.'raw' => null, 26.'cookies' => array() 27.); 8.9 Router Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Router can be used to parse urls into arrays containing indexes for the controller, action, and any parameters, and the opposite: to convert url arrays (eg. array('controller'=>'posts', 'action'=>'index')) to string urls. Read more about ways to configure the Router here: http://book.cakephp.org/view/945/Routes-Configuration Router also include other utility methods for dealing with urls.

9 Aplicaciones de Consola Principales


Editar Ver slo esta seccin

Historia Este texto puede diverger de la versin original El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones CakePHP viene con muchas aplicaciones de consola por defecto. Algunas de ellas se utilizan en combinacion con algunas de las funcionalidades de Cake, (ejemplo ACL o i18n), y otras son de uso general para ayudarte a producir ms rpido Esta seccin explica cmo usar las aplicaciones de consola que vienen empaquetadas con CakePHP Antes de que sigas con esta seccin, tal vez quisieras ver La consola de CakePHP. La configuracin de la consola no est cubierta por este captulo, as que si nunca la has usado anteriormente, echale un vistazo. 9.1 Generacin de Cdigo con Bake Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Ya has aprendido sobre scaffolding en CakePHP: una forma simple de armar una aplicacin con slo una base de datos y algunas clases bsicas. La consola Bake es otro esfuerzo para tener CakePHP corriendo rpido. La consola Bake puede crear cualquiera de los ingredientes bsicos de CakePHP: modelos, vistas y controladores. Y no estamos hablando slo de clases estructurales: Bake puede crear una aplicacin completamente funcional en slo unos minutos. De hecho, Bake es el paso natural que toman las aplicaciones una vez que han pasado por la etapa de scaffolding Para utilizar Bake necesitar ejecutar el script localizado en el directorio /cake/console/
$ cd ./cake/console/ $ cake bake

Dependiendo de tu configuracin, podras necesitar darle permisos de ejecucin al script bash o llamarlo usando./cake bake. La consola de Cake corre usando PHP CLI (command line interface). Si tienes algn problema con el script, asegrate de que tienes PHP CLI instalado y que adems tienes los mdulos necesarios habilitados(Ej: MySQL). Cuando utilices Bake por primera vez, te pedir que crees un archivo de configuracin para la base de datos, si todava no creaste uno. Una vez que hayas configurado la base de datos, cuando ejecutes Bake te presentar estas opciones:
--------------------------------------------------------------App : app Path: /ruta/al/proyecto --------------------------------------------------------------Interactive Bake Shell --------------------------------------------------------------[D]atabase Configuration [M]odel [V]iew [C]ontroller [P]roject [Q]uit What would you like to Bake? (D/M/V/C/P/Q) >

Alternativamente, puedes ejecutar cualquiera de estos comandos directamente de la lnea de comandos:


$ $ $ $ $ cake cake cake cake cake bake bake bake bake bake db_config model view controller project

9.1.1 Bake improvements in 1.3

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones For 1.3 bake has had a significant overhaul, and a number of features and enhancements have been built in. Two new tasks (FixtureTask and TestTask) are accessible from the main bake menu A third task (TemplateTask) has been added for use in your shells. All the different bake tasks now allow you to use connections other than default for baking. Using the -connection parameter.

Plugin support has been greatly improved. You can use either -plugin PluginName or Plugin.class. Questions have been clarified, and made easier to understand. Multiple validations on models has been added. Self Associated models using parent_id are now detected. For example if your model is named Thread, a ParentThread and ChildThread association will be created. Fixtures and Tests can be baked separately. Baked Tests include as many fixtures as they know about, including plugin detection (plugin detection does not work on PHP4). So with the laundry list of features, we'll take some time to look at some of the new commands, new parameters and updated features. New FixtureTask, TestTask and TemplateTask. Fixture and test baking were a bit of a pain in the past. You could only generate tests when baking the classes, and fixtures could only be generated when baking models. This made adding tests to your applications later or even regenerating fixtures with new schemas a bit painful. For 1.3 we've separated out Fixture and Test making them separate tasks. This allows you to re-run them and regenerate tests and fixtures at any point in your development process. In addition to being rebuildable at any time, baked tests are now attempt to find as many fixtures as possible. In the past getting into testing often involved fighting through numerous 'Missing Table' errors. With more advanced fixture detection we hope to make testing easier and more accessible. Test cases also generate skeleton test methods for every noninherited public method in your classes. Saving you one extra step. TemplateTask is a behind the scenes task, and it handles file generation from templates. In previous versions of CakePHP baked views were template based, but all other code was not. With 1.3 almost all the content in the files generated by bake are controlled by templates and the TemplateTask. The FixtureTask not only generates fixtures with dummy data, but using the interactive options or the -records option you can enable fixture generation using live data. New bake command New commands have been added to make baking easier and faster. Controller, Model, View baking all feature an all subcommand, that builds everything at once and makes speedy rebuilds easy. 1. cake bake model all Would bake all the models for an application in one shot. Similarly cake bake controller all would bake all controllers and cake bake

view all would generate all view files. Parameters on the ControllerTask have changed as well. cake bake controller scaffold is now cake bake controller public. ViewTask has had an -admin flag added, using -admin will allow you to bake views for actions that begin with Routing.admin As mentioned before cake bake fixture and cake bake test are new, and have several subcommands each. cake bake fixture all will regenerate all the basic fixtures for your application. The -count parameter allows you to set the number of fake records that are created. By running fixture task interactively you can generate fixtures using the data in your live tables. You can use cake bake test <type> <class> to create test cases for already created objects in your app. Type should be one of the standard CakePHP types ('component', 'controller', 'model', 'helper', 'behavior') but doesn't have to be. Class should be an existing object of the chosen type. Templates Galore New in bake for 1.3 is the addition of more templates. In 1.2 baked views used templates that could be changed to modify the view files bake generated. In 1.3 templates are used to generate all output from bake. There are separate templates for controllers, controller action sets, fixtures, models, test cases, and the view files from 1.2. As well as more templates, you can also have multiple template sets or, bake themes. Bake themes can be provided in your app, or as part of plugins. An example plugin path for bake theme would be app/plugins/bake_theme/vendors/shells/templates/dark_red/. An app bake theme called blue_bunny would be placed in app/vendors/shells/templates/blue_bunny. You can look at cake/console/templates/default/ to see what directories and files are required of a bake theme. However, like view files, if your bake theme doesn't implement a template, other installed themes will be checked until the correct template is found. Additional plugin support. New in 1.3 are additional ways to specify plugin names when using bake. In addition to cake bake plugin Todo controller Posts, there are two new forms. cake bake controller Todo.Posts and cake bake controller Posts -plugin Todo. The plugin parameter can be while using interactive bake as well. cake bake controller -plugin Todo, for example will allow you to use interactive bake to add controllers to your Todo plugin. Additional / multiple plugin paths are supported as well. In the past bake required your plugin to be in app/plugins. In 1.3 bake will find which of the pluginPaths the named plugin is located on, and add the files there. 9.2 Gestin del Esquema de la BBDD y Migraciones Editar

Ver slo esta seccin Historia Comparar con el contenido original El SchemaShell proporciona la funcionalidad para crear un esquema de objetos, volcados del esquema sql, as como crear y restaurar instantneas de base de datos.
9.2.1 Generando y Usando Archivos de Esquemas

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Un archivo de esquema permite transportar fcilmente el esquema de la base de datos, sin importar en qu motor se vaya a implementar. Puedes generar un archivo de esquema de la base de datos usando:
$ cake schema generate

Esto generar un archivo llamado schema.php en tu directorio app/config/sql. La aplicacin SchemaShell procesar slo las tablas para las cuales existe un modelo definido. Para forzar a que cree un esquema de todas las tablas, debes aadir la opcin -f en la lnea de comandos. Para reconstruir el esquema de la base de datos a partir de un archivo schema.php generado anteriormente, debes ejecutar:
$ cake schema run create

Esto borrar y volver a crear todas las tablas basndose en el contenido del archivo schema.php. Los archivos de esquema pueden ser usado para genera volcados de SQL. Para generar un archivo SQL que contenga las sencencias CREATE TABLE ejecuta:
$ cake schema dump volcado.sql

Donde volcado.sql es el nombre que deseas ponerle al volcado. Si omites este nombre, el volcado ser mostrado por pantalla sin ser escrito en ningn archivo.

9.2.2 Migrations with CakePHP schema shell

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Migrations allow for versioning of your database schema, so that as you develop features you have an easy and database agnostic way to distribute database changes. Migrations are achieved through either SCM controlled schema files or schema snapshots. Versioning a schema file with the schema shell is quite easy. If you already have a schema file created running
$ cake schema generate

Will bring up the following choices:


Generating Schema... Schema file exists. [O]verwrite [S]napshot [Q]uit Would you like to do? (o/s/q)

Choosing [s] (snapshot) will create an incremented schema.php. So if you have schema.php, it will create schema_2.php and so on. You can then restore to any of these schema files at any time by running:
$ cake schema update -s 2

Where 2 is the snapshot number you wish to run. The schema shell will prompt you to confirm you wish to perform the ALTER statements that represent the difference between the existing database the currently executing schema file. You can perform a dry run by adding a -dry to your command. 9.3 Modificando el HTML producido por defecto del script bake Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones

Si deseas modificar el HTML producido por el comando "bake", sigue los siguientes pasos: 1. 2. 3. 4. Dirgete a: cake/console/libs/templates/views Existen cuatro archivos ah Cpialos en: app/vendors/shells/templates/views Haz los cambios a la salida HTML para controlar la forma en que "bake" construye las vistas.

10 Deployment
Traducir Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin

Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Steps to deploy on a Hosting Server

11 Ejemplo de Aplicacin
Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones En esta seccin podrs ver cmo se unen todas las piezas en una aplicacin de CakePHP tpica. Alternativamente, puedes visitar CakeForge y The Bakery para encontrar aplicaciones existentes y otros componentes. 11.1 Blog Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado

Comparar con el texto original Mas info sobre traduciones Bienvenidos a CakePHP! Probablemente ests viendo este tutorial porque deseas aprender ms acerca de cmo funciona Cake. Es nuestro deseo incrementar la productividad y hacer la programacin ms agradable: esperamos que notes esto a medida que vayas avanzando con el tutorial. Este tutorial te guiar para que puedas crear un blog simple. Obtendremos e instalaremos Cake, creando la base de datos y configurndola, y creando luego la lgica necesaria para mostrar, aadir, editar y borrar posts del blog. Esto es lo que necesitas: 1. Un servidor web. Aqu asumiremos que ests usando Apache, aunque las instrucciones para utilizar otros servidores deberan ser similares. Tal vez necesitemos jugar un poco con la configuracin del servidor, pero la mayora de pueden obtener y poner en marcha Cake sin modificar la configuracin para nada. 2. Un servidor de base de datos. Nosotros utilizaremos MySQL es este tutorial. Debers saber lo suficiente de SQL como para crear una base de datos: Cake se encarga del resto a partir de ah. 3. Conocimiento bsico de PHP. Cuanto ms programacin orientada a objetos hayas hecho, mejor, pero no tengas miedo si eres un fan de la programacin procedural. 4. Finalmente, necesitars un conocimiento bsico del patrn MVC. Puedes darle un vistazo al captulo "Comenzando con CakePHP", en la seccin: Entendiendo Modelo-Vista-Controlador. No te preocupes, es menos de una pgina. Comencemos!
11.1.1 Obteniendo Cake

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Primero debemos conseguir una copia reciente de CakePHP.

Para esto debes visitar la seccin del proyecto CakePHP en Cakeforge http://cakeforge.org/projects/cakephp/ y descargar la versin estable. Para este tutorial vamos a usar la 1.2.x.x Tambin puedes obtener una copia mediante svn en https://svn.cakephp.org/repo/trunk/cake/1.2.x.x/ Sin importar cmo hayas conseguido Cake, deber colocar los archivos en el directorio raz del servidor (DocumentRoot). Una vez terminado, los directorios deberan lucir algo as: 1. 2. 3. 4. 5. 6. 7. /ruta_al_directorio_raiz /app /cake /docs /vendors .htaccess index.php

Este es un buen momento para aprender un poco ms acerca de cmo Cake utiliza la estructura de directorios: puedes verlo en el captulo "Principios bsicos de CakePHP", seccin : Estructura de archivos de CakePHP.
11.1.2 Creando la Base de Datos del Blog

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones A continuacin debemos crear la base de datos en la que se basar nuestro blog. Lo primero que haremos ser crear una tabla para almacenar nuestros posts. Tambin insertaremos algunos posts para poder utilizarlos de testeo. Ejecuta el siguiente cdigo SQL en tu base de datos: 1. 2. 3. 4. 5. 6. 7. 8. /* Primero, crear la tabla para los posts: */ CREATE TABLE posts ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(50), body TEXT, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL );

9. /* Luego insertar algunos posts de ejemplo: */ 10.INSERT INTO posts (title,body,created) 11.VALUES ('El ttulo', 'Este es el cuerpo del post.', NOW()); 12.INSERT INTO posts (title,body,created) 13.VALUES ('Un ttulo otra vez', 'Y el cuerpo del post a continuacin.', NOW()); 14.INSERT INTO posts (title,body,created) 15.VALUES ('Ttulo ataca de nuevo', 'Esto es realmente exitante! No.', NOW()); La eleccin de los nombres de la tabla y las columnas no es arbitrario. Si sigues las convenciones de Cake relacionadas a la base de datos, y las convenciones relacionadas a los nombres de las clases (puedes consultar ambas en "Convenciones de CakePHP"), tendrs la posibilidad de aprovechar muchas ventajas y evitar la configuracin. Cake es lo suficientemente flexible como para acomodarse inclusive al peor esquema de base de datos de aplicaciones antiguas, sin embargo, si utilizas las convenciones ahorrars mucho tiempo de desarrollo. Puedes ver las "Convenciones de CakePHP" para ms informacin, pero es suficiente con decir que al llamar a la tabla 'posts' automticamente estar asociada con el modelo Post, y al tener los campos 'modified' y 'created', stos sern manejados automticamente por Cake.
11.1.3 Configuracin de la Base de Datos en Cake

Editar Ver slo esta seccin Historia Comparar con el contenido original

Vamos a decirle a Cake dnde est nuestra base de datos y cmo conectarse a ella. Para muchos, esta ser la primera y ltima vez que configuren algo. Una copia del archivo de configuracin de la base de datos se encuentra en /app/config/database.php.default. Haz una copia en el mismo directorio, pero nombrndola database.php. El archivo de configuracin debera ser fcil de seguir: slo debes reemplazar los valores en el arreglo $default con la informacin que se corresponda a tu configuracin. Un ejemplo completo debere verse como el siguiente: 1. 2. 3. 4. 5. var $default = array( 'driver' => 'mysql', 'persistent' => 'false', 'host' => 'localhost', 'port' => '',

6. 'login' => 'usuario_de_la_BD', 7. 'password' => 'c4k3-rUl3Z', 8. 'database' => 'tutorial_blog', 9. 'schema' => '', 10.'prefix' => '', 11.'encoding' => '' 12.); Una vez que hayas guardado el nuevo database.php, deberas poder abrir el navegador en la pgina de inicio de Cake y ver que puede conectarse a la base de datos sin problemas.
11.1.4 Configuracin Opcional

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Hay dos tems ms que pueden ser configurados. La mayora de los desarrolladores realiza estos pasos, pero para este tutorial no son necesarios. El primero es definir una cadena (o "salt") para darle ms seguridad a los hash. El segundo tem es darle acceso de escritura a Cake, a su directorio tmp. La cadena de seguridad (o "salt") es usada para generar hashes. Puedes cambiarla editando el archivo /app/config/core.php. No importan tanto cul es el nuevo valor del salt, siempre y cuando no sea fcil de adivinar. 1. <?php 2. /** 3. * Una cadena aleatoria usada en los mtodos de hashing de seguridad. 4. */ 5. Configure::write('Security.salt', 'pl345e-P45s_7h3*S@l7!'); 6. ?> La segunda tarea es darle al servidor web permisos de escritura sobre el directorio app/tmp. La mejor forma de hacer esto es encontrar con qu nombre de usuario est corriendo el servidor (<?php echo `whoami`; ?>) y cambiar el propietario de app/tmp a ese usuario. El comando a ejecutar (en sistemas *nix) puede lucir similar a esto: 1. $ chown -R www-data app/tmp

Si por alguna razn CakePHP no puede escribir en ese directorio, podrs ver un aviso cuando te encuentres navegando la aplicacin en modo debug.
11.1.5 Una aclaracin para mod_rewrite

Editar Ver slo esta seccin Historia Comparar con el contenido original

Es muy probable que los usuarios novatos tengan problemas con mod_rewrite, as que haremos una mencin aqu. Si la pgina de bienvenida de CakePHP se ve un poco rara (sin imgenes o estilos CSS), probablemente no tengas funcionando el mdulo mod_rewrite en tu sistema. Algunos consejos para que hacerlo funcionar: 1. Asegrate que la sobreescritura (override) est permitida (allowed): en tu httpd.conf, deberas tener una seccin en la que se definen los permisos sobre cada Directorio en tu servidor. Asegrate que AllowOverride est puesto en All para el Directorio correcto. Por razones de seguridad y de performance, no setees AllowOverride en All dentro de <Directory />. A su vez, busca el bloque <Directory> que haga referencia al directorio de tu sitio web.. 2. Asegrate que ests editando el httpd.conf correcto en vez de un httpd.conf especfico de usuario o sitio web. 3. Por una u otra razn, puedes haber conseguido una copia de CakePHP sin los archivos .htaccess necesarios. Esto a veces sucede porque algunos sistemas operativos tratan a los archivos cuyo nombre comienza con '.' como ocultos, y no los copia. Asegrate que tu copia de CakePHP proviene de la seccin de descargas del sitio o desde nuestro repositorio SVN. 4. Asegrate que Apache est cargando mod_rewrite correctamente! Deberas ver algo como LoadModule rewrite_module libexec/httpd/mod_rewrite.so o (en Apache 1.3) AddModule mod_rewrite.c en tu httpd.conf. Si no quieres o no puedes hacer funcionar mod_rewrite (o algn otro mdulo compatible), necesitars usar las 'pretty' URLs proporcionadas por CakePHP. En /app/config/core.php, descomenta la lnea que diga algo como: 1. Configure::write('App.baseUrl', env('SCRIPT_NAME')); Tambin remueve estos archivos .htaccess: 1. /.htaccess 2. /app/.htaccess 3. /app/webroot/.htaccess

4. Esto har que tus URLs se vean de la forma www.example.com/index.php/controllername/actionname/param en vez de www.example.com/controllername/actionname/param.
11.1.6 Crear un modelo Post

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones La clase Model es el pan y manteca de las aplicaciones CakePHP. Creando un modelo CakePHP que interacte con nuestra base de datos, tendremos la base para poder hacer luego nuestras acciones de vista, agregar, editar, y eliminar. Los archivos de clases de modelo de CakePHP van en la carpeta /app/models, y el archivo que crearemos lo grabaremos en /app/models/post.php. El archivo completo debera verse as: 1. 2. 3. 4. 5. <?php class Post extends AppModel { var $name = 'Post'; } ?>

La convencin en la nomenclatura es muy importante en CakePHP. Nombrando nuestro modelo como Post, CakePHP puede automticamente inferir que este modelo ser usado en el controlador PostsController, y ser atado a la tabla de la base de datos llamada posts. CakePHP dinmicamente crear un objeto de modelo por ti, si no puede encontrar el archivo correspondiente en /app/models. Esto tambin dice que si nombras incorrectamente tu archivo (i.e. Post.php or posts.php) CakePHP no reconocer ninguna de tus configuraciones y usar las opciones por defecto. Siempre es una buena idea agregar la variable $name, y suele ahorrarnos problemas con los nombres de las clases en PHP4. Para ms informacin sobre modelos, como prefijos de tabla, callbacks, y validacin, revisar el captulo Models del Manual.

11.1.7 Crear un controlador para Post

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones A continuacin, crearemos un controlador para nuestros posts. El controlador es donde existe toda la lgica del negocio para la interaccin con los posts. En pocas palabras, es el lugar en el que juegas con los modelos y realizas el trabajo con los posts. Ubicaremos este nuevo controlador en un archivo llamado posts_controller.php dentro del directorio /app/controllers. As es como debe verse un controlador bsico: 1. 2. 3. 4. 5. <?php class PostsController extends AppController { var $name = 'Posts'; } ?>

Ahora, agreguemos una accin a nuestro controlador. Las acciones a menudo representan una funcin o una interfase en una aplicacin. Por ejemplo, cuando los usuarios ingresan www.example.com/posts/index (que es lo mismo que www.example.com/posts/), esperan ver un listado de posts. El cdigo para esa accin se vera como esto: 1. 2. 3. 4. 5. 6. 7. 8. <?php class PostsController extends AppController { var $name = 'Posts'; function index() { $this->set('posts', $this->Post->find('all')); } } ?>

Djenme explicar un poquito la accin. Definiendo la funcin index() en nuestro PostsController, los usuarios pueden ahora acceder a la lgica ubicada en www.example.com/posts/index. De forma similar, si definimos una funcin llamada foobar(), los usuarios podran acceder a ella en www.example.com/posts/foobar. Puede tentarte querer nombrar a tus controladores y acciones de cierta forma para obtener cierto URL. Resiste la tentacin. Sigue las convenciones de CakePHP (nombres en plural para los controladores,

etc.) y crea nombres legibles y entendibles para las acciones. Puedes mapear luego URLs a tu cdigo usando "routes". La nica instruccin en la accin usa set() para pasar datos desde el controlador a la vista (que crearemos a continuacin). La lnea iguala la variable de vista llamada 'posts' al valor retornado por el mtodo del modelo Post find('all'). Nuestro modelo Post est disponible automticamente en $this->Post porque hemos seguido la convencin de nombres de Cake. Para aprender ms sobre los controladores de Cake, chequea el captulo "Desarrollando con CakePHP": "Controllers".
11.1.8 Creando las Vistas(Views) de los Post

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Ahora que tenemos los datos que fluyen a nuestro modelo y la lgica de nuestra aplicacin y el flujo definido por nuestro controlador, vamos a crear una vista (view) para la accin index que hemos creado anteriormente. Cake view(vistas) son solo fragmentos de presentaciones-sabrosas que se adaptan dentro de las aplicaciones diseadas. Para la mayora de las aplicaciones estaremos mezclando HTML con PHP, pero puede terminar usando XML, CSV, o incluso de datos binarios. Los Diseos (Layouts) de presentacin son el cdigo que se envuelve alrededor de las vista (views), y pueden ser definidas y modificadas, pero por ahora, vamos a usar el valor por defecto. Recuerda que en la ltima seccin la forma en que asigno la variable "posts" a de la vista fue usando mtodo set()? La forma que transmite datos a la vista sera algo como esto:
// print_r($posts) output: Array ( [0] => Array ( [Post] => Array ( [id] => 1

) ) [1] => Array (

[title] => The title [body] => This is the post body. [created] => 2008-02-13 18:34:55 [modified] =>

[Post] => Array (

[id] => 2 [title] => A title once again [body] => And the post body follows. [created] => 2008-02-13 18:34:56 [modified] =>

) [2] => Array (

[Post] => Array ( [id] => 3 [title] => Title strikes back [body] => This is really exciting! Not. [created] => 2008-02-13 18:34:57 [modified] =>

) ) )

Los archivos de las Cakes views (vistas de cake) se almacenan en /app/views dentro de una carpeta con el nombre del controlador que corresponden (tendremos que crear una carpeta llamada "posts" en este caso). Para dar formato a los datos de los posts en un cuadro lindo, el cdigo de nuestra vista podra ser algo como esto: <!-- Archivo: /app/views/posts/index.ctp --> <h1>Blog posts</h1> <table> <tr> <th>Id</th> <th>Title</th> <th>Created</th> </tr> <!-- Aqui se hace el ciclo que recorre nuestros arreglo $posts , imprimiendo la informacin de cada post--> 10.<?php foreach ($posts as $post): ?> 11.<tr> 12.<td><?php echo $post['Post']['id']; ?></td> 13.<td> 14.<?php echo $html->link($post['Post']['title'], 15."/posts/view/".$post['Post']['id']); ?> 16.</td> 1. 2. 3. 4. 5. 6. 7. 8. 9.

17.<td><?php echo $post['Post']['created']; ?></td> 18.</tr> 19.<?php endforeach; ?> 20. 21.</table> Creemos que esto debera ser algo sencillo. Usted puede haber notado el uso de un objeto llamado $html. Esta es una instancia de la clase CakePHP HtmlHelper. CakePHP viene con un conjunto de "view helpers" (vistas de ayuda) que hacen cosas como la vinculacin, la forma de salida, manejo JavaScript y Ajax. Puede obtener ms informacin sobre cmo utilizarlas en el captulo "Builtin Helpers", pero lo que es importante sealar aqu es que el mtodo link() generar un vnculo HTML con un ttulo determinado (el primer parmetro) y la URL (la segunda parmetro). Al especificar las URL en Cake, slo tiene que dar una ruta relativa de la base de la aplicacin, y cake llena en el resto. Es as, que las URL se suelen quedar de la forma de /controlador/accin/parametro1/parametro2 (/controller/action/param1/param2). En este punto, usted debera ser capaz de escribir en el navegador http://www.example.com/posts/index. Usted debe observar en la vista, el formato correcto con el ttulo y la lista de los posts. Si le sucedi que hizo click en uno de los enlaces que hemos creado en esta vista (que vinculan el ttulo de un post a una URL /posts/view/some_id), probablemente ha sido informado por CakePHP que la accin an no ha sido definida. Si no recibi el informe, es que algo ha ido mal, o que realmente ya la a definido, en cuyo caso es muy astuto. De lo contrario, la vamos a crear ahora en el PostsController: 1. <?php 2. class PostsController extends AppController { 3. var $name = 'Posts'; 4. function index() { 5. $this->set('posts', $this->Post->find('all')); 6. } 7. function view($id = null) { 8. $this->Post->id = $id; 9. $this->set('post', $this->Post->read()); 10.} 11.} 12.?> La llamada set() les debe lucir familiar. Informamos de que estamos usando read() en lugar de find('all') porque realmente solo queremos la informacin de un nico post.

Tenga en cuenta que la accin de nuestra vista toma ID del post que nos gustara ver. Este parmetro se accin a travs de la URL solicitada. Si un usuario /posts/view/3, entonces el valor '3' es pasado como

un parmetro: la entrega a la solicita $id.

Ahora vamos a crear la vista para las view de nuestra nueva accin y lo colocaremos en /app/views/posts/view.ctp. 1. <!-- archivo: /app/views/posts/view.ctp --> 2. <h1><?php echo $post['Post']['title']?></h1> 3. <p><small>Created: <?php echo $post['Post']['created']? ></small></p> 4. <p><?php echo $post['Post']['body']?></p> Verifique que esto esta funcionando en los vnculos de /posts/index o manualmente solicitando un post accediendo a /posts/view/1.
11.1.9 Agregando Posts

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Leer y mostrar de la base de datos nuestros posts es un gran comienzo, pero debe habilitarse para agregar nuevos posts. En primer lugar, empezar por crear la accin add() controlador PostsController: 1. <?php 2. class PostsController extends AppController { 3. var $name = 'Posts'; 4. function index() { 5. $this->set('posts', $this->Post->find('all')); 6. } 7. function view($id) { 8. $this->Post->id = $id; 9. $this->set('post', $this->Post->read()); 10.} 11.function add() { 12.if (!empty($this->data)) { 13.if ($this->Post->save($this->data)) { 14.$this->Session->setFlash('Your post has been saved.'); 15.$this->redirect(array('action' => 'index'));

16.} 17.} 18.} 19.} 20.?> Lo que esta accin add() hace es lo siguiente: si los datos del formulario presentado no estn vacos, trate de guardar los datos utilizando el modelo Post. Si por alguna razn, no guarda, simplemente hacer que se quede en la vista. Esto nos da la oportunidad de mostrar los errores de validacin de usuario u otras advertencias. Cuando un usuario utiliza un formulario de datos POST en su aplicacin, esta informacin est disponible en $this->data. Usted puede usar las funciones pr() o debug para imprimir, si quieres ver como luce esto. Usamos la funcin del componente Session setFlash() para adjuntar un mensaje a una variable de sesin que se mostrar en la pgina despus de la redireccin. En el diseo tenemos $session->flash() , que muestra el mensaje y borra la variable de sesin correspondiente. La funcin redirectdel controlador redirige a otra direccin URL. El parmetro array('action'=>'index) se traduce en la URL /posts es decir, la accin index del controlador posts. Puede referirse a Router::url en funcin de la API para ver los formatos en los que se puede especificar una direccin URL para diversas funciones de cake. Llamando al mtodo save() haremos comprobacin de errores de validacin y abortar el guardado si algo ocurre. Hablaremos de cmo se manejan los errores en las siguientes secciones.
11.1.10 Validacin de Datos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Cake lleva un largo camino recogiendo la monotona de la validacin de formularios de entrada. Todo el mundo odia a la codificacin de sus infinitos formularios y rutinas de validacin. CakePHP hace que sea ms fcil y ms rpido. Para aprovechar las caractersticas de la validacin, tendrs que

utilizar FormHelper de Cake en tus vistas. El FormHelper est disponible por defecto en todas las vista en $form. Esta es nuestra Vista Agregar(add view): 1. 2. 3. 4. 5. 6. 7. 8. <!-- File: /app/views/posts/add.ctp --> <h1>Add Post</h1> <?php echo $form->create('Post'); echo $form->input('title'); echo $form->input('body', array('rows' => '3')); echo $form->end('Save Post'); ?>

Aqu, nosotros usamos el FormHelper para generar la etiqueta de apertura de un formulario HTML. Aqu est el cdigo HTML que genera $form->create() : 1. <form id="PostAddForm" method="post" action="/posts/add"> Si create() es llamado sin suministrarle parmetros, este supone que est construyendo un formulario que suministra datos a la accin add() (o a la accin edit() cuando el parmetro id esta includo en los datos del formulario ($form->data)), a travs del metodo POST. El mtodo $form->input() es utilizado para crear elementos de formulario del mismo nombre. El primer parmetro le dice a CakePHP a que campo corresponden, y el segundo parmetro le permite especificar una amplia gama de opciones - en este caso, el nmero de filas para el textarea. Hay un poco de introspeccin y automtizacion aqu: input() es la salida de diferentes elementos basados en el modelo del campo especificado. El $form->end() genera una llamada al botn de enviar y termina el formulario. Si una cadena se suministra como el primer parmetro a end(), FormHelper producir un botn de enviar con ese nombre seguido del cierre de la etiqueta. Una vez ms, consulte el Chapter "Built-in Helpers" para conocer ms acerca de los helpers. Ahora vamos a volver y actualizar nuestro /app/views/posts/index.ctp para incluir un nuevo enlace "Aadir entrada". Antes de el <table>, aada la siguiente lnea: 1. <?php echo $html->link('Add Post',array('controller' => 'posts', 'action' => 'add'))?> Puede estar preguntarse: cmo le digo a mi CakePHP sobre los requisitos de validacin? Reglas de validacin se definen en el modelo. Vamos a mirar hacia atrs en nuestro modelo y despus haremos algunos ajustes: 1. <?php 2. class Post extends AppModel 3. {

4. var $name = 'Post'; 5. var $validate = array( 6. 'title' => array( 7. 'rule' => 'notEmpty' 8. ), 9. 'body' => array( 10.'rule' => 'notEmpty' 11.) 12.); 13.} 14.?> El arreglo $validate le dice a CakePHP cmo validar sus datos cuando se llama el mtodo save() . Aqu, he especificado que tanto el campos cuerpo y el ttulo no deben estar vaca. El motor de validacin de CakePHP es fuerte, con una serie de normas pre-construidas (nmeros de tarjetas de crdito, direcciones de correo electrnico, etc) y la flexibilidad para aadir sus propias reglas de validacin. Para obtener ms informacin sobre esta configuracin, consulte el Captulo Validacin de Datos. Ahora que tiene las reglas de validacin en su lugar, utilice la aplicacin para tratar de aadir un post con un ttulo o el cuerpo vaco para ver cmo funciona. Como hemos utilizado el mtodo input() del componente FormHelper para crear elementos de nuestro formulario, nuestros mensajes de error de validacin se mostrar automticamente.
11.1.11 Borrando Posts

Editar Ver slo esta seccin Historia Comparar con el contenido original

A continuacin, vamos a crear un medio para que los usuarios eliminen posts. Comenzaremos con la accin delete() en el PostsController: 1. function delete($id) { 2. if ($this->Post->delete($id)){ 3. $this->Session->setFlash('The post with id: '.$id.' has been deleted.'); 4. $this->redirect(array('action'=>'index')); 5. } 6. } Esta lgica es eliminar el post por $ id, y utiliza $this->Session>setFlash() para mostrar al usuario un mensaje de confirmacin despus de la reorientacin a /posts. Porque estamos slo ejecutando una lgica y redireccionando, esta accin no tiene ninguna vista. Es posible que desee actualizar su

vista de ndice (index) con vnculos que permitan a los usuarios eliminar posts, entonces: 1. <!-- /app/views/posts/index.ctp --> 2. <h1>Blog posts</h1> 3. <p><?php echo $this->Html->link('Add Post', array('action' => 'add')); ?></p> 4. <table> 5. <tr> 6. <th>Id</th> 7. <th>Title</th> 8. <th>Actions</th> 9. <th>Created</th> 10.</tr> 11.<!-- Aqu esta el ciclo que muestra $posts a travs de nuestro arreglo, imprimiendo la informacin de los posts --> 12.<?php foreach ($posts as $post): ?> 13.<tr> 14.<td><?php echo $post['Post']['id']; ?></td> 15.<td> 16.<?php echo $this->Html->link($post['Post']['title'], array('action' => 'view', $post['Post']['id']));?> 17.</td> 18.<td> 19.<?php echo $this->Html->link('Delete', array('action' => 'delete', $post['Post']['id']), null, 'Estas seguro?' )?> 20.</td> 21.<td><?php echo $post['Post']['created']; ?></td> 22.</tr> 23.<?php endforeach; ?> 24. 25.</table> El cdigo de esta vista tambin utiliza HtmlHelper para que pregunte al usuario con un dilogo de confirmacin JavaScript de antes de intentar borrar un post.
11.1.12 Editando Posts

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones

Editando Post: aqu vamos! Eres un CakePHP pro por ahora, por lo que deberas haber adoptado un patrn. Hacer la accin, luego la vista. Aqu esta la accin edit() del PostsController que se vera como: 1. function edit($id) { 2. $this->Post->id = $id; 3. if (empty($this->data)) { 4. $this->data = $this->Post->read(); 5. } else { 6. if ($this->Post->save($this->data)) { 7. $this->Session->setFlash('Your post has been updated.'); 8. $this->redirect(array('action' => 'index')); 9. } 10.} 11.} Esta accin primero chequea los datos del formulario para enviarlos. Si no fue enviado, este busca el post y se lo pasa a la vista. Si algunos datos se han enviado, intenta guardar los datos utilizando el modelo Post (o los rechazar y mostrara al usuario los errores de validacin). La vista de edicin puede tener un aspecto parecido a este: 1. 2. 3. 4. 5. 6. 7. 8. 9. /app/views/posts/edit.ctp <h1>Edit Post</h1> <?php echo $form->create('Post', array('action' => 'edit')); echo $form->input('title'); echo $form->input('body', array('rows' => '3')); echo $form->input('id', array('type'=>'hidden')); echo $form->end('Save Post'); ?>

Esta vista muestra el formulario de edicin (con los valores de publicados), junto con los mensajes de errores de validacin necesarios. Cabe destacar aqu: que CakePHP asumir que usted est editando un registro si el campo 'id' est presente en el arreglo de datos. Si 'id' no est presente (mirar hacia atrs en nuestra opinin de aadir), Cake asumir que usted est aadiendo un nuevo registro para llamar a save() Ahora puede actualizar su vista de indice, con enlaces para ir a editar posts especficos: 1. /app/views/posts/index.ctp (edit links added) 2. <h1>Blog posts</h1> 3. <p><?php echo $html->link("Add Post", array('action'=>'add')); ? > 4. <table>

5. <tr> 6. <th>Id</th> 7. <th>Title</th> 8. <th>Action</th> 9. <th>Created</th> 10.</tr> 11.<!-- Aqui se hace el ciclo que recorre nuestros arreglo $posts , imprimiendo la informacin de cada post --> 12.<?php foreach ($posts as $post): ?> 13.<tr> 14.<td><?php echo $post['Post']['id']; ?></td> 15.<td> 16.<?php echo $html->link($post['Post'] ['title'],array('action'=>'view', 'id'=>$post['Post']['id']));?> 17.</td> 18.<td> 19.<?php echo $html->link( 20.'Delete', 21.array('action'=>'delete', 'id'=>$post['Post']['id']), 22.null, 23.'Are you sure?' 24.)?> 25.<?php echo $html->link('Edit', array('action'=>'edit', 'id'=>$post['Post']['id']));?> 26.</td> 27.<td><?php echo $post['Post']['created']; ?></td> 28.</tr> 29.<?php endforeach; ?> 30. 31.</table>
11.1.13 Rutas

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para algunos, el enrutamiento por defecto de CakePHP funciona lo suficientemente bien. Los desarrolladores que son sensibles a la facilidad de uso y compatibilidad del motor de bsqueda general aprecian la forma en que CakePHP URL mapea acciones especficas. As

que vamos a hacer un cambio rpido a las rutas en este tutorial. Para obtener ms informacin sobre las tcnicas avanzadas de enrutamiento, consulte "Configuracin de Rutas". Por defecto, CakePHP responde a una peticin de la raz de su sitio (es decir, http://www.example.com) con su PagesController, haciendo una vista llamada "home". En lugar de ello, vamos a sustituir esto con nuestros PostsController mediante la creacin de una regla de enrutamiento. El enrutamiento de Cake se encuentra en /app/config/routes.php. Usted querr comentar o eliminar la lnea que define la ruta raz predeterminada. El aspecto que presenta es: 1. Router::connect ('/', array('controller'=>'pages', 'action'=>'display', 'home')); Esta lnea conecta a la URL "/" con la pgina de inicio por defecto de CakePHP. Queremos que esto se conecte con nuestro propio controlador, por lo que aadiremos una lnea que tiene que ver asi: 1. Router::connect ('/', array('controller'=>'posts', 'action'=>'index')); Esto debe conectar a los usuarios que solicitan '/' a la accin ndex() de nuestra pronto-a-ser-creado PostsController. CakePHP tambin hace uso de "enrutamiento inverso" - si con la citada ruta que defini array('controller'=>'posts', 'action'=>'index') pasa a una funcin que espera un arreglo, la url resultante utilizada es '/'. Es, por tanto, una buena idea utilizar siempre los arreglos (arrays) de urls como rutas, esto significa definir a dnde va una url, y tambin se asegura de que los enlaces llevan al mismo sitio.
11.1.14 Conclusin

Editar Ver slo esta seccin Historia Comparar con el contenido original

Creado aplicaciones de esta manera ganar paz, honor, amor, y dinero, incluso ms all de sus fantasas ms salvajes. Simple, no? Tenga en cuenta que este tutorial es muy bsico. CakePHP tiene muchas ms caractersticas que ofrecer, y es flexible en formas que no se quiso cubrir aqu para simplificar. Utilice el resto de este manual como una gua para la construccin de aplicaciones con ms ricascaractersticas. Ahora que ha creado la base de una aplicacin Cake est listo para algo real. Comience su propio proyecto, lea el resto del Manual y API.

Si necesita ayuda, vengan a vernos en el #cakephp. Bienvenido a CakePHP!


# Suggested Follow-up Reading

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones These are common tasks people learning CakePHP usually want to study next: 1. 2. 3. 4. 5. Layouts: Customizing your website layout Elements: Including and reusing view snippets Scaffolding: Prototyping before creating code Baking: Generating basic CRUD code Authentication: User registration and login

11.2 Simple Acl controlled Application Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Bienvenido a CakePHP, si eres nuevo con CakePHP revisa primero el tutorial del Blog. Si ya lo has visto, y ya leiste acerca del uso de bake, y ests necesitando configurar un sistema Auth y Acl para el ingreso y autenticacin de tus usuarios, entonces este es el tutorial para ti. Como ya mencionamos anteriormente este tutorial asume que ya tienes experiencia con CakePHP, y que ests familiarizado con todos los conceptos del MVC que constituyen el ncleo. Tambin te sientes cmodo con el uso de la consola y el script bake. Si no conoces lo anterior, primero aprende todas estos elementos y luego vuelve. Este tutorial ser mucho ms facil de seguir y tendra ms sentido para ti. En este tutorial usaremos AuthComponent y AclComponent. Si no sabes lo que son, revisa sus pginas en el manual antes de proceder. Que necesitas? 1. Un servidor web. Asumiremos que usas Apache, pero las

instrucciones son similares en caso de otro servidor. Quizas debamos jugar un poco con la configuracin del servidor, pero muchos consiguen utilizar CakePHP sin tener que configurar nada. 2. Un servidor de bases de datos. Usaremos mySQL en este tutorial. Necesitars conocer suficiente SQL para crear la base de datos: CakePHP tomar las riendas de aqu en adelante. 3. Conocimiento PHP bsico. Mientras mas programacin orientada a objeto que hayas hecho mejor: pero si eres fantico de la programacin procedural no tienes nada que temer.
11.2.1 Preparando nuestra aplicacin

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Primero, consigamos una copia fresca de CakePHP. Para descargarla, visita la pgina de CakePHP en Cakeforge: http://cakeforge.org/projects/cakephp/ y descarga la ltima versin estable. Para este tutorial necesitaras la version 1.2.x.x Tambin puedes hacer checkout/export desde el trunk en: https://svn.cakephp.org/repo/trunk/cake/1.2.x.x/ Una vez que tengas la copia de Cake, configuraremos el archivo database.php, y cambiemos ademas el valor de Security.salt en el archivo app/config/core.php. Desde ac construiremos un esquema de base de datos simple para nuestra aplicacin. Ejecuta el siguiente cdigo SQL en tu base de datos.
CREATE TABLE users ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, password CHAR(40) NOT NULL, group_id INT(11) NOT NULL, created DATETIME, modified DATETIME ); CREATE TABLE groups ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, created DATETIME, modified DATETIME

); CREATE TABLE posts ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, user_id INT(11) NOT NULL, title VARCHAR(255) NOT NULL, body TEXT, created DATETIME, modified DATETIME ); CREATE TABLE widgets ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, part_no VARCHAR(12), quantity INT(11) );

Estas sern las tablas que usaremos para construir el resto de la aplicacin. Una vez que tengamos la estructura en la base de datos ya podemos comenzar a hornear. Usa cake bake para crear rapidamente tus modelos, controladores y vistas. Evite el uso de Scaffold(andamios) aqu. La generacin de la ACOS se vern seriamente afectados si hornear los controladores con la funcin de Scaffold. Mientras hornees tus modelos Cake automagicamente detectara las asociaciones entre tus modelos (o relaciones entre las tablas). Dejemos que Cake entregue las asociaciones hasMany y belongsTo apropiadas. Si te pregunta por elegir hasOne o hasMany, en general necesitars una relacin hasMany (solo) para este tutorial. Dejaremos admin routing fuera por ahora, este tema ya es bastante complejo sin ellos. Asegurate adems de NO agregar ninguno de los dos componentes a ningn controlador mientras estes hornendolo. Haremos eso tan pronto podamos. Ahora debieras tener modelos, controladores y vistas para tus tablas users (usuarios), groups (grupos), posts (artculos) y widgets. En modo actions (acciones), esto autenticar nuestros ARO que son los groups y users, con los objetos ACO - controladores & acciones.
11.2.2 Preparndose para agregar Autentificacin (Auth)

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes:

Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Ahora tenemos un funcionamiento de aplicacin CRUD. Bake debe tener todas las configuraciones de las relaciones que necesitamos, si no es as debemos aadirlas ahora. Hay algunas otras piezas que aadiremos antes de que podamos agregar los componentes de autenticacin y acl. En primer lugar aadir las acciones login(inicio sesin) y logout(salir sesin) en el controlador UsersController. 1. 2. 3. 4. 5. 6. function login() { //Autentificacin Magica } function logout() { //limpio por ahora. }

No es necesario preocuparse por agregar cualquier hash de contraseas, debido a que AuthComponent lo har por nosotros automticamente al crear/editar los usuarios, y cuando se inicia sesin, una vez configurado correctamente. Adems, si usted agrega un hash de las contraseas manualmente AuthComponent no podr iniciar sesin en absoluto. Pues los hash no coincidiran. A continuacin tenemos que hacer algunas modificaciones a AppController. Si usted no tiene el controlador /app/app_controller.php, crelo. Tenga en cuenta que esto va en /app/ y no /app/controllers/. Dado que queremos que todo el sitio este con el control de autentificacin y ACL, vamos a ponerlos en AppController. class AppController extends Controller { var $components = array('Acl', 'Auth'); function beforeFilter() { //Configure AuthComponent $this->Auth->authorize = 'actions'; $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); 7. $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login'); 8. $this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add'); 9. } 10.} 1. 2. 3. 4. 5. 6. Antes de configurar la ACL en todo tendr que aadir algunos usuarios y grupos. Con AuthComponent en uso no podremos acceder a ninguna de nuestras acciones, ya que no se ha iniciado sesin. Ahora vamos a aadir algunas excepciones de manera que AuthComponent nos permitir crear algunos grupos y usuarios. Por lo tanto en GroupsController y

UsersController aadiremos lo siguiente. 1. 2. 3. 4. function beforeFilter() { parent::beforeFilter(); $this->Auth->allowedActions = array('*'); }

Estas declaraciones son para decirle a AuthComponent que permita el acceso del pblico a todas las acciones. Esto es slo temporal y se eliminar una vez que tengamos unos usuarios y grupos en nuestra base de datos. No agregue los usuarios o grupos, no todava.
11.2.3 Inicializar las tablas Acl en la BD

Editar Ver slo esta seccin Historia Hay un cambio pendiente para esta seccin Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Antes de que creemos nuestros users o groups querremos conectarlos con el Acl. Sin embargo, en este punto aun no tenemos ninguna tabla Acl y si tratamos de ver cualquier pgina en este momento, obtendremos un error de tabla no encontrada. Para eliminar estos errores necesitamos ejecutar un archivo de esquema. En una consola ejecuta el siguiente codigo: cake schema run create DbAcl. Este esquema te preguntara acerca de eliminar y crear estas tablas. Acepta la eliminacin y creacin de stas tablas. Recuerda especificar la ruta de tu directorio app si ests fuera de ella. 1. En tu directorio de aplicacin app: $ /path/to/cake/console/cake schema run create DbAcl 2. Fuera de tu directorio de aplicacin app: $ /path/to/cake/console/cake -app /path/to/app/dir schema run create DbAcl Con los controladores listos para la entrada de datos y con las tablas Acl inicializadas estamos listos para empezar cierto?... no del todo, an necesitamos un poco de trabajo en los modelos de users y groups. Llammoslo, hacerlos automgicamente ligados a Acl.

11.2.4 Act as a Requester (Solicitante)

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Para que Auth y Acl funcionen apropiadamente necesitamos asociar a nuestros modelos users y groups con registros en las tablas Acl. Para hacer esto usaremos el AclBehavior. El AclBehavior permite la conexin automgica entre los modelos y las tablas Acl. Su uso requiere la implementacin de parentNode() en tu modelo. En nuestro modelo User agregaremos lo siguiente: 1. var $name = 'User'; 2. var $belongsTo = array('Group'); 3. var $actsAs = array('Acl' => array('requester')); 4. function parentNode() { 5. if (!$this->id && empty($this->data)) { 6. return null; 7. } 8. $data = $this->data; 9. if (empty($this->data)) { 10.$data = $this->read(); 11.} 12.if (!$data['User']['group_id']) { 13.return null; 14.} else { 15.return array('Group' => array('id' => $data['User'] ['group_id'])); 16.} 17.} Entonces en nuestro modelo Group agrega lo siguiente: 1. 2. 3. 4. var $actsAs = array('Acl' => array('requester')); function parentNode() { return null; }

Lo que hace esto es unir los modelos Group y User al Acl, y decirle a CakePHP que cada vez que crees un User o Group agregues una entrada en la tabla aros. Esto hace la administracin de Acl muy fcil ya que tus AROs se ligan transparentemente a tus tablas de users y groups. De esta forma, cada vez que se crea o elimina un usuario la tabla de

Aro se actualiza. Nuestros controladores y modelos ahora estn preparados para agregar algunos datos iniciales, y nuestros modelos Group y User estan unidos a la tabla Acl. Ahora agregaremos unos groups y users usando los formularios que creamos con bake. Yo cre en este caso los siguientes grupos: administrators managers users Tambien cre un user en cada group de tal forma de tener un user por cada grupo de acceso diferente para probarlos luego. Escribe todo facil de recordar, sobre todos los passwords. Si haces un SELECT * FROM aros; desde la consola de mysql obtendrs algo como:
+----+-----------+-------+-------------+-------+------+------+ | id | parent_id | model | foreign_key | alias | lft | rght | +----+-----------+-------+-------------+-------+------+------+ | 1 | NULL | Group | 1 | NULL | 1 | 4 | | 2 | NULL | Group | 2 | NULL | 5 | 8 | | 3 | NULL | Group | 3 | NULL | 9 | 12 | | 4 | 1 | User | 1 | NULL | 2 | 3 | | 5 | 2 | User | 2 | NULL | 6 | 7 | | 6 | 3 | User | 3 | NULL | 10 | 11 | +----+-----------+-------+-------------+-------+------+------+ 6 rows in set (0.00 sec)

Esto nos muestra que tenemos tres groups y 3 users. Los users estan anidados dentro de los grupos., lo que significa que podemos fijar permisos mediante grupos o por usuarios. Cuando modificamos un user, debes actualizar manualmente los ARo. Este codigo debera ser ejecutado cada vez que actualices la informacin del usuario: // Verificar si sus permisos de grupo han cambiado $oldgroupid = $this->User->field('group_id'); if ($oldgroupid !== $this->data['User']['group_id']) { $aro =& $this->Acl->Aro; $user = $aro->findByForeignKeyAndModel($this->data['User'] ['id'], 'User'); 6. $group = $aro->findByForeignKeyAndModel($this->data['User'] ['group_id'], 'Group'); 7. // Guardar en la tabla ARO 8. $aro->id = $user['Aro']['id']; 9. $aro->save(array('parent_id' => $group['Aro']['id'])); 10.} 1. 2. 3. 4. 5.
# 11.2.4.1 Group-only ACL

Editar

Ver slo esta seccin Historia Comparar con el contenido original En caso que queramos permisos por grupo solamente, necesitamos implementar bindNode() en el modelo User. 1. function bindNode($user) { 2. return array('model' => 'Group', 'foreign_key' => $user['User'] ['group_id']); 3. } Este mtodo le dir al ACL que no revise el User Aro, y que slo revise el Group Aro. Cada usuario tiene que tener asignado un group_id para que pueda funcionar. En este caso nuestra tabla aros se ver como sigue:
+----+-----------+-------+-------------+-------+------+------+ | id | parent_id | model | foreign_key | alias | lft | rght | +----+-----------+-------+-------------+-------+------+------+ | 1 | NULL | Group | 1 | NULL | 1 | 2 | | 2 | NULL | Group | 2 | NULL | 3 | 4 | | 3 | NULL | Group | 3 | NULL | 5 | 6 | +----+-----------+-------+-------------+-------+------+------+ 3 rows in set (0.00 sec)

11.2.5 Creando ACOs

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Ahora que ya tenemos nuestros users y groups (aros), podemos empezar a ingresar nuestros controladores en el Acl y fijar los permisos para cada grupo de usuarios, adems, habilitar el login y logout. Nuestros AROs son automaticamente creados cuando nuevos usuarios y grupos son creados. Que hay de autogenerar los ACOs desde nuestros controladores y sus acciones?. Desafortunadamente no hay una manera mgica de hacer esto. Las clases del ncleo ofrecen unas pocas formas de crear ACOs manualmente. Se pueden crear ACOs a travs de la consola o usando el AclComponent. Desde la consola esto se ve as:

cake acl create aco root controllers

Mientras que desde el AclComponent se ve asi: 1. $this->Acl->Aco->create(array('parent_id' => null, 'alias' => 'controllers')); 2. $this->Acl->Aco->save(); Ambos ejemplos crear nuestra 'raiz' (root) o ACO de nivel superior, el cual se llama 'controllers'. El propsito de este nodo raiz es hacer fcil permitir/denegar (allow/deny) acceso en el mbito global de la aplicacin y permitir el uso del Acl para propsitos no relacionados con los controladores/acciones tales como verificar permisos de registro del modelo. As como usaremos una raz global para los ACO necesitaremos hacer una pequea modificacin a la configuracin de nuestro AuthComponent. AuthComponent necesita saber de la existencia de este nodo raz, de tal forma que cuando hacemos que ACL lo verifique, pueda usar la ruta correcta al nodo cuando busque un(a) controlador/accion. En AppController agrega el siguiente cdigo a beforeFilter: 1. $this->Auth->actionPath = 'controllers/';
11.2.6 Una herramienta automtica para crear ACOs

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Tal como se mencion anteriormente, no hay una forma pre-construida para insertar y conectar nuestros controladores y sus funciones dentro del Acl. Sin embargo, todos odiamos hacer tareas repetitivas como tipear lo que tal vez sean cientos de acciones en una aplicacin grande. He escrito una funcin automtica para construir mi tabla de Aco's. Esta funcin mirar en cada controlador de la aplicacin. Aadir cualquier metodo no privativo, ni propio del Controller. Puedes agregar y ejecutar esto en tu AppController o cualquier otro controlador con ese propsito, solo asegurate de eliminarlo antes de poner la aplicacin en produccin. 1. /** 2. * Reconstruye el Acl basado en los controladores actuales de la aplicacin. 3. *

4. * @return void 5. */ 6. function buildAcl() { 7. $log = array(); 8. $aco =& $this->Acl->Aco; 9. $root = $aco->node('controllers'); 10.if (!$root) { 11.$aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers')); 12.$root = $aco->save(); 13.$root['Aco']['id'] = $aco->id; 14.$log[] = 'Creado el nodo Aco para los controladores'; 15.} else { 16.$root = $root[0]; 17.} 18.App::import('Core', 'File'); 19.$Controllers = Configure::listObjects('controller'); 20.$appIndex = array_search('App', $Controllers); 21.if ($appIndex !== false ) { 22.unset($Controllers[$appIndex]); 23.} 24.$baseMethods = get_class_methods('Controller'); 25.$baseMethods[] = 'buildAcl'; 26.// miramos en cada controlador en app/controllers 27.foreach ($Controllers as $ctrlName) { 28.App::import('Controller', $ctrlName); 29.$ctrlclass = $ctrlName . 'Controller'; 30.$methods = get_class_methods($ctrlclass); 31.//buscar / crear nodo de controlador 32.$controllerNode = $aco->node('controllers/'.$ctrlName); 33.if (!$controllerNode) { 34.$aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => $ctrlName)); 35.$controllerNode = $aco->save(); 36.$controllerNode['Aco']['id'] = $aco->id; 37.$log[] = 'Creado el nodo Aco del controlador '.$ctrlName; 38.} else { 39.$controllerNode = $controllerNode[0]; 40.} 41.//Limpieza de los metodos, para eliminar aquellos en el controlador 42.//y en las acciones privadas 43.foreach ($methods as $k => $method) { 44.if (strpos($method, '_', 0) === 0) { 45.unset($methods[$k]); 46.continue; 47.} 48.if (in_array($method, $baseMethods)) {

49.unset($methods[$k]); 50.continue; 51.} 52.$methodNode = $aco->node('controllers/'.$ctrlName.'/'.$method); 53.if (!$methodNode) { 54.$aco->create(array('parent_id' => $controllerNode['Aco']['id'], 'model' => null, 'alias' => $method)); 55.$methodNode = $aco->save(); 56.$log[] = 'Creado el nodo Aco para '. $method; 57.} 58.} 59.} 60.debug($log); 61.} Quizs quieras mantener esta funcin cerca cuando aadas nuevos ACO's para todos los controladores & acciones que tiene tu aplicacin cada vez que la ejecutes. Sin embargo, no remueve los nodos de las acciones que ya no existen, esto implica tener que limpiar a mano la tabla ACO. Ahora que todo lo ms complejo est hecho, necesitamos ahora configurar los permisos, y eliminar el cdigo que deshabilit el AuthComponent anteriormente. Ahora, que ya est funcionando, quizs notes que tienes problemas accesando cualquier plugin que quizs estabas ocupando. El truco para automatizar el controlador de ACO's para los plugins, es que necesita un App::import que siga la convencion de nombre de plugins, que es PluginNombre.PluginControllerNombre. Entonces lo que necesitamos es una funcin que nos entregar una lista de los nombres de los controladores de los plugins, y que los importe en la misma forma que lo hicimos arriba para los controladores normales. La funcin de abajo har exactamente eso: /** * Obtener los nombres de los controladores de plugins * * Esta funcion entrega un arreglo con los nombres de los controladores 5. * de los plugins y adems se asegura que los controladores estn disponibles 6. * para nosotros, de modo de obtener los nombres de los metodos al hacer un 7. * App:import para cada uno de los plugins. 8. * 9. * @return arreglo con los nombres de los plugins. 10.* 11.*/ 12.function _get_plugin_controller_names(){ 13.App::import('Core', 'File', 'Folder'); 1. 2. 3. 4.

14.$paths = Configure::getInstance(); 15.$folder =& new Folder(); 16.// Cambiamos al directorio de plugins 17.$folder->cd(APP.'plugins'); 18.// Obtener la lista de los archivos que terminan con 19.// controller.php 20.$files = $folder->findRecursive('.*_controller\.php'); 21.// Obtener la lista de plugins 22.$Plugins = Configure::listObjects('plugin'); 23.// Ciclo a travs de los controladores que encontramos en el 24.// directorio de plugins 25.foreach($files as $f => $fileName) 26.{ 27.// Obtener el nombre de archivo base 28.$file = basename($fileName); 29.// Obtener el nombre del controlador 30.$file = Inflector::camelize(substr($file, 0, strlen($file)strlen('_controller.php'))); 31.// Ciclo a travs de los plugins 32.foreach($Plugins as $pluginName){ 33.if (preg_match('/^'.$pluginName.'/', $file)){ 34.// Primero nos deshacemos del AppController del plugin 35.// Hacemos esto porque nunca lo llamamos directamente 36.if (preg_match('/^'.$pluginName.'App/', $file)){ 37.unset($files[$f]); 38.} else { 39.if (!App::import('Controller', $pluginName.'.'.$file)) 40.{ 41.debug('Error importando el archivo '.$file.' para el plugin '. $pluginName); 42.} 43.// Ahora le agregamos el nombre del plugin al inicio 44.// Esto lo necesitamos para poder obtener los nombres 45.// de los mtodos 46.$files[$f] = $file; 47.} 48.break; 49.} 50.} 51.} 52.return $files; 53.} Tu puedes modificar el cdigo original para incluir los controladores de plugins al mezclarlos con la lista que obtuviste (ubicarlo antes del ciclo foreach): 1. $Plugins = $this->_get_plugin_controller_names(); 2. $Controllers = array_merge($Controllers, $Plugins);

11.2.7 Configurando los permisos

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Crear los permisos al igual que crear los ACO's no tiene una solucion mgica, en este caso no proveeremos una forma automtica. Para permitir a los ARO's acceder a los ACO's desde la consola, usamos:
cake acl grant $aroAlias $acoAlias [create|read|update|delete|'*']

* Necesita estar entre comillas simples ('*') Para permitir acceso a travs del AclComponent haz lo siguiente: 1. $this->Acl->allow($aroAlias, $acoAlias); Ahora aadiremos algunas sentencias para permitir y denegar el acceso. Agrega lo siguiente a tu funcin temporal en tu UsersController e ingresa a la direccin adecuada en tu navegador para ejecutarla. Si haces un SELECT * FROM aros_acos deberas ver toda un montn de unos y ceros. Una vez que hayas confirmado los permisos, elimina la funcin. 1. function initDB() { 2. $group =& $this->User->Group; 3. //Permite a los administradores hacer todo 4. $group->id = 1; 5. $this->Acl->allow($group, 'controllers'); 6. //permite a los editores postear y accesar los widgets 7. $group->id = 2; 8. $this->Acl->deny($group, 'controllers'); 9. $this->Acl->allow($group, 'controllers/Posts'); 10.$this->Acl->allow($group, 'controllers/Widgets'); 11.//permite a los usuarios aadir y editar posts y widgets 12.$group->id = 3; 13.$this->Acl->deny($group, 'controllers'); 14.$this->Acl->allow($group, 'controllers/Posts/add'); 15.$this->Acl->allow($group, 'controllers/Posts/edit'); 16.$this->Acl->allow($group, 'controllers/Widgets/add'); 17.$this->Acl->allow($group, 'controllers/Widgets/edit'); 18.} Ahora hemos seteado algunas reglas bsicas de acceso. Hemos permitido

a los administradores accesar a todas las funciones. Los editores pueden accesar a todas las funcionalidades de los posts y los widgets. En cambio los usuarios solo pueden accesar aquellas funciones que permiten agregar y editar posts y widgets. Debemos obtener una referencia del modelo Group y modificar su id para poder especificar el ARO que queremos, esto es debido a la forma en que trabaja el AclBehavior. El AclBehavior no configura el campo alias en la tabla aros, por lo que debemos usar una referencia a un objeto ARO que necesitemos. Quizs hayas notado que deliberadamente deje fuera index y view fuera de mis permisos ACL. Haremos que los metodos index y view sean de acceso pblico en el controlador PostsController y en el WidgetsController. Esto permite a los usuarios no autorizados para ver estas paginas, haciendolas pblicas. Sin embargo, en cualquier momento puedes eliminar estas acciones desde AuthComponent::allowedActions y los permisos de estas dos funciones volvern a su configuracin original del Acl. Ahora queremos eliminar las referencias al Auth->allowedActions en los controladores de users y groups. Entonces agregamos el siguiente cdigo en los controladores de posts y widgets: 1. 2. 3. 4. function beforeFilter() { parent::beforeFilter(); $this->Auth->allowedActions = array('index', 'view'); }

Esto elimina el "interruptor de apagado" que colocamos anteriormente el los controladores de groups y users, y otorga acceso pblico a las acciones index y view en aquellos controladores. En AppController::beforeFilter() agrega lo siguiente: 1. $this->Auth->allowedActions = array('display'); Esto hace que la accin 'display' sea pblica. Esto mantendr publica nuestra accin PagesController::display(). Esto es importante pues a menudo sta es la accion accesada por defecto del routing de la aplicacin.
11.2.8 Logueo de Usuarios

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original

Mas info sobre traduciones Nuestra aplicacin ya esta bajo control de acceso, y cualquier intento de ver alguna pgina sin acceso pblico ser redirigida a la pgina de login. Sin embargo, necesitamos crear una vista de login antes de que alguien pueda loguerase. Agrega el siguiente cdigo a app/views/users/login.ctp si es que an no lo has hecho. 1. <h2>Login</h2> 2. <?php 3. echo $form->create('User', array('url' => array('controller' => 'users', 'action' =>'login'))); 4. echo $form->input('User.username'); 5. echo $form->input('User.password'); 6. echo $form->end('Login'); 7. ?> Tal vez quieras agregar un flash() para los mensajes del componente Auth en tu layout. Copia el layout por defecto que se encuentra en cake/libs/views/layouts/default.ctp - a la carpeta de layouts de tu aplicacin si es que an no lo has hecho. En app/views/layouts/default.ctp agrega: 1. $session->flash('auth'); Ahora deberias poder loguerte y todo deber funcionar automgicamente. Cuando el acceso sea denegado el mensaje apropiado del Auth ser desplegado si es que has agragado $session>flash('auth')
11.2.9 Logout (deslogueo)

Editar Ver slo esta seccin Historia Comparar con el contenido original

Ahora al logout. Hace un momento dejamos esta funcin en blanco, ahora es el momento de llenarla. En UsersController::logout() aade lo siguiente: 1. $this->Session->setFlash('Adios y nos vemos.'); 2. $this->redirect($this->Auth->logout()); Esto establece el mensaje flash y saca al usuario de la aplicacin usando el mtodo logout del componente Auth. Este mtodo basicamente elimina la llave de la sesin del usuario y devuelve la url que puede ser usada en el redireccionamiento. Si es que hay otros datos en la sesin que necesiten ser eliminados se debe agregar ese cdigo ac.
11.2.10 Todo hecho

Editar

Ver slo esta seccin Historia Comparar con el contenido original En este momento ya deberas tener una aplicacin controlada por los componentes Auth y Acl. Los permisos de usuarios se hicieron al nivel de grupo, pero pueden ser configurados a nivel de usuarios en cualquier momento. Tambin puedes configurar los permisos a nivel global y tambin por controladores y acciones. Adems, tienes a tu disposicin un cdigo reusable para facilmente expandir tu tabla de ACO a medida que tu aplicacin crece.

12 Apendices
Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Notas adicionales sobre el desarrollo con CakePHP 12.1 Migrando desde CakePHP 1.2 a 1.3 Editar Ver slo esta seccin Historia Comparar con el contenido original

Esta gua resume muchos de los cambios necesarios al migrar desde CakePHP 1.2 al 1.3. Cada seccin contiene informacin relevante acerca de las modificaciones hechas a los mtodos existentes as como los mtodos que han sido eliminados/renombrados. Reemplazos de archivos de aplicacin (importante) webroot/index.php: Debe ser reemplazado debido a cambios en el proceso de bootstrapping. config/core.php: Han sido aadidas configuraciones adicionales requeridas por PHP 5.3. webroot/test.php: Reemplace este archivo si desea correr pruebas unitarias (unit tests).

# Constantes eliminadas

Editar Ver slo esta seccin Historia Comparar con el contenido original

Las siguientes constantes han sido eliminadas de CakePHP. Si su aplicacin depende de una de ellas, debe definirlas previamente en app/config/bootstrap.php CIPHER_SEED - Reemplazada por la variable de la clase Configure Security.cipherSeed que debe ser cambiada en app/config/core.php PEAR INFLECTIONS VALID_NOT_EMPTY VALID_EMAIL VALID_NUMBER VALID_YEAR
# Configuration and application bootstrapping

Editar Ver slo esta seccin Historia Este texto puede diverger de la versin original

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes: Ver que ha cambiado Comparar con el texto original Mas info sobre traduciones Bootstrapping Additional Paths. In your app/config/bootstrap.php you may have variables like $pluginPaths or $controllerPaths. There is a new way to add those paths. As of 1.3 RC1 the $pluginPaths variables will no longer work. You must use App::build() to modify paths. 1. App::build(array( 2. 'plugins' => array('/full/path/to/plugins/', '/next/full/path/to/plugins/'), 3. 'models' => array('/full/path/to/models/', '/next/full/path/to/models/'), 4. 'views' => array('/full/path/to/views/', '/next/full/path/to/views/'), 5. 'controllers' => array('/full/path/to/controllers/', '/next/full/path/to/controllers/'),

6. 'datasources' => array('/full/path/to/datasources/', '/next/full/path/to/datasources/'), 7. 'behaviors' => array('/full/path/to/behaviors/', '/next/full/path/to/behaviors/'), 8. 'components' => array('/full/path/to/components/', '/next/full/path/to/components/'), 9. 'helpers' => array('/full/path/to/helpers/', '/next/full/path/to/helpers/'), 10.'vendors' => array('/full/path/to/vendors/', '/next/full/path/to/vendors/'), 11.'shells' => array('/full/path/to/shells/', '/next/full/path/to/shells/'), 12.'locales' => array('/full/path/to/locale/', '/next/full/path/to/locale/') 13.)); Also changed is the order in which bootstrapping occurs. In the past app/config/core.php was loaded after app/config/bootstrap.php. This caused any App::import() in an application bootstrap to be un-cached and considerably slower than a cached include. In 1.3 core.php is loaded and the core cache configs are created before bootstrap.php is loaded. Loading custom inflections inflections.php ha sido removido, se trataba de un archivo innecesario, y las caractersticas relacionadas fueron reprogramadas en un mtodo para incrementar su flexibilidad. Ahora utilice Inflector::rules() para cargar las inflexiones personalizadas. 1. Inflector::rules('singular', array( 2. 'rules' => array('/^(bil)er$/i' => '\1', '/^(inflec| contribu)tors$/i' => '\1ta'), 3. 'uninflected' => array('singulars'), 4. 'irregular' => array('spins' => 'spinor') 5. )); Will merge the supplied rules into the infection sets, with the added rules taking precedence over the core rules.
# File renames and internal changes

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Library Renames Core libraries of libs/session.php, libs/socket.php, libs/model/schema.php and libs/model/behavior.php have been renamed

so that there is a better mapping between filenames and main classes contained within (as well as dealing with some name-spacing issues): session.php cake_session.php App::import('Core', 'Session') App::import('Core', 'CakeSession') socket.php cake_socket.php App::import('Core', 'Socket') App::import('Core', 'CakeSocket') schema.php cake_schema.php App::import('Model', 'Schema') App::import('Model', 'CakeSchema') behavior.php model_behavior.php App::import('Core', 'Behavior') App::import('Core', 'ModelBehavior') In most cases, the above renaming will not affect userland code. Inheritance from Object The following classes no longer extend Object: Router Set Inflector Cache CacheEngine

If you were using Object methods from these classes, you will need to not use those methods.
# Controller & Components

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Controller Controller::set() no longer changes variables from $var_name to $varName. Variables always appear in the view exactly as you set them. Controller::set('title', $var) no longer sets $title_for_layout when rendering the layout. $title_for_layout is still populated by default. But if you want to customize it, use $this>set('title_for_layout', $var).

Controller::$pageTitle has been removed. Use $this>set('title_for_layout', $var); instead. Controller has two new methods startupProcess and shutdownProcess. These methods are responsible for handling the controller startup and shutdown processes. Component Component::triggerCallback has been added. It is a generic hook into the component callback process. It supplants Component::startup(), Component::shutdown() and Component::beforeRender() as the preferred way to trigger callbacks. CookieComponent del is deprecated use delete AclComponent + DbAcl Node reference checks done with paths are now less greedy and will no longer consume intermediary nodes when doing searches. In the past given the structure: 1. 2. 3. 4. ROOT/ Users/ Users/ edit

The path ROOT/Users would match the last Users node instead of the first. In 1.3, if you were expecting to get the last node you would need to use the path ROOT/Users/Users RequestHandlerComponent getReferrer is deprecated use getReferer SessionComponent & SessionHelper del is deprecated use delete SessionComponent::setFlash() second param used to be used for setting the layout and accordingly rendered a layout file. This has been modifed to use an element. If you specified custom session flash layouts in your applications you will need to make the following changes. 1. Move the required layout files into app/views/elements 2. Rename the $content_for_layout variable to $message 3. Make sure you have echo $session->flash(); in your layout SessionComponent and SessionHelper are not automatically loaded. Both SessionComponent and SessionHelper are no longer automatically included without you asking for them. SessionHelper and SessionComponent now act like every other component and must be

declared like any other helper/component. You should update AppController::$components and AppController::$helpers to include these classes to retain existing behavior. 1. var $components = array('Session', 'Auth', ...); 2. var $helpers = array('Session', 'Html', 'Form' ...); These change were done to make CakePHP more explicit and declarative in what classes you the application developer want to use. In the past there was no way to avoid loading the Session classes without modifying core files. Which is something we want you to be able to avoid. In addition Session classes were the only magical component and helper. This change helps unify and normalize behavior amongst all classes.
# Library Classes

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones CakeSession del is deprecated use delete SessionComponent SessionComponent::setFlash() now uses an element instead of a layout as its second parameter. Be sure to move any flash layouts from app/views/layouts to app/views/elements and change instances of $content_for_layout to $message. Folder Set isEqual is deprecated. Use == or ===. String getInstance is deprecated, call String methods statically. Router Routing.admin is deprecated. It provided an inconsistent behavior with other prefix style routes in that it was treated differently. Instead you should use Routing.prefixes. Prefix routes in 1.3 do not mkdir mv is ls is cp is rm is is deprecated use create deprecated use move deprecated use read deprecated use copy deprecated use delete

require additional routes to be declared manually. All prefix routes will be generated automatically. To update simply change your core.php. 1. 2. 3. 4. //from: Configure::write('Routing.admin', 'admin'); //to: Configure::write('Routing.prefixes', array('admin'));

See the New features guide for more information on using prefix routes. A small change has also been done to routing params. Routed params should now only consist of alphanumeric chars, - and _ or /[AZ0-9-_+]+/. 1. Router::connect('/:$%@#param/:action/*', array(...)); // BAD 2. Router::connect('/:can/:anybody/:see/:m-3/*', array(...)); //Acceptable For 1.3 the internals of the Router were heavily refactored to increase performance and reduce code clutter. The side effect of this is two seldom used features were removed, as they were problematic and buggy even with the existing code base. First path segments using full regular expressions was removed. You can no longer create routes like 1. Router::connect('/([0-9]+)-p-(.*)/', array('controller' => 'products', 'action' => 'show')); These routes complicated route compilation and impossible to reverse route. If you need routes like this, it is recommended that you use route parameters with capture patterns. Next mid-route greedy star support has been removed. It was previously possible to use a greedy star in the middle of a route. 1. 2. 3. 4. 5. Router::connect( '/pages/*/:event', array('controller' => 'pages', 'action' => 'display'), array('event' => '[a-z0-9_-]+') );

This is no longer supported as mid-route greedy stars behaved erratically, and complicated route compiling. Outside of these two edge-case features and the above changes the router behaves exactly as it did in 1.2 Also, people using the 'id' key in array-form URLs will notice that Router::url() now treats this as a named parameter. If you previously used this approach for passing the ID parameter to actions, you will need to rewrite all your $html->link() and $this->redirect() calls to reflect this change. 1. // old format: 2. $url = array('controller' => 'posts', 'action' => 'view', 'id' => $id);

3. // use cases: 4. Router::url($url); 5. $html->link($url); 6. $this->redirect($url); 7. // 1.2 result: 8. /posts/view/123 9. // 1.3 result: 10./posts/view/id:123 11.// correct format: 12.$url = array('controller' => 'posts', 'action' => 'view', $id); Dispatcher Dispatcher is no longer capable of setting a controller's layout/viewPath with request parameters. Control of these properties should be handled by the Controller, not the Dispatcher. This feature was also undocumented, and untested. Debugger Debugger::checkSessionKey() has been renamed to Debugger::checkSecurityKeys() Calling Debugger::output("text") no longer works. Use Debugger::output("txt"). Object Object::$_log has been removed. CakeLog::write is now called statically. See New Logging features for more information on changes made to logging. Sanitize Sanitize::html() now actually always returns escaped strings. In the past using the $remove parameter would skip entity encoding, returning possibly dangerous content. Sanitize::clean() now has a remove_html option. This will trigger the strip_tags feature of Sanitize::html(), and must be used in conjunction with the encode parameter. Configure and App Configure::listObjects() replaced by App::objects() Configure::corePaths() replaced by App::core() Configure::buildPaths() replaced by App::build() Configure no longer manages paths. Configure::write('modelPaths', array...) replaced by App::build(array('models' => array...)) Configure::read('modelPaths') replaced by App::path('models') There is no longer a debug = 3. The controller dumps generated by this setting often caused memory consumption issues making it an impractical and unusable setting. The $cakeDebug variable has also been removed from View::renderLayout You should remove this

variable reference to avoid errors. Configure::load() can now load configuration files from plugins. Use Configure::load('plugin.file'); to load configuration files from plugins. Any configuration files in your application that use . in the name should be updated to use _ Cache In addition to being able to load CacheEngines from app/libs or plugins, Cache underwent some refactoring for CakePHP1.3. These refactorings focused around reducing the number and frequency of method calls. The end result was a significant performance improvement with only a few minor API changes which are detailed below. The changes in Cache removed the singletons used for each Engine type, and instead an engine instance is made for each unique key created with Cache::config(). Since engines are not singletons anymore, Cache::engine() was not needed and was removed. In addition Cache::isInitialized() now checks cache configuration names, not cache engine names. You can still use Cache::set() or Cache::engine() to modify cache configurations. Also checkout the New features guide for more information on the additional methods added to Cache. It should be noted that using an app/libs or plugin cache engine for the default cache config can cause performance issues as the import that loads these classes will always be uncached. It is recommended that you either use one of the core cache engines for your default configuration, or manually include the cache engine class before configuring it. Furthermore any non-core cache engine configurations should be done in app/config/bootstrap.php for the same reasons detailed above.
# Model Databases and Datasources

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Model Model::del() and Model::remove() have been removed in favor of Model::delete(), which is now the canonical delete method. Model::findAll, findCount, findNeighbours, removed. Dynamic calling of setTablePrefix() has been removed. tableprefix should be with the $tablePrefix property, and any other custom construction behavior should be done in an overridden Model::__construct(). DboSource::query() now throws warnings for un-handled model

methods, instead of trying to run them as queries. This means, people starting transactions improperly via the $this->Model>begin() syntax will need to update their code so that it accesses the model's DataSource object directly. Missing validation methods will now trigger errors in development mode. Missing behaviors will now trigger a cakeError. Model::find(first) will no longer use the id property for default conditions if no conditions are supplied and id is not empty. Instead no conditions will be used For Model::saveAll() the default value for option 'validate' is now 'first' instead of true

Datasources DataSource::exists() has been refactored to be more consistent with non-database backed datasources. Previously, if you set var $useTable = false; var $useDbConfig = 'custom';, it was impossible for Model::exists() to return anything but false. This prevented custom datasources from using create() or update() correctly without some ugly hacks. If you have custom datasources that implement create(), update(), and read() (since Model::exists() will make a call to Model::find('count'), which is passed to DataSource::read()), make sure to re-run your unit tests on 1.3. Databases Most database configurations no longer support the 'connect' key (which has been deprecated since pre-1.2). Instead, set 'persistent' => true or false to determine whether or not a persistent database connection should be used SQL log dumping A commonly asked question is how can one disable or remove the SQL log dump at the bottom of the page?. In previous versions the HTML SQL log generation was buried inside DboSource. For 1.3 there is a new core element called sql_dump. DboSource no longer automatically outputs SQL logs. If you want to output SQL logs in 1.3, do the following: 1. <?php echo $this->element('sql_dump'); ?> You can place this element anywhere in your layout or view. The sql_dump element will only generate output when Configure::read('debug') is equal to 2. You can of course customize or override this element in your app by creating app/views/elements/sql_dump.ctp.

# View and Helpers

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones View View::renderElement removed. Use View::element() instead. Automagic support for .thtml view file extension has been removed either declare $this->ext = 'thtml'; in your controllers, or rename your views to use .ctp View::set('title', $var) no longer sets $title_for_layout when rendering the layout. $title_for_layout is still populated by default. But if you want to customize it, use $this>set('title_for_layout', $var). View::$pageTitle has been removed. Use $this>set('title_for_layout', $var); instead. The $cakeDebug layout variable associated with debug = 3 has been removed. Remove it from your layouts as it will cause errors. Also see the notes related to SQL log dumping and Configure for more information. All core helpers no longer use Helper::output(). The method was inconsistently used and caused output issues with many of FormHelper's methods. If you previously overrode AppHelper::output() to force helpers to auto-echo you will need to update your view files to manually echo helper output. TextHelper TextHelper::trim() is deprecated, used truncate() instead. TextHelper::highlight() no longer has: an $highlighter parameter. Use $options['format'] instead. an $considerHtmlparameter. Use $options['html'] instead. TextHelper::truncate() no longer has: an $ending parameter. Use $options['ending'] instead. an $exact parameter. Use $options['exact'] instead. an $considerHtmlparameter. Use $options['html'] instead.

PaginatorHelper PaginatorHelper has had a number of enhancements applied to make styling easier. prev(), next(), first() and last() The disabled state of these methods now defaults to <span> tags instead of <div> tags. passedArgs are now auto merged with url options in paginator.

sort(), prev(), next() now add additional class names to the generated html. prev() adds a class of prev. next() adds a class of next. sort() will add the direction currently being sorted, either asc or desc. FormHelper FormHelper::dateTime() no longer has a $showEmpty parameter. Use $attributes['empty'] instead. FormHelper::year() no longer has a $showEmpty parameter. Use $attributes['empty'] instead. FormHelper::month() no longer has a $showEmpty parameter. Use $attributes['empty'] instead. FormHelper::day() no longer has a $showEmpty parameter. Use $attributes['empty'] instead. FormHelper::minute() no longer has a $showEmpty parameter. Use $attributes['empty'] instead. FormHelper::meridian() no longer has a $showEmpty parameter. Use $attributes['empty'] instead. FormHelper::select() no longer has a $showEmpty parameter. Use $attributes['empty'] instead. Default urls generated by form helper no longer contain 'id' parameter. This makes default urls more consistent with documented userland routes. Also enables reverse routing to work in a more intuitive fashion with default FormHelper urls. FormHelper::submit() Can now create other types of inputs other than type=submit. Use the type option to control the type of input generated. FormHelper::button() Now creates <button> elements instead of reset or clear inputs. If you want to generate those types of inputs use FormHelper::submit() with a 'type' => 'reset' option for example. FormHelper::secure() and FormHelper::create() no longer create hidden fieldset elements. Instead they create hidden div elements. This improves validation with HTML4. Also be sure to check the Form helper improvements for additional changes and new features in the FormHelper. HtmlHelper HtmlHelper::meta() no longer has an $inline parameter. It has been merged with the $options array. HtmlHelper::link() no longer has an $escapeTitle parameter. Use $options['escape'] instead. HtmlHelper::para() no longer has an $escape parameter. Use $options['escape'] instead. HtmlHelper::div() no longer has an $escape parameter. Use $options['escape'] instead.

HtmlHelper::tag() no longer has an $escape parameter. Use $options['escape'] instead. HtmlHelper::css() no longer has an $inline parameter. Use $options['inline'] instead. SessionHelper flash() no longer auto echos. You must add an echo $session>flash(); to your session->flash() calls. flash() was the only helper method that auto outputted, and was changed to create consistency in helper methods. CacheHelper CacheHelper's interactions with Controller::$cacheAction has changed slightly. In the past if you used an array for $cacheAction you were required to use the routed url as the keys, this caused caching to break whenever routes were changed. You also could set different cache durations for different passed argument values, but not different named parameters or query string parameters. Both of these limitations/inconsistencies have been removed. You now use the controller's action names as the keys for $cacheAction. This makes configuring $cacheAction easier as its no longer coupled to the routing, and allows cacheAction to work with all custom routing. If you need to have custom cache durations for specific argument sets you will need to detect and update cacheAction in your controller. TimeHelper TimeHelper has been refactored to make it more i18n friendly. Internally almost all calls to date() have been replaced by strftime(). The new method TimeHelper::i18nFormat() has been added and will take localization data from a LC_TIME locale definition file in app/locale following the POSIX standard. These are the changes made in the TimeHelper API: TimeHelper::format() can now take a time string as first parameter and a format string as the second one, the format must be using the strftime() style. When called with this parameter order it will try to automatically convert the date format into the preferred one for the current locale. It will also take parameters as in 1.2.x version to be backwards compatible, but in this case format string must be compatible with date(). TimeHelper::i18nFormat() has been added Deprecated Helpers Both the JavascriptHelper and the AjaxHelper are deprecated, and the JsHelper + HtmlHelper should be used in their place. You should replace $javascript->link() with $html->script() $javascript->codeBlock() with $html->scriptBlock() or $html-

>scriptStart() and $html->scriptEnd() depending on your usage.


# Console and shells

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Shell Shell::getAdmin() has been moved up to ProjectTask::getAdmin() Schema shell cake schema run create has been renamed to cake schema create cake schema run update has been renamed to cake schema update Console Error Handling The shell dispatcher has been modified to exit with a 1 status code if the method called on the shell explicitly returns false. Returning anything else results in a 0 status code. Before the value returned from the method was used directly as the status code for exiting the shell. Shell methods which are returning 1 to indicate an error should be updated to return false instead. Shell::error() has been modified to exit with status code 1 after printing the error message which now uses a slightly different formatting. 1. 2. 3. 4. 5. $this->error('Invalid Foo', 'Please provide bar.'); // outputs: Error: Invalid Foo Please provide bar. // exits with status code 1

ShellDispatcher::stderr() has been modified to not prepend Error: to the message anymore. It's signature is now similar to Shell::stdout(). ShellDispatcher::shiftArgs() The method has been modified to return the shifted argument. Before if no arguments were available the method was returning false, it now returns null. Before if arguments were available the method was returning true, it now returns the shifted argument instead.
# Vendors, Test Suite & schema

Traducir Ver slo esta seccin

Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones vendors/css, vendors/js, and vendors/img Support for these three directories, both in app/vendors as well as plugin/vendors has been removed. They have been replaced with plugin and theme webroot directories. Test Suite and Unit Tests Group tests should now extend TestSuite instead of the deprecated GroupTest class. If your Group tests do not run, you will need to update the base class. Vendor, plugin and theme assets Vendor asset serving has been removed in 1.3 in favour of plugin and theme webroot directories. Schema files used with the SchemaShell have been moved to app/config/schema instead of app/config/sql Although config/sql will continue to work in 1.3, it will not in future versions, it is recommend that the new path is used. 12.2 Nuevas caractersticas en CakePHP 1.3 Editar Ver slo esta seccin Historia Comparar con el contenido original

CakePHP 1.3 introdujo varias caractersticas nuevas. Esta gua intenta resumir los cambios y vincular a la documentacin expandida donde sea necesario.
# Componentes

Editar Ver slo esta seccin Historia Comparar con el contenido original

SecurityComponent Los mtodos requireXX como requireGet y requirePost ahora aceptan un nico array como argumento adems de una coleccin de cadenas de texto. 1. $this->Security->requirePost(array('edit', 'update')); Configuracin de componentes La configuracin para todos los componentes del ncleo puede ser

definida desde el array $components. De la misma forma que los comportamientos, se pueden declarar parametros de configuracin cuando se declara el componente. var $components = array( 'Cookie' => array( 'name' => 'MyCookie' ), 'Auth' => array( 'userModel' => 'MyUser', 'loginAction' => array('controller' => 'users', 'action' => 'login') 8. ) 9. ); 1. 2. 3. 4. 5. 6. 7. Esto debera reducir la cantidad de cdigo en los mtodos beforeFilter(). EmailComponent Ahora se puede obtener el contenido del correo electrnico creado, leyendo $this->Email->htmlMessage y $this->Email>textMessage. Estas propiedades almacenan el contenido en html y en texto plano respectivamente. Muchos de los mtodos privados (private) del EmailComponent's ahora son protegidos (protected) para facilitar la extensin de los mismos. EmailComponent::$to ahora tambin puede ser un array, facilitando la configuracin de mltiples destinatarios, y mejorando la consistencia con otras propiedades. EmailComponent::$messageId ha sido aadida, y permite controlar el encabezado Message-ID del correo electrnico.
# View & Helpers

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Helpers can now be addressed at $this->Helper->func() in addition to $helper->func(). This allows view variables and helpers to share names and not create collisions. New JsHelper and new features in HtmlHelper See JsHelper documentation for more information Pagination Helper Pagination helper provides additional css classes for styling and you can set the default sort() direction. PaginatorHelper::next() and

PaginatorHelper::prev() now generate span tags by default, instead of divs. Helper Helper::assetTimestamp() has been added. It will add timestamps to any asset under WWW_ROOT. It works with Configure::read('Asset.timestamp'); just as before, but the functionality used in Html and Javascript helpers has been made available to all helpers. Assuming Asset.timestamp == force 1. $path = 'css/cake.generic.css' 2. $stamped = $this->Html->assetTimestamp($path); 3. //$stamped contains 'css/cake.generic.css?5632934892' The appended timestamp contains the last modification time of the file. Since this method is defined in Helper it is available to all subclasses. TextHelper highlight() now accepts an array of words to highlight. NumberHelper A new method addFormat() has been added. This method allows you to set currency parameter sets, so you don't have to retype them. 1. $this->Number->addFormat('NOK', array('before' => 'Kr. ')); 2. $formatted = $this->Number->currency(1000, 'NOK'); FormHelper The form helper has had a number of improvements and API modifications, see Form Helper improvements for more information.
# Logging

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Logging and CakeLog have been enhanced considerably, both in features and flexibility. See New Logging features for more information.
# Caching

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones

Cache engines have been made more flexible in 1.3. You can now provide custom Cache adapters in app/libs as well as in plugins using $plugin/libs. App/plugin cache engines can also override the core engines. Cache adapters must be in a cache directory. If you had a cache engine named MyCustomCacheEngine it would be placed in either app/libs/cache/my_custom_cache.php as an app/libs. Or in $plugin/libs/cache/my_custom_cache.php as part of a plugin. Cache configs from plugins need to use the plugin dot syntax. 1. 2. 3. 4. Cache::config('custom', array( 'engine' => 'CachePack.MyCustomCache', ... ));

App and Plugin cache engines should be configured in app/bootstrap.php. If you try to configure them in core.php they will not work correctly. New Cache methods Cache has a few new methods for 1.3 which make introspection and testing teardown easier. Cache::configured() returns an array of configured Cache engine keys. Cache::drop($config) drops a configured Cache engine. Once dropped cache engines are no longer readable or writeable. Cache::increment() Perform an atomic increment on a numeric value. This is not implemented in FileEngine. Cache::decrement() Perform an atomic decrement on a numeric value. This is not implemented in FileEngine.
# Models, Behaviors and Datasource

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones App::import(), datasources & datasources from plugins Datasources can now be included loaded with App::import() and be included in plugins! To include a datasource in your plugin you put it in my_plugin/models/datasources/your_datasource.php. To import a Datasource from a plugin use App::import('Datasource', 'MyPlugin.YourDatasource'); Using plugin datasources in your database.php You can use plugin datasources by setting the datasource key with the plugin name. For example if you had a WebservicePack plugin with a LastFm datasource

(plugin/webservice_pack/models/datasources/last_fm.php), you could do: 1. var $lastFm = array( 2. 'datasource' => 'WebservicePack.LastFm' 3. ... Model Missing Validation methods now trigger errors, making debugging why validation isn't working easier. Models now support virtual fields Behaviors Using behaviors that do not exist, now triggers a cakeError making missing behaviors easier to find and fix. CakeSchema CakeSchema can now locate, read and write schema files to plugins. The SchemaShell also exposes this functionality, see below for changes to SchemaShell. CakeSchema also supports tableParameters. Table Parameters are non column specific table information such as collation, charset, comments, and table engine type. Each Dbo implements the tableParameters they support. tableParameters in MySQL MySQL supports the greatest number of tableParameters; You can use tableParameters to set a variety of MySQL specific settings. engine Control the storage engine used for your tables. charset Control the character set used for tables. encoding Control the encoding used for tables. In addition to tableParameters MySQL dbo's implement fieldParameters. fieldParameters allow you to control MySQL specific settings per column. charset Set the character set used for a column encoding Set the encoding used for a column See below for examples on how to use table and field parameters in your schema files. tableParameters in Postgres .... tableParameters in SQLite .... Using tableParameters in schema files You use tableParameters just as you would any other key in a schema file. Much like indexes:

1. var $comments => array( 2. 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'), 3. 'post_id' => array('type' => 'integer', 'null' => false, 'default' => 0), 4. 'comment' => array('type' => 'text'), 5. 'indexes' => array( 6. 'PRIMARY' => array('column' => 'id', 'unique' => true), 7. 'post_id' => array('column' => 'post_id'), 8. ), 9. 'tableParameters' => array( 10.'engine' => 'InnoDB', 11.'charset' => 'latin1', 12.'collate' => 'latin1_general_ci' 13.) 14.); is an example of a table using tableParameters to set some database specific settings. If you use a schema file that contains options and features your database does not implement, those options will be ignored. For example if you imported the above schema to a PostgreSQL server, all of the tableParameters would be ignore as PostgreSQL does not support any of the included options.
# Console

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Bake Bake has had a number of significant changes made to it. Those changes are detailed in the bake updates section Subclassing The ShellDispatcher has been modified to not require shells and tasks to have Shell as their immediate parent anymore. Output Shell::nl() has been added. It returns a single or multiple linefeed sequences. Shell::out(), err() and hr() now accept a $newlines parameter which is passed to nl() and allows for controlling how newlines are appended to the output. Shell::out() and Shell::err() have been modified, allowing a parameterless usage. This is especially useful if you're often using $this->out('') for outputting just a single newline.

Acl Shell All AclShell commands now take node parameters. node parameters can be either an alias path like controllers/Posts/view or Model.foreign_key ie. User.1. You no longer need to know or use the aco/aro id for commands. The Acl shell dataSource switch has been removed. Use the Configure settings instead. SchemaShell The Schema shell can now read and write Schema files and SQL dumps to plugins. It expects and will create schema files in $plugin/config/schema ....
# Router and Dispatcher

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Router Generating urls with new style prefixes works exactly the same as admin routing did in 1.2. They use the same syntax and persist/behave in the same way. Assuming you have Configure::write('Routing.prefixes', array('admin', 'member')); in your core.php you will be able to do the following from a nonprefixed url: 1. $this->Html->link('Go', array('controller' => 'posts', 'action' => 'index', 'member' => true)); 2. $this->Html->link('Go', array('controller' => 'posts', 'action' => 'index', 'admin' => true)); Likewise, if you are in a prefixed url and want to go to a nonprefixed url, do the following: 1. $this->Html->link('Go', array('controller' => 'posts', 'action' => 'index', 'member' => false)); 2. $this->Html->link('Go', array('controller' => 'posts', 'action' => 'index', 'admin' => false)); Route classes For 1.3 the router has been internally rebuilt, and a new class CakeRoute has been created. This class handles the parsing and reverse matching of an individual connected route. Also new in 1.3 is the ability to create and use your own Route classes. You can implement any special routing features that may be needed in

application routing classes. Developer route classes must extend CakeRoute, if they do not an error will be triggered. Commonly a custom route class will override the parse() and/or match() methods found in CakeRoute to provide custom handling. Dispatcher Accessing filtered asset paths, while having no defined asset filter will create 404 status code responses.
# Library classes

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Inflector You can now globally customize the default transliteration map used in Inflector::slug using Inflector::rules. eg. Inflector::rules('transliteration', array('//' => 'aa', '//' => 'oe')) The Inflector now also internally caches all data passed to it for inflection (except slug method). Set Set has a new method Set::apply(), which allows you to apply callbacks to the results of Set::extract and do so in either a map or reduce fashion. 1. Set::apply('/Movie/rating', $data, 'array_sum'); Would return the sum of all Movie ratings in $data. L10N All languages in the catalog now have a direction key. This can be used to determine/define the text direction of the locale being used. File File now has a copy() method. It copies the file represented by the file instance, to a new location. Configure Configure::load() can now load configuration files from plugins. Use Configure::load('plugin.file'); to load configuration files from plugins. Any configuration files in your application that use . in the name should be updated to used _ App/libs

In addition to app/vendors a new app/libs directory has been added. This directory can also be part of plugins, located at $plugin/libs. Libs directories are intended to contain 1st party libraries that do not come from 3rd parties or external vendors. This allows you to separate your organization's internal libraries from vendor libraries. App::import() has also been updated to import from libs directories. 1. App::import('Lib', 'ImageManipulation'); //imports app/libs/image_manipulation.php You can also import libs files from plugins 1. App::import('Lib', 'Geocoding.Geocode'); //imports app/plugins/geocoding/libs/geocode.php The remainder of lib importing syntax is identical to vendor files. So if you know how to import vendor files with unique names, you know how to import libs files with unique names. Configuration The default Security.level in 1.3 is medium instead of high There is a new configuration value Security.cipherSeed this value should be customized to ensure more secure encrypted cookies, and a warning will be generated in development mode when the value matches its default value. i18n Now you can use locale definition files for the LC_TIME category to retrieve date and time preferences for a specific language. Just use any POSIX compliant locale definition file and store it at app/locale/language/ (do not create a folder for the category LC_TIME, just put the file in there). For example, if you have access to a machine running debian or ubuntu you can find a french locale file at: /usr/share/i18n/locales/fr_FR. Copy the part corresponding to LC_TIME into app/locale/fr_fr/LC_TIME file. You can then access the time preferences for French language this way: 1. Configure::write('Config.language','fr-fr'); // set the current language 2. $monthNames = __c('mon',LC_TIME,true); // returns an array with the month names in French 3. $dateFormat = __c('d_fmt',LC_TIME,true); // return the preferred dates format for France You can read a complete guide of possible values in LC_TIME definition file in this page

# Miscellaneous

Traducir Ver slo esta seccin Historia Todavia no hay una traducion de este texto. Por favor ayudanos y traducirla.. Mas info sobre traduciones Error Handling Subclasses of ErrorHandler can more easily implement additional error methods. In the past you would need to override __construct() and work around ErrorHandler's desire to convert all error methods into error404 when debug = 0. In 1.3, error methods that are declared in subclasses are not converted to error404. If you want your error methods converted into error404, then you will need to do it manually. Scaffolding With the addition of Routing.prefixes scaffolding has been updated to allow the scaffolding of any one prefix. 1. 2. 3. 4. Configure::write('Routing.prefixes', array('admin', 'member')); class PostsController extends AppController { var $scaffold = 'member'; }

Would use scaffolding for member prefixed urls. Validation After 1.2 was released, there were numerous requests to add additional localizations to the phone() and postal() methods. Instead of trying to add every locale to Validation itself, which would result in large bloated ugly methods, and still not afford the flexibility needed for all cases, an alternate path was taken. In 1.3, phone() and postal() will pass off any country prefix it does not know how to handle to another class with the appropriate name. For example if you lived in the Netherlands you would create a class like 1. 2. 3. 4. 5. 6. 7. 8. class NlValidation { function phone($check) { ... } function postal($check) { ... } }

This file could be placed anywhere in your application, but must be imported before attempting to use it. In your model validation you could use your NlValidation class by doing the following.

1. 2. 3. 4.

var $validate = array( 'phone_no' => array('rule' => array('phone', null, 'nl')), 'postal_code' => array('rule' => array('postal', null, 'nl')) );

When your model data is validated, Validation will see that it cannot handle the 'nl' locale and will attempt to delegate out to NlValidation::postal() and the return of that method will be used as the pass/fail for the validation. This approach allows you to create classes that handle a subset or group of locales, something that a large switch would not have. The usage of the individual validation methods has not changed, the ability to pass off to another validator has been added. IP Address Validation Validation of IP Addresses has been extended to allow strict validation of a specific IP Version. It will also make use of PHP native validation mechanisms if available. 1. Validation::ip($someAddress); // Validates both IPv4 and IPv6 2. Validation::ip($someAddress, 'IPv4'); // Validates IPv4 Addresses only 3. Validation::ip($someAddress, 'IPv6'); // Validates IPv6 Addresses only Validation::uuid() A uuid() pattern validation has been added to the Validation class. It will check that a given string matches a uuid by pattern only. It does not ensure uniqueness of the given uuid

Anda mungkin juga menyukai