Está en la página 1de 41

TUTORIAL DE

cakePHP
NDICE
1. NTRODUCCN
2. CONFGURACN.
3. CONCEPTOS SOBRE cakePHP
3. DESARROLLO CON SCAFFOLD.
4. EJEMPLO COMPLETO.
5. AADR FUNCONALDAD..
6. DSEO DE LA APLCACN..
5
5
7
18
20
36
37
4
Tutorial de cakePHP
1. INTRODUCCIN
CakePHP es un framework para programar aplicaciones Web que sigue la
arquitectura MVC (Modelo Vista Controlador: http://es.wikipedia.org/wiki/MVC).
Para su funcionamiento requiere un servidor Web Apache, con PHP (versin 4 o
5) y un servidor de base de datos MySQL (aunque tambin trabaja con
PostgreSQL, SQLite o ADODB). Existen herramientas, como XAMPP
(http://www.apachefriends.org/en/xampp.html), que integran ambos servicios en
una nica instalacin. El presente tutorial se ha realizado con la versin 1.6.0 de
XAMPP, que incorpora las versiones 2.2.4 de Apache, 5.2.1 y 4.4.5 de PHP y
5.0.3.3 de MySQL. La versin de cakePHP con la que se ha trabajado y cuyo
funcionamiento se va a describir es la 1.1.14.4797 de abril de 2007. Esta
herramienta se puede descargar de su web oficial:
http://.cakephp.or!/
Los lectores de este tutorial debern tener conocimientos de programacin en
PHP, de gestin de MySQL y conceptos tericos de bases de datos.
". CON#I$UR%CIN
Una vez instalado un servido (Apache), con el mdulo rewrite habilitado (aunque
tambin funciona sin l, pero es preferible segn el autor del framework). Dicha
habilitacin se realiza accediendo al fichero httpd.conf en la carpeta []
/apache/conf/ y descomentando la lnea correspondiente (quitando la #) antes de
arrancar el servicio web.
#LoadModule rewrite_module modules/mod_rewrite.so
#i!ura 1. %cti&aci'( del )'dulo *rerite+ de %pache
5
Tutorial cakePHP
Se crea una carpeta dentro de la web de nuestro servidor en la que descomprimir
los ficheros del cakePHP. En nuestro caso, dicha carpeta se llamar
proyectoca!e, y accederemos a ella va web mediante la direccin
http"//#oca#host/proyectoca!e (ver figura 2).
Lo siguiente que hay que hacer es configurar el acceso a la base de datos; para
ello se crea un archivo con el nombre data$ase.php en la carpeta []
/proyectoca!e/app/config/, donde se especifican los parmetros de la conexin:
el motor de base de datos, el tipo de conexin (%ys&#connect o
%ys&#pconnect), el host, el login, la contrasea de la base de datos y el nombre
de sta, que en este tutorial ser proyectoca!e; naturalmente esta base de
datos deber estar creada de antemano (ver figura 3).

Ojo: La base de datos
no est disponible
#i!ura ". ,i-ta i(icial CakePHP
<?php
class DATABASE_C!"#$%
6
Tutorial cakePHP
&ar 'de(ault )
arra*+,dri&er, )- ,m*s.l,/
,co00ect, )- ,m*s.l_co00ect,/
,host, )- ,localhost,/
,lo1i0, )- ,user,/
,password, )- ,pwd_user,/
,data2ase, )- ,pro*ecto_ca3e,/
,pre(i4, )- ,,56 /7este par8metro se .ueda e0 2la0co7/
9?-
#i!ura .. Co(/i!uraci'( de acce-o a la 0a-e de dato-
Ahora CakePHP ya puede acceder a la base de datos (ver figura 4).

Base de datos disponible
#i!ura 1. 2a-e de dato- co(ectada
.. CONCEPTO3 3O2RE CakePHP
Los diferentes elementos necesarios para desarrollar una aplicacin con
CakePHP deben ser nombrados siguiendo el siguiente convenio:
7
Tutorial cakePHP
Tablas de la base de datos .- El nombre de cualquier tabla debe estar en
plural, ej: proyectos o a#'%nos. En el caso de ser una tabla para una
relacin muchos a muchos, por ejemplo entre proyectos y alumnos, se
creara otra tabla cuyo nombre contendra los de las tablas relacionadas
separadas por una barra (_) y en orden alfabtico, es decir:
a#'%nosproyectos (ojo: si la tabla se llamara proyectosa#'%nos no
funcionara).Ver ejemplo en la figura 5.
Model (modelo) .- Cada tabla debe tener una clase modelo de igual nombre
que la tabla, pero en singular, guardada en un archivo tambin con el
mismo nombre de la tabla, pero en singular, con extensin .php. Dicho
fichero deber almacenarse en la carpeta []/proyectoca!e/app/
%ode#s/. Para la tabla alumnos, la clase para el modelo se llamar c#ass
a#'%no ) * y deber estar guardada en el fichero a#'%no.php.
C:EATE TABLE ;alum0os; +
;id; i0t+<<5 !T !=LL auto_i0creme0t/
;0om2re; &archar+>?5 !T !=LL/
;apellido; &archar+>?5 !T !=LL/
;(echa_0acimie0to; date !T !=LL/
;email; &archar+@>5 !T !=LL/
;tele(o0o; &archar+<>5 !T !=LL/
;0um_0atricula; i0t+@5 !T !=LL/
;0ota_selecti&idad;decimal+@/A5 !T !=LL/
B:#MA:C DEC +;id;5
56
C:EATE TABLE ;pro*ectos; +
;id; i0t+<?5 u0si10ed !T !=LL auto_i0creme0t/
;titulo; &archar+@>5 !T !=LL/
;0um_pa1i0as; &archar+@>5 !T !=LL/
B:#MA:C DEC +;id;5
56
C:EATE TABLE ;alum0os_pro*ectos; +
;id; i0t+<<5 !T !=LL auto_i0creme0t/
;alum0o_id; i0t+<<5 !T !=LL/
;pro*ecto_id; i0t+<<5 !T !=LL/
B:#MA:C DEC +;id;5
56
#i!ura 4. E5e)plo creaci'( de ta0la-
<?php
class Alum0o e4te0ds AppModel%
&ar '0ame ) ,Alum0o,6
9
?-
#i!ura 6. Creaci'( del )odelo alu)(o.php
Controller (controlador) .- El nombre de la clase controlador se forma
poniendo el nombre de la tabla en plural, seguido de Contro##er. Para la
8
Tutorial cakePHP
tabla alumno quedara as: c#ass a#'%nosContro##er ) *. Esta clase
deber guardarse en un fichero de nombre a#'%noscontro##er.php dentro
de la carpeta []/proyectoca!e/app/contro##ers/.
<?php
class alum0osco0troller e4te0ds AppCo0troller%
&ar '0ame ) ,alum0os,6
&ar 'helpers ) arra*+,Etml,/ ,"orm,56
9
?-
#i!ura 7. Creaci'( del co(trolador alu)(o.php
Views (vistas) .- Para crear las vistas de las tablas de la base de datos, hay
que crear una carpeta por cada tabla dentro de la carpeta []
/proyectoca!e/app/+iews/. Para la tabla alumnos se crear la carpeta
[]/proyectoca!e/app/+iews/a#'%nos/. Dentro de cada una de las
carpetas creadas para las vistas se crear un fichero para la vista de
edicin, de nombre edit.tht%#, otro para la de insercin, add.tht%#, otro
para el listado de registros inde,.tht%# y otro para cada registro
+iew.tht%#.

#i!ura 8. Carpeta- 9 /ichero- de u(a aplicaci'(
CakePHP dispone de la clase -t%#-e#per que permite crear formularios en HTML
y algunos otros componentes para una pgina web, es decir, para crear las vistas
9
Tutorial cakePHP
de la aplicacin (ficheros con extensin .tht%#). En los archivos de vistas est
disponible el objeto ht%# de la clase -t%#-e#per que proporciona los mtodos
necesarios para disear cada vista, algunos de los ms utilizados son:
Para crear el formulario:
EtmlEelperFF(ormTa1+' target )0ull /' type ),post, /' htmlAttributes )arra*+5 5
Para enviar la informacin de un formulario:
EtmlEelperFFsubmit+'caption),Su2mit,/'htmlAttributes)arra*+5/'return)(alse5
Para que el campo password, convierta la contrasea a asteriscos:
EtmlEelperFFpassword+'fieldName/'htmlAttributes)arra*+5/'return)(alse5
Agrega los campos para textos de mayor longitud:
EtmlEelperFFtextarea+'fieldName/'htmlAttributes)arra*+5/'return)(alse5
Crea campos ocultos:
EtmlEelperFFhidden+'fieldName/'htmlAttributes)arra*+5/'return)(alse5
Agrega imgenes a los formularios:
EtmlEelperFFimage+'path/'htmlAttributes)arra*+5/'return)(alse5
Crea campos para texto:
EtmlEelperFFinput+'fieldName/'htmlAttributes)arra*+5/'return)(alse5
Crea campos para seleccionar elementos:
EtmlEelperFFselectTa1+'fieldName/'optionElements/'selected)0ull/
'selectAttr)arra*+5/'optionAttr)0ull/
'showEmpty)true/'return)(alse5
Genera campos para insertar la fecha y hora:
EtmlEelperFFdateTimeptio0Ta1+
'tagName/ 'dateFormat),DMC,/ 'timeFormat),<A,/ 'selected)0ull/
'selectAttr)0ull/ 'optionAttr)0ull/ 'showEmpty)true5
Toda la documentacin correspondiente a esta versin se puede encontrar en
http://api.cakephp.org/.
A continuacin se va a crear un ejemplo con un formulario para la tabla alumno
(siguiendo con el ejemplo anterior). Este formulario se har para crear un alumno
nuevo, por tanto tendremos que ir a la carpeta view, []/proyectoca!e/app/
+iews/, y crear un archivo llamado add.thtml. Como el que se puede ver en la
figura 9.
!
Tutorial cakePHP
Adems de estas funciones, CakePHP, posee la caracterstica de validar los
datos, pudindolo hacer para cuatro tipos de campos, que son los siguientes:
Campo no vaco: VALD_NOT_EMPTY.
Campo numrico: VALD_NUMBER.
Campo de e-mails: VALD_EMAL.
Campo de aos: VALD_YEAR.
<2r-<hG-!ue&o Alum0o</hG-
<?php echo 'htmlH-(ormTa1+,/alum0os/add/,556?-
<ta2le-
<di& class)Ire.uiredI-
//#0dicar si es u0 campo opcio0al+optio0al5 u o2li1atorio+re.uired5
//i0dica el 0om2re del campo e0 el (ormulario.
<la2el (or)Ialum0o_0om2reI-!om2reF</la2el-
//Brimero po0er el tipo de campo+i0put5/ se1uido del 0om2re de la ta2la/campo
<?php echo 'htmlH-i0put+,Alum0o/0om2re,/ arra*+,siJe, )- ,>?,556?-
<?php echo 'htmlH-ta1ErrorMs1+,Alum0o/0om2re,/ ,!om2re 0o &8lido,56?-
</di&-
<di& class)Ire.uiredI-
<la2el (or)I alum0o _apellidoI-ApellidoF</la2el-
<?php echo 'htmlH-i0put+, Alum0o /apellido,/ arra*+,siJe, )- ,>?,556?-
<?php echo 'htmlH-ta1ErrorMs1+,Alum0o/apellido,/ ,Apellido 0o &8lido,56?-
</di&-
<di& class)Ioptio0alI-
<la2el (or)I alum0o_(echa_0acimie0toI-"echa de !acimie0toF</la2el-
<?php echo 'htmlH-dateTimeptio0Ta1+,Alum0o/(echa_0acimie0to,/,DMC,/,!!E,56?-
<?php echo 'htmlH-ta1ErrorMs1+,Autor/(echa_0acimie0to,/,"echa 0o &alida,56?-
</di&-
<di& class)Ire.uiredI-
<la2el (or)Ialum0o_emailI-EmailF</la2el-
<?php echo 'htmlH-i0put+,Alum0o/email,/ arra*+,siJe, )- >?556?-
<?php echo 'htmlH-ta1ErrorMs1+,Alum0o/email,/ ,EHmail 0o &alido,56?-
</di&-
<di& class)Ioptio0alI-
<la2el (or)I alum0o_tele(o0oI-Tele(o0oF</la2el-
<?php echo 'htmlH-i0put+,Alum0o/tele(o0o,/arra*+,siJe, )- >?556?-
<?php echo 'htmlH-ta1ErrorMs1+,Alum0o/tele(o0o,/,De2e0 ser 0umeros,56?-
</di&-
<di& class)Ire.uiredI-
<la2el (or)I alum0o_0um_matriculaI-!Kmero de matriculaF</la2el-
<?php echo 'htmlH-i0put+,Alum0o/0um_matriculaL/ arra*+,siJe,)->?556?-
<?php echo 'htmlH-ta1ErrorMs1+,Alum0o/0um_matricula,/
,De2e escri2ir u0 aMo,56?-
</di&-
<di& class)Ire.uiredI-
<la2el (or)I alum0o_0ota_selecti&idadI-!ota de Selecti&idadF</la2el-
<?php echo 'htmlH-i0put+,Alum0o/0ota_selecti&idad,/arra*+,siJe,)->?556?-
<?php echo 'htmlH-ta1ErrorMs1+,Alum0o/0ota_selecti&idad,/
,De2e0 ser u0 0Kmero,56?-
</di&-
</ta2le-

Tutorial cakePHP
<di& class)Isu2mitI-<i0put t*pe)Isu2mitI &alue)IAddI /-</di&-
</(orm-
#i!ura :. #or)ulario para crear (ue&o- alu)(o-
A continuacin se van a validar los datos de la tabla alumnos, siguiendo el
siguiente criterio.
Campos no vacos: nombre, apellido.
Campo email: email.
Campo ao: ao
Campo numero: nota_matricula
Para hacer esta validacin en cake, tendremos que ir a []
/proyectoca!e/app/+iews/a#'%nos/ y crear las validaciones como se puede ver
en la figura 10.
<?php
class alum0o e4te0ds AppModel%
&ar '0ame ) ,Alum0o,6
&ar '&alidate ) arra*+,0om2re,)-NAL#D_!T_EMBTC/
,apellido,)-NAL#D_!T_EMBTC/
,email,)-NAL#D_EMA#L/
,aMo_matriculaciO0,)-NAL#D_CEA:/
,0ota_selecti&idad,)-NAL#D_!=MBE:/56
9
?-
#i!ura 1;. ,alidar ca)po- del /or)ulario
Una opcin muy potente de la que dispone CakePHP, es la gestin de las
relaciones entre tablas de la base de datos. Estas relaciones se deben escribir en
el modelo de la tabla correspondiente (alumnos.php, proyecto.php). A
continuacin se van a ver los cuatro tipos de relaciones que tiene CakePHP,
viendo para cada una un ejemplo entre las tablas "alumnos y proyectos:
"
Tutorial cakePHP
hasOne: 1:1, uno a uno. Siguiendo el ejemplo, se dir que la relacin entre
proyecto y alumno es de uno a uno, por tanto en uno de los modelos
(alumno.php o proyecto.php), se debe incluir esta condicin, es decir habr
que validar la relacin entre tablas para que sea de uno a uno. Veas figura
11.
<?php class Alum0o e4te0ds AppModel%
&ar '0ame ) ,Alum0o,6
&ar 'has0e ) arra*+,Bro(ile, )- arra*+,class!ame, )- ,Bro*ecto,/
,co0ditio0s,)- ,,/ ,order, )- ,,/
,depe0de0t, )-true/ ,(orei10De*,)- ,alum0o_id,556
9?-
#i!ura 11. ,alidar relaci'( u(o a u(o
.c#ass/a%e0 (obligatorio): nombre del modelo que se quiere asociar. En este
ejemplo se quiere asociar con el modelo Proyecto.
.conditions0: condiciones SQL que definen la relacin. Se podra utilizar, por
ejemplo, para asociar solo los proyectos que tienen 200 pginas, para
especificarlo se pondra: 1Proyecto.n'%paginas2.34405.
.order0: se utilizara para ordenar la asociacin en el modelo. Para ordenarlo de
forma ascendente se pondra: 1Proyecto.tit'#o ASC05. Y para ordenarlo de
forma descendnte se pondra: 1Proyecto.tit'#o D6SC05
.dependent0: si se pone a "true, el registro que esta asociado a otro registro se
borrar cuando este se borr. Por ejemplo si el alumno "Carlos esta asociado
con el proyecto "Aplicaciones Web, si se borra el alumno "Carlos tambin se
borrar el proyecto "Aplicaciones web.
.foreign7ey0: es el nombre de la FK que apunta al modelo con el que est
asociado. En este caso en la tabla proyecto debe haber un campo que sea
alumno_id, pues este campo es la FK que tendremos que escribir en "foreign
key.
Arra*+
#
Tutorial cakePHP
PAlum0oQ )- Arra*+
PidQ )- A>
P0om2reQ )- Carlos
PapellidoQ )- LirO0 LOpeJ
P(echa_0acimie0toQ )- <RSAH<<H<<
PemailQ )- carlosliro0Talu.umh.es
Ptele(o0oQ )- RU>G>?SR>
PaMo_matriculacio0Q )- A??G
P0ota_selecti&idadQ )- R/S
5
PBro*ectoQ )- Arra*+
PidQ )- @
PtituloQ )- Aplicacio0es Ve2
P0um_pa1i0asQ )- A??
Palum0o_idQ ) A>
5
5
#i!ura 1". Re-ultado de la relaci'( 1:1 e( %lu)(o 9 Pro9ecto
hasMany: 1:N, uno a muchos. Siguiendo el ejemplo, se dir que la relacin
entre alumno y proyecto es de uno a muchos, por tanto en el modelo
alumno.php, se debe incluir esta condicin, es decir habr que validar la
relacin entre tablas para que sea de uno a muchos. Vase figura 13.
.c#ass/a%e0 (obligado): nombre del modelo con el que se quiere asociar.
En este caso con Proyecto.
.conditions0: condiciones SQL que definen la relacin.
order0: se utilizara para ordenar la asociacin en el modelo.
.#i%it0: el nmero mximo de asociaciones que se quieren en un modelo. En
este ejemplo solo se quieren dos proyectos por cada alumno.
<?php
class Alum0o e4te0ds AppModel%
&ar '0ame ) ,Alum0o,6
&ar 'hasMa0* ) arra*+,Bro*ecto, )-
arra*+,class!ame, )- ,Bro*ecto,/
,co0ditio0s, )- ,,/
,order, )- ,,/
,limit, )- ,A,/
,(orei10De*, )- ,alum0o_id,/
,depe0de0t, )- true/
,e4clusi&e, )- (alse/
4
Tutorial cakePHP
,(i0derWuer*,)- ,,
5
56
9
?-
#i!ura 1.. ,alidar relaci'( u(o a )ucho-
.foreign7ey0: es el nombre de la FK que apunta al modelo con el que est
asociado. En este caso en la tabla proyecto debe haber un campo que sea
alumno_id, pues este campo es la FK que tendremos que escribir en
"foreign key.
dependent: si se pone a "true, el registro que esta asociado a otro registro
se borrar cuando este se borr. Por ejemplo si el alumno "Jose esta
asociado con el proyecto "Ajax, si se borra el alumno "Jose tambin se
borrar el proyecto "Ajax.
exclusive: si se pone a true, todos los objetos asociados sern borrados
en una consulta SQL.
finderQuery: especifica una sentencia completa en SQL para buscar
asociaciones.
Arra*+
PAlum0oQ )- Arra*+
PidQ )- A>
P0om2reQ )- Carlos
PapellidoQ )- LirO0 LOpeJ
P(echa_0acimie0toQ )- <RSAH<<H<<
PemailQ )- carlosliro0Talu.umh.es
Ptele(o0oQ )- RU>G>?SR>
PaMo_matriculacio0Q )- A??G
P0ota_selecti&idadQ )- R/S
5
PBro*ectoQ )- Arra*+
P?Q )- Arra*+
PidQ )- @
PtituloQ )- Aplicacio0es Ve2
P0um_pa1i0asQ )- A??
Palum0o_idQ ) A>
5
P<Q )- Arra*+
PidQ )- A?
PtituloQ )- Bases de Datos
P0um_pa1i0asQ )- <>?
Palum0o_idQ ) A>
5
Tutorial cakePHP
5
5
5
#i!ura 11. Re-ultado de la relaci'( 1:N e( %lu)(o 9 Pro9ecto
belongsTo: N:1, muchos a uno. Siguiendo el ejemplo, se dir que la
relacin entre proyecto y alumno es de muchos a uno, por tanto en el
modelo proyecto.php, se debe incluir esta condicin, es decir tendremos
que validar la relacin entre tablas para que sea muchos a uno. Vase la
figura 15.
<?php
class Bro*ecto e4te0ds AppModel%
&ar '0ame ) ,Bro*ecto,6
&ar '2elo01sTo ) arra*+,Alum0o, )-
arra*+,class!ame, )-,Alum0o,/
,co0ditio0s,)-,,/
,order, )-,,/
,(orei10De*,)-,alum0o_id,
5
56
9
?-
#i!ura 14. ,alidar relaci'( )ucho- a u(o
.c#ass/a%e0 (required): nombre del modelo con el que se quiere asociar. En
este caso con Alumno.
.conditions0: condiciones SQL que definen la relacin.
.order0: se utilizara para ordenar la asociacin en el modelo.
.foreign7ey0: es el nombre de la FK que apunta al modelo con el que est
asociado. En este caso en la tabla proyecto debe haber un campo con el
nombre alumno_id, pues ste ser la FK que habr que escribir en "foreign
key.
Arra*+
PBro*ectoQ )- Arra*+
PidQ )- @
PtituloQ )- Aplicacio0es Ve2
P0um_pa1i0asQ )- A??
6
Tutorial cakePHP
Palum0o_idQ ) A>
5
PAlum0oQ )- Arra*+
PidQ )- A>
P0om2reQ )- Carlos
PapellidoQ )- LirO0 LOpeJ
P(echa_0acimie0toQ )- <RSAH<<H<<
PemailQ )- carlosliro0Talu.umh.es
Ptele(o0oQ )- RU>G>?SR>
PaMo_matriculacio0Q )- A??G
P0ota_selecti&idadQ )- R/S
5
5
#i!ura 16. Re-ultado de la relaci'( N:1 e( %lu)(o 9 Pro9ecto
hasAndBelongToMany: N:N, de muchos a muchos. Siguiendo el ejemplo,
se dir que la relacin entre proyecto y alumno es de muchos a muchos,
por ello lo primero que hay que hacer es crear otra tabla llamada
"alumnos_proyectos. Despus tendremos que validar la relacin de N:N
en el modelo alumno.php. Vase figura 17.
.c#ass/a%e0 (required): nombre del modelo con el que se quiere asociar. En
este caso con Proyecto.
.8oin9a$#e0: anteriormente se ha comentado que en una relacin N:N se debe
crear otra tabla con el nombre de ambas y las FK de ambas (alumno_id,
proyecto_id), tambin se ha comentado que el nombre de esta tabla debera
estar en plural y en orden alfabtico. Pues mediante esta opcin "joinTable
permite poner el nombre de la tabla aunque no haya seguido el convenio de
CakePHP. Por ejemplo si en vez de llamarse alumnos_proyectos se hubiese
llamado universitario, mediante esta opcin, CakePHP podra trabajar con esa
tabla.
<?php
class Alum0o e4te0ds AppModel%
&ar '0ame ) ,Alum0o,6
&ar 'hasA0dBelo01sToMa0* )
arra*+,Bro*ecto, )-
arra*+,class!ame,)-,Bro*ecto,/
,Xoi0Ta2le, )-,alum0os_pro*ectos,/
,(orei10De*, )-,alum0o_id,/
,associatio0"orei10De*,)-,pro*ecto_id,/
,co0ditio0s, )-,,/
,order, )-,,/
7
Tutorial cakePHP
,limit, )-,,/
,u0i.ue, )-true/
,(i0derWuer*, )-,,/
,deleteWuer*, )-,,
5
56
9
?-
#i!ura 17. ,alidar relaci'( )ucho- a )ucho-
foreign7ey" nombre de la FK en el join table que apunta al modelo actual. En
este caso como el modelo es alumno, la FK ser alumno_id.
associationForeign7ey" nombre de la FK en el join table que apunta al modelo
asociado. En este caso como el modelo asociado es proyecto, pues la FK ser
proyecto_id.
.conditions0: condiciones SQL que definen la relacin.
.order0: se utilizara para ordenar la asociacin en el modelo.
.#i%it0: el nmero mximo de asociaciones que se quieren en un modelo.
'ni&'e" si es .tr'e0: duplica la asociacin entre objetos, con lo cual sern
ignorados los mtodos .accessors0 (metodos que acceden al contenido de los
objetos pero no los pueden modificar) y .&'ery0 (es una consulta, una
bsqueda en la base de datos().
finderQuery: especifica una sentencia completa en SQL para buscar
asociaciones.
.de#eteQ'ery0" sentencias en SQL que pueden eliminar asociaciones entre
modelos de muchos a muchos.
Arra*+
PAlum0oQ )- Arra*+
8
Tutorial cakePHP
PidQ )- A>
P0om2reQ )- Carlos
PapellidoQ )- LirO0 LOpeJ
P(echa_0acimie0toQ )- <RSAH<<H<<
PemailQ )- carlosliro0Talu.umh.es
Ptele(o0oQ )- RU>G>?SR>
PaMo_matriculacio0Q )- A??G
P0ota_selecti&idadQ )- R/S
5
PBro*ectoQ )- Arra*+
P?Q )- Arra*+
PidQ )- @
PtituloQ )- Aplicacio0es Ve2
P0um_pa1i0asQ )- A??
5
P<Q )- Arra*+
PidQ )- A?
PtituloQ )- Bases de Datos
P0um_pa1i0asQ )- <>?
5
5
5
#i!ura 18. Re-ultado de la relaci'( N:N e( %lu)(o 9 Pro9ecto
.. DE3%RRO<<O CON *SCAFFOLD+
Scaffold (o scaffo#ding, del ingls, andamio o andamiaje) es una utilidad de
CakePHP que se utiliza para desarrollar aplicaciones Web muy fcilmente. La
idea es poder disponer de todos los formularios para insercin, edicin y borrado
de los registros de cualquier tabla de la base de datos; mediante este mtodo,
CakePHP genera automticamente los listados y formularios necesarios para ello.
Los pasos a seguir para ello seran:
1) Crear la tabla te%as (tabla de ejemplo) en la base de datos, como
muestra en la figura 19. Los nombres de las tablas deben estar siempre
en plural.
2) Crear el controlador, donde se incorpora la opcin scaffolding, como se
muestra en la figura 20. Todos los controladores se crearn en la
carpeta []/proyectoca!e/app/contro##ers/. El nombre del fichero del
controlador para la tabla temas deber ser te%asContro##er.
C:EATE TABLE ;temas;+
;id; i0t+<?5 u0si10ed !T !=LL auto_i0creme0t/
;descripcio0; te4t+<??5 !T !=LL/
;tema_id; i0t+<?5/
9
Tutorial cakePHP
B:#MA:C DEC +;id;5
56
#i!ura 1:. Ta0la de *te)a+
<?php
class temasCo0troller e4te0ds AppCo0troller %
&ar '0ame ) ,temas,6
&ar 'sca((old6
9
?-
#i!ura ";. Co(trolador para la ta0la *te)a-+
3) Crear el modelo de la aplicacin como se indica en la figura 21. Todos
los modelos se crearn en la carpeta []/proyectoca!e/app/%ode#s/.
Ojo, la clase para el modelo de la tabla temas deber tener el mismo
nombre pero en singular, y la propiedad ;na%e debe tener el valor
Tema (en singular y la primera letra mayscula). El nombre del fichero
para el modelo de la tabla temas deber ser te%a.php.
<?php
class tema e4te0ds AppModel%
&ar '0ame ) ,Tema,6
9
?-
#i!ura "1. =odelo de la ta0la *te)a-+
Tras los pasos anteriores, escribiendo http"//#oca#host/proyectoca!e/te%as
dispondremos de las opciones para gestionar la tabla temas de nuestra base de
datos (figura 22).

#i!ura "". %plicaci'( para !e-ti'( de la ta0la *te)a-+
1. E>E=P<O CO=P<ETO
"!
Tutorial cakePHP
Ahora se va a explicar la forma en la que se puede realizar una pequea
aplicacin Web. Pero como antes ya se ha mencionado, esta herramienta trata
cuatro tipos de relaciones, por esta razn se va a dividir la base de datos en
fragmentos, para ir explicando cada relacin por separado.
Relaci'( de )ucho- a )ucho-: por ejemplo, libros y autores
Primer paso
Crear la base de datos, para CakePHP no es necesario que se haga con nnoDb,
tampoco se tienen que poner los campos relacionados en ambas tablas, es decir,
en la tabla autor no hay que poner libro_id, ni en libro hay que poner autor_id,
solamente hay que construir otra tabla donde estn estas dos foreign key.
En la figura 23 hay una muestra de dos tablas relacionadas de muchos a muchos.
A continuacin se va a ir explicando como se hara para la tabla autor, pero
tambin se hara exactamente igual para libro, solamente habra que cambiar los
nombre de las tablas.
Segundo paso
Crear los controladores de ambas tablas, recordar que el nombre de los
controladores deben ponerse en plural (pero el plural hay que formarlo en ingls),
por tanto dentro de la carpeta []/proyectoca!e/app/contro##ers/, hay que crear
dos archivos: autor-?co(troller.php y li0ro-?co(troller.php. Escribiendo en
cada una de ellas el cdigo que se realizar como el que se muestra en la tabla
figura 24.
C:EATE TABLE `autors`+
;id; i0t+<<5 !T !=LL auto_i0creme0t/
;0om2re; &archar+>?5 !T !=LL/
;apellido; &archar+>?5 !T !=LL/
;(echa_0acimie0to; date !T !=LL/
;(echa_de(u0cio0; date de(ault !=LL/
B:#MA:C DEC +;id;5
56
"
Tutorial cakePHP
C:EATE TABLE ;libros`+
;id; i0t+<?5 u0si10ed !T !=LL auto_i0creme0t/
;titulo; &archar+@>5 !T !=LL/
;0um_pa1i0as; &archar+@>5 !T !=LL/
;editorial_id; i0t+S5 u0si10ed !T !=LL/
B:#MA:C DEC +;id;5/
56
C:EATE TABLE `autors_libros`+
;id; i0t+<<5 !T !=LL auto_i0creme0t/
`autor_id` i0t+<<5 !T !=LL/
`libro_id` i0t+<<5 !T !=LL/
B:#MA:C DEC +;id;5
56
#i!ura ".. Relaci'( de ta0la- de N a N
<?php
class AutorsCo0troller e4te0ds AppCo0troller%
&ar '0ame ) ,Autors,6
9
?-
#i!ura "1. Co(trolador de %utor
Por otra parte, teniendo en cuenta que posteriormente en el formulario se querrn
incorporar funciones que estn en "htmlhelper (ayuda para crear formularios),
como son las funciones password, submit, input, etc. Por ello se incorporar en el
controlador una funcin, quedando finalmente como se muestra en la figura 25.
<?php
class AutorsCo0troller e4te0ds AppCo0troller%
&ar '0ame ) ,Autors,6
&ar $helpers ) arra*+,Etml,/ ,"orm,56
9
?-
#i!ura "4. Co(trolador de %utor
Tercer paso
Crear los modelos de ambas tablas, estos archivos se llamarn con el nombre de
la tabla en singular seguido de .php0, siguiendo el ejemplo, sern; .a'tor.php0,
""
Tutorial cakePHP
.#i$ro.php0. Estos archivo se crearan dentro de la carpeta []
/proyectoca!e/app/%ode#s/.
En la figura 26, se muestra como se hace un modelo de una tabla, pero un
modelo muy bsico, sobre l, posteriormente se irn insertando funciones, as
como para validando campos o relaciones entre tablas.
<?php
class Autor e4te0ds AppModel%
&ar '0ame ) ,Autor,6
9
?-
#i!ura "6. =odelo de %utor
Debido a que autor es una tabla relacionada N:N con libro, esto tendramos que
identificarlo en el modelo. Esta relacin se llama hasAndBelongToMany, en la
figura 24 se puede ver un ejemplo con la tabla autor.
<?php
class Autor e4te0ds AppModel%
&ar '0ame ) 'Autor'6
&ar 'hasAndBelongsToMany )
arra*+'Libro' )-
arra*+,class!ame, )- 'Libro'/
,Xoi0Ta2le, )- 'autors_libros'/
,(orei10De*, )- 'autor_id'/
,associatio0"orei10De*, )- 'libro_id'
5
56
9
?-
#i!ura "7. =odelo de %utor
En la figura 27, se aade la relacin de muchos a muchos, donde se dice que
est relacionada con la tabla libro, mediante la tabla .a'tors#i$ros0, tambin se
escribe la foreign key (autor_id) y la foreign key del modelo asociado (libro_id).
Pero si se deja tal como esta ahora, en la tabla libro se ver el identificador del
autor y no el nombre, que es lo que verdaderamente interesa, por ello se agregar
una funcin ms al modelo, obligndole as que en la asociacin de estas dos
tablas se pueda ver el nombre y no un nmero o identificador. Esto mismo
tambin se har en la tabla libro, donde en vez de querer la id se quiere que el
campo que se muestra sea el titulo del libro. Por tanto se tendr que agregar la
"#
Tutorial cakePHP
funcin +ar ;disp#ayFie#d2 <ca%pota$#a<0= a ambos modelos, poniendo en cada
modelo el campo que se quiere ver en la tabla relacionada.
//E0 el modelo Autor
&ar 'displa*"ield) ,0om2re,6
//E0 el modelo Li2ro
&ar 'displa*"ield) ,titulo,6
#i!ura "8. Ca)po a )o-trar e( la- ta0la- relacio(ada-
Cuarto paso
Crear la pgina principal de ambas tablas. Para ello se crear una funcin en el
controlador del autor, []/proyectoca!e/app/contro##era'torcontro##er.php/.,
escribiendo el cdigo que se muestra en la figura 29.
(u0ctio0 i0de4+5%
'thisH-AutorH-recursi&e ) ?6
'thisH-set+,autors,/ 'thisH-AutorH- (i0dAll+556
9
#i!ura ":. #u(ci'( i(de@ de autor
Una vez creada la clase, se crear el diseo de la pgina principal de Autor. Para
ello se tiene que crear una carpeta llamada autors, dentro []
/proyectoca!e/app/+iew/, quedando, []/proyectoca!e/app/+iew/
app/view/autors, creando dentro de la carpeta otro archivo llamado index.thtml,
donde se indican: el diseo de la pgina principal, los campos de las tablas, as
como los enlaces. Se adjunta un ejemplo en las figuras 30 y 31.
<h<-Lista de Autores</h<-
<ta2le-
//Titulo de la tabla, on los ampos de la misma!
<tr-
<th-#d</th-
<th-!om2re</th-
<th-Apellido</th-
<th-"echa de !acimie0to</th-
<th-"echa de De(u0ciO0</th-
<th-Cam2ios</th-
</tr-
//"atos de la base de datos por #ilas
<?php (oreach$$autors as $row%?-
<tr-
<td-<?php echo $row&'Autor''&'id''6?-</td-
<td-<?php echo $row&'Autor''&'nombre''6?-</td-
<td-<?php echo $row&'Autor''&'apellido''(?-</td-
"4
Tutorial cakePHP
<td-<?php echo $row&'Autor''&'#eha_naimiento''6?-</td-
<td-<?php echo $row&'Autor''&'#eha_de#union''6?-</td-
//)nlaes para* editar, eliminarlo o +er un registro!
<td-<?php echo 'htmlH-li03+,Nista,/
,/autors/&iew/,.'rowP,Autor,QP,id,Q56?-
<?php echo 'htmlH-li03+,Editar,/
,/autors/edit/,.'rowP,Autor,QP,id,Q56?-
<?php echo 'htmlH-li03+,Elimi0ar,/
,/autors/delete/,.'rowP,Autor,QP,id,Q56?-
</td-
</tr-
<?php e0d(oreach6?-
</ta2le-
//Lin, para rear un dato -ue+o, en este aso un autor
<ul-
<li-<?php echo 'htmlH-li03+,!ue&o Autor,/,/autors/add,56?-</li-
</ul-
#i!ura .;. Di-eAo de la pB!i(a autor
Como se puede ver en la figura 31, hay cuatro enlaces, vista, editar, eliminar y
nuevo, a continuacin ir se crearn las funciones para que funcionen.

#i!ura .1.PB!i(a Ce0 de autor
Quinto paso
Ahora se crear la vista de la tabla autor. Primero, al igual que antes se escribir
la funcin view (figura 32), dentro del controlador de la tabla autor ([]
/proyectoca!e/app/contro##es), y a continuacin el diseo de la pagina que se
"5
Tutorial cakePHP
crear dentro de []/proyectoca!e/app/+iews/a'tors y se llamar view.thtml
(figura 33).
"u0ctio0 &iew+'id5%
'thisH-set+,autors,/ 'thisH-AutorH-read+0ull/ 'id556
9
#i!ura .". #u(ci'( &ie e( el co(trolador
<h<-Nista del Autor</h<-
<ta2le-
//.aremos lo siguiente para todos los ampos de la tabla
<tr hei1ht)I@?p4I width)I<??p4I-
<td-<?php echo ,#dF,6?-</td-
<td-<?php echo 'autorsP,Autor,QP,id,Q6?-</td-</tr-
</ta2le-
///rear los enlaes neesarios
<ul-
<li-<?php echo 'htmlH-li03+,EditarAutor,/
,/autors/edit/,.'autorsP,Autor,QP,id,Q5 ?-</li-
</ul-
...
#i!ura ... Di-eAo de la &i-ta del autor

#i!ura .1.PB!i(a Ce0 de la &i-ta del autor
Sexto paso
A continuacin se crear la funcin para crear un autor nuevo (funcin add).
Como anteriormente, primero se crea la funcin en el controlador y
posteriormente el diseo. Ver figuras 35, 36 y 37.
En la figura 35 se muestra una funcin para crear un nuevo autor, cuando la tabla
no tiene ninguna relacin con otra tabla. Pero la tabla "autor esta relacionada con
otra tabla, entonces hay que crear una variable autorArray para que se pueda ver
en una tabla los datos de la otra, como en la figura 36, que sera la funcin
completa, donde se indica en negrita el cdigo necesario para una relacin N:N.
"6
Tutorial cakePHP
(u0ctio0 add+5
%
i(+empt*+'thisH-data55%
'thisH-set+,autors,/ 0ull56
9
else
%
'thisH-clea0=p"ields+56
i(+'thisH-AutorH-sa&e+'thisH-data55
%
//redireccio0a a otra p81i0a dicie0do .ue se ha 1uardado
//'thisH-(lash+,=suario 1uardado.,/,/autors/i0de4,56
//redireccio0a a la misma p81i0a
'thisH-redirect+,autors/i0de4,56
9
else
%
'data ) 'thisH-data6
'thisH-set+,autors,/ 'data56
9
9
9
#i!ura .4.#u(ci'( para aAadir u( autor. 3i( ta0la- relacio(ada-
(u0ctio0 add+5
%
i(+empt*+'thisH-data55
%
$this01set$'libroArray', $this01Autor01Libro01generateList$''%%(
$this01set$'seletedLibro', null%(
9
else
%
'thisH-clea0=p"ields+56
i(+'thisH-AutorH-sa&e+'thisH-data55
%
'thisH-redirect+,autors/i0de4,56
9
else
%
'data ) 'thisH-data6
'thisH-set+,autors,/ 'data56
$libro 2 null(
$this01set$'libroArray',$this01Autor01Libro01generateList$%%(
i#$isset$$data&'Libro''&'Libro''%%
3
#oreah$$data&'Libro''&'Libro'' as $+ar%
3
$libro&$+ar' 2 $+ar(
4
4
$this01set$'seletedLibro', $libro%(
9
9
9
#i!ura .6. #u(ci'( para aAadir u( autor. Co( ta0la- relacio(ada-
"7
Tutorial cakePHP
Una vez realizada la funcin, hay que hacer el diseo, al igual que antes, se
crear el archivo add.thml dentro de []/proyectoca!e/app/+iew/a'tors.
En la figura 37, se ha escrito el cdigo para hacer el diseo. A continuacin se
explicar algunas funciones de la figura anterior, como son las siguientes:
<di& class)5re6uired51
En la lnea anterior se especifica si el campo es opcional u obligatorio (requerido).
Si es opcional se pondr optional, y si es obligatorio se escribir required. Pero
con poner required en el cdigo no es suficiente para obligar al usuario a escribir
algo en dicho campo, para ello tendremos que volver al modelo de la tabla y
validar los campos obligatorios, como se muestra en la figura 38.
<h<-!ue&o Autor</h<-
<(orm actio0)I/pro*ecto_ca3/autors/addI method)IBSTI-
/777777777777777777/rear ampo para el nombre777777777777777777/
<di& class)5re6uired51
<la2el (or)5autor_nombre51!om2reF</la2el-
<?php echo 'htmlH-input+,Autor/0om2re,/ arra*+,siJe, )- ,>?,556?-
<?php echo 'htmlH-tag)rrorMsg+,Autor/0om2re,/,!om2re 0o &8lido,56?-
<2r-
</di&-
/77777777777777777777777777777777777777777777777777777777777777/
/777777777777777777/rear ampo de #eha777777777777777777777777/
<di& class)IoptionalI-
<la2el (or)Iautor_#eha_de#unionI-"echa de De(u0ciO0F</la2el-
<?php echo 'htmlH-dateTime7ptionTag+,Autor/(echa_0acimie0to,/
'"M8','-7-)'56?-
</di&-
/77777777777777777777777777777777777777777777777777777777777777/
/7777777777/rear ampo relaionado on otra tabla77777777777777/
<di& class25optional5-
<la2el (or)5libro_libro5-Li2ros relacio0adosF</la2el-
<?php echo 'htmlH-seletTag$'Libro/Libro', $libroArray,
$seletedLibro,
array$'multiple'21'multiple'/true/
,siJe, )- ,<?,5/ 0ull/ (alse56?-
<?php echo 'htmlH-ta1ErrorMs1+,Li2ro/Li2ro,/,"echaF CCCCHMMHDD,56?-
<2r-
</di&-
/77777777777777777777777777777777777777777777777777777777777777/
<di& class)Isu2mitI-<i0put t*pe)Isu2mitI &alue)IAddI /-</di&-
</(orm-
<ul-
<li-<?php echo 'htmlH-li03+,Lista de autores,/ ,/autors/i0de4,5?-</li-
</ul-
#i!ura .7. Di-eAo para crear u( (ue&o autor
"8
Tutorial cakePHP
&ar '&alidate ) arra*+,0om2re,)-NAL#D_!T_EMBTC/
,apellido,)-NAL#D_!T_EMBTC/
,(echa_0acimie0to,)-NAL#D_!T_EMBTC/56
#i!ura .8. ,alidar ca)po- del /or)ulario autor
Una vez explicado como se validan los campos, se continuar en la figura 37.
Como se ha dicho, la primera lnea se utiliza para decir si un campo es obligatorio
u opcional, a continuacin la segunda lnea sirve para poner el nombre del campo
en la tabla, como por ejemplo la lnea siguiente.
La2el (or)5autor_nombre51!om2reF</la2el-
En la lnea siguiente se especifica el tipo de campo necesario, en este caso para
escribir el nombre el autor, se necesita un cuadro de texto, que se llama input,
como en la siguiente lnea de cdigo.
<?php echo 'htmlH-input+,Autor/0om2re,/arra*+,siJe,)-,>?,556?-
Si en vez de ser un campo de texto fuese una fecha, el campo se llamara
"dateTimeOptionTag, como se muestra en el campo "fecha de nacimiento de la
figura 36, donde tambin se puede especificar el orden de la fecha (date) "DMY,
"YMD, "MDY, y el tiempo (time) se puede poner: "12 (12 horas), "24 (24 horas)
o "none (para que no aparezca el tiempo).
En el caso que fuese un campo de otra tabla, como en el caso libro-autor, el
campo necesario es selectTag, seguido de la tabla donde esta / y otra vez la tabla
donde esta situado, aadiendo $nombre_de_la_tabla_array, (variable definida en
el controlador), seguido de $selected_nombre_de_la_tabla, como se muestra en
la siguiente lnea.
<?php
echo 'htmlH-seletTag$'Libro/Libro', $libroArray, $seletedLibro,
array$'multiple'21'multiple'/true/,siJe,)-,<?,5/
0ull/ (alse56
?-
Por ultimo solo faltara escribir un mensaje de error para indicarle al navegador
que los datos del formulario los ha escrito incorrectamente. Esto se hara con una
lnea de cdigo, como se muestra a continuacin.
"9
Tutorial cakePHP
<?php echo 'htmlH-tag)rrorMsg+,Autor/0om2re,/ ,!om2re 0o &8lido,56?-
Sptimo paso
Ahora se crear la funcin .edit0, para modificar los datos, esta funcin es muy
parecida a la anterior con la peculiaridad que en sta, se tiene que pasar la .id0 del
formulario, para poder ver los datos y modificarlos. En la figura 40, se muestra la
modificacin respecto a la funcin add, a partir del "else se hara lo mismo para
ambas funciones, .add0 y .edit0.
Para hacer el diseo de la pagina .edit0 (modificar), se debe hacer el mismo
formulario que para .add0 (nuevo), con la diferencia que se tiene que pasar la .id0
en la primera lnea de cdigo, tal como se muestra en la figura 41 y a continuacin
sera igual que en el cdigo de .edit0. Este archivo se debe crear como el resto,
dentro de []/proyectoca!e/app/+iew/a'tors y llamarse .edit.tht%#0.
#i!ura .:. #or)ulario para crear u( (ue&o autor
(u0ctio0 edit+'id ) 0ull5%
i(+empt*+'thisH-data55%
'thisH-AutorH-id ) 'id6
'thisH-data ) 'thisH-AutorH-read+56
'data) 'thisH-AutorH-read+0ull/ 'id56
'thisH-set+,li2ros,/ 'data56
'li2ro ) 0ull6
'thisH-set+,li2roArra*,/ 'thisH-AutorH-Li2roH-1e0erateList+556
(oreach+'dataP,Li2ro,Q as '&ar5%
'li2roP'&arP,id,QQ ) '&arP,id,Q6 9
#!
Tutorial cakePHP
'thisH-set+,selectedLi2ro,/ 'li2ro569
else%
//a partir de a6u9 igual 6ue la #uni:n add%
#i!ura 1;. #u(ci'( editar para autor
<?php echo 'htmlH-(ormTa1+,/autors/edit/,.'htmlH
-ta1Nalue+,Autor/id,556?-
#i!ura 11. C'di!o para leer u(a id
#i!ura 1". #or)ulario para )odi/icar u( autor
Octavo paso
Por ltimo quedara por hacer la funcin .de#ete0 (eliminar), la cual debe
introducirse tambin dentro del controlador autor y la funcin ser la que adjunto
en la figura 43.
"u0ctio0 delete+'id5%
'thisH-AutorH-del+'id56
'thisH-redirect+,autors/i0de4,569
#i!ura 1.. #u(ci'( para 0orrar lo- autore-
Relaci'( de )ucho- a u(o: aqu se estudiar un ejemplo de relacin N:1, para
ello se crearan dos tablas: editorial y libro (una editorial, muchos libros). Al ser una
relacin de N:1, los formularios de la tabla editorial no tendra ninguna
peculiaridad, mientras que los de libro si, la pgina de editoriales se hara normal
mientras que la de libro sera un poco diferente. Ya que en libro habra que crear
#
Tutorial cakePHP
la relacin entre tablas, indicando el tipo de relacin que es, y posteriormente en
la tabla libro estara la clave fornea a editorial, la cual tendramos que indicarla.
Primer paso
Crear la tabla libro, como en ella, editorial es una foreign key, pues dicho campo
habra que escribirlo en singular y seguido de .id0, de la siguiente forma:
.editoria#id0. En la figura 44 se muestra la tabla libro

id
titulo
num_paginas
editorial_id
Libro
#i!ura 11. Ta0la li0ro
Segundo paso
Crear el controlador de libro, se hara igual que en el ejemplo anterior
Tercer paso
Crear el modelo del libro, teniendo en cuenta que es una relacin N:1, por lo
tanto, se crear la relacion BelongsTo en el modelo. Ver figura 45.
&ar '2elo01sTo ) arra*+
,editorial, )-
arra*+,class!ame, )- ,Editorial,/
,co0ditio0s, )- ,,/
,order, )- ,,/
,(orei10De*, )- ,,/
,cou0terCache, )- ,,5/56
#i!ura 14. Relaci'( N:1 e( <i0ro
Cuarto paso
#"
Tutorial cakePHP
Crear la pgina principal, para ello se crear el index en el controlador de libro, y
luego la pagina index.thtml(como en el ejemplo de N:N). Pero en el index thtml se
tendr en cuenta que el campo editorial es una FK, por lo tanto no se puede poner
$row[nombre de la tabla][nombre del campo] de esta tabla, sino el nombre de la
tabla editorial y el nombre del campo de la tabla editorial tambin, quedando como
en la figura 46.
<td-<?php echo 'rowP,Li2ro,QP,id,Q6?-</td-
<td-<?php echo 'rowP,Li2ro,QP,titulo,Q6?-</td-
<td-<?php echo 'rowP,Li2ro,QP,0um_pa1i0as,Q6?-</td-
<td-<?php echo $row&'editorial''&'nombre''(;1</td1
#i!ura 16. =o-trar ca)po de otra ta0la
Dando como resultado un formulario como el que se muestra en la figura 44.

#i!ura 17. Relaci'( N:1 e( <i0ro
En la figura 47, y en concreto en la columna de editorial, se puede ver que en
editorial no muestra los "identificadores (1, 2, 3,) sino los nombres de las
editoriales.
Quinto paso
En este paso se crear la vista del libro, se har exactamente igual que en el
ejemplo anterior, pero en el .+iew.tht%#0 (el diseo de libro), se modificar el campo
##
Tutorial cakePHP
de la editorial ya que de lo contrario mostrara el identificador. Adems de agregar
eso tambin se puede agregar un link en html para que al pulsar redireccione a la
pgina de la vista de la editorial. Despus de los cambios, el formulario se
quedara como en la figura 48.
<tr-<td-<?php echo ,EditorialF, ?-</td-
<td-<?php echo $html01lin,$$libros&'editorial''&'nombre'',
5/editorials/+iew/5!$libros&'Libro''&'editorial_id''56?-</td-
</tr-
#i!ura 18. =o-trar el (o)0re de la- editoriale- e( li0ro
Una vez realizado quedar como en la figura 49
Sexto paso
En este paso se tendr que crear la funcin dentro del controlador para aadir
libros nuevos, esta funcin cambiar, con respecto a las anteriores. Ver figura 50.

#i!ura 1:. ,i-ta del <i0ro
(u0ctio0 add +5%
i(+empt*+'thisH-data55%
$this01set$'editorialArray',
$this01Libro01)ditorial01generateList$%%(
'thisH-set+,li2ros,/ 0ull56
9
else%
i(+'thisH-Li2roH-sa&e+'thisH-data55
'thisH-redirect+,li2ros/i0de4,56
else%
'data ) 'thisH-data6
'thisH-set+,li2ros,/ 'data56
'li2ro ) 0ull6
$this01set$'editorialArray',
$this01Libro01)ditorial01generateList$%%(
9
9
9
#4
Tutorial cakePHP
#i!ura 4;. #u(ci'( *(ue&o+ DaddE del li0ro
Respecto a la pgina add.thtml se quedara como en el ejemplo anterior, haciendo
un pequeo cambio en el campo editorial. En dicho campo se necesitar un
select, por ello se escribir .se#ect9ag0 seguido del nombre_tabla/nombre_campo
de la tabla relacionada. Ver figura 51.
<di& class)Ioptio0alI-
<la2el (or)Ili2ro_editorial_idI-EditorialF</la2el-
<?php echo 'htmlH-seletTag$'Libro/editorial_id',
$editorialArray,
array$'id' 21 'libro_editorial_id,/ ,siJe, )- ,<,556 ?-
</di&-
#i!ura 41. E-cri0ir u(a #F e( u( /or)ulario
Sptimo paso.
Al igual que en el sexto paso habra que cambiar las funciones en la que aparece
editorial, por tanto se cambiar tanto el controlador como la funcin edit.thtml. Ver
figuras 52 y 53.
"u0ctio0 edit+'id5
%
i(+empt*+'thisH-data55
%
'thisH-Li2roH-id ) 'id6
'thisH-data ) 'thisH-Li2roH-read+56
'data )'thisH-Li2roH-read+0ull/ 'id56
'thisH-set+,li2ros,/ 'data56
$this01set$'editorialArray',
$this01Libro01)ditorial01generateList$%%(
9
else
%
i(+'thisH-Li2roH-sa&e+'thisH-data55
%
'thisH-redirect+,li2ros/i0de4,56
9
else
%
'data ) 'thisH-data6
'thisH-set+,li2ros,/ 'data56
$this01set$'editorialArray',
$this01Libro01)ditorial 01generateList$%%(
9
9
9
#i!ura 4". #u(ci'( editar de <i0ro
#5
Tutorial cakePHP
<di& class)Ioptio0alI-
<la2el (or)Ili2ro_editorial_idI-Editorial</la2el-
<?php
echo 'htmlH-seletTag$'Libro/editorial_id', $editorialArray,
$libros&'Libro''&'editorial_id'',
array$'id'21'libro_editorial_id'/,siJe,)-,?,556
?-
</di&-
#i!ura 4.. Di-eAo de la pB!i(a para editar el li0ro
En la figura 53, adems de poner el .se#ectag0, tambin tendramos que pasarle la
id de ese libro y adems debera mostrarlo, por ello la funcin no es igual en
nuevo y en editar.
Ta0la U-uario
Para realizar la tabla usuarios se har igual que las anteriores, por ello solo se
comentarn las peculiaridades de esta tabla.
El campo mas importante de esta tabla es el de la contrasea. Para que en dicho
campo "password escriba asteriscos en vez de letras es suficiente con indicarlo
en el formulario, poniendo password delante del campo, como se indica a
continuacin.
<?php
echo 'htmlH-passwordTa1+,=suario/password,/arra*+,siJe,)-,@?,556
?-
#i!ura 41. Ca)po pa--ord e( el /or)ulario de editar 9 (ue&oDedit 9 addE
#i!ura 44. Ca)po pa--ord
Tambin se puede encriptar la contrasea, para que en la base de datos no se
pueda ver, mediante la funcin en PHP que se adjunta en la figura 56.
#6
Tutorial cakePHP
'thisH-dataP,=suario,QP,password,Q ) md>+'thisH-
dataP,=suario,QP,password,Q56
#(+'thisH-=suarioH-sa&e+'thisH-dataP,=suario,Q55
#i!ura 46. #u(ci'( para e(criptar
La funcin de la figura 56, se escribir tanto en insertar un campo nuevo, como en
editar un campo, quedando en la lista de usuarios, tal como se muestra en la
figura 57.
#i!ura 47. <i-ta de u-uario-
En dicha tabla, entre otros campos, est el campo e-mail, dicho campo se ha
validado (en el modelo de la clase usuario) como un campo email, con lo cual se
asegura que el campo tenga una "@ y un"., en el caso de faltarle alguna de las
dos exigencias de un campo email, mostrara un error como en la figura 58
#i!ura 48. Ca)po e)ail
4. %G%DIR #UNCION%<ID%D
Debido a la gran flexibilidad que muestra este programa, se va a crear una
funcin ms. Dicha funcin consiste en crear en las vistas de las tablas que estn
relacionadas mediante una asociacin de N:N, todos los campos de una y otra
tabla. Por ejemplo dentro de la tabla libro (siguiendo el ejemplo anterior), se
mostrar todos los autores, con todos los campos de cada autor. Para ello es
suficiente con hacer una funcin dentro de la vista de libro como la que se
muestra en figura 59.
<hA-Autores relacio0ados</hA-
<?php i(+isset+'li2rosP,Autor,QP,?,Q5YYis_arra*+'li2rosP,Autor,Q55F?-
<ta2le-<tr-
<?php (oreach +'li2rosP,Autor,QP,?,Q as 'colum0 )- '&alue5F?-
<th-<?php echo 'colum06?-</th-
<?php e0d(oreach6?-
#7
Tutorial cakePHP
<th-Accio0es</th-</tr-
<?php (oreach +'li2rosP,Autor,Q as 'row5F?- <tr-
<?php (oreach +'row as 'colum0 )- '&alue5F?-
<td-<?php echo '&alue?-</td-
<?php e0d(oreach6?-
<?php i( +isset+'thisH-co0trollerH-Li2roH-Autor55F?-<td-
<?php echo 'htmlH-li03+,Niew,/,/autors/&iew/,.
'rowP'thisH-co0trollerH-Li2roH-AutorH-primar*De*Q56?-</td-
<?php elseF?-
<td
<?php echo 'htmlH-li03+,Niew,/,/autors/&iew/,.
'rowP'thisH-co0trollerH-Li2roH-primar*De*Q56?-
<ul-
<li-<?php echo 'htmlH-li03+,!ue&o Autor,/,/autors/add/,56?-</li-
</ul-
#i!ura 4:. Relaci'( de todo- lo- ca)po- de u(a ta0la
En la figura 60 se muestran los autores relacionados con el libro "lo mejor en
PHP.
#i!ura 6;. Relaci'( e(tre ta0la-
6. DI3EGO DE <% %P<IC%CIN
A pesar que cakePHP incorpora estilos CSS, se disear otro posible estilo de
diseo, para ello utilizaremos programas de diseo, estilos CSS, as como tablas,
vietas, etc.
CakePHP lleva incorporado una hoja de estilos situada dentro de []
/proyectoca!e/app/webroot/css, es una hoja de estilos muy completa, con varios
estilos para los campos: input, select, etc
#8
Tutorial cakePHP
Tambin se va a comentar la forma de hacer los link, esto se hara con la funcin
link, (funcin ya creada por cakePHP), seguido del nombre que queramos que
aparezca en el diseo y despus del nombre de la carpeta, es decir el nombre de
la tabla, seguido del archivo que queramos enlazar (index, edit, add, view). Como
muestro en la siguiente lnea.
<?php echo 'htmlH-li03+,Autor,/I/autors/I5?-
Para empezar con la aplicacin lo primero que se va a disear ha sido una
cabecera, as como un men y un pie de pgina. Todo ello solo se hara en una
pgina, llamada default, que se encuentra en []
/proyectoca!e/libs/view/templates/layouts, en la figura 61 se adjunta un posible
ejemplo de pgina default.
<di+ id25header51
<?php echo 'htmlH-ima1e+,titulo.p01,56?-
</di&-
<di&-
<td-
<ul class25menu51
<li-<?php echo 'htmlH-li03+,Autor,/I/autors/I56?-</li-
</ul-
</td-
</di&-
<di+ id25ontent51
<?php i( +'sessio0H-chec3+,Messa1e.(lash,55
'sessio0H-(lash+56
echo 'co0te0t_(or_la*out6?-
</di&-
<di+ id25#ooter51
<?php echo 'htmlH-ima1e+,(ooter.p01,56?-
</di&-
#i!ura 61. PB!i(a de/ault
Teniendo realizado el cdigo de la figura 61, en las siguientes pginas solo se
crear el contenido de la pgina, as como por ejemplo crear el contenido de la
pgina principal, solo habr que ir a la pgina "home, situada en []
/proyectoca!e/libs/view/templates/pages y escribir lo necesario, quedando como
se puede ver en la figura 62.
#9
Tutorial cakePHP
#i!ura 6". PB!i(a Pri(cipal
En las figuras siguientes se mostrarn las distintas vistas de esta aplicacin.
#i!ura 6.. #or)ulario de u(a li-ta de dato-
4!
Tutorial cakePHP
#i!ura 61. ,i-ta -e(cilla de u( dato de cualHuier ta0la
#i!ura 64. #or)ulario para editar
#i!ura 66. ,i-ta co)ple5a de u( dato
En la figura 66, se ven las vistas de un dato relacionado con dos tablas, en este
caso la vista de libro donde se ven autores y temas relacionados. Por cada libro
seleccionado saldra todos los datos del libro, as como todos los datos del autor
relacionado y de todos los temas relacionados tambin con dicho libro
4

También podría gustarte