61
CAPITULO I: INSTALACION DESDE CONSOLA DE CAKE-PHP Añadir al path C:\wamp\cake\cake\cake\console\ C:\wamp\bin\php\php5.3.0\ crear un nuevo proyecto: En C:\wampªwww: ------------------------------------------ cake bake nombre_proyecto --> crea C:\wamp\www\prueba le damos a enter en to pero activamos el verbose vamos a phpmyadmin : (poniendo localhost en el navegador) y creamos una BD reiniciamos el server seguimos el proceso de creacion dandole enter a todo Otra opcion para crear un proyecto: copiar la carpeta cake a WWW. Tendremos que crear una BD y configurarlo (www/dirAplicacion/app/config/database.php) En apache en httpd.conf: ------------------------ 1. Buscamos la cadena de txt= al directorio de publicacion C:\wamp\www y miramos que AllowOverride all esta desactivada 2. Desactivamos la opcion mod_rewrite => ya podremos poner http://localhost/prueba/ reiniciamos el server

curso cake

  • Upload
    mirojor

  • View
    367

  • Download
    5

Embed Size (px)

Citation preview

Page 1: curso cake

CAPITULO I: INSTALACION DESDE CONSOLA DE CAKE-PHP

Añadir al pathC:\wamp\cake\cake\cake\console\C:\wamp\bin\php\php5.3.0\

crear un nuevo proyecto: En C:\wampªwww:------------------------------------------cake bake nombre_proyecto --> crea C:\wamp\www\pruebale damos a enter en to pero activamos el verbosevamos a phpmyadmin : (poniendo localhost en el navegador) y creamos una BD reiniciamos el serverseguimos el proceso de creacion dandole enter a todo

Otra opcion para crear un proyecto: copiar la carpeta cake a WWW.Tendremos que crear una BD y configurarlo (www/dirAplicacion/app/config/database.php)

En apache en httpd.conf:------------------------1. Buscamos la cadena de txt= al directorio de publicacion C:\wamp\www y miramos que AllowOverride all esta desactivada2. Desactivamos la opcion mod_rewrite

=> ya podremos poner http://localhost/prueba/reiniciamos el server

Page 2: curso cake

CAPITULO II: MVC

M: B.DatosV: Paginas HTMLC: Logica del contenido

Modelo: Representa 1 Tabla de la BD. Cada tabla tiene su propio modelo,Cada peticion web o entrada de usr va dirigida a un controlador, cuya logica decidira que respuesta ha de generar.La logica suele contener llamadas a modelos para obtener datos.

Ej: un usr envia datos de un form .1. dicha peticion se hace al controlador (GET, POST) 2. Pide al modelo o le manda los datos3. El modelo le responde al controlador4. El controlador le manda a la vista los datos de salida que se mostraran como

se haya determinado en la vista.

Page 3: curso cake

CAPITULO III: 1ª aplicacion: lista de tareas por hacer.

Convenciones CakePHP

1) Los nombres de las tablas de la base de datos deben estar en plural.

2) La clave primaria de la tabla debe ser siempre el campo id.

3) Todos los modelos deben estar dentro del directorio models

4) El nombre de cada modelo debe ser el singular de la tabla que le corresponde

5) El nombre de la clase del model es también el singular del nombre de la tabla de la base de datos que representa, pero CamelCased.

6) Todos los archivos de clase controller deben estar dentro del directorio controllers.

7) Los nombres de los archivos controller son el plural del nombre del modelo seguido por un subrayado y la palabra controller, con la extensión php.

8) Los nombres de las clases controller deben ser CamelCased y plural

9) Todos los archivos de vistas se mantienen en el directorio views dentro del directorio app. Dentro de este directorio, todas las vistas de un único controlador son mantenidas bajo un subdirectorio con el mismo nombre que el controlador.

10) La acción del controlador y su correspondiente archivo vista tienen que tener el mismo nombre.

1. entender caracteristicas- tarea (titulo, status, fecha creacion, ultima modif)C.Uso: añadir/Editar/borrar tarea/Ver tarea completada/pendiente

2. crear y config BD

solo tendra 1 tabla: desde phpmyAdmin importo el archivo SQLUSE listatareas;

Archivo SQL:-------------CREATE TABLE tareas (id int(10) unsigned NOT NULL auto_increment,titulo varchar(255) NOT NULL,hecha tinyint(1) default NULL,creado datetime default NULL,modificado datetime default NULL,PRIMARY KEY (id));Fin Archivo SQL

Page 4: curso cake

Config:En el directorio de cake de la aplicacion , en app/config editamos el database.php.default al que quitaremos el .default y le pondremos los datos de conexion con la BD.Donde esta el array de nombre default ponemos la cadena de conexion.

3. Escribir modeloCreamos un archivo "tarea.php" en la carpeta app/models.<?phpclass Tarea extends AppModel { //singular de la tablavar $name = 'Tarea'; //no necesario xq cake php ya sabe como ha de llamarle a cada uno de ellos}?>

Si creamos la aplicacion desde la consola se crea automaticamente el modelo.

4. escribir controlador

<?phpclass TareasController extends AppController {var $name = 'Tareas'; //no necesario xq cake php ya sabe como ha de llamarle a cada uno de ellosfunction index() {$this->set('tareas', $this->Tarea->find('all')); //maneja peticion siempre que se haga de la url http://localhost/listatareas/tareas/index

dominio/dirAplicaci/Controller/nombre_accionSet pasa los datos recuperados con la accion del controlador a la vistael 1er param es la variable que contendra los datos que enviamos a la vista el 2º param son los datos k necesitamos pasar

}}?>

Puede haber varios controladores que controlen un modelo y un modelo que tenga varios controladores ES decir, la relacion no es 1 a 1.

5. construir una vistaDentro de views creamos una carpeta con el nombre tareas y creamos un archivo index.ctpTodas las vistas del controlador tarea lo meteremos en views/tareas

6. crear 2 formularios7. crear 1 regla d validacion

Page 5: curso cake

8. añadir funcionalidad borrado9. separar tareas pendientes y completadas10.mejorar aspecto fechas11.crear pag inicio

Page 6: curso cake

CAPITULO IV: Añadir funcionalidad de “Añadir tarea” y helpers

Controller: tareas_controller.php

<?phpclass TareasController extends AppController {var $name = 'Tareas';var $helpers = array('Html', 'Form'); //para formatear los datos fácilmente , ver como fácilmente se puede usar en la view add.ctpfunction index() {$this->set('tareas', $this->Tarea->find('all'));}

function add() {if (!empty($this->data)) { // si se han enviado datos dsd el form$this->Tarea->create(); // llama a la function create del modeloif ($this->Tarea->save($this->data)) { //save del modelo , salva los datos)$this->Session->setFlash('La Tarea ha sido salvada');$this->redirect(array('action'=>'index'), null, true); //redirecciona a la pagina index} else {$this->Session->setFlash('Tarea no salvada. Prueba de nuevo.');}}

}}?>

function edit($id = null) { //la function edit tiene como parametro el id de tareaif (!$id) {$this->Session->setFlash('Tarea Inválida');$this->redirect(array('action'=>'index'), null, true);}if (empty($this->data)) {$this->data = $this->Tarea->find(array('id' => $id));} else {if ($this->Tarea->save($this->data)) {$this->Session->setFlash('La Tarea ha sido salvada');$this->redirect(array('action'=>'index'), null, true);} else {$this->Session->setFlash('La Tarea no ha podido ser salvada.inténtalo de nuevo.');}}}

View : add.ctp<?php echo $form->create('Tarea');?> //le estamos diciendo que use el helper form para crear un formulario de la clase tarea<fieldset><legend>Añadir Nueva Tarea</legend><?php //campos que queremos enlazar, cakephp añade automaticamente en 1 campo oculto la fecha de creacion/modificacion, para ello CAMBIAR EN LA BD con phpmyadmin los nombres de los campos creado por created y modificado por modified y cambiarlo en la vista index.ctpecho $form->input('titulo');echo $form->input('hecha');?></fieldset><?php echo $form->end('Añadir Tarea');?> //end para indicar fin de formulario<?php echo $html->link('Listar todas las Tareas', array('action'=>'index')); ?> // Enlace a la lista tareas

View: edit.ctp

<?php echo $form->create('Tarea');?><fieldset><legend>Edita Tarea</legend><?phpecho $form->hidden('id');echo $form->input('titulo');echo $form->input('hecha');

Page 7: curso cake

?></fieldset><?php echo $form->end('Salvar');?><?php echo $html->link('Listar Todas las Tareas', array('action'=>'index')); ?><br /><?php echo $html->link('Agregar Tarea', array('action'=>'add')); ?>

View : index.ctp

<h2>Tareas</h2><?php if(empty($tareas)): ?>No hay tareas en esta lista<?php else: ?><table><tr><th>Título</th><th>Estatus</th><th>Creado</th><th>Modificado</th><th>Acciones</th></tr><?php foreach ($tareas as $tarea): ?><tr><td><?php echo $tarea['Tarea']['titulo'] ?></td><td><?phpif($tarea['Tarea']['hecha']) echo "Hecha";else echo "Pendiente";?></td><td><?php echo $tarea['Tarea']['created'] ?></td><td><?php echo $tarea['Tarea']['modified'] ?></td><td><?php echo $html->link('Editar', array('action'=>'edit',$tarea['Tarea']['id'])); ?></td></tr><?php endforeach; ?></table><?php endif; ?><?php echo $html->link('Añadir Tarea', array('action'=>'add')); ?> //enlace a añadir tarea

Page 8: curso cake

CAPITULO V: Validacion de datos, function delete, poner 3 listas de tareas (todas/completadas/pendientes), crear un menu para una pagina k acceda a to las acciones

Models/tarea.php

<?phpclass Tarea extends AppModel {var $name = 'Tarea';var $validate = array( //regla de validacion para el campo titulo'titulo' => array('rule' => VALID_NOT_EMPTY,'message' => 'Tienes que cubrir campo Titulo'));}?>

Controller: tareas_controller.php

<?phpclass TareasController extends AppController {var $name = 'Tareas';var $helpers = array('Html', 'Form', ´Time’); //para formatear los datos fácilmente ,

function delete($id = null) {if (!$id) {$this->Session->setFlash('id Invalida para Tarea');$this->redirect(array('action'=>'index'), null, true);}if ($this->Tarea->del($id)) {$this->Session->setFlash('Tarea #'.$id.' borrada');$this->redirect(array('action'=>'index'), null, true);}}

View : index.ctp

<?php foreach ($tareas as $tarea): ?><tr><td><?php echo $tarea['Tarea']['titulo'] ?></td><td><?phpif($tarea['Tarea']['hecha']) echo "Hecha";else echo "Pendiente";?></td><td><?php echo $time->niceShort($tarea['Tarea']['created']) ?> //usamos el helper time para modificar el aspecto de la fecha. Ya veremos como crear helpers o usar otros.</td><td><?php echo $time->niceShort($tarea['Tarea']['modified']) ?></td><td><?php echo $html->link('Editar', array('action'=>'edit',$tarea['Tarea']['id'])); ?>&nbsp;<?php echo $html->link('Borrar', array('action'=>'delete', $tarea['Tarea']['id']), null, '¿Estás Seguro?'); ?></td></tr><?php endforeach; ?>

….al final

<?php if($status): ?><?php echo $html->link('Listar Todas las Tareas', array('action'=>

Page 9: curso cake

'index')); ?><br /><?php endif;?><?php if($status != 'hecha'): ?><?php echo $html->link('Listar Tareas Hechas', array('action'=>'index', 'hecha')); ?><br /><?php endif;?><?php if($status != 'pendiente'): ?><?php echo $html->link('Listar Tareas Pendientes', array('action'=>'index', 'pendiente')); ?><br /><?php endif;?>

Añadir enlaces en las views:

Ejemplo, en add :

<?php echo $html->link('Listar Tareas Hechas', array('action'=>'index', 'hecha')); ?><br /><?php echo $html->link('Listar Tareas Pendientes', array('action'=>'index', 'pendiente')); ?><br />

Menu para acceder a todas las acciones.

En view/pages: metemos todas las vistas que no impliquen directamente una accion , por ejemplo , si queremos poder acceder a todas las acciones mediante un menu incluiriamos la pagina del menu ahí.

<!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><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Documento sin tÃtulo</title></head>

<body><h1>Bienvenido a Atareado</h1><p>Atareado es una aplicaci&oacute;n sencilla pero &uacute;til que te permite mantener registro de todas las cosas que necesitas hacer. Usando Atareado, puedes:</p><ul><li><?php echo $html->link('Listar todas tus Tareas',array('controller' => 'tareas', 'action'=>'index')); ?></li><li><?php echo $html->link('Listar tus tareas completadas',array('controller' => 'tareas', 'action'=>'index','hecha'));?></li><li><?php echo $html->link('Listar tus tareas pendientes',array('controller' => 'tareas', 'action'=>'index','pendiente')); ?></li><li><?php echo $html->link('Agregar nuevas Tareas', array('controller'=> 'tareas', 'action'=>'add')); ?></li><li>Editar tareas</li><li>Borrar tareas</li></ul>

</body></html>

Page 10: curso cake

CAPITULO VI: 2ª y 3ª aplicacion: Crear una aplicación con el uso de Scaffolding (andamiaje)

Definir en el controller una variable de tipo Scaffold

ConvencionLas claves externas han de ponerse de la forma tablaExtEnSingular_id

Relaciones entre tablas de la BD en cake >

1 a 1: hasOne1..* : hasMany : belongsTo : cada disco pertenece a un solo grupo : hasAndBelongsToMany

Models ,

disco.php

<?php class Disco extends AppModel { var $name = 'Disco';

var $belongsTo = array('Grupo' => array('className' => 'Grupo', 'conditions' => '', 'order' => '', 'foreignKey' => 'grupo_id' ) ); }?>

Grupo.php

<?php class Grupo extends AppModel { var $name = 'Grupo'; var $displayField = 'nombre'; campo de la tabla grupos que queremos que se muestre en la tabla discos. }?>

Controllers:

<?php class GruposController extends AppController { var $scaffold; }?>

<?php class DiscosController extends AppController { var $scaffold; }?>

Page 11: curso cake

CAPITULO VII y VIII: INSTALACION : Creacion de un Blog

Estructura de directorios del framework:

App: aplicación Cake: core del FrameworkVendors: librerias de 3ª partes, mailers.. El .htaccess es para Linux

App.model: permite resolver determinados problemas de codificacion de caracteres.

/APP/config : conexión a la BD, seguridad , control de acceso/controllers: controladores que vayamos creando/components : /locale: permiten la creación de archivos multilenguaje/models: /plugins:/tests: para poder crear una aplicación paralela de prueba/tmp: logs y cache/vendors: librerias /views : archivos .ctp /elements: trozos de vista , partes de una pagina/errors: podemos personalizar las paginas de error/helpers:/layouts: determinamos los archivos de diseño/pages: definimos el aspecto para 1 pag en concreto /posts : /scaffolds:/webroot: raiz para la aplicación operativa/css/files: cualquier tipo de archivo/js/img

1. Create Models: comunican con la BD

Para cambiar la codificacion UTF-8 en el app_model del Raiz , metemos el siguiente codigo :

<?php

class AppModel extends Model { function __construct(){

parent::__construct();$this->query("SET NAMES 'utf8'");

}}?>

CheatSheet: chuletilla que hay en la web

Page 12: curso cake

Tambien podemos ver todas las clases que hay en cake. http://api.cakephp.org/classes <?php class Post extends AppModel { var $name = 'Post'; } ?>

Controllerss

Estructura URL de loa cotrollers: /controller/accion (ej posts/index)

<?php

class PostsController extends AppController{

var $name = 'Posts';

function index() { $this->set('posts', $this->Post->findAll()); }

function view($id = null) { $this->Post->id = $id; $this->set('post', $this->Post->read()); }}

?>

Views:

Index.ctp:

<?php foreach ($posts as $post): ?> <tr> <td><?php echo $post['Post']['id']; ?></td> <td> <?php echo $html->link($post['Post']['titulo'] txt,("/posts/view/".$post['Post']['id']) link; ?> </td> <td><?php echo $post['Post']['created']; ?></td> </tr> <?php endforeach; ?>

View.ctp

<h1><?php echo $post['Post']['titulo']?></h1> <p><small>Creado: <?php echo $post['Post']['created']?></small></p> <p><?php echo $post['Post']['cuerpo']?></p>

Page 13: curso cake

CAPITULO IX: funcionalidad add, edit a miblog. REGLAS DE VALIDACION.

Post_controller.php

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

if ($this->Post->save($this->data)) {$this->Session->setFlash('Su Post ha sido salvado.');$this->redirect(array('action' => 'index'));

}}

}

function delete($id) { $this->Post->del($id); $this->Session->setFlash('El post con id: '.$id.' ha sido borrado.'); $this->redirect(array('action'=>'index'));

function edit($id = null) {$this->Post->id = $id;if (empty($this->data)) {

$this->data = $this->Post->read();} else {

if ($this->Post->save($this->data)) {$this->Session->setFlash('Tu post ha sido actualizado.');$this->redirect(array('action' => 'index'));

}}

}

El componente session de PHP: (sesiones): guarda los datos para un usr determinado.

setFlash: se usa para config una variable de sesion, que puede ser utilizada para dar una variable en la vista..

add.ctp (View)

<h1>Añadir Post</h1><?phpecho $form->create('Post'); //usamos el form helper, metodos create,input y end , al create , si no le pasamos otros param crea: <form id=”PostAddForm” method=”post” action=”/post/add”>echo $form->input('titulo'); echo $form->input('cuerpo', array('rows' => '3')); //1er param: nombre del campo de la bd , varios parámetros, echo $form->end('Salvar Post'); //Salvar post es el titulo del boton?>

Todo esto se puede ver en la pagina de cakephp en el cookbook –formularios

Index.ctp (lo enlazamos con add.ctp):

<?php echo $html->link('Add Post',array('controller' => 'posts', 'action' =>

'add'))?> //usamos el helper html

<?php foreach ($posts as $post): ?> <tr> <td><?php echo $post['Post']['id']; ?></td> <td> <?php echo $html->link($post['Post']['titulo'], "/posts/view/".$post['Post']['id']); ?> </td>

<td>

Page 14: curso cake

<?php echo $html->link('Borrar', array('action' => 'delete', 'id' => $post['Post']['id']), null, 'Vas Borrar definitivamente este post' )?>

<?php echo $html->link('Editar', array('action'=>'edit', 'id'=>$post['Post']['id']));?>

</td> <td><?php echo $post['Post']['created']; ?></td> </tr> <?php endforeach; ?>

Edit.ctp

<h1>Editar Post</h1><?phpecho $form->create('Post', array('action' => 'edit')); //El metodo create , si le pasamos la accion edit, por si no contiene ninguna modificacion que recupere la info de la BDecho $form->input('titulo');echo $form->input('cuerpo', array('rows' => '3'));echo $form->input('id', array('type'=>'hidden')); //campo oculto para decirle si existe o no el post , y editar o crearloecho $form->end('Salvar Post');?>

REGLAS DE VALIDACION: Se añaden en el modelo.

<?php class Post extends AppModel { var $name = 'Post';

var $validate = array( //se llama cd se use el metodo Save'titulo' => array( //nombre del campo y crear un array de reglas a aplicar'rule' => 'notEmpty'),'cuerpo' => array('rule' => 'notEmpty'));

} ?>

Ver manual , reglas de validación

CONFIGURACION DE RUTAS: Apartado 3.4.5 del manualLa config esta en el archivo /app/config/routes

Editamos la linea Router::connect (‘/’, array(‘controller=’posts’, action=”index”))

Page 15: curso cake

CAPITULO X: Controllers, aplicación sin model. ASOCIACION CONTROLLERS-MODELS. CONTROLLERS-VIEWS

Enlace automatico entre los modelos y controladores:

Vinculacion automatica: es la que hace cake por la convencion de nombres, pero alguna vez puede que haya algun controlador que no tenga un modelo asociado. Para ello se usa un “model less controller” y lo hacemos mediante vinculacion manual.

Libros_controller.php

<?phpclass LibrosController extends AppController {var $nombre = 'Libros';

var $uses = array(); //uses es un atributo especial del controller en el cual definimos el nombre de la clase modelo de un controller. Mediante el hacemos que no se use el sistema automatico de cake. Le asigno un array vacio diciendole que libros_controllers no usara ningun modelo asociado. Tambien podemos usarlo si no seguimos las convenciones de cake.

Para vincular 2 modelos a un controlador los metemos en el array separados por comas

function index() {$this->set('cabecera_pagina', 'Biblioteca de Libros Online'); //1er param nombre que queremos darle a la vista y el segundo el contenido.$libro = array ('titulo_libro' => 'Rayuela','autor' => 'Julio Cortázar','isbn' => '184718930323','fecha_publicacion' => 'Diciembre 2008');$this->set($libro);

}}?>

Index.ctp

<h2><?php echo $cabecera_pagina; ?></h2><dl><lh><?php echo $tituloLibro; ?></lh><dt>Autor:</dt><dd><?php echo $autor; ?></dd><dt>ISBN:</dt><dd><?php echo $isbn; ?></dd><dt>Fecha:</dt><dd><?php echo $fechaPublicacion; ?></dd></dl>

Enlace automatico entre Las vistas y controladores:

Nombre_controller/nombre accion

Page 16: curso cake

CAPITULO XI: Manejo d peticiones entrantes: Añadir params a las acciones .

Formato: host/controller/accion/parametro1/param2…http://localhost/cake10/libros/index/1/=>Nombre aplicación = cake10Nombre controller = libros_controller.phpModelo = libro.phpAcction = indexParámetros = 1Vista = /libros/index.ctp

<?phpclass LibrosController extends AppController {var $nombre = 'Libros';var $uses = array();function index( $id = 0 ) {$libros = array ( //matriz '0' => array ('titulo_libro' => 'Rayuela','autor' => 'Julio Cortázar','isbn' => '184718930323','fecha_publicacion' => 'Diciembre 2008'),'1' => array ('titulo_libro' => 'Libro de Sueños','autor' => 'Jorge Luis Borges','isbn' => '145678908976','fecha_publicacion' => 'Diciembre 2009'));$id = intval($id); //devuelve un entero meta lo que meta en id, si ese entero <0 o >num libros => devuelve el primer elementoif( $id < 0 || $id >= count($libros) ) {$id = 0;}$this->set($libros[$id] ); //para k nos devuelva el valor de libros[id]$this->set('cabecera_pagina', 'Biblioteca Online');$this->pageTitle = 'Bienvenido a la Biblioteca Online';}}?>

Ejemplo pasandole 2 parametros

<?phpclass MatesController extends AppController {var $name = 'Mates';var $uses = array();function add_digitos( $digito1 = 0, $digito2 = 0, $digito3 = 0 ) {$sum = intval($digito1) + intval($digito2) + intval($digito3);$this->set('sum', $sum);}}?>

/views/mates/add_digitos.ctp<h2>La suma es igual a: <?php echo $sum; ?></h2>

Obtener datos de una vista: lo mas normal es hacer un formulario, Que con cakephp los haremos fácilmente con FormHelper

Users_controller.php

Page 17: curso cake

<?phpclass UsersController extends AppController {var $name = 'Users';var $uses = array();function index() {if (!empty($this->data)) { //data => almacena los datos $POST enviados desde los forms HTML al controlador. En este ejemplo , si no le hemos metido un user nos saca la vista//datos enviadosecho $this->data['nombre']; //imprimimos el campo data[‘nombre’]$this->autoRender = false; //no queremos que se muestre el formulario de nuevo, solo el nombre}}}?>

View/users/index.ctp : ejemplo de uso de FormHelper

<?php echo $form->create(null, array('action' => 'index'));?> //parametros de create(model, accion a la que vamos a enviar la info)<fieldset> //etiqueta para agrupar un conjunto de campos y le pondremos nombre con la etiqueta <legend><legend>Escribe tu nombre</legend><?php echo $form->input('nombre'); ?></fieldset><?php echo $form->end('Ir');?>

Page 18: curso cake

CAPITULO XII: Redirecciones y componentes.

En php la redireccion se hacer con header() mientras que en cake se hace con redirect().

User_controller.php<?phpclass UsersController extends AppController {var $name = 'Users';var $uses = array();function index() {if (!empty($this->data)) {$this->redirect(array('controller'=>'users','action'=>'bienvenido', urlencode($this->data['nombre']))); //redireccionamos de index.ctp a bienvenido.ctp //parámetros ( array(controller,action,params action) , parámetros de petición (que le pasamos a la vista bienvenido) , 3er param: podriamos incluir trae para que antes de la redireccion ejecutase todo el codigo de bienvenido.}}function bienvenido( $nombre = null ) { //parametro opcional nombreif(empty($nombre)) {$this->Session->setFlash('Por favor escribe tu nombre',true);$this->redirect(array('controller'=>'users','action'=>'index'));}$this->set('nombre', urldecode($nombre));}}

/view/users/index.ctp<?php echo $form->create(null, array('action' => 'index'));?><fieldset><legend>Escribe tu nombre</legend><?php echo $form->input('nombre'); ?></fieldset><?php echo $form->end('Ir');?>

/view/users/bienvenido.ctp<h2>Bienvenido, <?php echo $nombre; ?></h2>

Los controllers heredan todos de cake/libs/controller/app_controller.php que puede sobrescribirse en app. (ver ejemplos en el tutorial)

<?phpclass AppController extends Controller {function adaptador ( $id, $array) {

$id = intval($id);if( $id < 0 || $id >= count($array) ) {$id = 0;}return $id;}}?>

Ahora en el controller tendriamos que acceder al metodo de la formaId = this->adaptador( $id, $libros);

Clases reutilizables (desde controladores o desde otros componentes) o Components.

Controllers/components/util.php<?phpclass UtilComponent extends Object{

Page 19: curso cake

function adaptador ( $id, $array) {$id = intval($id);

if( $id < 0 || $id >= count($array) ) { $id = 0; }

return $id;}

}?>

En el controller tendriamos que acceder al metodo de la formaVar $components = Array(‘Util’);

Id = this-Util->adaptador($uid, $libros);

Page 20: curso cake

CAPITULO XIII: Acceso a datos con los Modelos.

Clase PHP: usualmente representa una tabla de la BD

App/models/alumno.php

<?phpclass Alumno extends AppModel{var $name = 'Alumno';}?>

App/controllers/alumnos_controllers.php //Basico<?phpclass AlumnosController extends AppController {var $name = 'Alumnos';function index() {$alumnos = $this->Alumno->find('all', //metemos en alumnos lo que devuelve find (heredado de la clase controller) array( 'fields' => array(//vector, donde el primer campo es un vector(nombre,apellidos y edad) 'Alumno.nombre', 'Alumno.apellidos', 'Alumno.edad' ), 'order' => 'Alumno.apellidos ASC' ) );$this->set('alumnos', $alumnos);}}?>

App/controllers/alumnos_controllers1.php //Con scaffold<?phpclass AlumnosController extends AppController {var $name = 'Alumnos';var $scaffold;}?>

App/views/index.ctp

<table><thead><th>Nombre</th><th>Apellidos</th></thead><?php foreach($alumnos as $alumno): ?><tr><td><?php echo $alumno['Alumno']['nombre'] ?></td><td><?php echo $alumno['Alumno']['apellidos'] ?></td></tr><?php endforeach; ?></table>

Trabajaremos con el controller basico (sin scaffold) por ahora.

Metodo Find (select de SQL):

2 parametros: (tipo consulta, constraints o condiciones de los datos extraidos)

Page 21: curso cake
Page 22: curso cake

Ej

<?phpclass AlumnosController extends AppController {var $name = 'Alumnos';function index() {$alumnos = $this->Alumno->find('all',array('fields' => array('Alumno.apellidos','Alumno.nombre'),'conditions' => array('Alumno.nombre LIKE'=>'J%'),'order' => 'Alumno.Apellidos ASC','limit'=>2));$this->set('alumnos', $alumnos);}}?>

Page 23: curso cake
Page 24: curso cake

Alumnos cuyo codigo sea 0003, 0005 o 0007<?phpclass AlumnosController extends AppController {var $name = 'Alumnos';function index() {$alumnos = $this->Alumno->find('all',array('fields' => array('Alumno.codigo','Alumno.nombre','Alumno.apellidos','Alumno.edad'),'conditions' => array('Alumno.codigo' => array ('0003', '0005', '0006'))

));$this->set('alumnos', $alumnos);}}?>

Alumnos que se llamen jaime y que tengan 17 años , por defecto usa el operador AND'conditions' => array('Alumno.nombre' => 'Jaime', 'Alumno.edad' => '17')

Para usar el Operador OR:'conditions' => array('or' =>array( 'Alumno.nombre LIKE' => 'Jaime' 'Alumno.nombre LIKE' => 'Rosa'))

Para usar AND y OR: Vista desde arbol , muestra los alumnos que se llamen Jaime de edad 17 o los que se llamen rosa y tengan 19.'conditions' => array('or' =>array( array('Alumno.nombre LIKE' => 'Jaime', 'Alumno.edad LIKE' => '17'), array('Alumno.nombre LIKE' => 'Rosa', 'Alumno.edad LIKE' => '19'))

Hay por ejemplo otros metodos de cake como find by “field” que devuelve un valorDevuelve el primer registro cuyo nombre sea Jaime. Si<?phpclass AlumnosController extends AppController {var $name = 'Alumnos';function index() {$alumnos = $this->Alumno->findByNombre('Jaime');$this->set('alumnos', $alumnos);}}

Page 25: curso cake

?>

Si queremos que muestre todos es exactamente igual pero con findAllBy.

Page 26: curso cake

CAPITULO XIV: Usos del metodo Save : almacena en la BD (insert/update)

Save (array $data, bool $validate = trae , array $fieldList = array() )

Param1: datos que deben ser salvados. Param2: booleano que indica si debe usarse un sist de validación de datos. (TRUE)Param3: Especificamos los campos que queremos modificar en la BD . Sirve para proteger ciertos campos.

Controller function add() {if (!empty($this->data)) {$this->Alumno->create();if(!!$this->Alumno->save($this->data)) {$this->Session->setFlash('Datos del alumno han sido salvados', true);$this->redirect(array('action'=>'index'));}

function edit($id=null) {if (!$id && empty($this->data)) {$this->Session->setFlash('Datos Alumno incorrectos', true);$this->redirect(array('action'=>'index'));}if (empty($this->data)) {$this->data = $this->Alumno->read(null, $id); //null= devuelve to los campos, xro podemos especificar solo los que queramos}else {$this->Alumno->create();if(!!$this->Alumno->save($this->data)) {$this->Session->setFlash('Datos Alumno actualizados', true);$this->redirect(array('action'=>'index'), null, true);}

View/add.ctp<?php echo $form->create('Alumno');?> //vinculamos el formulario con el modelo alumno

//le decimos a cake donde tiene que guardar ls datos<fieldset><legend>Datos nuevo alumno</legend><?phpecho $form->input('codigo');echo $form->input('nombre');echo $form->input('apellidos');echo $form->input('edad');?></fieldset><?php echo $form->end('Enviar');?> //boton submit.

View/edit.ctp

<?php echo $form->create('Alumno');?>

Page 27: curso cake

<fieldset><legend>Editar Alumno</legend><?phpecho $form->input('id');echo $form->input('codigo');echo $form->input('nombre');echo $form->input('apellidos');echo $form->input('edad');?></fieldset><?php echo $form->end('Enviar');?>

View/index.ctp<table><thead><th>Codigo</th><th>Nombre</th><th>Apellidos</th><th>Edad</th><th>Acciones</th></thead><?php foreach($alumnos as $alumno): ?><tr><td><?php echo $alumno['Alumno']['codigo'] ?></td><td><?php echo $alumno['Alumno']['nombre'] ?></td><td><?php echo $alumno['Alumno']['apellidos'] ?></td><td><?php echo $alumno['Alumno']['edad'] ?></td><td><?php echo $html->link('editar','edit/'.$alumno['Alumno']['id'])?></td></tr><?php endforeach; ?></table>

Page 28: curso cake

CAPITULO XV: Creacion de metodos “model” : addAsterisco. Y validación de datos.

Actualizacion de un registroMetodo saveField( string $nombreCampo, string $valorCampo , $validate=false)

thisAlumnoid=9;thisAlumnosaveField(‘nombre’, ‘NuevoNombre’);

Actualizacion Batch: updateAll( array $conditions, array $fields)

$thisAlumnoupdateAll(Array(‘Alumno.curso’=>’4º ESO A’), // a todos los alumnos que cumplan esta condic.

Array(‘Alumno.tutor’=>’Adrian Osorio’) //les actualiza el campo tutor

);

Borrar : del o delete

Añadir un campo a la tabla alumnos.

Alumno.php

Alumnos_controller.php

Page 29: curso cake

Index.ctp

Reglas de validación: videotutorial numero 9 Se aplican en el modelo:

A ‘edad’ le hemos aplicado una regla cake.Si indicamos custom , es para una regla personalizada. A continuación pondremos la Expresion regular.

Vemos un ejemplo de aplicar varias reglas a un campo (codigo).

Page 30: curso cake
Page 31: curso cake

CAPITULO XVI: Modelando las relaciones entre tablas.

Cake usa ORM: Object relational Management.

Las relaciones se definen en los modelos.

Tipos: 1-1. 1-n, n-n

1-n1 curso tiene muchos alumnos y un alumno va a pertenecer a un curso.

CREATE TABLE `cursos` (`id` int( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,`nombre` varchar( 127 ) NOT NULL ,`aula` varchar( 127 ) NOT NULL ,`tutor` varchar( 127 ) NOT NULL);

CREATE TABLE `alumnos` (`id` int( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,`codigo` varchar( 13 ) NOT NULL ,`nombre` varchar( 64 ) NOT NULL ,`apellidos` varchar( 127 ) NOT NULL ,`curso_id` int( 11 ) NOT NULL //clave externa (Convencion cake)

Modelo: - model/curso.php- model/alumno.php

Controllers:

- alumnos_controller.php:

2 tipos de asociación:

- hasMany: lo usaremos en el modelo curso- belongsTo: lo usaremos en el modelo alumno

Page 32: curso cake

Cambiamos los controllers e index(s).ctp:

Controller de curso (lo mismo con los alumnos)

Con el uso de recursive (que luego usara el metodo find) indicamos el numero de niveles a recuperar de la BD.De momento estamos trabajando con 2 tablas => con el valor uno sera suficiente.Con ‘-1’ nos devuelve la información del modelo.Con ‘0’ devuelve la tabla y aquellas tablas con las que tiene relacion belongsTo (pero no las que tenga hasMany).Con ‘1’ nos mostraria tambien los valores de las tablas con las que tiene una relacion hasMany

Index de alumno (lo mismo con el de curso)

Lo interesante es ver como se hacen los LOOPs

Page 33: curso cake
Page 34: curso cake

En el tutorial hay un ejemplo con 3 tablas.

Page 35: curso cake

CAPITULO XVII: ORM Relaciones

Creamos la accion add para la aplicación anterior.

View/alumno/add.ctp

Alumnos_controller.php: Vemos como accedemos a la tabla con la que se relaciona alumno (Curso) con la linea

$cursos = $thisAlumnoCursofind(‘list’, array(‘fields’=>’Curso.nombre’));

Doc:

Page 36: curso cake

1..1

La relacion belongsTo la pondremos en el modelo de la tabla que contiene la clave externa.

($belongsto) alumnosAlumnos $hasOne

Modelo alumnos

Modelo datos

Creamos las tablas alumnos , alumnas cursos

Page 37: curso cake

n..n

Hay autores que han escrito mas de un libro y hay libros que son escritos por varios autores.

Tablas a crearautores:libros:tabla join : autores_libros: (convencion del nombre: como las tablas, separadas con un subrayado y en ORDEN ALFABETICO.)

Los campos: como la tabla en singular , terminando como el sufijo ’_id’ Ej. Autore_id y libro_id.

modelos:

autore.php

Libro.php

Controllers:

Page 38: curso cake

Recuperar datos relacionados de cualquiera de las 2 tablas

Controllers: quitamos los scaffolds y creamos la funcion index.

Views/Autores/index.ctp

Views/libros/index.ctp

Page 39: curso cake

Funcion add:

Autores_controller.php

Page 40: curso cake

Vistas

En el ultimo input hemos pasado el nombre del modelo con el que esta relacionado.

Page 41: curso cake

CAPITULO XVIII: Personalizar las Vistas

Tienen extensión .ctp y se almacenan con el nombre de la accion, en un directorio llamado como el controller , dentro de app/views/nombre_controller.

1. Layouts: diseño: Para cambiar el diseño, poner un archivo /app/views/layout/default.ctpSi quisieras cambiar el que viene por defecto es en cake/libs/layout/default.ctp

Charset: pa q piye los caracteres del español

Title_for_layout: coge el titulo de la pagina $thispageTitle

La hoja de estilo se pone sin extensión css y sin ruta.

Los CSS van en app/webroot/css

$content_for_layout: lugar dnd queremos que aparezca el contenido que devuelve el controller.

2. Elements: codigo reutilizable dentro de la vista

Por ejemplo si en un blog, en una pagina queremos en una pestaña los post mas relevantes y en otra los mas leidos. Para ello usariamos la misma estructura para evitar repetir codigo. (es como un incluye)

Vamos a usar un mismo element en index.ctp y view.ctp a los que les pasaremos los parámetros que vaya a imprimir

Index.ctp

View.ctp

Page 42: curso cake

Los parámetros son los siguientes:

En view/elements vamos a poner lo siguiente

Libro_info.ctp

Libros_controller.php

Page 43: curso cake

CAPITULO XIX: Personalizar las Vistas

3. Helpers: clases logicas reuitilizables

Por ejemplo , un conversor de medidas (bytes – KB) por ejemplo

App/views/helpers/Formato.phpConvencion: Clase en formato camel case y acabado en Helper y extenderan a AppHelper.

El nombre del archivo es el nombre de la clase sin el ‘Helper’

Substr (var , offset, lenght)

Ponemos en el controller

Var $helpers = array(‘formato’); //podemos poner varios

En la vista podemos usarlo del siguiente modo

Los mas utilizados del core de cake son los $form helper (cookbook 7.3.1) Podemos usar para todos los campos incluidos las fechas etc..

A create se le pasa , el modelo y un array de pares de (nombre,valor) .Esto lo vimos en el tutorial 4.

Page 44: curso cake

CAPITULO XX:

Cookbook 9. Core console applications

Pre-requisitos:Tener en el PATH la ruta de PHP y la de CAKE.

1. Crear una aplicación : cake bake

2. Definir la BD siguiendo la convencion cake

3. Ejecutamos bake : El script bake tambien nos permite crear los modelos asi como crear criterios de validacion para los campos del modelo y otras muchas cosas:

Situados en el dir de la aplicación escribimos ‘cake bake’ y puedes elegir en una de las opciones.

En este caso , escogemos la (M) para trabajar con el modelo.Tambien , nos sugiere las relaciones entre los modelos.

Si seleccionamos la opción (C), creamos los controladores dandonos la posibilidad de crear metodos CRUD (Create ,read, update, delete)

Con (V), accedemos a las vistas: dandonos la posibilidad de scaffoldded views. (con las acciones CRUD disponibles)

Page 45: curso cake

CAPITULO XXI: Construccion de una aplicación desde cero.

El error de Security.salt es por el tema de encriptación, para que no nos salga ahí , cambiamos la linea en la que pone security.salt del archivo app/config/core.phpBasta con modificar la cadena de texto que aparece.

1.Creacion y configuración de la BD.

Creamos la BD con cotejamiento “utf8-spanish2 ci” e importamos el fichero .sql

---- Estructura de tabla para la tabla `preguntas`--

CREATE TABLE IF NOT EXISTS `preguntas` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `pregunta` varchar(255) CHARACTER SET utf8 NOT NULL, `autor` varchar(64) CHARACTER SET utf8 NOT NULL, `creado` datetime NOT NULL, `modificado` datetime NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=6 ;

-- Volcar la base de datos para la tabla `preguntas`

INSERT INTO `preguntas` (`id`, `pregunta`, `autor`, `creado`, `modificado`) VALUES(1, '¿Por qué usas Videotutoriales?', 'OutKast', '2008-02-11 22:19:04', '2008-02-11 22:19:04'),(2, '¿Por qué no usas Videotutoriales?', 'OutKast', '2008-02-11 22:22:06', '2008-02-11 22:22:06')….;-- --------------------------------------------------------

-- Estructura de tabla para la tabla `respuestas`

CREATE TABLE IF NOT EXISTS `respuestas` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `pregunta_id` int(10) unsigned NOT NULL, `respuesta` varchar(255) CHARACTER SET utf8 NOT NULL, `colaborador` varchar(64) CHARACTER SET utf8 NOT NULL, `creado` datetime NOT NULL, `modificado` datetime NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=10 ;

-- Volcar la base de datos para la tabla `respuestas`

INSERT INTO `respuestas` (`id`, `pregunta_id`, `respuesta`, `colaborador`, `creado`, `modificado`) VALUES(1, 1, 'Se aprende mucho mejor.', 'Alberto', '2008-02-11 22:22:45', '2008-02-11 22:22:45'),(2, 1, 'Porque me gusta', 'Manuel', '2008-02-11 22:23:06', '2008-02-11 22:23:06')…;

El campo pregunta_id es clave externa de preguntas. En este caso “Cada pregunta puede tener muchas respuestas pero cada respuesta pertenece a 1 pregunta”. (1..*) => Preguntas y respuestas : hasManyRespuestas y preguntas: BelongsTo

Creamos la aplicación: cake bake respondeme2

Ya podemos empezar : http://localhost/respondeme2/ ya que todo esta en verde ahí.

Page 46: curso cake

3. Crear Modelos y definir relaciones

App/models: creamos pregunta.php y respuesta.php

pregunta.php<?phpclass Pregunta extends AppModel {var $name = 'Pregunta';var $hasMany = array('Respuesta' => array('className' => 'Respuesta'));var $validate = array('pregunta' => array('rule' => array('minLenght', 1),'required' => true,'allowEmpty' => false,'message' => 'Escribe tu pregunta, por favor'),'autor' => array('rule' => array('minLenght', 1),'required' => true,'allowEmpty' => false,'message' => 'Escribe tu nombre, por favor'));}?>

respuesta.php<?phpclass Respuesta extends AppModel {var $name = 'Respuesta';var $belongsTo = array('Pregunta' => array('className' => 'Pregunta'));var $validate = array('respuesta' => array('rule' => array('minLenght', 1),'required' => true,'allowEmpty' => false,'message' => 'Escribe una respuesta, por favor'),'colaborador' => array('rule' => array('minLenght', 1),'required' => true,'allowEmpty' => false,'message' => 'Escribe tu nombre, por favor'));}?>

Page 47: curso cake

4. Crear controller y sus vistas : Vamos a tener 2 acciones y 2 paginas de momento

pagina donde mostraremos las preguntas que se han hecho y para añadir nueva pregunta

pagina donde mostraremos cada una de las preguntas , las respuestas que hay para esa pregunta y un formulario para añadir una nueva respuesta.

CONTROLLERS:

Controllers/Preguntas_controllers.php:

<?phpclass PreguntasController extends AppController {var $name = 'Preguntas';

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

$this->Pregunta->create();if ($this->Pregunta->save($this->data)) {$this->Session->setFlash('Tu Pregunta ha sido añadida.');$this->redirect(array('action'=>'inicio'), null, true);} else {$this->Session->setFlash('Tu Pregunta no ha podido ser salvada, inténtalo de nuevo.');}}

$this->Pregunta->recursive = 1;$this->set('preguntas', $this->Pregunta->find('all'));

}

function mostrar( $id = null) {if (!$id) {$this->Session->setFlash('Pregunta no válida.');$this->redirect(array('action'=>'inicio'));}if (!empty($this->data)) {$this->Pregunta->Respuesta->create();if ($this->Pregunta->Respuesta->save($this->data)) {

$this->Session->setFlash('La Respuesta ha sido salvada');$this->redirect(array('action' => 'mostrar', $id),null, true);} else {$this->Session->setFlash('La Respuesta no ha sido salvada. Inténtalo de nuevo.');}}$this->set('pregunta', $this->Pregunta->read(null, $id));}}?>

Page 48: curso cake

VISTAS: lo unico distinto es que usamos la funcion ‘e’ en lugar de ‘echo’

Views/preguntas/inicio.ctp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//ES""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"lang="es"><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"/><?php echo $html->charset(); ?> </head><body><?php e($form->error('Pregunta.pregunta', null, array('class'=> 'message'))); ?><?php e($form->error('Pregunta.autor', null, array('class'=> 'message'))); ?><?php e($form->create('Pregunta', array('action' => 'inicio')));?><fieldset><label for="QuestionQuestion" class="questionlabel"><span>Tu Pregunta</span></label><?php e($form->text('pregunta', array('class' =>'fullwidth'))); ?><span class="big">?</span><label for="QuestionQuestioner" class="questionerlabel"><span>Tu Nombre</span></label><?php e($form->text('autor', array('class' => 'halfwidth'))); ?><?php e($form->submit('Publica tu pregunta', array('div' => false, 'class' => 'submitbutton'))); ?></fieldset><?php e($form->end()); ?><?php if(empty($preguntas)): ?><p class="no_answer">Aún no hay Preguntas. Sé el primero en hacer una Pregunta!</p><?php else: ?><dl><?php foreach ($preguntas as $pregunta): ?><dt><span><?php e($pregunta['Pregunta']['autor']);?></span></dt><dd><?php e($html->link($pregunta['Pregunta']['pregunta'], array('action' => 'mostrar', $pregunta['Pregunta']['id']))); ?><?php$contador_respuestas = count($pregunta['Respuesta']);if(!$contador_respuestas)e("(no hay respuestas aún)");else if($contador_respuestas == 1)e("(1 respuesta)");elsee("(".$contador_respuestas." respuestas)");?></dd><?php endforeach; ?></dl><?php endif; ?></body></html>

Views/preguntas/mostrar.ctp

<?php e($form->error('Respuesta.respuesta', null, array('class'=> 'message'))); ?><?php e($form->error('Respuesta.colaborador', null, array('class'=> 'message'))); ?><h2><?php e($pregunta['Pregunta']['pregunta']) ?>?</h2><div id="autor"><div><span><?php e($pregunta['Pregunta']['autor']) ?></span></div></div><?php e($form->create('Respuesta', array('url' => 'mostrar/'.$pregunta['Pregunta']['id'])));?><fieldset><?php e($form->hidden('pregunta_id', array('value' =>$pregunta['Pregunta']['id']))); ?><label for="AnswerAnswer" class="questionlabel"><span>Tu Respuesta</span></label>

Page 49: curso cake

<?php e($form->text('respuesta', array('class' =>'fullwidth'))); ?><span class="big">!</span><label for="AnswerAnswerer" class="questionerlabel"><span>Tu Nombre</span></label><?php e($form->text('colaborador', array('class' =>'halfwidth'))); ?><?php e($form->submit('Publica tu respuesta', array('div' =>false, 'class' => 'submitbutton'))); ?></fieldset><?php e($form->end()); ?><?php if(empty($pregunta['Respuesta'])): ?><p class="no_answer">No hay respuestas aún. ¡Sé el primero en responder!</p><?php else: ?><dl><?php foreach($pregunta['Respuesta'] as $respuesta) : ?><dt><span><?php e($respuesta['colaborador']); ?></span></dt><dd><?php e($respuesta['respuesta']); ?></dd><?php endforeach; ?></dl><?php endif; ?>

5. Hacer diseño personalizado

Copiamos los archivos css a app/webroot/cssEn views/layout sobreescribimos el default.ctp y ya tendremos nuestro diseño

Para que no nos salga la consulta sql , le ponemos al configure::write (‘debug’, 0); del archivo app/config/core.php

Para modificar la ruta por defecto para que cuando entremos en nuestra aplicación vaya a nuestra pagina. App/config/routes.php Router::connect(‘/’, array (‘controller’ => ‘preguntas’, ‘action’ => ‘inicio’));

6. Hacer formularios para añadir contenidos

Ver el codigo arriba en las vistas

Page 50: curso cake

CAPITULO XXII: Construccion de una aplicación desde cero (II).