Anda di halaman 1dari 19

cakePHP

Introduccion y Configuracion
Introduccion

El modelo puede ser: 1)bbdd 2)LDAP 3)RSS La vista puede ser: 1)html 2)pdf 3)xml 4)JSON->EXT JS Extensiones ------------------------------------------------------> Componentes
(para compartir logica entre controladores o

Controlador

(callbacks: beforeFilter, beforeRender) aplicaciones)

Modelo (behaviors)

-----------------------------------------------------------> Comportamientos
(aade funcionalidades comunes entre modelos)

(Datasource: BBDD,LDAP,CSV,iCal,RSS callbacks: beforeFind,afterFind)

Vistas

------------------------------------------------------------->Helpers
(Ayuda a las vistas. Permite compartir logica de presentacion entre vistas.Ej:AjaxHelper)

(Reutilizacion de codigo elements: elementos que se utilizan en muchas vistas layouts: donde el controlador renderiza cada vista)

Mas detalles Extensiones de Aplicacion Tanto los controladores como los helpers y los modelos tienen una clase padre que puede utilizarse para definir opciones importantes de la aplicacin. En AppController, AppHelper y AppModel se pueden poner mtodos para compartir entre controladores , helpers y modelos. /controller/action/var1/var2 => Controller::action($var1, $var2)

Estructura de ficheros app, lugar donde esta nuestra aplicacin. Podemos tener tantos direcctorios app como keramos, cada uno con su nombre de aplicacion. cake, el core de cakephp. docs vendors, donde colocar las librerias de terceros, como por ejemplo, ext js. La carpeta app: o config. Configuracin de la conexin a la base de datos, etc. o controllers. Controladores de la aplicacin y sus componentes. o locale. Internationalizacin. o models. Modelos, comportamientos y datasources de la aplicacin. o plugins. Paquetes de plugins. o tmp. Suele guardar descripciones de modelos, logs y a veces informacin de la sesin.

o vendors. Cualqueir clase o libreria de terceros que use nuestra aplciacin va aqu. As podemos usarlas facilmente utilizandola funcin vendor(). o views. Vistas: elementos, pginas de error, helpers, layouts y ficheros de vista. o webroot. En produccin, esta carpeta puede usarse como el document root de la aplicacin. Aqu tambien se almacenan CSS,imagenes, y archivos JavaScript. Convenciones Nombres de clases: camello Nombres de ficheros: guion bajo Modelos: en singular y camello Tablas de modelos: en plural y minusculas Tablas de relacion muchos a muchos: guion bajo y orden de tablas alfabetico Clases de controlador: plural, camello y terminan con 'Controller'. PeopleControler,... Todo controlador tiene q tener una funcion index(), la funcion por defecto si no se especifica accion Las funciones de un controlador que empiezan por _ no son visibles desde la web, solo internamente. Los ficheros de las vistas se nombran igual que la funcion que sirven con guion bajo. Ej segun convencion: o tabla: gente o Clase Modelo: Persona, en /app/models/persona.php o Clase Controlador: GenteController, en /app/controllers/gente_controller.php o Vista, en /app/views/gente/index.ctp

IMPORTANTE

Configuracion

Tanto el core como el web root y el app se pueden instalar en cualquier directorio. La configuracin de la base de datos esta en app/config/database.php. La configuracion de la aplicacion esta en /app/config/core.php Para leer variables de configuracion -> <?php Configure::read('debug'); ?> CUIDADO CON ROMPER EL MVC <?php Configure::read('debug'); ?> Para guardar variables en la aplicacion: Configure::write('Company.name','Pizza, Inc.'); Para eliminar: Configure::delete('Company.name'); Para cargar variables desde un fichero: el array de variables tiene q ser $config, si no lo ignora
// /app/config/messages.php: <?php $config['Company']['name'] = 'Pizza, Inc.'; $config['Company']['slogan'] = 'Pizza for your body and soul'; $config['Company']['phone'] = '555-55-55'; ?> <?php

Configure::load('messages'); Configure::read('Company.name'); ?>

La clase Configure tbn permite manejar las variables de app/config/core.php o App.baseUrl. Hay que descomentarlo del fichero para no usar mod_rewrite o Routing.admin Para usar rutas de administracion de cakephp /app/config/inflections.php para las reglas de conversion en plural/singular/camel Configuraciones adicionales en /app/config/bootstrap.php

Controladores
Controladores

Si queremos nuestro propio controlador de aplicacion AppController -> /app/app_controller.php Atributos de controlador: o $name: para php4 o $components, $helpers and $uses: dicen a CakePHP qu helpers, componentes y modelos sern usados con el controlador. Cada controlador tiene disponibles algunas de estas clases por defecto, asi que puede que no sea necesario configurarlas. Por defecto cada controlador tiene acceso a su modelo primario (ej. ProductosController tiene a $this->Producto). HtmlHelpers y SessionHelpers tbn estan disponibles por defecto. Ejemplo:
<?php

class RecipesController extends AppController { var $name = 'Recipes'; var $uses = array('Recipe', 'User'); var $helpers = array('Html', 'Ajax'); var $components = array('Session', 'Email'); } ?> Atributos relacionados con paginas: o $layout. Almacena el nombre del layout que se encuentra en /app/views/layouts. El layout se especifica haciendo que $layout sea igual al nombre del fichero layout menos la extension .ctp. Si no se define $layout cake renderiza el layout por defecto. Si no se ha definido uno en /app/views/default.ctp, se usara el layout por defecto de Cake. <?php # Using $layout to define an alternate layout

class RecipesController extends AppController { function quickSave() { $this->layout = 'ajax'; }

} o ?> $pageTitle. Para que funcione se coloca $title_for_layout en los tags <title>. $params. Para almacenar valores pasados como GET o POST. o form. Cualquier info POST de cualquier formulario se almacena aqui, inclusive $_FILES. $this->params['form'] bare. Vale 1 si el layout actual esta vacio, 0 si no. o isAjax. Vale 1 si el layout actual es igual a ajax, 0 si no. Esta variable solo se usa si el componente RequestHandler es usado en el controlador. o controller. Almacena el nombre del mismo controlador que maneja la solicitud. o action. Igual para la accion solicitada. o pass. Almacena la cadena GET. o data. Usada para manejar los datos POST enviados desde un formulario FormHelper al controlador. $this->data <?php // The FormHelper is used to create a form element: $form->text('User.first_name'); // When rendered, it looks something like: <input name="data[User][first_name]" value="" type="text" /> // When the form is submitted to the controller via POST, // the data shows up in $this->data. //The submitted first name can be found here: $this->data['User']['first_name']; ?> o $paginate. Ver api. Metodos de controlador: o Para vistas: set. Es la forma principal de pasar datos desde el controlador a la vista. Una vez usado set, la variable puede usarse en la vista. set(string $var, mixed $value). Tbn permite usar arrays asociativos para asignaciones rapidas. <?php //First you pass data from the controller: $this->set('color', 'pink'); //Then, in the view, you can utilize the data: You have selected icing for the cake.

?> render. Este metodo es llamado automaticamente al final de cada accion solicitada al controlador. Coge todo lo establecido con set, coloca la vista en el layout y lo pasa al usuario. render(string $action, string $layout, string $file)

El fichero de vista usado por render es por convencion. Si se solicita la accion buscar() del RecetasController, se renderiza el fichero de vista /app/views/recetas/buscar.ctp Although CakePHP will automatically call it (unless youve set $this>autoRender to false) after every actions logic, you can use it to specify Se puede usar render para especificar un fichero de vista alternativo usando $action. Tbn especificando un fichero de vista con $file. El parametro $layout permite especificar el layout donde se renderizar la vista. o Para controlar el flujo: redirect. Toma su primer parametro con la forma de una direccion cakephp relativa. Cuando un usuario ha realizado una orden satisfactoriamente puede que quieras redirigirlo a una pantalla de confirmacion. redirect(string $url, integer $status, boolean $exit) flash. Es usado para dirigir a un usuario a una nueva pagina despues de alguna operacion. Se diferencia con redirect en que muestra un mensaje antes de redirigir a otro url. flash(string $message, string $url, integer $pause)

Callbacks. beforeFilter(). Se ejecuta antes de cualquier otra accion del controlador. Ideal para comprobar sesiones y permisos de usuario. beforeRender(). Llamada despues de la accion del controlador pero antes de mostrar la vista. afterFilter(). Llamada despues de cada accion del controlador. afterRender(). Llamada despues de que una accion ha sido renderizada. Otros metodos. o paginate. Para paginar los resultados devueltos por los modelos. Se pueden especificar tamaos de pagina, filtros, etc. o requestAction. Esta funcion llama a una accion de un controlador desde cualquier sitio y devuelve los datos desde la accion. $url -> /controllername/actionname/params. requestAction(string $url, array $options)

Componentes Son paquetes de logica copartida entre controladores. Si en algun momento copias y pegas algo entre controladores debes considerar el meter esa funcionalidad en un componente. El conjunto de componentes que proporciona CakePHP es: Seguridad Sesiones Listas de Control de Acceso (Access control lists) Emails Cookies Autenticacion Manejo de solicitudes (Request handling)

Para crear un componentes creamos el fichero en /app/controllers/components/math.php. <?php class MathComponent extends Object { function doComplexOperation($amount1, $amount2) {

} }

return $amount1 + $amount2;

?> Para usarlo en cualquier controlador: /Make the new component available at $this->Math var $components = array('Math', 'Session');

Modelos

Si en cada tabla creamos dos campos de tipo date: created y modified, seran gestionados automaticamente por cake. Atributos: o $useDbConfig. El nombre de la configuracion de base de datos usada por el modelo. Las configuraciones se definene en /app/config/database.php. Por defecto 'default'. o $useTable. La tabla que usa el modelo. Coincide con el nombre de la clase del modelo en minusculas y en plural. Cuidado con los plurales! o $primaryKey. Clave primaria de la tabla, por defecto 'id'. o $displayField. Define el campo del modelo que se usara para mostrar en los elementos de scaffolding. o $recursive. Un entero que especifica el numero de niveles que cake usara para obtener los datos asociados a un modelo en las operaciones find() y findAll(). Puede ralentizar el proceso. Grupos cada uno con varios Usuarios cada uno muchos Articulos Los datos devueltos por $this->Grupo->find() segun el valor de $recursive son: -1 - Solo datos de Grupo sin joins. 0 - Datos de Grupo en su dominio. 1 - Devuelve un Grupo, su dominio y sus Usuarios asociados 2 - Cake devuelve un Grupo, su dominio, sus Usuarios asociados, y los articulos asociados a cada Usuario o $order. Valores posibles:

$order = "campo" $order = "Modelo.campo"; $order = "Modelo.campo asc"; $order = "Modelo.campo ASC"; $order = "Modelo.campo DESC"; $order = array("Modelo.campo" => "asc", "Modelo.campo2" => "DESC"); $data. Contiene los datos devueltos por el modelo. o $_schema. Metadatos de un campo de la tabla del modelo. Cada campo se describe como: name type (integer, string, datetime, etc.) null

default value length o $validate. Almacena reglas que permiten al modelo validar los datos antes de guardarlos. o $name. El nombre del modelo. Obligatorio en php4. o $belongsTo, $hasOne, $hasMany, $hasAndBelongsToMany. Se ver mas adelante. Almacenan arrays que definen como se relaciona el modelo con otros modelos. o $actAs. Almacena el nombre del comportamiento (Behavior) que usa el modelo. Metodos: o findAll() findAll(string $condiciones, array $campos, string $orden, int $limite, int $pag, int $recursivo); Devuelve los campos indicados hasta un limite de los registros que coincidadn con las condiciones, comenzando en la pagina indicada. Si no hay coincidencias se devuelve un array veacio. La condicion se forma como una sentencia sql: $condiciones = "Dulce.tipo LIKE '%bizcocho%' AND Dulce.created_on > 2007-0101". Recursivo para tablas relacionadas. Los datos devueltos tienen el ste formato: Array ( [0] => Array ( [ModelName] => Array ( [id] => 83 [field1] => value1 [field2] => value2 [field3] => value3 ) [AssociatedModelName] => Array ( [id] => 1 [field1] => value1 [field2] => value2 [field3] => value3 ) ) [1] => Array ( [ModelName] => Array ( [id] => 85 [field1] => value1 [field2] => value2 [field3] => value3 ) [AssociatedModelName] => Array ( [id] => 2 [field1] => value1 [field2] => value2 [field3] => value3

) ) o find()

find(string $conditions, array $fields, string $order, int $recursive); Similar a findAll(), excepto que solo devuelve el primer registro coincidente. Este metodo se ha modificado de forma que puede utilizarse para diversas consultas. find($type, $params); $type puede ser 'all', 'list' o 'first'. First por defecto. $params es un array con las siguientes opciones: array( conditions field names

'conditions' => array('Model.field' => $thisValue), //array of 'recursive' => 1, //int 'fields' => array('Model.field1', 'Model.field2'), //array of 'order' => 'Model.created', //string or array defining order 'limit' => n, //int 'page' => n //int

) findAllBy()

findAllBy<fieldName>(string $value) Es usada para buscar por un campo concreto. Solo hay q aadir el nombre del campo en formato camel e incluir el filtro de busqueda como parametro.

findBy() findBy<fieldName>(string $value); field() field(string $name, string $conditions, string $order) field(string $name, string $conditions, string $order) field(string $name, string $conditions, string $order) field(string $name, string $conditions, string $order) field(string $name, string $conditions, string $order)field(string $name, string $conditions, string $order) Devuelve el valor de un unico campo ($name) del primer registro que coincida con las condiciones ordenados por $order.

findCount() findCount(string $conditions, int $recursive) query() y execute() query(string $query), execute(string $query)

Ambas se usan para realizar una consulta sql. La diferencia es que query devuelve el resultado y execute no.

Condiciones.

=>

$condiciones = array("Noticia.titulo" => "Esto es una noticia"); WHERE Noticia.titulo LIKE "Esto es una noticia" $this->Noticia->find($condiciones); array("Noticia.titulo" => "<> Esto es una noticia") =>

Se puede usar cualquier operador sql inclusive LIKE, BETWEEN, o REGEX, siempre dejando un espacio entre el operador y el valor. La unica excepcion es IN. array( "Post.title" => array("First post", "Second post", "Third post") )

Multiples condiciones array ( "Post.title" => array("First post", "Second post", "Third post"), "Post.created" => "> " . date('Y-m-d', strtotime("-2 weeks")) ) Por defecto cake enlaza multiples condiciones con AND. Para usar OR: array ("or" => array ( "Post.title" => array("First post", "Second post", "Third post"), "Post.created" => "> " . date('Y-m-d', strtotime("-2 weeks")) ) ) array ("Author.name" => "Bob", "or" => array ( "Post.title" => "LIKE %magic%", "Post.created" => "> " . date('Y-m-d', strtotime("-2 weeks") ) ) Guardando los datos. El formato de los datos q se han de pasar al metodo save() del modelo tiene el siguiente aspecto: Array ( [ModelName] => Array ( [fieldname1] => 'value' [fieldname2] => 'value' ) )

Ejemplo:

function edit($id) { //Has any form data been POSTed? if(!empty($this->data)) { //If the form data can be validated and saved... if($this->Recipe->save($this->data['Recipe'])) { //Set a session flash message and redirect. $this->Session->setFlash("Recipe Saved!"); $this->redirect('/recipes'); exit(0); } } //If no form data, find the recipe to be edited //and hand it to the view. $this->set('recipe', $this->Recipe->findById($id);

} Cuando se pasan los datos a save() esos datos se validan usando la validacion de cakePhp. Si no guarda, comprobar la validacion.

save(array $data = null, boolean $validate = true, array $fieldList = array()) Guarda un arrafy formateafo de datos. El segundo parametro permite especificar alguna validacion y el tercero proporciona una lista de campos del modelo a actualizar. Despues de guardar, el ID del objeto se almacena en el atributo $id del modelo, util cuando se crean nuevos objetos. create(array $data = array()) Este metodo inicializa el modelo para guardar informacion nueva. Si estamos llamando a save() desde un bucle para crear muchos registros de una vez hay q llama a create() antes de save(). saveField(string $fieldName, string $fieldValue, $validate = false) Used to save a single field value. Set the ID of the model ($this->ModelName->id = $id) just before calling saveField(). updateAll(array $fields, array $conditions) Los registros a actualizar se indican en el array $conditions, y los campos a actualizar en el array $fields. Ejemplo: $this_year = date('Y-m-d h:i:s', strtotime('-1 year')); $this->Baker->updateAll( array('Baker.approved' => true), array('Baker.created' => "<= $this_year") ); remove(int $id = null, boolean $cascade = true); del(int $id = null, boolean $cascade = true); Elimina el registro $id. Por defecto, tambien elimina los registros dependeientes. Por ejemplo, al borrar un registro de Usuario que esta enlazado a registros de Receta:

Si $cascade es true, tambien se eliminan los registros relacionados de Receta. o Si $cascade es false, no se eliminan los registros de Receta.

deleteAll(mixed $conditions, $cascade = true) Igual que el anterior solo que elimina todos los registros que coincidan con las condiciones.

Asociaciones. Los 4 tipos de asociaciones que soporta cake son : hasOne, hasMany, belongsTo, yd hasAndBelongsToMany (HABTM). Las asociaciones se definen creando variables de clase. Esas variables pueden ser desde simples cadenas hasta arrays multidimensionales. <?php class Usuario extends AppModel { var $name = 'Usuario'; var $hasOne = 'Perfil'; var $hasMany = array( 'Receta' => array( 'className' => 'Receta', 'conditions' => 'Receta.approved = 1', 'order' => 'Receta.created DESC' ) ); } ?> o hasOne

<?php class User extends AppModel { var $name = 'User'; var $hasOne = 'Profile'; } ?> Si queremos mas control podemos usar un array, somo por ejemplo, si queremos ordenar los registros relacionados segun una fecha o limitar la asociacion incluyendo solo ciertos registros: <?php class User extends AppModel { var $name = 'User'; var $hasOne = array( 'Profile' => array( 'className' => 'Profile', 'conditions' => 'Profile.published = 1', 'dependent' => true ) ); } ?>

Entre los posibles valores del array tenemos:

className: el modelo asociado al modelo que se esta definiendo. foreignKey: el nombre de la clave ajena en el otro modelo. Especialmente util si es necesario definir varias relaciones hasOne. El valor por defecto es el nombre del otro modelo en singular con el sufijo '_id'. conditions: Un fragmento SQL utilizado como filtro en la relacion. fields: Lista de campos a obtener cuando se devuelve el modelo asociado. Por defecto son todos los campos. dependent: Cuando es true, y el metodo delete() se establece como cascade a true, los registros del modelo asociado seran eliminados tambien.

El resultado de find en el modelo de Usuario tambien devolvera el registro de Perfil relacionado, si existe: //resultado de $this->User->find(). Array ( [Usuario] => Array ( [id] => 121 [nombre] => Gwoo the Kungwoo [created] => 2007-05-01 10:31:01 ) [Perfil] => Array ( [id] => 12 [usuario_id] => 121 [habilidad] => Baking Cakes [created] => 2007-05-01 10:31:01 ) ) o belongsTo Es un complemento natural para las asociaciones hasOne y hasMany ya que permite ver los datos desde la otra direccion. Convenciones: belongsTo: el modelo en definicion contiene la clave ajena. Platano belongsTo Manzana Perfil belongsTo Usuario Mentor belongsTo Doctor => platanos.manzana_id => perfils.usuario_id => mentors.doctor_id

Si una tabla contiene una clave ajena, usa belongsTo. En el ejemplo de Perfil tenemos en /app/models/perfil.php: <?php class Perfil extends AppModel { var $name = 'Perfil'; var $belongsTo = 'Usuario';

} ?> Tambien podemos usar arrays: <?php class Perfil extends AppModel { var $name = 'Perfil'; var $belongsTo = array( 'Usuario' => array( 'className' => 'Usuario', 'foreignKey' => 'usuario_id' ) ); } ?> Los valores posibles del array se corresponden con los de hasOne excepto dependent.

hasMany Vamos a definir la relacion "Un Usuario tiene varios (hasMany) Comentarios". Una asociacion hasMany nos permitir obtener los comentarios del usuario que buscquemos. Convenciones: hasMany: el 'otro' modelo contiene la clave ajena. Usuario hasMany Comentario => Comentario.usuario_id Cake hasMany Virtudes => Virtud.cake_id Producto hasMany Opcion => Opcion.producto_id Ejs: <?php class Usuario extends AppModel { var $name = 'Usuario'; var $hasMany = 'Comentario'; } ?> <?php class Usuario extends AppModel { var $name = 'Usuario'; var $hasMany = array( 'Comentario' => array( 'className' => 'Comentario', 'foreignKey' => 'usuario_id', 'conditions' => 'Comentario.estado = 1', 'order' => 'Comentario.created DESC', 'limit' => '5', 'dependent'=> true ) );

} ?> Opciones: Los mismos que hasOne y ademas: order: fragmento SQL que define la ordenacion de los registros asociados. limit: el numero mximo de registros asociados que queremos obtener. offset: el numero de registros asociados a eludir (dadas las condiciones y el orden) antes de devolver y asociar. finderQuery: Consulta SQL completa que cake puede usar para obtener registros asociados. Debe ser utilizada en aquellas situaciones que requieren resultados muy precisos. Algo a tener en cuenta es que se necesita una relacion belongsTo de Usuario en Comentario para poder obtener datos en ambos sentidos. o hasAndBelongsToMany

Esta asociacion se usa cuando tenemos dos modelos que necesitan estar unidos, repetidamente, muchas veces en muchas ocaciones. La principal diferencia entre hasMany y HABTM es que un enlace entre modelos con HABTM no es exclusivo. Por ejemplo, vamos a unir el modelo de Receta con un modelo Etiqueta usando HABTM. Asignando la etiqueta "italiana" a la receta de Gnocci de mi abuela no restrinjo esa etiqueta, tbn puedo etiquetar mis Espageti Carbonara como "Italiana". Los enlaces entre los objetos asociados con hasMany son exclusivos. Si mi Usuario hasMany Comentarios, un comentario solo puede pertenecer a un usuario especfico. Para las relaciones muchos a muchos necesitamos una tabla extra en la base de datos. Esta tabla se nombra incluyendo los nombres de los dos modelos en orden alfabetico. El contenido de la tabla debe constar al menos de dos campos, cada clave ajena (q deben ser enteros) que se corresponde con la clave principal de los modelos implicados. Convenciones: HABTM: Requiere una tabla separada que incluye los nombres de los dos modelos. Nota: el nombre de las tablas va en orden alfabetico. Receta HABTM Etiqueta => recetas_etiquetas.receta_id, recetas_etiquetas.etiqueta_id Cake HABTM Fan => cakes_fans.cake_id, cakes_fans.fan_id Foo HABTM Bar => bars_foos.foo_id, bars_foos.bar_id <?php class Receta extends AppModel { var $name = 'Receta'; var $hasAndBelongsToMany = array( 'Etiqueta' => array('className' 'joinTable' 'foreignKey'

=> 'Etiqueta', => 'recetas_etiquetas', => 'receta_id',

'associationForeignKey' 'conditions' 'order' 'limit' 'uniq' 'finderQuery' 'deleteQuery' 'insertQuery' ); )

=> => => => =>

'etiqueta_id', '', '', '', true, => '', => '', => ''

} ?> Esto tbn hay que hacerlo en la clase modelo Etiqueta.

Guardando datos en modelos relacionados. hasOne, hasMany, belongsTo Cuando se usan modelos asociados es importante comprender que guardar los datos del modelo es realizado por el correspondiente modelo de cake. Si estas guardando un nuevo Mensaje y sus Comentarios asociados, deberias usar tanto el modelo Mensaje como los modelos de los Comentarios en la operacion de guardado. Si no existe ninguno de los registros del modelo en el sistema, necesitaras guardar primero el modelo principal o padre. Supongamos que tenemos una accion en nuestro UsuarioController que guarda los datos de un nuevo Usuario y su Perfil asociado. La accion asumir que has enviado suficientes datos para crear un Usuario y un Perfil.

<?php function add() { if (!empty($this->data)) { //We can save the User data: //it should be in $this->data['Usuario'] $this->Usuario->save($this->data); //Now we add this information to the save data //and save the Perfil. //The ID of the newly created user has been set //as $this->Usuario->id. $this->data['Perfil']['usuario_id'] = $this->Usuario->id; //Because our Usuario hasOne Perfil, we can access //the Perfil model through the Usuario model: } } ?> HABTM $this->Usuario->Perfil->save($this->data);

Siguiendo con el ejemplo de las recetas y las etiquetas, debemos hacer algun tipo de formulario que asigne Etiqueta a Receta. Se crea un formulario que cree recetas y las asocie a una lista existente de etiquetas.

Tambien podria ser util un formulario para crear nuevas etiquetas y asociarlas al vuelo, pero por simplicidad solo veremos cmo asociarlas y obtenerlas. Empecemos con el formulario que crea una receta: <?php echo $form->create('Etiqueta');?> <?php echo $form->hidden('Receta.Receta', array('value' => $receta_id))?> <p><?php echo $form->input('Etiqueta.nombre');?></p> <p><?php echo $form->end('Nueva Etiqueta');?></p> </form> function add() { //First, lets get the ID of the existing etiqueta $this->Etiqueta->recursive = 0; $etiqueta = $this->Etiqueta->findByNombre($this>data['Etiqueta']['nombre']); //You may want to create the tag here if it doesnt exist, //But were going to push ahead assuming it exists. :) //Set this ID in $this->data, marking it as the //tag we want to associate. $this->data['Etiqueta']['id'] = $etiqueta['Etiqueta']['id']; //Set the recipe ID in $this->data, marking it as the //recipe we want to associate. $this->data['Receta']['Receta'] = array($this->data['Receta'] ['Receta']); //Save the association if ($this->Etiqueta->save($this->data)) { //do something on success } } Modelo de datos asociado. Revisar: para guardar las relaciones HABTM, llenar $this->data[OtroModelo][OtroModelo] con un array conteniendo el ID (o IDs) de los registros a los que quieres asociar y guardar el modelo actual asegurandonos que $this->data[EsteModelo][id] esta en su sitio. ??????????????????? o Comportamientos (Behaviors) Los comportamientos del Modelo son una forma de organizar algo de la funcionalidad definida en los modelos de cake. Permiten separar la logica que no debe estar directamente relacionada con un modelo pero necesita estar ahi. Esta forma de extender los modelos permiten aadir funciones a modelos simplemente definiendo una variable de clase. Como ejemplo consideremos un modelo que nos da acceso a una tabla de la base de datos que almacena informacion sobre un arbol. Eliminar, aadir y migrar los nodos del arbol no es algo tan simple como eliminar, insertar o editar las filas de la tabla. Muchos registros necesitan ser actualizados cuando se realizan algunas de estas acciones. Para no tener que crear todas estas acciones de manejo del arbol e un modelo basico (o para cada uno que necesite alguna funcionalidad extra) simplemente le decimos a nuestro modelo que use un comportamiento de arbol o

TreeBehavior, o mejor dicho, le decimos que se comporte como un arbol. Estamos asignando un comportamiento a un modelo solo con una linea de codigo. CakePHP incluye comportamientos para estructuras en arbol, traducciones, interaccion con listas de control de acceso, sin dejar de mencionar los comportamientos aadidos por la comunidad en el CakePHP Bakery (http://bakery.cakephp.org).

Vistas Vistas La mayoria de las vistas muestran (X)HTML , pero tbn sirven datos AMF a un objeto Flash, una respuesta a una aplicacion remota via SOAP, o una salida a un fichero CSV. Los ficheros de vistas de CakePHP tienen la extension .ctp (CakePHP Template). Las vistas se almacenan en /app/views/, en una carpeta nombrada como el controlador que la usa, y el nombre de la accion que le corresponde. Por ejemplo la accion ver() del controlador de Producto se puede encontrar en /app/views/productos/ver.ctp. La capa de la vista tiene varias partes: o layouts: ficheros de vista que contienen codigo de presentacion. La mayoria de las vistas se renderizan dentro de un layout. o elements: pequeos trozos de codigo reutilizable en las vistas. Los Elementos normalmente se renderizan en vistas. o helpers: estas clases encapsulan logica de vistas que se necesita en muchos sitios en la capa de vista. Entre otras cosas, los helpers en CakePHP te ayudan a crear formularios, usar funciones AJAX, paginar los datos del modelo, o servir feeds RSS. o Layouts Un layout contiene codigo de presentaicon que envuelve una vista. Todo lo que quieras ver de tus vistas tiene q ir en un layout. Los ficheros de layout van en /app/views/layouts. El layout por defecto de CakePHP puede reescribirse creando uno en /app/views/layouts/default.ctp. Cuando creamos un layout, tenemos q decirle a cake donde coloca el codigo de las vistas. Para eso tenemos q asegurarnos que incluye $content_for_layout (y opcionalmente, $title_for_layout). Por ejemplo: <!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/x-icon"> </head> <body> <!-- If you'd like some sort of menu to show up on all of your views, include it here -->

<div id="header"> <div id="menu">...</div> </div> <!-- Here's where I want my views to be displayed --> <?php echo $content_for_layout ?> <!-- Add a footer to each displayed page --> <div id="footer">...</div> </body> </html> Elements Muchas aplicaciones tienen pequeos bloques de codigo de presentacion que se repite de pagina en pagina, algunas veces en diferentes lugares del layout. Cake permite reutilizar esos bloques que son llamados Elements. Los bloques que cake implementa como Elements incluyen publicidad, ayuda, controles de navegacion, menus extra, formularios de entrada y salida. Un elemento es basicamente una mini vista que puede ser incluida en otras vistas, layouts e incluso en otros elementos. Los Elements permiten hacer una vista ms legible, colocando el renderizado de elementos repetidos en sus propios archivos. Tambien permiten reutilizar fragmentos de contenidos en nuestra aplicacion. Los Elements se encuentran en /app/views/elements/, y tbn tienen la extension .ctp. Para mostrar los elementos se usa el metodo element de las vistas. <?php echo $this->element('helpbox'); ?> Para pasar variables a un elemento: <?php echo $this->element('helpbox', array("helptext" => "Oh, this text is very helpful.")); ?> En el fichero de Element, todas las variables pasasdas estan disponivles como indices del array pasado (igual q set() en los controladores). Una forma de conseguir mas funcionalidad de los elementos es usando requestAction(). Esta funcion captura variables de vista desde una accion de controlador y las devuelve como un array. Esto permite a los elementos hacer MVC. Creamos una accion de controlador que prepare kas variables de vista para nuestros elementos y llamamos a requestAction() desde el segungo parametro de element() para pasar al elemento esas variables.

Helpers Los Helpers son clases como los componentes pero para la capa de presentacion. Contienen logica de presentacion que es compartida entre muchas vistas, elementos o layouts. Cada helper hereda de AppHelper, una clase que almacena cualquier logica que necesiten los helpers. Para usar los helpers tenemos que avisar al controlador. Cada controlador contiene una variable especial $helpers que contiene los helpers disponibles en cualquiera de las vistas que el controlador renderiza. Para disponer de un helper en las vista del controlador, se alade el nombre del helper al array $helper. <?php class BakeriesController extends AppController { var $helpers = array('Form', 'Html', 'Javascript', 'Time');

} ?> Los helpers del nucleo de cakePhp son:

CakePHP Helper

Descripcion

Usada con la libreria de javascript Prototype JavaScript para aadir Ajax a las vistas. Contiene metodos para drag/drop, formularios y enlaces ajax, observadores, y mas. Cache Usado por el nucleo para cachear el contenido de la vista. Crea formularios HTML y elementos de formulario que se autocompletan y Form gestionan los problemas de validacin. Metodos para incluir etiquetas html bien formadas. Etiquetas de imagenes, Html enlaces, tablas, header y demas. Javascri Para usar valores en JavaScript, escribir datos en objetos JSON y formatear pt bloques de codigo. Number Formateo de numeros y monedas. Paginat Paginacin y ordenacion de los datos del modelo. or Rss Metodos para escribir datos XML como feed RSS. Session Para escribir valores de sesion. Text Enlace inteligente, texto destacado, palabras truncadas. Deteccion de proximidad (se acerca el ao proximo?), formato de cadenas Time (Hoy, 10:30 am) y conversion de zona horaria. Xml Metodos para crear cabeceras y elementos XML. Ajax

Scaffolding
Usar scaffolding solo para prototipos ya q proporciona una estructura pobre y noes flexible. Es mas util usar las herramientas de consola de cake ya que genera todo lo necesario para trabajar sin problemas.

Cake Consola

Anda mungkin juga menyukai