Está en la página 1de 211

Kumbia PHP

Framework
Porque Programar debera ser ms
fcil
Libro de Kumbia: Porque Programar debera ser ms fcil 1
ndice de contenido
1 Agradecimientos1!
! "ntroducci#n1$
$ %obre &l Libro de Kumbia1'
( )*ue+o en uso de Frameworks,1-
(1 ).u/ 0ace un Framework,1-
(! 1eali2ar a3licaciones orientadas a 4suarios 1-
($ )Por qu/ Kumbia 5 no otro Framework, 1-
' %obre Kumbia16
- Kumbia en su Punto17
-1 "ntroducci#n 17
-! ).u/ es un Framework, 17
6 Kumbia +s 8tros Frameworks19
7 ).u/ es Kumbia,!:
9 )&st 0ec0o kumbia 3ara m,!!
1: *ue+e 1a2ones 3ara 4sar Kumbia!$
11 "nstalando Kumbia!(
111 Prerrequisitos !(
11! "nstalando !(
11$ ;onfiguraci#n de A3ac0e !(
11$1 )Por qu/ es im3ortante <od=1ewrite,!'
11( ;onfiguraci#n de PHP!-
11' Porque Kumbia utili2a PHP',!-
11- ;onfiguraci#n de <5%.L !-
116 "nstalaci#n 5 ;onfiguraci#n con 8racle !-
117 >etalles &s3ecficos 3ara %8 !6
1! ;reaci#n de Pro5ectos!7
1!1 "ntroducci#n !7
1!! "niciar un Pro5ecto !7
1!$ >irectorios de Kumbia !7
1!( 8tros >irectorios !7
1!' 1esumen !7
1$ &?3licando la ;onfiguraci#n!9
1$1 "ntroducci#n !9
0tt3:@@wwwassemblacom@wiki@s0ow@kumbia@Parte1=;a3itulo(!9
1( A 3artir de un <odelo <A;!9
1' &?3licando la "m3lementaci#n <A;$:
1'1 "ntroducci#n $:
1'! ;once3tos $1
1'$ &Bem3lo $1
1- Primera A3licaci#n en Kumbia$!
&l 3resente ca3tulo tiene como obBeti+o entender la creaci#n de una 3rimera a3licaci#n usando
KumbiaC que nos ser+ir 3ara entender la arquitectura <A; 5 algunos caractersticas
interesantes $!
*uestra Primera A3licaci#n$!
16 <odelos 5 Dases de >atos en Kumbia$!
161 "ntroducci#n $!
16! ;a3a de Abstracci#n "nde3endiente $!
16$ Ada3tadores Kumbia $!
17 &squema de Acceso a Dases de >atos en Kumbia $$
171 <odelos $$
19 Acceso >irecto a 1>D<%$(
191 La ;lase >dDase $(
19! ;rear una instancia de >bDase $(
Libro de Kumbia: Porque Programar debera ser ms fcil !
4so de la Funci#n DbDase::rawEconnectFG $(
19$ Pro3iedades de la ;lase >bDase$(
19$1 Hdb=I"dE;onnection$(
19$! Hdb=Ilast1esult.uer5 $(
19$$ Hdb=Idb4ser$(
19$( Hdb=IdbHost $(
19$' Hdb=IdbPort $(
19$- Hdb=IdbPass $(
19$6 Hdb=Ilast&rror $'
19$7 Hdb=Idb*ame $'
19( </todos de la ;lase >D $'
19(1 .uer5 $'
;lose $'
19(! Fetc0 Arra5 $'
19($ *um 1ows $-
Field *ame $-
19(( >ata %eek $-
19(' Affected 1ows $-
19(- &rror $-
19(6 *o &rror $6
19(7 Find $6
19(9 "n .uer5 $6
19(1: "n .uer5 Assoc $6
19(11 "n .uer5 *um $7
19(1! Fetc0 8ne $7
19(1$ Jable &?ists $7
!: )Por qu/ usar una ca3a de Abstracci#n,$9
!1 La Aida sin Acti+e1ecord(:
!! KParmetros con *ombreL(1
!$ Acti+e1ecord(!
!$1 AentaBas del Acti+e 1ecord (!
!$! ;rear un <odelo en Kumbia (!
;olumnas 5 Atributos (!
!$$ Lla+es Primarias 5 el 4so de ">s ($
!$( ;14>: ;reate F;rearGC 1ead FLeerGC 43date FActuali2arGC >elete FDorrarG ($
!$(1 ;reando 1egistros ((
!$(! ;onsultando 1egistros ((
!$($ &l 3oderoso Find ('
!$(( PromedioC ;ontandoC %umandoC <nimo 5 <?imo (-
!$(' Actuali2ando 1egistros e?istentes (-
!$(- Dorrando 1egistros (6
!$(6 Pro3iedades %o3ortadas(6
!$' ;on+enciones en Acti+e1ecord(6
!$'1 ;on+enciones Menerales (6
!$'! "d (6
!$'$ cam3oEid (6
!$'( cam3oEat (7
!$'' cam3oEin (7
!$- ;on+enciones 3ara 1>D<s (7
!$-1 ;on+enciones &s3eciales 3ara Postgre%.L (7
!$-! ;on+enciones &s3eciales 3ara 8racle (7
!( Acti+e 1ecord AP"(9
!(1 ;onsulta (9
!(11 distinct (9
!(11 findEallEb5Esql Fstring HsqlG (9
Libro de Kumbia: Porque Programar debera ser ms fcil $
!(1! findEb5Esql Fstring HsqlG (9
!(1$ findEfirst ':
!(1( find '1
!(1' selectEoneFstring HselectEquer5G '!
!(1- selectEoneFstring HselectEquer5G FstaticG '!
!(16 e?ists '!
!(17 findEallEb5'!
!(19 findEb5ENcam3oN'!
!(11: findEallEb5ENcam3oN'!
!(! ;onteos 5 %umatorias '$
!(!1 count'$
!(!! sum'$
!(!$ countEb5Esql'$
!($ PromediosC <?imos 5 <inmos '$
!($1 a+erage'$
!($! ma?imum '$
!($$ minumum '$
!(( ;reaci#n@Actuali2aci#n@Dorrado de 1egistros'(
!((1 create '(
!((! u3date '(
!(($ u3dateEall '(
!((( sa+e '(
!((' createEfromErequest '(
!((- sa+eEfromErequest ''
!((6 delete ''
!((7 deleteEall ''
!(' Aalidaciones''
!('1 +alidatesE3resenceEof ''
!('! +alidatesElengt0Eof ''
!('$ +alidatesEnumericalit5Eof '-
!('( +alidatesEemailEin '-
!('' +alidatesEuniquenessEof '-
!('- +alidatesEdateEin '6
!('6 +alidatesEformatEof '6
!(- Jransaccionalidad '6
!(-1 commitFG '6
!(-! beginFG '6
!(-$ rollbackFG '7
!(6 8tros <etodos '7
!(61 sqlFstring HsqlG '7
!(7 ;allbacks en Acti+e1ecord'7
!(71 beforeE+alidation'9
!(7! beforeE+alidationEonEcreate'9
!(7$ beforeE+alidationEonEu3date '9
!(7( afterE+alidationEonEcreate '9
!(7' afterE+alidationEonEu3date '9
!(7- afterE+alidation '9
!(76 beforeEsa+e '9
!(77 beforeEu3date'9
!(79 beforeEcreate'9
!(71: afterEu3date -:
!(711 afterEcreate-:
!(71! afterEsa+e -:
!(71$ beforeEdelete-:
!(71( afterEdelete -:
Libro de Kumbia: Porque Programar debera ser ms fcil (
!(9 Persistencia-1
!(1: Jra2a 5 >ebug en Acti+e1ecord-!
!(11 Jra2a en Pantalla -!
!(1! <ostrar &rrores en 8bBetos Acti+e1ecord -$
!(1$ Asociaciones-$
);omo usar Asociaciones,-(
!(1$1 Pertenece a-(
!(1$! Jienes un-'
!(1$$ Jiene muc0os--
!(1$( Jiene 5 3ertenece a muc0os-6
!(1( <ulti3les cone?iones en Acti+e1ecord-7
!(1' Paginadores-9
!(1- Paginando en Acti+e1ecord6:
!(16 Acti+e1ecord 5 los ;am3os con Aalores 3or >efecto6!
!' Meneraci#n >e Formularios6$
!'1 Ji3os de Formularios 6$
!'! AentaBas Meneradores de Formularios 6$
!'$ >es+entaBas Meneradores de Formularios 6(
!- %tandardForm6'
!-1 "ntroducci#n 6'
!-! ;rear un controlador 3ara el Formulario Album6'
!-$ ;on+enciones de los *ombres de las ;olumnas 6-
!-$1 id 6-
!-$! tablaEid 6-
!-$$ cam3oEat 6-
!-$( cam3oEin 66
!-$' email66
!-( ;om3ortamiento de un Formulario %tandard 66
!-' Pro3iedades de un Formulario %tandard 66
!-'1 Hscaffold FJrue o FalseG 66
!-'! Hsource66
!-'$ Hforce67
!-- </todos de la ;lase %tandardForm 67
!--1 setEformEca3tionFHtitleG 67
!--! useE0el3erFHcam3oG 67
!--$ setEt53eEtimeFHcam3oG 69
!--( setEt53eEte?tareaFHcam3oG 69
!--' setEt53eEimageFHcam3oG 69
!--- setEt53eEnumericFHcam3oG 69
!--6 setEt53eEdateFHcam3oG 69
!--7 setEt53eEemailFHcam3oG 69
!--9 setEt53eE3asswordFHcam3oG 7:
!--1: setEte?tEu33erFHcam3oG 7:
!--11 setEcomboEstaticFHcamoC arra5 H+aloresG 7:
!--1! setEcomboEd5namicFHcam3oC HtablaC Hcam3o>etalleC OcolumnErelation: Hcam3oPG
7:
!--1$ ignoreFHcam3oG 71
!--1( setEsi2eFHcam3oC Hsi2eG 71
!--1' setEma?lengt0FHcam3oC Hlengt0G 7!
!--1- notEbrowseFHcam3oC QHcam3o!C RG 7!
!--16 notEre3ortFHcam3oG 7!
!--17 setEtitleEimageFHimG 7!
!--19 fieldsE3erErowFHnumberG 7!
!--!: unableEinsert 7!
!--!1 unableEdelete 7!
Libro de Kumbia: Porque Programar debera ser ms fcil '
!--!! unableEu3date 7!
!--!$ unableEquer5 7!
!--!( unableEbrowse 7$
!--!' unableEre3ort 7$
!--!- routeEtoFHcontrollerCHactionCHidG 7$
!--!6 setE0iddenFHcam3oG 7$
!--!7 setEquer5Eonl5FHcam3oG 7$
!--!9 setEca3tionFHcam3oC Hca3tionG 7$
!--$: setEactionEca3tionFHactionC Hca3tionG 7$
!--$1 setEe+entFHactionC Hca3tionG 7(
!--$! setEattributeFHfieldC HattributeCH+alueG 7(
!--$$ s0owEnotEnullsFG7(
!--$( setEmessageEnotEnullFHmessageG 7(
!-6 &+entos del lado del ;liente F;allbacksG 7'
!-61 beforeEenableEinsert7'
!-6! afterEenableEinsert 7'
!-6$ beforeEenableEu3date 7'
!-6( afterEenableEu3date 7'
!-6' beforeEenableEquer5 7'
!-6- afterEenableEquer5 7'
!-66 beforeE+alidation 7'
!-67 afterE+alidation 7'
!-69 beforeEinsert 7'
!-61: beforeEu3date 7'
!-611 beforeEquer5 7'
!-61! beforeEre3ort 7-
!-61$ beforeEcancelEin3utFactionG 7-
!-7 &+entos del lado del %er+idor F;allbacksG 76
!-71 beforeEinsert 76
!-7! afterEinsert 77
!-7$ beforeEu3date 77
!-7( afterEu3date 77
!-7' +alidation 77
!-7- beforeEdelete 77
!-76 afterEdelete 77
!-77 beforeEfetc0 77
!-79 afterEfetc0 77
!-9 JrabaBando con "mgenes 79
!-1: Aalidaciones FA ni+el de ;am3oG 79
!-11 ;ombos &stticos 9:
!-1! ;ambiando el as3ecto de Formularios %tandardForm9:
!6 ;ontroladores9!
!61 &Bem3lo 9$
!6! ;reaci#n de un ;ontrolador 9$
!7 A33lication;ontroller9(
!71 </todos de la ;lase A33lication;ontroller 9'
!711 renderFH+iewG 9'
!71! redirectFHurlC HsecondsS:'G 9'
!71$ 3ostFH+alueG 9'
!71( getFH+alueG 9-
!71' requestFH+alueG 9-
!71- renderE3artialFHnameG 9-
!716 routeEtoFQ3arams: +alorRG 9-
!717 redirectFHurlEcontroladorG9-
!719 cac0eEla5outFHminutesG 96
Libro de Kumbia: Porque Programar debera ser ms fcil -
!711: notEfoundFHcontrollerC HactionG 96
!7111 setEres3onseFHt53eG 96
!711! isEalnumFH+alorG96
!711$ loadEreacordFHrecordG97
!711( isEnumericFH+alorG99
!9 8btener +alores desde una de Kumbia1::
$: Persistencia en ;ontroladores1:$
$1 Filtros en ;ontroladores1:'
$11 beforeEfilterFHcontrollerC HactionC HidG1:'
$1! afterEfilterFHcontrollerC HactionC HidG1:'
$1$ notEfoundFHcontrollerC HactionC HidG1:-
$! A33lication;ontrollerDase1:6
$$ &nrutamiento 5 1edirecciones1:7
$$1 )Por qu/ re=direccionamiento, 1:7
$$! &sttico1:7
$$$ >inmico 1:9
$( Filter11:
$(1 .ue es un Filtro,11:
$(! 4tili2aci#n Dsica11:
$($ </todos de la clase Filter111
$($1 addEfilterFHfilterG111
$($! a33l5FH+arC QfiltersRG 5 a33l5EfilterFH+arC QfiltersRG111
$($$ getEinstanceFG111
$(( Filtros >is3onibles111
$((1 addslas0es111
$((! alnun111
$(($ al30a111
$((( date111
$((' digit111
$((- 0tmlentities111
$((6 0tmls3ecialc0ars111
$((7 u33er11!
$((9 trim11!
$((1: stri3tags11!
$((11 stri3s3ace11!
$((1! stri3slac0es11!
$((1$ numeric11!
$((1( nl!br11!
$((1' md'11!
$((1- lower11!
$((16 i3+(11!
$((17 int11!
$' Aistas11$
$'1 Porque usar Aistas, 11$
$'! 4so de Aistas 11(
$'$ 4so de La5outs 11'
$'( 4so de Jem3lates 11'
$'' 4so de Partials 11-
$'- 4so de ;%% en Kumbia11-
$'6 4so de contentFG116
$'7 Hel3ers117
$'71 linkEtoFHaccionC Hte?toC QH3arametrosRG117
$'7! linkEtoFHaccionC Hte?toC QH3arametrosRG117
$'7$ linkEtoEremoteFHaccionC Hte?toC HobBetoEaEactuali2arC QH3arametrosRG117
$'7( buttonEtoEremoteEactionFHaccionC Hte?toC HobBetoEaEactuali2arC QH3arametrosRG119
Libro de Kumbia: Porque Programar debera ser ms fcil 6
$'7' Ba+ascri3tEincludeEtagFHarc0i+oEBsG119
$'7- Ba+ascri3tElibrar5EtagFHarc0i+oEBsG119
$'76 st5les0eetElinkEtagFHarc0i+oEcssC C QuseE+ariables: trueRG119
$'77 imgEtagFHsrcG119
$'79 formEremoteEtagFHactionC HobBetoEqueEactuali2aG1!:
$'71: formEtagFHactionG1!:
$'711 endEformEtagFG1!:
$'71! comillasFHte?toG1!:
$'71$ submitEtagFHca3tionG1!1
$'71( submitEimageEtagFHca3tionC HsrcG1!1
$'71' buttonEtagFHca3tionG1!1
$'71- te?tEfieldEtagFHnombreG1!1
$'716 c0eckbo?EfieldEtagFHnombreG1!1
$'717 numericEfieldEtagFHnombreG1!1
$'719 te?tu33erEfieldEtagFHnombreG1!1
$'7!: dateEfieldEtagFHnombreG1!!
$'7!1 fileEfieldEtagFHnombreG1!!
$'7!! radioEfieldEtagFHnombreC HlistaG1!!
$'7!$ te?tareaEtagFHnombreG1!!
$'7!( 3asswordEfieldEtagFHnombreG1!!
$'7!' 0iddenEfieldEtagFHnameG1!!
$'7!- selectEtagFHnameC HlistaG1!!
$'7!6 o3tionEtagFH+alorC Hte?toG1!$
$'7!7 u3loadEimageEtagFHnombreG1!$
$'7!9 setEdro33ableFHnombreC HaccionG1!$
$'7$: redirectEtoFHurlC HsegundosG1!$
$'7$1 renderE3artialFH+istaE3artialC H+alorSTTG1!$
$'7$! brEbreakFHnumeroG 1!$
$'7$$ trEbreakFHnumeroG 1!(
$'7$( trEcolorFHcolor1C Hcolor!C QHcolornRG1!(
$'7$' u3daterEselectFHnombreG 1!(
$'7$- te?tEfieldEwit0Eautocom3leteFHnombreG1!(
$'7$6 truncateFHte?toC HnumeroS:G1!'
$'7$7 0ig0lig0tFHte?toC Hte?toEaEresaltarG1!'
$'7$9 mone5FH+alorG1!'
$'7(: dateEfieldEtagFHnameG1!-
$'7(1 selectEtagFG1!-
$'9 Aerificar en+o de datos al controlador1!6
$'91 0asE3ostFHnameG1!6
$'9! 0asEgetFHnameG1!6
$'9$ 0asErequestFHnameG1!6
$'1: Hel3ers de usuario en Kumbia1!7
$'11 Formularios no intrusi+os1!9
$'1! Autocarga de 8bBetos1$:
$'1$ Paginador1$!
$(71 3aginateFG1$!
$'1( 3aginateEb5EsqlFG1$$
$- Denc0mark1$(
$(' </todos Denc0mark1$(
$('1 startEclockFHnameG1$(
$('! timeEe?ecutionFHnameG1$(
$('$ memor5EusageFHnameG1$(
$6 A;L1$'
$61 </todos de la ;lase A;L1$-
$611 addEroleFAcl1ole Hrole8bBectC HaccessEin0eritsSTTG1$-
Libro de Kumbia: Porque Programar debera ser ms fcil 7
$61! addEin0eritFHroleC HroleEtoEin0eritG1$-
$61$ isEroleFHroleEnameG1$-
$61( isEresourceFHresourceEnameG1$-
$61' addEresourceFAcl1esource HresourceG1$-
$61- addEresourceEaccessFHresourceC HaccessElistG1$-
$616 dro3EresourceEaccessFHresourceC HaccessElistG1$-
$617 allowFHroleC HresourceC HaccessG1$-
$619 den5FHroleC HresourceC HaccessG1$6
$611: isEallowedFHroleC HresourceC HaccessElistG1$6
$7 Aut01$7
$9 Programaci#n <odular1$9
(: 4so de Flas0 1(:
(:1 Flas0::error1(:
(:! Flas0::success1(:
(:$ Flas0::notice1(:
(:( Flas0::warning1(:
(1 "ntegrar F<A;G en Kumbia1(1
(11 &Bem3lo %encillo 1(1
(! 4so de Paquetes F*ames3acesG1($
($ 4sando AUAV1((
($1 "ntroducci#n 1((
($! V<LHtt31equest 1('
($$ );omo usar AUAV en Kumbia, 1('
($( linkEtoEremote 1(-
($' formEremoteEtag 1(6
(( Ua+a%cri3t 5 Kumbia1(9
((1 &l 8bBeto AUAV1(9
((! AUAV+iew1equest 1(9
(($ AUAV?ml1equest1':
((( AUAVe?ecute1'1
((' AUAVquer5 1'!
((- ABa?1equest 5 ABa?43dater1'!
((1 ABa?Periodical43dater1'$
(' %ession1'(
('1 </todos de la clase %ession 1'(
('11 %ession::setEdataFHnameC H+alorG 1'(
('1! %ession::getEdataFHnameC H+alorG 1'(
('1$ %ession::unsetEdataFHnameG 1'(
('1( %ession::issetEdataFHnameG 1'(
('1' %ession::setFHnameC H+alorG 1'(
('1- %ession::getFHnameC H+alorG 1'(
(- Loggers1''
(-1 </todos de la ;lase Logger 1'-
(-11 constructor 1'-
(-1! logFHmessageC Ht53eG 1'-
(-1$ beginFG1'-
(-1( commitFG 1'-
(-1' rollbackFG 1'-
(-1- close 1'-
(6 Protot53e en Kumbia1'6
(7 &fectos Aisuales 5 %cri3tAculo4s1'7
(71 &fectos Dsicos1'7
(711 &ffect83acit51'9
(71! &ffect%cale1'9
(71$ &ffect<or301-:
Libro de Kumbia: Porque Programar debera ser ms fcil 9
(71( &ffect<o+e1-:
(7! &fectos ;ombinados1-1
(7!1 &ffectA33ear1-1
(7!! &ffectFade1-1
(7!$ &ffectPuff1-!
(7!( &ffect>ro38ut1-!
(7!' &ffect%0ake1-!
((11 &ffect%witc08ff1-!
((1! &ffectDlind>own1-!
((1$ &ffectDlind431-$
((1( &ffect%lide>own1-$
(7$ <s "nformaci#n1-$
(9 Aentanas Protot53eWindows1-(
(91 4so de las Aentanas Protot53e1-(
(9! 1eferencia de ;lases 5 8bBetos de Protot53e Windows1--
(9$ ;lase Window1--
(9( &Bem3los de Protot53e Windows1-9
(9(1 Abriendo una Aentana %encilla1-9
(9(! Abrir una +entana usando una 41L1-9
(9($ Abre una +entana con un contenido e?istente16:
(9(( Abriendo una cuadro de dialogo usando AUAV161
(9(' Abrir un cuadro de >ialogo de Alerta161
': Funciones de 1e3ortes16!
':1 <anual de 1eferencia de FP>F 16!
':! ).u/ es FP>F, 16!
'1 ;orreo &lectr#nico16$
'11 ).u/ es PHP<ailer, 16$
'1! )Por qu/ usar 303mailer, 16$
'1$ PHP<ailer en Acci#n con Mmail16(
'! "ntegraci#n con %mart516'
'!1 ).u/ es %mart5, 16'
'!! ;omo se integra %mart5 a Kumbia 16-
'$ ;oders166
'$1 Acti+ar los ;oders 166
'$! Probar los coders 166
'$$ 4n eBem3lo 3rctico 166
'( Meneraci#n de Mrficas171
'!1 Libc0art en Acci#n17!
'' Pasos de Daile en Kumbia17$
'- ;reando tus 3ro3ios arc0i+os de configuraci#n ini17$
'-1 Leer la configuraci#n Actual17$
'-! Leer Arc0i+os &?cel con Kumbia17'
'-$ 4tili2ando la consola "nteracti+a iPHP176
'-$1 createEstandardformFHnombreG 177
'-$! createEmodelFHnombreG 177
'-$$ createEcontrollerFHnombreG 177
'-( Aalidar un 4suario179
'-' ;rear un 1e3orte usando FP>F19!
'-- ;ombos Actuali2ables con AUAV19(
'-6 ;ambiando el ;ontrolador 3or >efecto!::
'-7 >e+ol+iendo una salida V<L!::
'-9 4sar ;om3onentes &dici#n "n=Place!:!
'-1: ;reando un Li+e %earc0!:'
'6 Mlosario de ;once3tos!:6
'61 AUAV !:6
Libro de Kumbia: Porque Programar debera ser ms fcil 1:
'6! <odelo Aista ;ontrolador F<A;G !:6
'6$ Framework !:7
'6( Acti+e1ecord !:9
'6' %caffold FAndamiaBeG !:9
'6- Programaci#n 8rientada a 8bBetos !:9
'66 ;a3a de Abstracci#n de >atos !:9
'67 PHP !:9
'69 )Por qu/ Patrones, !1:
'7 J0e M*4 Meneral Public License FMPLG!1:
Libro de Kumbia: Porque Programar debera ser ms fcil 11
1 Agradecimientos
&ste manual es 3ara agradecer a quienes con su tiem3o 5 a3o5o en gran o en 3oca
medida 0an a5udado a que este framework sea cada da meBor
A todos ellos Mracias Jotales:
Andres Feli3e Mutierre2 gutierre2andresfeli3eXgmailcom
>ei+inson JeBeda dei+insonteBedaXkumbia303com
&milio %il+eira emiliorstXkumbia303com
;/sar ;aballero aka P0illi3o 30illi3oXkumbia303com
Y a toda la comunidad que rodea a KumbiaC con sus 3reguntasC notificaciones de errores
FDugTsGC a3ortacionesC etc
Libro de Kumbia: Porque Programar debera ser ms fcil 1!
2 "ntroducci#n
Kumbia naci# en un esfuer2o 3or no esfor2arme 3ara 0acer las cosas Puede sonar raro
3ero as fue 4n da em3ec/ a 0acer un 3ro5ecto de un sistema de informaci#n donde
0aban muc0os formularios 5 diBe: = &sta cosa siem3re es lo mismoC as que si 5o 0iciera
algo 3ara no re3etir tanto 5 s#lo escribir lo que cambiaba en cada formulario entonces
sera ms r3ido
>es3u/s de 0aber terminado las funciones 3ara generar los formularios me d cuenta que
0aban quedado mu5 bien 5 entonces lo em3ec/ 0a im3lementar en otras cosas As es
que Kumbia naci# de una a3licaci#n real 5 lo 3use a dis3osici#n de la ;omunidad
<i trabaBo era mu5 inde3endiente del obBeti+o de sistema de informaci#n que se iba a
desarrollar con los generadores de formulariosC as que me 3ro3use usarlo en otro
3ro5ecto &l resultado fue mu5 buenoC 0aba logrado desarrollar algo ms del 6:Z de un
sistema de informaci#n en tan s#lo unos das &ntonces me 3use a organi2ar las
funcionesC comentar el c#digo 5 meBorar la instalaci#n 3ara que 3udieran ser usadas en
otros 3ro5ectos
&n esa /3oca 3ro3use llamar el 3ro5ecto AuroraFormsC agregu/ alguna funcionalidad
e?tra 5 decid darle 3ro3aganda en algunos foros de "nternet .uise darle un tono
interesante al 3ro5ecto 3romulgu/ las facilidades que ofreca 5 3use un demo 3ara que
otros 3udieran comentar sobre /l
&s3eraba que muc0a gente se interesaraC 3ero lo [nico que logr/ fue muc0as crticas
Oconstructi+asP &l 3ro5ecto no tena documentaci#n as que era como decirles miren lo
que s/ 0acerC 3ero no les digo c#mo usarlo *o era mi intenci#n 3ero fue un error
3ublicar sin documentar "gualmente es necesario 0acer muc0as cosas 3ara crear un
3ro5ecto de software libre 5 no 3ens/ que tu+iera que tener en cuenta tantas cosas 3ara
que as fuese
8tro 3aso im3ortante fue acoger la licencia M*4@MPL en +e2 de otraC como la D%> o la
<"JC que aunque son menos restricti+as no fa+orecen el mo+imiento del software libre 5
eso es algo que quise transmitir con el 3ro5ecto
Pienso que el software libre 3ermite crear el ambiente de colaboraci#n ideal que quera
lograr con el 3ro5ectoC liberar las ideas 3ermite que otros inter+engan 5 busquen el
camino ideal es3erando a3ortar 5 a5udar con algo que le 3ueda ser+ir a toda la
comunidad
Duscar la meBor forma de 0acer las cosas a +eces 3uede resultar difcilC 3ues si
encontramos algunaC que 3robablemente 3are2ca la meBorC no siem3re es ace3tada 3or
los dems 5 terminan rec0a2ando las ideas que queremos +enderC as demos todos los
argumentos del caso
Jiem3o des3u/s fui contratado 3ara desarrollar un software algo grande 5 que
3atrocinaba el esfuer2o de trabaBar en Kumbia &l resultado fue mu5 buenoC siem3re me
em3e\o en dar lo meBor cuando trabaBo en un 3ro5ectoC as que el framework em3e2# a
crecer 5 la funcionalidad agregada forma gran 3arte de lo que 0o5 es como tal
Libro de Kumbia: Porque Programar debera ser ms fcil 1$
JrabaBar en una a3licaci#n real con caractersticas +erstiles increment# la estabilidad 5
las soluciones creadas 3ara necesidades reales aument# su funcionalidad
Alg[n tiem3o des3u/s fue agregado el 3ro5ecto a sourceforgenet 5 esto tambi/n 0a sido
un gran logro 3ara 3osicionarlo como un 3ro5ecto serio 5 con futuro Las 0erramientas
3ro3orcionadas en este forge dieron 3ie 3ara em3e2ar a meBorar muc0os as3ectos que
estu+ieron centrali2ados 3or muc0o tiem3o &l 3ro5ecto a0ora 3osee muc0as
caractersticas que 0an a5udado a su crecimiento como 3or eBem3lo los muc0os
ser+idores que re3lican Kumbia en todo el mundoC el sistema de gesti#n de bugsC el s+n 5
el ms reciente dominio kumbia303com
<uc0as 3ersonas 0an sido tambi/n fundamentales 3ara le+antar este 3ro5ecto sin dudaC
la colaboraci#n tanto en a3o5o econ#micoC moralC de desarrolloC moti+aci#n a usuariosC
testeo de funcionesC sugerencias 5 3ruebas 0an contribuido a lo que es el 3ro5ecto 0o5
como tal
Aun en el auge de las frameworkTs 3ara 303 5 otros lenguaBesC Kumbia fue 3ensado
desde un 3unto de +ista mu5 diferente Al 3asar de los das el obBeti+o de este 3ro5ecto
se +ol+a cada +e2 ms claro Kumbia deba ser 3otente como 3ara desarrollar 3ro5ectos
a ni+el em3resarial] 3ero al mismo tiem3o sencilloC tanto que 0asta alguien que
em3e2ara a desarrollar en PHP 3udiera ado3tarlo como 0erramienta de trabaBo
saltndose muc0os das de leer 5 releer tutoriales de 3rinci3iantes
&s mu5 moti+ante cuando dicen que nuestro trabaBo es Ofcil de usarPC O3rcticoP o O[tilP
5a que se 0a logrado satisfacci#n colecti+a La moti+aci#n engranada con el deseo de
0acer las cosas bien es algo que busco constantemente
Pienso que los lmites de la com3utaci#n em3e2aron a +erse mu5 leBanos cuando el
"nternet entr# en furorC 3ara m creo que marc# lo que siem3re 0a sido mi +isi#n de lo
que quiero Programar 3ara "nternet es mi constante 5 la 3reocu3aci#n 3or a3render 5
meBorar es el 3ilar de todo lo que 0ago 3ara /l
Programar fcil es im3ortante ;uando escribo c#digoC 3rimero sue\o 5 luego trabaBo 3or
ese sue\o &scribo c#digo 3ensando si esto fuera tan s#lo estoC entonces 5a 0ubiera
terminado sin 0acer casi nada Luego dedico +arias 0oras 3ara que ese 3oquito 0aga
todo lo que tiene que 0acer sin da\ar la fantasa Luego me d cuenta que as funciona
todo 5 que muc0as cosas nos tocan fciles 3or el trabaBo so\ador de otros
>e3ende de la culturaC se 3ueden rec0a2ar una 3ro3uesta cuando 3arece mu5 alocada o
inalcan2able 3ara el medio en la que se 3lantea &ncontrar las 3ersonas que tengan
suficiente e?3eriencia o necesidad 3ara a3o5ar ideas o contribuir con el meBoramiento de
/stas 3uede ser una larga tareaC 3ero cuando las encuentrasC te moti+as a continuar 5 a
meBorarC 3orque 3iensas que 3uede ser [til 3ara alguien ms
;on esta introducci#n es3ero se 0a5a interesado 3or este libro 5 3or este 3ro5ecto que
tambi/n fue 3ensado 5 desarrollado 3ara alguien como usted
Libro de Kumbia: Porque Programar debera ser ms fcil 1(
3 %obre &l Libro de Kumbia
&l libro de Kumbia es un intento 3or comunicar todo lo que este framework 3uede 0acer
3or usted Le 3ermite descubrir todos los rincones 5 a3render 3or qu/ Kumbia 3uede ser
la 0erramienta que estaba es3erando 3ara em3e2ar a desarrollar su 3ro5ecto
;umbia es el nombre de un ritmo musical del ;aribe 5 Kumbia es un 3roducto
colombiano 3ara el mundo Programar debe ser tan bueno como bailar 5 Kumbia es un
baileC un baile 3ara 3rogramar
;ada da el libro sigue tomando +alor gracias a los a3ortes de la comunidad
NOTA: Este libro se tratan los nuevos avances de la versin 0.5 de kumbia, de
la misma orma se a!radece a la comunidad "ue acom#a$a a este rame%ork,
"ue notii"uen las me&oras de manera "ue el #ro'ecto si!a creciendo.
Libro de Kumbia: Porque Programar debera ser ms fcil 1'
( )*ue+o en uso de Frameworks,
(.1 )*u+ ,ace un -rame%ork.
>efine una Filosofa de JrabaBo
Pro3orciona libreras 5 funciones que deberan 0acer la +ida del 3rogramador ms
feli2
A0orrar trabaBo 5 tiem3o
Producir a3licaciones ms fciles de mantener
&+itar c#digo du3licado
;rear A3licaciones <ulti=;a3a
(.2 /eali0ar a#licaciones orientadas a 1suarios
Preocu3arse 3or interfacesC l#gica 5 3rocesos ms intuiti+os 5 3rcticos 3ara
usuarios
4sar frameworks 3ara e+itar estar 3ensando en los OdetallesP 5 facilitar el trabaBo
Duscar en qu/ manera 3odra ser ms fcilC sin que aumente el trabaBo
considerablemente
Atacar necesidades reales 5 no desarrollar en su3uestos de utilidad
%er fantico de la 3roducti+idad
(.3 )2or "u+ 3umbia ' no otro -rame%ork.
"m3lementa los meBores 3atrones de 3rogramaci#n orientados a la Web
Fomenta la utili2aci#n de caractersticas Web !: en nuestro software
Hace la ma5or 3arte del trabaBo 5 se ocu3a de los OdetallesP
<antener una a3licaci#n es ms fcil
&s software libreC 3or lo tanto obtiene todas las +entaBas que /ste 3ro3orciona
%u >ocumentaci#n esta 3rinci3almente en es3a\ol
Libro de Kumbia: Porque Programar debera ser ms fcil 1-
5 %obre Kumbia
Kumbia es un web framework libre escrito en PHP' Dasado en las meBores 3rcticas de
desarrollo webC usado en software comercial 5 educati+oC Kumbia fomenta la +elocidad 5
eficiencia en la creaci#n 5 mantenimiento de a3licaciones webC reem3la2ando tareas de
codificaci#n re3etiti+as 3or 3oderC control 5 3lacer
%i 0a +isto a 1ub5=1ails@P5t0on=>Bango encontrar a Kumbia una alternati+a 3ara
3ro5ectos en PHP con caractersticas como:
%istema de Plantillas sencillo
Administraci#n de ;ac0/
%caffolding A+an2ado
<odelo de 8bBetos 5 %e3araci#n <A;
%o3orte 3ara AUAV
Meneraci#n de Formularios
;om3onentes Mrficos
%eguridad
5 muc0as cosas ms Kumbia 3uede ser la soluci#n que est buscando
&l n[mero de 3rerrequisitos 3ara instalar 5 configurar es mu5 3eque\oC a3enas 4ni? o
Windows con un ser+idor web 5 PHP' instalado Kumbia es com3atible con motores de
base de datos como <5%.LC Postgre%.L 5 8racle
4sar Kumbia es fcil 3ara 3ersonas que 0an usado PHP 5 0an trabaBado 3atrones de
dise\o 3ara a3licaciones de "nternet cu5a cur+a de a3rendi2aBe est reducida a un da &l
dise\o lim3io 5 la fcil lectura del c#digo se facilitan con Kumbia >esarrolladores 3ueden
a3licar 3rinci3ios de desarrollo como >1YC K"%% o VPC enfocndose en la l#gica de
a3licaci#n 5 deBando atrs otros detalles que quitan tiem3o
Kumbia intenta 3ro3orcionar facilidades 3ara construir a3licaciones robustas 3ara
entornos comerciales &sto significa que el framework es mu5 fle?ible 5 configurable Al
escoger Kumbia esta a3o5ando un 3ro5ecto libre 3ublicado baBo licencia M*4@MPL
Libro de Kumbia: Porque Programar debera ser ms fcil 16
4 Kumbia en su Punto
4.1 5ntroduccin
Kumbia es un framework PHP' basado en el modelo <A; Permite la se3araci#n de las
reglas de negocioC l#gica de a3licaci#n 5 +istas de 3resentaci#n de una a3licaci#n web
Adems 3osee otras 0erramientas 5 clases que a5uden a acortar el tiem3o de desarrollo
de una a3licaci#n web
4.2 )*u+ es un -rame%ork.
&n el desarrollo de softwareC un framework es una estructura de so3orte definida en la
cual otro 3ro5ecto de software 3uede ser organi2ado 5 desarrollado J3icamenteC un
framework 3uede incluir so3orte de 3rogramasC libreras 5 un lenguaBe de scri3ting entre
otros software 3ara a5udar a desarrollar 5 unir los diferentes com3onentes de un
3ro5ecto
4n framework agrega funcionalidad e?tendida a un lenguaBe de 3rogramaci#n] /staC
automati2a muc0os de los 3atrones de 3rogramaci#n 3ara orientarlos a un determinado
3ro3#sito 4n framework 3ro3orciona una estructura al c#digo 5 0ace que los
desarrolladores escriban c#digo meBorC ms entendible 5 mantenible Adems 0ace la
3rogramaci#n ms fcilC con+irtiendo com3leBas funciones en sencillas instrucciones
&st usualmente escrito en el lenguaBe que e?tiende Kumbia est escrito en PHP'
4n framework 3ermite se3arar en ca3as la a3licaci#n &n generalC di+ide la a3licaci#n en
tres ca3as:
La l#gica de 3resentaci#n que administra las interacciones entre el usuario 5 el
software
La L#gica de >atos que 3ermite el acceso a un agente de almacenamiento
3ersistente u otros
La l#gica de dominio o de negocioC que mani3ula los modelos de datos de acuerdo
a los comandos recibidos desde la 3resentaci#n
Los Web framework 3retenden facilitar el desarrollo de A3licaciones web F sitios webC
intranetsC etcG PHP es conocido 3or su sim3licidad 5 es am3liamente usado en este
cam3o %#lo PHP 3uede utili2ar casi cualquier motor de base de datosC administrar
sesionesC acceder a arc0i+os del ser+idorC etcC 3ero cuando las a3licaciones crecen 5 su
com3leBidad aumenta un framework sol+enta muc0os 3roblemas 5 facilita muc0as tareas
Libro de Kumbia: Porque Programar debera ser ms fcil 17
6 Kumbia +s 8tros Frameworks
&n un mercado inundado de frameworks <A; que 3rometen ser la soluci#n de desarrollo
a cualquier ti3o de 3ro5ectoC Kumbia 3retende ser una soluci#n a cualquier ti3o de
3ersona desde el 3rinci3ianteC 3asando 3or el desarrollador que no tiene tiem3o 3ara
a3render un nue+o frameworkC 0asta la em3resa de desarrollo de software Lo
im3ortante es que e?ista una necesidad 5 que Kumbia 3ueda a5udarte a 0acerla
realidad
Kumbia es inno+ador 5 su 3rinci3al enfoque es desarrollar 0erramientas 5 escribir cada
com3onente del framework 3ensando en que sea fcil de usar 3ara cualquiera que lea su
documentaci#n
;ualquier framework 3ara la Web res3etable tiene una a3licaci#n del 3atr#n <A;C un
81< F<a3eo obBeto relacionalGC generaci#n de logsC enrutamientoC 3lantillasC facilidades
Ba+ascri3tC uso de aBa? 5 otras cosillas ms &ntoncesC )cul es la diferencia, La
diferencia est en cunto tiem3o dedicas a leer su documentaci#nC cuntas +eces debes
recurrir a ellaC cuntas +eces debes recordar sinta?is com3leBaC 5 lo ms im3ortante:
)>es3u/s de cunto tiem3o obtienes resultados,
Je in+itamos a com3arar a Kumbia con otros frameworks 5 darte cuentaC c#mo usando
otras 0erramientasC escribes ?C 5C 2 c#digoC 0aces 1C !C $C etc 3asos 3ara 0acer una
sim3le tarea 5 c#mo en Kumbia esto est reducido a su mnima unidad con lo que te
0aces ms 3roducti+oC a3rendes ms r3ido 5 das meBores soluciones antici3ndote a la
com3etencia
Libro de Kumbia: Porque Programar debera ser ms fcil 19
7 ).u/ es Kumbia,
Kumbia es un esfuer2o 3or 3roducir un framework que a5ude a reducir el tiem3o de
desarrollo de una a3licaci#n web sin 3roducir efectos sobre los 3rogramadores
&st basado en los siguientes conce3tos:
;om3atible con muc0as 3lataformas
Fcil de instalar 5 configurar
Fcil de a3render
Listo 3ara a3licaciones comerciales
;on+enci#n sobre ;onfiguraci#n
%im3le en la ma5or 3arte de casos 3ero fle?ible 3ara ada3tarse a casos ms
com3leBos
%o3ortar muc0as caractersticas de A3licaciones Web Actuales
%o3ortar las 3racticas 5 3atrones de 3rogramaci#n mas 3roducti+os 5 eficientes
Producir a3licaciones fciles de mantener
Dasado en %oftware Libre
&l 3rinci3al 3rinci3io es 3roducir a3licaciones que sean 3rcticas 3ara el usuario final 5 no
s#lo 3ara el 3rogramador La ma5or 3arte de tareas que le quiten tiem3o al desarrollador
deberan ser automati2adas 3or Kumbia 3ara que /l 3ueda enfocarse en la l#gica de
negocio de su a3licaci#n *o deberamos rein+entar la rueda cada +e2 que se afronte un
nue+o 3ro5ecto de software
Para satisfacer estos obBeti+os Kumbia est escrito en PHP' Adems 0a sido 3robado en
a3licaciones reales que trabaBan en di+ersas reas con +ariedad de demanda 5
funcionalidad &s com3atible con las bases de datos dis3onibles actuales mas usadas:
<5%.L
Postgre%.L
8racle
&l modelo de obBetos de Kumbia es utili2ado en tres diferentes ca3as:
Abstracci#n de la base de datos
<a3eo 8bBeto=1elacional
<odelo <A; F<odeloC AistaC ;ontroladorG
;aractersticas comunes de A3licaciones Web son automati2adas 3or Kumbia:
Plantillas FJem3lateAiewG
Aalidaci#n de Formularios
Administraci#n de ;ac0/
%caffolding
"nteracci#n AUAV
Meneraci#n de Formularios
&fectos Aisuales
%eguridad
Libro de Kumbia: Porque Programar debera ser ms fcil !:
Kumbia utili2a otros 3ro5ectos de software libre 3ara com3lementar su funcionalidad:
FP>F: 1e3ortes en formato P>F
Protot53e: Ua+ascri3t crossbrowser
%cri3taculous: &fectos +isuales
PHP<ailer: ;orreo &lectr#nico
%mart5: <otor de Plantillas 3otente 5 fcil de usar
Se tiene previsto que para la version 0.6 del framwork se migre de framework para el
manejo de AJAX hacia JQuer.
Libro de Kumbia: Porque Programar debera ser ms fcil !1
8 )&st 0ec0o kumbia 3ara m,
*o im3orta si usted es el e?3erto en PHP' o un 3rinci3ianteC lo que im3orta es el tama\o
del 3ro5ecto que quiera desarrollar %i +a a crear un software 3eque\o de ms o menos
1: 3ginas con acceso limitado a bases de datosC sin obligaci#n en desem3e\o 5
dis3onibilidadC entonces 3uede utili2ar PHP sin Kumbia
;on Kumbia 3uede crear a3licaciones grandes o medianasC con l#gica de negocios
com3leBa 5 alta dis3onibilidad en donde PHP soloC no sera suficiente
%i 3lanea mantener o e?tender sus a3licaciones en el futuro 5 necesita c#digo
li+ianoC entendible 5 efecti+o
%i desea dedicar tiem3o al dise\o 5 usabilidad de su a3licaci#n 5 ol+idarse de los
detalles
%i desea usar las [ltimas caractersticas en interacci#n con el usuario Fcomo AUAVG
en forma intuiti+a sin tener que escribir cientos de lneas de Ua+a%cri3t
%i quiere desarrollar r3ido 5 con buena calidad
&n estos casos Kumbia est 0ec0o 3ara usted
Libro de Kumbia: Porque Programar debera ser ms fcil !!
10 *ue+e 1a2ones 3ara 4sar Kumbia
19 Es mu' -:cil de 1sar: &m3e2ar con Kumbia es demasiado fcilC es s#lo
descom3rimir 5 em3e2ar a trabaBar
29 /ealmente A!ili0amos Traba&o ;rear una a3licaci#n mu5 funcional con KumbiaC es
cuesti#n de 0oras o minutosC as que 3odemos darle gusto a nuestros clientes sin que
afecte nuestro tiem3o Mracias a las m[lti3les 0erramientas que 3ro3orciona el
framework 3ara agili2ar el trabaBo 3odemos 0acer ms en menos tiem3oC
39 ;e#arar la <!ica de la 2resentacin. 4na de las meBores 3rcticas de desarrollo
orientado a la Web es se3erar la l#gicaC de los datos 5 la 3resentaci#nC con Kumbia es
sencillo a3licar el 3atr#n <A;F<odeloC AistaC ;ontroladorG 5 0acer nuestras a3licaciones
mas fciles de mantener 5 de crecer
(9 /educcin del uso de otros <en!ua&es: Mracias a los Hel3ers 5 a otros 3atrones
como Acti+e1ecord e+itamos el uso de lenguaBes %.L o HJ<L Fen menor 3orcentaBeGC 5a
que Kumbia 0ace esto 3or nosotrosC con esto logramos c#digo mas claroC natural 5 con
menos errores
59 =3umbia ,abla Es#a$ol>: La documentaci#nC mensaBes de errorC arc0i+os de
configuraci#nC comunidadC desarrolladoresC KK0ablan es3a\olLLC con esto no tenemos que
entender a medias otros Frameworks o quedarnos cru2ados de manos 3orque no
3odemos 3edir a5uda
49 A#render a usar 3umbia es cuestin de 1 d?a: ;uando Leemos toda la
documentaci#n no tardamos ms de 1 daC esto nos 3ermite ado3tar todo su 3oder sin
3erder tiem3o le5endo largas guas
69 ;in darnos cuenta a#licamos los 2atrones de dise$o de moda: Los 3atrones de
dise\o son 0erramientas que facilitan el trabaBo reali2ando abstracci#nC reduciendo
c#digo o 0aciendo ms fcil de entender la a3licaci#n ;uando trabaBas en Kumbia
a3licas muc0os 3atrones 5 al final te das cuenta que eran mas fciles de usar de lo que
se escuc0aban
79 3umbia es sot%are <ibre: *o tienes que 3reocu3arte 3or licenciar nadaC Kumbia
3romue+e las comunidades de a3rendi2aBeC el conocimiento es de todos 5 cada uno sabe
c#mo a3ro+ec0arlo meBor
89 A#licaciones /obustas, )no sab?a "ue ten?a una.: A3licaciones em3resariales
requieren arquitecturas robustasC Kumbia 3ro3orciona una arquitectura fcil de a3render
5 de im3lementar sin com3licarnos con conce3tos raros o rebuscados
Libro de Kumbia: Porque Programar debera ser ms fcil !$
11 "nstalando Kumbia
11.1 2rerre"uisitos
&s necesario instalar el la mquina con Windows !:::@VP@!::$ # Linu?@4*"V un
ser+idor Web A3ac0e en cualquier +ersi#n
Puedes utili2ar ""% con "sa3iE1ewrite instalado
"nstalar PHP'^ Frecomendado '!G 5 alg[n motor de base de datos so3ortado si se
necesitase
11.2 5nstalando
Kumbia se distribu5e en un 3aquete com3rimido listo 3ara usar %e 3uede descargar la
[ltima +ersi#n de 0tt3:@@kumbiasourceforgenet
&l nombre del 3aquete tiene un nombre como kumbia=+ersion=notesformatoC 3or
eBem3lo: kumbia@0.(.(.tar.!0
%e co3ia el 3aquete al directorio ra2 del ser+idor web
Windows: c:\Apache2\htdocs\ o c:\wamp\www
Linux: /srv/www/htdocs, /var/www/html o /var/www
%e descom3rime 5 crea un directorio kumbia@0.(.( que 3uede ser renombrado 3or el
nombre de nuestro 3ro5ecto
11.3 Aoni!uracin de A#ac,e
Kumbia utili2a un m#dulo llamado modErewrite 3ara la utili2aci#n de 41L% ms
entendibles 5 fciles de recordar en nuestras a3licaciones Por estoC el m#dulo debe ser
configurado e instalado en A3ac0e Para estoC debe c0equear que el m#dulo est/
0abilitado
Para 0abilitar el m#dulo distribuciones M*4@Linu?
_ a!enmod rewrite
Luego debemos editar el arc0i+o de configuracion de a3ac0eC esto con la finalidad que el ser+idor
web tenga la ca3acidad de leer los arc0i+os .,taccess, en la +ersion !!? de a3ac0e el arc0i+o se
encuentra BetcBa#ac,e2Bsites@availableBdeault
Libro de Kumbia: Porque Programar debera ser ms fcil !(
5normacin: %i desea instalar la ultima beta de
Kumbia debe ingresar al gru3o en google 5
descargarlo de los arc0i+os del gru3o &n
0tt3:@@grou3sgooglecom@grou3@kumbia
<Directory />
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
&n el >ocument1oot F>irectorio 1a2 de A3ac0eG debe lle+ar la o3ci#n Allo%Override All
3ara que A3ac0e lea el arc0i+o .,taccess 5 llame a modCre%rite.
Posterior a esto 0a5 que indicar al ser+idor web cual ser el orden de 3referencias en
cuanto a los arc0i+os inde?C 3or defecto en 3rimer orden se eBecutan los arc0i+os
indeD.,tml esto 0a5 que cambiarlo 3or indeD.#,#
&n +ersion !!? de a3ac0e solo 0a5 que editar el arc0i+o que se encuentra
BetcBa#ac,e2Bmods@enabledBdir.con
1. DirectoryIndex index.php index.html ...
11.3.1 )2or "u+ es im#ortante Eod@/e%rite.
1eWrite es un m#dulo de a3ac0e que 3ermite reescribir las urls que 0an utili2ado
nuestros usuarios a otras ms com3licadas 3ara ellos Kumbia enca3sula esta
com3leBidad 3ermiti/ndonos usar 41L% bonitas o lim3ias como las que +emos en blogs o
en muc0os sitios donde no a3arecen los , # los ` o las e?tensiones del ser+idor F303C
as3C as3?C etcG
Adems de estoC con mod=rewriteC kumbia 3uede 3roteger nuestras a3licaciones ante la
3osibilidad de que los usuarios 3uedan +er los directorios del 3ro5ecto 5 3uedan acceder
a arc0i+os de clasesC modelosC l#gicaC etcC sin que sean autori2ados
;on mod=rewrite el [nico directorio que 3ueden +er los usuarios es el contenido del
directorio 3ublicC el resto 3ermanece oculto 5 s#lo 3uede ser +isuali2ado cuando 0a
reali2ado una 3etici#n en forma correcta 5 tambi/n es correcto seg[n nuestra l#gica de
a3licaci#n
;uando escribes direcciones utili2ando este ti3o de 41LsC ests a5udando tambi/n a los
motores de b[squeda a inde?ar meBor tu informaci#n
!"#A$ Se tra%aja actualmente para que este requisito no sea indispensa%le& se
estima que esta mejora ser' incorporada en la versi(n 0.6 del framework& de
manera que se pueda utili)ar el framework en servidores compartidos o en
aquellos hosting que no ofrecen este m(dulo de apache
Libro de Kumbia: Porque Programar debera ser ms fcil !'
11.( Aoni!uracin de 2F2
Actualmente Kumbia no necesita configuraciones es3eciales de PHP
11.5 2or"ue 3umbia utili0a 2F25.
Kumbia trabaBa s#lo con PHP' PHP' es la +ersi#n ms a+an2adaC estable 5 es el futuro
de este lenguaBe Posee un so3orte ms com3leto a la orientaci#n a obBetosC iteradoresC
e?ce3ciones 5 un so3orte a ?ml ms 3otente
4suarios que quieran dar un toque realmente 3rofesional a sus a3licaciones sabrn
+alorar las cualidades de PHP' 5 abandonarn el uso de PHP( Alguna +e2 se 3ens# en
desarrollar una +ersi#n es3ecifica de Kumbia 3ara PHP(C sin embargo esto era dar un
3aso atrs
Ho5 en daC el ma5or 3roblema que tiene PHP' es el 3aso a ser+idores de 0osting
com3artido con esta +ersi#nC que 0o5 en da mantienen com3atibilidad con PHP(C 5a que
el cambio generara 3roblemas con a3licaciones e?istentes en ellas Pero esto 3oco a
3oco se deBa atrs 5 cada +e2 ms ser+idores tienen la ultima +ersi#n de PHP
11.4 Aoni!uracin de E';*<
;uando se utili2a una base de datos <Y%.L' debe +erificarse que el sqlEmode no est/ en
modalidad estricta Para +alidar esto debe ingresar a la lnea de comando de <Y%.L':
m5sql =0 local0ost =u root =3
5 luego eBecutar el siguiente select:

m5sqlI select XXglobalsqlEmode]
>e3endiendo de la configuraci#n que tenga le dar un resultado 3arecido a esto:
^=============================================== ^
a XXglobalsqlEmode a
^=============================================== ^
a %J1";JEALLEJADL&% a
^=============================================== ^
Para cambiar este 3armetroC a uno adecuado al frameworkC debe eBecutar el siguiente comando:
m5sqlI set Qglobal a sessionR sqlEmode S ]
o cambiar la configuraci#n del arc0i+o m'.ini en su sistema o3erati+o
Para +er otros 3armetros +er el siguiente enlace Q1R
11.6 5nstalacin ' Aoni!uracin con Oracle
Kumbia trabaBa con la e?tensi#n de PHP 8;"7 &stas funciones le 3ermiten acceder a
bases de datos 8racle 1:C 8racle 9C 8racle 7 5 8racle 6 usando la "nterfa2 de Llamados
8racle F8;" 3or sus siglas en "ngl/sG &llas so3ortan la +inculaci#n de +ariables PHP a
Libro de Kumbia: Porque Programar debera ser ms fcil !-
reci3ientes 8racleC tienen so3orte com3leto L8DC F"L& 5 18W">C 5 le 3ermiten usar
+ariables de definici#n entregadas 3or el usuario
Para que 8;"7 trabaBe es necesario instalar el cliente instantneo de oracle
Luego 0a5 que agregar a la +ariable de entorno PAJH del sistema la ruta a donde
fue descom3rimido el cliente instantneo 2ATFGH2ATF
HIc:Jinstantclient10C2J
1einiciar A3ac0e
11.7 Ketalles Es#ec?icos #ara ;O
"nstalando Kumbia en VA<PP en Windows
&l 3rocedimiento 3ara instalar VA<PP en Windows es el siguiente:
1 >escargar VA<PP de A3ac0e Friends
! "nstalar VA<PP
b Habitilitar "nstalar A3ac0e 5 <5%.L como %er+icio
$ &ditar el arc0i+o c:\Archivos de Programa\xampp\apache\conf\httpd.conf
( >escomentar L"uitar el M9 de la lnea donde dice:
LoadModule rewrite_module modules/mod_rewrite.so
' 1einiciar el ser+icio de A3ac0e desde el Panel de ;ontrol de VA<PP
- ;o3iar el 3aquete de Kumbia a:
c:\Archivos de Programa\xampp\apache\htdocs\
6 ;ontinuar *ormalmente
"nstalando Kumbia en VA<PP en M*4@Linu?
&l 3rocedimiento 3ara instalar VA<PP en cualquier distribuci#n M*4@Linu? es el siguiente:
1 >escargar VA<PP de A3ac0e Friends
! "nstalar VA<PP
$ ;o3iar el 3aquete de 3umbia a Bo#tBlam##B,tdocsB
( ;ontinuar la instalaci#n normalmente
"nstalando Kumbia en >ebian@4buntu Linu?
"nstala A#ac,e2NE';*<5N2F25 si no lo tienes instalado usando la gua en este blog o
en 4buntu=es
&n KebianB1buntu tienes que usar el comando 3ara 0abilitar modCre%rite en A#ac,e:
1. # a2enmod rewrite
5 luego en editas el arc0i+o:
/etc/apache2/sites-enabled/000-default
Duscas la lnea 3ara el directorio BvarB%%% donde dice: Allow"verride !one 5 cambiar
3or Allow"verride All
Libro de Kumbia: Porque Programar debera ser ms fcil !6
Advertencia: &n 8racle la funcionalidad limit 3odra no
funcionar como se es3era 4tilice la condici#n
rownum c numeroEfilas 3ara 0acer esto.
1einicias A3ac0e con:
# /etc/init.d/apache2 restart
;ontinuar normalmente
12 ;reaci#n de Pro5ectos
12.1 5ntroduccin
&n Kumbia un 3ro5ecto es un conBunto de ser+icios que com3arten un nombre de
dominio 5 un conBunto de modelos de datos
&n un 3ro5ecto las o3eraciones estn l#gicamente agru3adas en controladoresC /stos
3ueden trabaBar inde3endientemente o de forma distribuida con los otros del mismo
3ro5ecto
Probablemente una a3licaci#n contenga al menos ! controladores que administren el
front 5 el back office de un 3ro5ecto
4n controlador re3resenta una o ms 3ginas con un mismo 3ro3#sito &Bem3lo:
<antenimiento de ;lientes
Los controladores 3oseen un conBunto de acciones &llos re3resentan las di+ersas
o3eraciones que se 3ueden reali2ar dentro de un controlador Por eBem3lo: ;rear
;lientesC Actuali2arlosC 1e+isar su ;arteraC etc
%i 3arece que muc0os controladores aumenten la com3leBidad de una a3licaci#nC
entonces se 3odran mantener agru3ados en uno soloC esto lo mantiene sim3le ;uando
la a3licaci#n cre2ca entonces se 3ueden agru3ar en otros controladores l#gicos
12.2 5niciar un 2ro'ecto
0tt3:@@wwwassemblacom@wiki@s0ow@kumbia@Parte1=;a3itulo(
12.3 >irectorios de Kumbia
0tt3:@@wwwassemblacom@wiki@s0ow@kumbia@Parte1=;a3itulo(
12.( 8tros >irectorios
0tt3:@@wwwassemblacom@wiki@s0ow@kumbia@Parte1=;a3itulo(
12.5 1esumen
%i 3ensamos en con+enci#n sobre configuraci#nC entonces 3odemos tambi/n 3ensar que
mientras todo est/ en su lugarC meBorar el orden de la a3licaci#n 5 ser ms fcil
encontrar 3roblemasC 0abilitar@in0abilitar m#dulos 5 en sntesis mantener la a3licaci#n
Libro de Kumbia: Porque Programar debera ser ms fcil !7
13 &?3licando la ;onfiguraci#n
13.1 5ntroduccin
Kumbia 3osee una configuraci#n 3or defecto que debe funcionar bien en la ma5or 3arte
de casos aunque /sta 3uede 3ersonali2arse de acuerdo a necesidades es3ecficas de
cada 3ro5ecto
%e 0a 3ensado en configurar al mnimo 3ara 3oder em3e2ar 0a trabaBar 5 deBar que
Kumbia escoBa la configuraci#n ms #3tima
Kumbia utili2a arc0i+os formato ini 3ara 0acer la configuraci#n
,tt#:BB%%%.assembla.comB%ikiBs,o%BkumbiaB2arte1@Aa#itulo(
1( A 3artir de un <odelo <A;
&n 1969C Jr5g+e 1eenskaug desarroll# una arquitectura 3ara desarrollar a3licaciones
interacti+as &n este dise\o e?istan tres 3artes: modelosC +istas 5 controladores
&l modelo <A; 3ermite 0acer la se3araci#n de las ca3as de interfa2C modelo 5 l#gica de
control de /sta La 3rogramaci#n 3or ca3asC es un estilo de 3rogramaci#n en la que el
obBeti+o 3rimordial es la se3araci#n de la l#gica de negocios de la l#gica de dise\oC un
eBem3lo bsico de esto es se3arar la ca3a de datos de la ca3a de 3resentaci#n al usuario
La +entaBa 3rinci3al de este estiloC es que el desarrollo se 3uede lle+ar a cabo en +arios
ni+eles 5 en caso de alg[n cambio s#lo se ataca al ni+el requerido sin tener que re+isar
entre c#digo me2clado Adems 3ermite distribuir el trabaBo de creaci#n de una
a3licaci#n 3or ni+elesC de este modoC cada gru3o de trabaBo est totalmente abstrado
del resto de ni+elesC sim3lemente es necesario conocer la AP" F"nterfa2 de A3licaci#nG que
e?iste entre ni+eles La di+isi#n en ca3as reduce la com3leBidadC facilita la reutili2aci#n 5
acelera el 3roceso de ensamblar o desensamblar alguna ca3aC o sustituirla 3or otra
distinta F3ero con la misma res3onsabilidadG
&n una a3licaci#n Web una 3etici#n se reali2a usando HJJP 5 es en+iado al controlador
&l controlador 3uede interactuar de muc0as formas con el modeloC luego el 3rimero llama
a la res3ecti+a +ista Finterfa2 de usuarioG la cual obtiene el estado del modelo 5 lo
muestra al usuario en una res3uesta HJJP
Libro de Kumbia: Porque Programar debera ser ms fcil !9
15 &?3licando la "m3lementaci#n <A;
15.1 "ntroducci#n
Kumbia a3ro+ec0a los meBores 3atrones de 3rogramaci#n orientada a la web en es3ecial
el 3atr#n <A; F<odelosC AistaC ;ontroladoresG &ste ca3tulo describe el funcionamiento
general de este 3aradigma en Kumbia
&l obBeti+o de este 3atr#n es el reali2ar 5 mantener la se3araci#n entre la l#gica de
nuestra a3licaci#nC los datos 5 la 3resentaci#n &sta se3araci#n tiene algunas +entaBas
im3ortantesC como:
Podemos identificar ms fcilmente en qu/ ca3a se est 3roduciendo un 3roblema
con s#lo saber su naturale2a
Podemos crear +arias 3resentaciones sin necesidad de escribir +arias +eces la
misma l#gica de a3licaci#n
;ada 3arte funciona inde3endiente 5 cualquier cambio centrali2a el efecto sobre
las demsC as que 3odemos estar seguros que una modificaci#n en un
com3onente reali2ar bien las tareas en cualquier 3arte de la a3licaci#n
Libro de Kumbia: Porque Programar debera ser ms fcil $:
15.2 Aonce#tos
La base de Kumbia es el EOAC un tradicional 3atr#n de dise\o que funciona en tres
ca3as:
Eodelos: 1e3resentan la informaci#n sobre la cual la a3licaci#n o3eraC su l#gica
de negocios
Oistas: Aisuali2an el modelo usando 3ginas Web e interactuando con los usuarios
de /stas
Aontroladores: 1es3onden a acciones de usuario e in+ocan cambios en las +istas
o en los modelos seg[n sea necesario
&n Kumbia los controladores estn se3arados en 3artesC llamadas front controller 5 un en
un conBunto de acciones ;ada acci#n sabe c#mo reaccionar ante un determinado ti3o de
3etici#n Las +istas estn se3aradas en la5outsC tem3lates 5 3artials &l modelo ofrece
una ca3a de abstracci#n de la base de datos utili2ada adems dan funcionalidad
agregada a datos de sesi#n 5 +alidaci#n de integridad relacional
&ste modelo a5uda a se3arar el trabaBo en l#gica de negocios FmodelosG 5 la 3resentaci#n
FAistasG Por eBem3loC si usted tiene una a3licaci#n que corra tanto en equi3os de
escritorio 5 en dis3ositi+os de bolsillo entonces 3odra crear dos +istas diferentes
com3artiendo las mismas acciones en el controlador 5 la l#gica del modelo
&l controlador a5uda a ocultar los detalles de 3rotocolo utili2ados en la 3etici#n FHJJPC
modo consolaC etcG 3ara el modelo 5 la +ista FinalmenteC el modelo abstrae la l#gica de
datosC que 0ace a los modelos inde3endientes de las +istas
La im3lementaci#n de este modelo es mu5 li+iana mediante 3eque\as con+enciones se
3uede lograr muc0o 3oder 5 funcionalidad
15.3 &Bem3lo
Para 0acer las cosas ms clarasC +eamos un eBem3lo de c#mo una arquitectura <A;
trabaBa 3ara un agregar al carrito PrimeroC el usuario interact[a con la interfa2
seleccionando un 3roducto 5 3resionando un bot#nC esto 3robablemente +alida un
formulario 5 en+a una 3etici#n al ser+idor
1 El -ront Aontroller 1ecibe la notificaci#n de una acci#n de usuarioC 5 luego de
eBecutar algunas tareas FenrutamientoC seguridadC etcGC entiende que debe
eBecutar la acci#n de agregar en el controlador
! <a accin de agregar accede al modelo 5 actuali2a el obBeto del carrito en la
sesi#n de usuario
$ %i la modificaci#n es almacenada correctamenteC la acci#n 3re3ara el contenido
que ser de+uelto en la res3uesta d confirmaci#n de la adici#n 5 una lista com3leta
de los 3roductos que estn actualmente en el carrito La +ista ensambla la
res3uesta de la acci#n en el cuer3o de la a3licaci#n 3ara 3roducir la 3gina del
carrito de com3ras
( Finalmente es transferida al ser+idor Web que la en+a al usuarioC quien 3uede
leerla e interactuar con ella de nue+o
<s informaci#n sobre <A; en Wiki3edia
Libro de Kumbia: Porque Programar debera ser ms fcil $1
14 Primera A3licaci#n en Kumbia
El #resente ca#?tulo tiene como ob&etivo entender la creacin de una #rimera
a#licacin usando 3umbia, "ue nos servir: #ara entender la ar"uitectura EOA '
al!unos caracter?sticas interesantes.
Nuestra 2rimera A#licacin
16 <odelos 5 Dases de >atos en Kumbia
16.1 "ntroducci#n
Kumbia 3osee una doble ca3a de abstracci#n de base de datos La 3rimera mantiene un
acceso uniforme que e+ita reescribir c#digo en caso de cambiar el motor de
almacenamiento 5 la segunda llamada Acti+e1ecord que est basada en su anlogo de
1ails] 3ermite ma3ear las relaciones de la base de datos a obBetos &ste ma3eo 3ermite
el fcil acceso 5 modificaci#n de las relaciones de la base de datos &ste ca3tulo e?3lica
la creaci#n de estos obBetosC la forma en que trabaBan 5 c#mo integrarlos con las dems
3artes de la arquitectura
16.2 ;a3a de Abstracci#n "nde3endiente
Kumbia 3osee una 3rimera ca3a que e+ita la reescritura del c#digo que accede a bases
de datos en caso de cambiar de un motor a otro Posee todas las funciones bsicas 3ara
efectuar o3eraciones sobre tablasC mantener cone?ionesC eBecutar consultasC etc sin
3erder inde3endencia &sta ca3a funciona baBo la ca3a obBeto relacional 5 es
am3liamente usada 3or todo el framework >ebera ser usada en caso de necesitar un
acceso de baBo ni+el a la base de datos
8tra +entaBa es que cursores 5 streams de cone?i#n son enca3sulados en obBetos
e+itando escribir c#digo re3etiti+o
16.3 Ada3tadores Kumbia
<ientras estos ada3tadores est/n dis3onibles se 3uede tener acceso a un motor de base
de datos en 3articular Actualmente e?isten: <5%.LC Postgre%.L FDetaG 5 8racle FbetaG
Libro de Kumbia: Porque Programar debera ser ms fcil $!
17 &squema de Acceso a Dases de >atos
en Kumbia
17.1 Eodelos
La segunda ca3a de abstracci#n de datos utili2a un ma3eo obBeto@relacional 3ara
re3resentar las entidades del modelo de datos en nuestras a3licaciones &stos modelos
son 3arte integral de la arquitectura <A; F<odel Aiew ;ontrollerG 5 estn basados en el
3atr#n Acti+e1ecord
;aractersticas de los modelos:
"m3lementan las clases de la ca3a de negocios: ProductosC ;lientesC FacturasC
&m3leadosC etc
<antienen los datos 5 su l#gica Buntos: 4n 3roducto tiene una cantidad 5 se +ende
s#lo si est acti+o
1e3resentar relaciones en el modelo: 4na ;liente tiene muc0as Facturas
Libro de Kumbia: Porque Programar debera ser ms fcil $$
18 Acceso >irecto a 1>D<%
18.1 La ;lase >dDase
La clase PKbQaseR 3ersonali2ada 3ara cada motor es cargada automticamente 5 est
dis3onible globalmente &l +alor database.t'#e en coni!Benvironment.iniC indica qu/
dri+er se debe cargar automticamente
18.2 Arear una instancia de KbQase
4so de la Funci#n DbDase::rawEconnectFG
Ya que los 3armetros de cone?i#n de la base de datos estn definidos en
coni!Benvironment.ini 3odemos utili2ar esta funci#n 3ara crear el obBeto db
&Bem3lo:
1. <?php
2. $db = DbBase::raw_connect();
3. ?>
18.3 Pro3iedades de la ;lase >bDase
18.3.1 Sdb@T5dCAonnection
Posee una referencia al stream de cone?i#n a la base de datos
18.3.2 Sdb@Tlast/esult*uer'
4ltima sentencia %.L eBecutada en la base de datos en la instancia
18.3.3 Sdb@Tdb1ser
4suario de la base de datos utili2ado 3ara crear la cone?i#n
18.3.( Sdb@TdbFost
Host de la base de datos utili2ado 3ara crear la cone?i#n
18.3.5 Sdb@Tdb2ort
Puerto de la base de datos utili2ado 3ara crear la cone?i#n
18.3.4 Sdb@Tdb2ass
Password del 4suario de la base de datos utili2ado 3ara crear la cone?i#n
Libro de Kumbia: Porque Programar debera ser ms fcil $(
18.3.6 Sdb@TlastError
eltimo error generado 3or el motor de la base de datos 3roducido en alguna o3eraci#n
%.L
18.3.7 Sdb@TdbName
*ombre de la base de datos actual
18.( </todos de la ;lase >D
18.(.1 *uer'
Kescri#cin: Permite en+iar sentencias %.L al motor de base de datos &l 3armetro
debug 3ermite +er un mensaBe del %.L que es en+iado al motor de base de datos
Sintaxis:
Hdb=Iquer5Fstring HsqlC Qbool HdebugSfalseRG
&Bem3lo:
1. <?php
2. $db = DbBase::raw_connect();
3. $db->query(update clientes set estado = A);
4. ?>
Alose
Kescri#cin: Kumbia 3ara el maneBo de las cone?iones 0acia los motores de D> utili2a
el 3atr#n de >ise\o %inglentonQ1RC de esta forma de e+ita crear multi3les cone?iones a la
D> innecesarias
Q1R=I0tt3:@@eswiki3ediaorg@wiki@%ingleton
18.(.2 -etc, Arra'
Kescri#cin: 1ecorre el cursor eBecutado en la [ltima o3eraci#n select
Sintaxis:
Hdb=Ifetc0Earra5FQcursor HcursorRC Qint Hti3oEresultadoS>DED8JHRG
&Bem3lo:
1. <?php
2. $db = DbBase::raw_connect();
3. $db->query(select codigo, nombre from productos);
4. while($producto = $db->fetch_array()){
5. print$producto[nombre!
6. }//fin while
7. $db->close();
8. ?>
Los ti3os de resultado 3ueden ser:
Libro de Kumbia: Porque Programar debera ser ms fcil $'
db::KQCA;;OA: Arra5 con ndices asociati+os de los nombres de los cam3os
db::KQCN1E: Arra5 con ndices num/ricos que indican la 3osici#n del cam3o en el
select
db::KQCQOTF: Arra5 con ndices tanto num/ricos como asociati+os
18.(.3 Num /o%s
Kescri#cin: >e+uel+e el n[mero de filas de la [ltima instrucci#n select en+iada al
motor de base de datos
Sintaxis:
Hdb=InumErowsFQcursor HcursorRG]
&Bem3lo:
1. <?php
2. $db = DbBase::raw_connect();
3. $db->query(select codigo, nombre from productos);
4. print "#a$ %.$db&'num(rows)*." productos "!
5. $db->close();
6. ?>
-ield Name
Kescri#cin: >e+uel+e el nombre del cam3o en la 3osici#n Hnumber del [ltimo select
en+iado al motor de base de datos
Sintaxis:
1. $db->field_name(int $number, [cursor $cursor]);
18.(.( Kata ;eek
Kescri#cin: %e mue+e a la 3osici#n Hnumber del cursor de la [ltima instrucci#n select
en+iada al motor de base de datos
Sintaxis:
1. $db->data_seek(int $number, [cursor $cursor]);
18.(.5 Aected /o%s
Kescri#cin: >e+uel+e el n[mero de filas afectadas en la [ltima instrucci#n insertC
u3date o delete
Sintaxis:
1. $db->affected_rows();
18.(.4 Error
Kescri#cin: >e+uel+e la cadena descri3ti+a del [ltimo error generado 3or base de
datos 3roducido 3or la [ltima instrucci#n %.L
Sintaxis:
1. $db->error();
Libro de Kumbia: Porque Programar debera ser ms fcil $-
18.(.6 No Error
Kescri#cin: >e+uel+e el n[mero interno del [ltimo error generado 3or base de datos
3roducido 3or la [ltima instrucci#n %.L
%inta?is:
1. $db->no_error();
18.(.7 -ind
Kescri#cin: &Becuta un %elect en el motor con los 3armetros en+iados 5 de+uel+e un
Arra5 con los resultados
Sintaxis:
1. $db->find(string $table, [string $where=1=1], [string $fields=*],
[string $orderBy=1]);
&Bem3lo:
1. <?php
2. $db = DbBase::raw_connect();
3. foreach($db->find(productos) as $producto){
4. print $producto[nombre!
5. } //fin del foreach
6. $db->close();
7. ?>
18.(.8 5n *uer'
>escri3ci#n: >e+uel+e el resultado de una instrucci#n %.L en un arra5 listo 3ara ser
recorrido
Sintaxis:
Hdb=IinEquer5Fstring HsqlC Qbool HdebugSfalseRC Qint Hti3oEresultado S db::>DED8JHRG]
&Bem3lo:
1. <?php
2. $db = DbBase::raw_connect();
3. foreach($db->in_query(select * from productos) as $producto){
4. print $producto[nombre!
5. }//fin del foreach
6. $db->close();
7. ?>
18.(.10 5n *uer' Assoc
Kescri#cin: >e+uel+e el resultado de una instrucci#n %.L en un arra5 con inde?ado
asociati+o listo 3ara ser recorrido
Sintaxis:
1. $db->in_query_assoc(string $sql, [bool $debug=false]);
Libro de Kumbia: Porque Programar debera ser ms fcil $6
18.(.11 5n *uer' Num
Kescri#cin: >e+uel+e el resultado de una instrucci#n %.L en un arra5 con inde?ado
num/rico listo 3ara ser recorrido
Sintaxis:
1. $db->in_query_num(string $sql, [bool $debug=false]);
18.(.12 -etc, One
Kescri#cin: >e+uel+e la 3rimera fila de un select &s [til cuando el select de+uel+e
una sola fila
Sintaxis:
1. $db->fetch_one(string $sql, [bool $debug=false]);
&Bem3lo:
1. <?php
2. $db = DbBase::raw_connect()();
3. $producto = $db->fetch_one(select * from producto where codigo = 1);
4. print $producto[nombre!
5. $db->close();
6. ?>
18.(.13 Table EDists
Kescri#cin: >e+uel+e +erdadero si la tabla Htable e?iste en la base de datosC falso de
lo contrario
Sintaxis:
1. $db->table_exists(string $table);
Libro de Kumbia: Porque Programar debera ser ms fcil $7
20 )Por qu/ usar una ca3a de Abstracci#n,
Las Dases de datos son relaciones 5 PHP'@Kumbia es orientado a obBetos 3or lo tanto
deberamos acceder a las D> en forma orientada a obBetos Para esto necesitamos una
interfa2 que transforme la l#gica de obBetos a la relacional 5 +ice+ersa &ste 3roceso es
llamado ma3eo obBeto=relacional o en ingl/s 81< F8bBect=1elational <a33ingGC 5 es
usado 3or Kumbia en su arquitectura <A;
%e trata de dar a los obBetosC acceso a los datos sin deBar de lado las reglas de la l#gica
de negocios
4n beneficio de la ca3a da abstracci#n ob&etoBrelacional es que 3re+iene un 3oco el uso
de sinta?is es3ecfica de un motor de base de datosC 5a que automticamente traduce
los llamados a los obBetos modelos en instrucciones %.L o3timi2adas 3ara el motor
actual
&sto significa que cambiar de un motor de base de datos a otro en la mitad del 3ro5ecto
es ms fcil de lo que se imagina Pasar de Postgre%.L a <5%.L o a 8racle requiere de
un cambio de una lnea de configuraci#n
4na ca3a de abstracci#n enca3sula la l#gica de datos &l resto de la a3licaci#n no
necesita saber sobre instrucciones %.LC aunque 3uede 0acerlo si lo requiere
Aer las filas como obBetos 5 las tablas como clases tiene otro beneficio Permiten crear
nue+os accesos 3ara nuestras tablas Por eBem3lo si tenemos una clase ;lientes 5 tiene
un cam3o 3rimer nombreC otro segundo nombre 5 a3ellidos entonces 3odemos crear un
acceso llamado get*ombre as:
1. public function getNombre(){
2. return $this->primer_nombre. .$this->segundo_nombre. .
3. $this->apellidos;
4. }
Kumbia 3ro3orciona una serie de clases LActive/ecord ' ;ession/ecord9 que
3ermiten reali2ar este ma3eo 5 adems eBecutar o3eraciones nati+as sobre las relaciones
de la base de datos de forma ms 0umana 5 entendible
Libro de Kumbia: Porque Programar debera ser ms fcil $9
21 La Aida sin Acti+e1ecord
Anteriormente las a3licaciones eran bolas de c#digoC me2claban %.LC ;%%C HJ<LC PHPC
Ua+a%cri3tC etc Al menos los que buscbamos un orden mnimo conseguamos se3arar
algunas cosas] 3ero el %.L 5 el PHP siem3re iban ligados as que 0acer cambios en el
modelo relacional 3odra ser fatal 5a que da\aba muc0as 3artes de la a3licaci#n que 5a
estaban 3robadas
&ste no es un 3roblema e?clusi+o de PHPC tambi/n lo tienen otros lenguaBes o estilos de
3rogramaci#n que no re3aran en esto Por eBem3lo en Aisual Dasic *&J 5 en PHP
tradicional:
1. Dim nit As String = 808111827-2
2. Dim Query As String = "select count(*) from clientes where nit = " & nit &

3. Dim command As New System.Data.OleDb.OleDbCommand(Query, con)


4. Dim cnt As Int32 = 0
5. Try
6. con.Open()
7. Dim cursor As OleDb.OleDbDataReader = command.ExecuteReader()
8. cursor.Read()
9. If cursor.GetInt32() = 0 Then
10. new System.Data.OleDb.OleDbCommand(insert into clientes values( & nit &
,
11. EMPRESA DE TELECOMUNICACIONES ETB))
12. Else
13. new System.Data.OleDb.OleDbCommand(update clientes set razon_social
14. = EMPRESA DE TELECOMUNICACIONES ETB where nit = & nit & )
15. End If
16. cursor.Close()
17. Catch dbError As OleDBException
18. Dim i As Integer
19. For i = 0 To dbError.Errors.Count - 1
20. MessageBox.Show(dbError.Errors(i).Message + ControlChars.Cr)
21. Next i
22.End Try
23.
24.<?php
25. $nit = 808111827-2 ;
26. $+ , m$s+l(+uer$)"select count)-* .rom clientes where nit , $nit%*!
27. $.ila , m$s+l(.etch(arra$)$+*!
28. if($fila[0]==0){
29. m$s+l(+uer$ )"insert into clientes values )$nit, /012/3A 4/
5/6/7809:;7A7;8:/3 /5<%*!
30. } else {
31. m$s+l(+uer$ )"update clientes set ra=on(social , /012/3A 4/
5/6/7809:;7A7;8:/3 /5<
32. where nit = $nit);
33. }
34. ?>
Libro de Kumbia: Porque Programar debera ser ms fcil (:
&l ma3eo Ob&eto@/elacional soluciona esto 5 3ro3orciona un alto 3otencial 3ara 0acer
las a3licaciones ms fciles de mantener
22 KParmetros con *ombreL
KWowLC Algo mu5 im3ortante en Kumbia es la a3licaci#n de los 3armetros con nombreC
/sta es una caracterstica mu5 im3ortante usada a lo largo del framework 5 que es mu5
[til fsta 3ermite en+iar los 3armetros en un orden inde3endiente sin que esto im3ida
que funcione bien Los 3armetros con nombre son una caracterstica utili2ada en otros
lenguaBes como 1ub5 en donde son am3liamente usados La im3lementaci#n nos 3ermite
de forma sencilla en+iar los +alores de los 3armetros de todo ti3o de funciones sin
3reocu3arnos 3or el orden correcto de estos
&l uso es Unombre: valorUC es mu5 im3ortante mantener el orden sintctico 3ara que
funcionen bien:
*o es3acios delante del nombre del 3armetro 5 /ste no debe contener es3acios
Los dos 3untos g:h deben ir a continuaci#n del nombre del 3armetroC sin es3acios
entre /ste 5 el nombre
4n es3acio obligatorio des3u/s de los g:h
&l +alor 3uede ser cualquier +alor
Libro de Kumbia: Porque Programar debera ser ms fcil (1
23 Acti+e1ecord
&s la 3rinci3al clase 3ara la administraci#n 5 funcionamiento de modelos Acti+e1ecord
es una im3lementaci#n de este 3atr#n de 3rogramaci#n] 5 est mu5 influenciada 3or la
funcionalidad de su anloga en 1ub5 dis3onible en 1ails Acti+e1ecord 3ro3orciona la
ca3a obBeto=relacional que sigue rigurosamente el estndar 81<: Jablas en ;lasesC
;am3os en Atributos 5 1egistros en 8bBetos Facilita el entendimiento del c#digo
asociado a base de datos 5 enca3sula la l#gica es3ecifica 0aci/ndola ms fcil de usar
3ara el 3rogramador
1. <?php
2. $Clientes->nit = 808111827-2;
3. $Clientes->razon_social = EMPRESA DE TELECOMUNICACIONES ETB
4. $Clientes->save();
5. ?>
23.1 AentaBas del Acti+e 1ecord
%e trabaBan las entidades del <odelo ms naturalmente como obBetos
Las acciones como "nsertarC ;onsultarC Actuali2arC DorrarC etc de una entidad del
<odelo estn enca3suladas as que se reduce el c#digo 5 se 0ace ms fcil de
mantener
;#digo ms fcil de entender 5 mantener
1educci#n del uso del %.L en un 7:ZC con lo que se logra un alto 3orcentaBe de
inde3endencia del motor de base de datos
<enos OdetallesP ms 3racticidad 5 utilidad
Acti+e1ecord 3rotege en un gran 3orcentaBe de ataques de %.L in5ection que
3uedan llegar a sufrir tus a3licacionesC esca3ando caracteres que 3uedan facilitar
estos ataques
23.2 ;rear un <odelo en Kumbia
Lo 3rimero es crear un arc0i+o en el directorio models con el mismo nombre de la
relaci#n en la base de datos Por eBem3lo: modelsBclientes.#,# Luego creamos una
clase con el nombre de la tabla e?tendiendo alguna de las clases 3ara modelos &Bem3lo:
1. <?php
2. class Clientes extends ActiveRecord {
3.
4. }
;olumnas 5 Atributos
8bBetos Acti+e1ecord corres3onden a registros en una tabla de una base de datos Los
obBetos 3oseen atributos que corres3onden a los cam3os en estas tablas La clase
Acti+e1ecord automticamente obtiene la definici#n de los cam3os de las tablas 5 los
con+ierte en atributos de la clase asociada A esto es lo que nos referamos con ma3eo
obBeto relacional
Libro de Kumbia: Porque Programar debera ser ms fcil (!
<iremos la tabla Album:
1. CREATE TABLE album (
2. id INTEGER NOT NULL AUTO_INCREMENT,
3. nombre VARCHAR(100) NOT NULL,
4. fecha DATE NOT NULL,
5. valor DECIMAL(12,2) NOT NULL,
6. artista_id INTEGER NOT NULL,
7. estado CHAR(1),
8. PRIMARY KEY(id)
9. )
Podemos crear un Acti+e1ecord que ma3ee esta tabla:
1. <?php
2.
3. class Album extends ActiveRecord {
4.
5. }
6.
7.
4na instancia de esta clase ser un obBeto con los atributos de la tabla album:
1. $Album = new Album();
2. $Album->id = 2;
3. $Album->nombre = Going Under;
4. $Album->save();
23.3 Lla+es Primarias 5 el 4so de ">s
&n los eBem3los mostrados de Kumbia siem3re se trabaBa una columna llamada id como
lla+e 3rimaria de nuestras tablas Jal+/2C esto no siem3re es 3rctico a su 3arecerC de
3ronto al crear la tabla clientes la columna de n[mero de identificaci#n sera una
e?celente elecci#nC 3ero en caso de cambiar este +alor 3or otro tendra 3roblemas con el
dato que este re3licado en otras relaciones FeBem3lo facturasGC adems de esto tendra
que +alidar otras cosas relacionadas con su naturale2a Kumbia 3ro3one el uso de ids
como lla+es 3rimarias con esto se automati2a muc0as tareas de consulta 5 3ro3orciona
una forma de referirse un+ocamente a un registro en es3ecial sin de3ender de la
naturale2a de un atributo es3ecfico 4suarios de 1ails se sentirn familiari2ados con esta
caracterstica
&sta 3articularidad tambi/n 3ermite a Kumbia entender el modelo entidad relaci#n
le5endo los nombres de los atributos de las tablas Por eBem3lo en la tabla lbum del
eBem3lo anterior la con+enci#n nos dice que id es la lla+e 3rimaria de esta tabla 3ero
adems nos dice que 0a5 una lla+e fornea a la tabla artista en su cam3o id
23.( ;14>: ;reate F;rearGC 1ead FLeerGC 43date
FActuali2arGC >elete FDorrarG
Acti+e1ecord im3lementa automticamente las cuatro o3eraciones bsicas sobre una
tabla: ;rearC LeerC Actuali2ar 5 Dorrar
Libro de Kumbia: Porque Programar debera ser ms fcil ($
23.(.1 ;reando 1egistros
<anteniendo la idea del 8bBeto=1elacional 3odemos 3ensar que crear registros es lo
mismo que crear obBetosC entonces 3odramos estar en lo cierto Asignar a un obBeto
+alores 5 eBecutar el m/todo create o sa+e es todo lo que tenemos que 0acer
1. $Album = new Album();
2. $Album->nombre = Take Off Your Pants and Jacket;
3. $Album->valor = 40000;
4. $Album->save();
Adicionalmente a esto 3uede utili2ar el m/todo VcreateW as como los m/todos como
VcreateCromCre"uestW 3ara crear nue+os registros
1. $Album = new Album();
2. $Album->nombre = Take Off Your Pants and Jacket;
3. $Album->valor = 40000;
4. $Album->create();
5.
6. $Album = new Album();
7. $Album->create(
8. nombre: Take Off Your Pants and Jacket,
9. valor: 40000
10.);
11.
12.$Album = new Album();
13.$Album&'create)arra$)
14. nombre => Take Off Your Pants and Jacket,
15. valor => 40000
16.));
Jambi/n 3odemos crear un *ue+o registro a 3artir de los +alores de HE1&.4&%J
1. $Album = new Album();
2. $Album->create_from_request();
23.(.2 ;onsultando 1egistros
Para consultar en una base de datos tenemos que tener claro qu/ +amos a buscarC es
decir definir un criterio de b[squeda &ste criterio le 3ermite a Active/ecord de+ol+er el
conBunto de obBetos que coincidan con este 5 as 3oder trabaBar esa informaci#n
&l camino ms sencillo 3ara encontrar determinado registro en una tabla es es3ecificar
su lla+e 3rimaria &n Kumbia los modelos so3ortan el m/todo VindWC as como otros
m/todos com3lementarios 3ara consultas &ste m/todo 3ermite consultar registros a
3artir de sus lla+es 3rimarias as como con 3armetros *#tese que este m/todo
de+uel+e el +alor boolean false en caso de no encontrar registros que coincidan con la
b[squeda
1. //Buscar el Producto con id = 38
2. $producto = $Productos->find(38);
3. print $producto&'nombre! //;mprime el nombre del producto id,>?
Libro de Kumbia: Porque Programar debera ser ms fcil ((
"gualmente necesitamos 0acer consultas a 3artir de otros atributos del modelo no
solamente a 3artir de su lla+e 3rimaria Acti+e1ecord 3ro3orciona una serie de
3armetros 3ara crear consultas es3eciali2adas que nos 3ermitan acceder a los registros
que necesitamos Para ilustrar esto +eamos:
1. # Buscar los Productos en estado = C y cuyo valor sea menor a 15000
2. foreach($Productos->find(estado=C and valor<15000) as $producto){
3. print $producto&'nombre!
4. }
5.
6. #Buscar el primer producto en estado = C ordenado por fecha
7. foreach($Productos->find_first(conditions: estado=C,
8. order: fecha desc) as $producto){
9. print $producto&'nombre!
10.}
11.
12.#Buscar el primer producto en estado = $estado ordenado por fecha
13.$producto = $Productos->find_first(conditions: estado=$estado,
14. order: fecha desc);
15.print $producto&'nombre!
;abe destacar que el uso de VindCirstW de+uel+e el 3rimer registro que coincida con la
b[squeda 5 VindW todos los registros
23.(.3 &l 3oderoso Find
Aunque a3arentemente Acti+e1ecord elimina el uso del %.L en un gran 3orcentaBeC
realmente no lo esC sim3lemente crea una ca3a de abstracci#n su3erior que 3uede llegar
a limitarse en determinados momentos cuando las b[squedas se em3ie2an a +ol+er
com3leBas Kumbia 3ermite el uso del lenguaBe %.L 5a sea utili2ando una instancia de
Acti+e1ecord o accediendo a la ca3a de abstracci#n de datos como [ltimo recurso Flo
cual no es recomendadoG &l lenguaBe %.L es una 3oderosa 0erramienta que no 3odemos
deBar de usar 5 que debemos tener a la mano en uno de esos casos e?tremos en lo
dems Acti+e1ecord se encargar de facilitarnos la +ida en gran medida
%in 3armetros e?tra Acti+e1ecord con+ierte una consulta en un select from estndar
3ero 3odemos agregar otras o3ciones 3ara es3eciali2ar la b[squeda 5 obtener ms
detalladamente lo que buscamos
&l 3armetro conditions: 3ermite es3ecificar un conBunto de condiciones que +an a
actuar como el gw0ereh de nuestra consulta "gualmente Acti+e1ecord no garanti2a que
los registros sean de+ueltos en el orden requerido as que 3odemos utili2ar order: 3ara
reali2ar el ordenamiento &l 3armetro limit: nos 3ermite es3ecificar el n[mero m?imo
de registros a ser de+ueltos
1. #Buscar los productos en estado = $estado ordenado por fecha y valor
2. foreach($Productos->find_first(conditions: estado=$estado,
3. order: fecha Desc, valor,
4. limit: 30) as $prod){
5. print $prod&'nombre!
6. }
Libro de Kumbia: Porque Programar debera ser ms fcil ('
23.(.( PromedioC ;ontandoC %umandoC <nimo 5 <?imo
4na de las tareas ms comunes es el uso de contadores 5 sumadores de registros en
consultasC as como el uso de otras funciones de agru3aci#n
&l m/todo de conteo de registros se llama count 5 3uede recibir como 3armetros
condiciones de /ste
1. #Cuantos productos hay?
2. print 1roductos&'count)*!
3.
4. #Cuantos productos hay con estado = 'A'?
5. print 1roductos&'count)"estado,@A@%*!
Las funciones de agru3aci#n sumaC mnimoC 3romedio 5 m?imoC son utili2adas de esta
forma:
1. #Cuantos suma el valor de todos los productos?
2. print 1roductos&'sum)"valor%*!
3.
4. #Cuantos suma el valor de los productos activos?
5. print 1roductos&'sum)"valor%, "conditions: estado,@A@%*!
6.
7. #Promedio del valor de los productos activos?
8. print 1roductos&'averaAe)"valor%, "conditions: estado,@A@%*!
9.
10.#El valor mnimo de los productos activos?
11. print 1roductos&'minumum)"valor%, "conditions: estado,@A@%*!
12.
13.#El valor mximo de los productos activos?
14. print 1roductos&'maBimum)"valor%, "conditions: estado,@A@%*!
23.(.5 Actuali2ando 1egistros e?istentes
1ealmente no 0a5 muc0o que decir acerca de c#mo actuali2ar registros %i tienes un
obBeto Acti+e1ecord F3or eBem3lo un 3roducto de la base de datosGC 3uedes actuali2ar
llamando su m/todo sa+eFG %i este obBeto 0a sido ledo de la base de datos 3uedes
actuali2ar el registro corres3ondiente mediante sa+eC en caso de que no e?ista se
insertar el un registro nue+o
1. $producto = $Productos->find(123);
2. $producto->nombre = "Televisor";
3. $producto->save();
Libro de Kumbia: Porque Programar debera ser ms fcil (-
Advertencia: &n 8racle la funcionalidad limit 3odra no
funcionar como se es3era 4tilice la condici#n
rownum c numeroEfilas 3ara 0acer esto.
8tra forma de actuali2ar registros es utili2ar el m/todo u3dateFG de esta forma:
1. $producto = $Productos->find(456);
2. $producto->update(nombre: Televisor, cantidad: 2);
3. $producto->save();
23.(.4 Dorrando 1egistros
1ealmente no 0a5 muc0o que decir acerca de c#mo eliminar registros %i tienes un
obBeto Acti+e1ecord F3or eBem3lo un 3roducto de la base de datosGC 3uedes eliminarlo
llamando a su m/todo deleteFG
1. $Productos->delete(123);
23.(.6 2ro#iedades ;o#ortadas
2ro#iedad Kescri#cin
Hfields Listado de ;am3os de la tabla que 0an sido ma3eados
Hcount ;onteo del [ltimo 1esultado de un %elect
H3rimar5Eke5 Listado de columnas que conforman la lla+e 3rimaria
HnonE3rimar5 Listado de columnas que no son lla+e 3rimaria
HnotEnull Listado de cam3os que son notEnull
HattributesEnames *ombres de todos los cam3os que 0an sido ma3eados
HisE+iew %o3orte 3ara las Aista
23.5 Aonvenciones en Active/ecord
Acti+e1ecord 3osee una serie de con+enciones que le sir+en 3ara asumir distintas
cualidades 5 relacionar un modelo de datos Las con+enciones son las siguientes:
23.5.1 ;on+enciones Menerales
23.5.2 "d
%i Acti+e1ecord encuentra un cam3o llamado 5dC Acti+e1ecord asumir que se trata de la
lla+e 3rimara de la entidad 5 que es autonum/rica
23.5.3 cam3oEid
Los cam3os terminados en Cid indican relaciones forneas a otras tablasC de esta forma
se 3uede definir fcilmente las relaciones entre las entidades del modelo:
4n cam3o llamado clientesEid en una tabla indica que e?iste otra
tabla llamada clientes 5 esta contiene un cam3o id que es fornea a este
Libro de Kumbia: Porque Programar debera ser ms fcil (6
23.5.( cam3oEat
Los cam3os terminados en Cat indican que son fec0as 5 3osee la funcionalidad e?tra que
obtienen el +alor de fec0a actual en una insercin
1. created_at es un campo fecha
23.5.5 cam3oEin
Los cam3os terminados en Cin indican que son fec0as 5 3osee la funcionalidad e?tra que
obtienen el +alor de fec0a actual en una actuali0acin
1. modified_in es un campo fecha
23.4 ;on+enciones 3ara 1>D<s
23.4.1 ;on+enciones &s3eciales 3ara Postgre%.L
Los cam3os autonum/ricos en Postgre%.L deben ser definidos con una columna de ti3o
serial
23.4.2 ;on+enciones &s3eciales 3ara 8racle
Los cam3os autonum/ricos en 8racle no e?isten 5 las inserciones deben ser reali2adas
utili2ando una isequenciai au?iliar que debe ser creada utili2ando la con+enci#n
tabla_sequence
Libro de Kumbia: Porque Programar debera ser ms fcil (7
2( Acti+e 1ecord AP"
A continuaci#n +eremos una referencia de los m/todos que 3osee la clase Acti+e1ecord 5
su funcionalidad res3ecti+a fstos se encuentran organi2ados alfab/ticamente:
2(.1 ;onsulta
</todos 3ara 0acer consulta de 1egistros:
2(.1.1 distinct
1 distinct([string $atributo_entidad], [conditions: ], [order: ], [limit:
], [column: ])
&ste m/todo eBecuta una consulta de distinci#n [nica en la entidadC funciona igual que un
Pselect uni"ue cam#oR +i/ndolo desde la 3ers3ecti+a del %.L &l obBeti+o es de+ol+er
un arra5 con los +alores [nicos del cam3o es3ecificado como 3armetro
1. $unicos = $this->Usuarios->distinct(estado)
2. # array(A, I, N)
Los 3armetros conditionsC order 5 limit funcionan id/nticamente que en la funci#n find 5
3ermiten modificar la forma o los mismos +alores de retorno de+ueltos 3or /sta
2(.1.1 indCallCb'Cs"l Lstrin! Ss"l9
&ste m/todo nos 3ermite 0acer una consulta 3or medio de un %.L 5 el resultado de+uelto
es un arra5 de obBetos de la misma clase con los +alores de los registros en estos La idea
es que el uso de este m/todo no debera ser com[n en nuestras a3licaciones 5a que
Acti+e1ecord se encarga de eliminar el uso del %.L en gran 3orcentaBeC 3ero 0a5
momentos en que es necesario que seamos ms es3ecficos 5 tengamos que recurrir al
uso de este &Bem3lo:
1. foreach($Usuarios->find_all_by_sql("select * from usuarios
2. where codigo not in (select codigo
3. from ingreso)") as $usuario){
4. print $9suario&'nombre!
5. }
&ste eBem3lo consultamos todos los usuarios con una sentencia %,ere es#ecial e
im3rimimos sus nombres La idea es que los usuarios consultados no 3ueden estar en la
entidad ingreso
2(.1.2 indCb'Cs"l Lstrin! Ss"l9
&ste m/todo nos 3ermite 0acer una consulta 3or medio de un %.L 5 el resultado de+uelto
es un obBeto que re3resenta el resultado encontrado La idea es que el uso de este
m/todo no debera ser com[n en nuestras a3licaciones 5a que Acti+e1ecord se encarga
Libro de Kumbia: Porque Programar debera ser ms fcil (9
de eliminar el uso del %.L en gran 3orcentaBeC 3ero 0a5 momentos en que es necesario
que seamos ms es3ecficos 5 tengamos que recurrir al uso de este &Bem3lo:
1. $usuario = $Usuarios->find_by_sql("select * from usuarios
2. where codigo not in (select codigo
3. from ingreso) limit 1");
4. print $9suario&'nombre!
&ste eBem3lo consultamos todos los usuarios con una sentencia %,ere es#ecial e
im3rimimos sus nombres La idea es que el usuario consultado no 3uede estar en la
entidad ingreso
2(.1.3 indCirst
findEfirstFQinteger HidRC QOconditions: jPRC QOorder: jPRC QOlimit: jRC QOcolumns: jPRG
&l m/todo OfindEfirstP de+uel+e el 3rimer registro de una entidad o la 3rimera ocurrencia
de acuerdo a unos criterios de b[squeda u ordenamiento Los 3armetros son todos
o3cionales 5 su orden no es rele+anteC cuando se in+oca sin 3armetros de+uel+e el
3rimer registro insertado en la entidad &ste m/todo es mu5 fle?ible 5 3uede ser usado
de muc0as formas:
&Bem3lo:
1. $this->Usuarios->find_first(conditions: estado=A ,order: fecha desc);
&n este eBem3lo buscamos el 3rimer registro cu5o estado sea igual a OAP 5 ordenado
descendentementeC el resultado de /steC se carga a la +ariable H4suarios e igualmente
de+uel+e una instancia del mismo obBeto Acti+e1ecord en caso de /?ito o false en caso
contrario
;on el m/todo findEfirst 3odemos buscar un registro en 3articular a 3artir de su id de
esta forma:
1. $this->Usuarios->find_first(123);
As obtenemos el registro 1!$ e igualmente de+uel+e una instancia del mismo obBeto
Acti+e1ecord en caso de /?ito o false en caso contrario
Kumbia genera una ad+ertencia cuando los criterios de b[squeda 3ara findEfirst
de+uel+en ms de un registroC 3ara esto 3odemos for2ar que se de+uel+a solamente unoC
mediante el 3armetro limitC de esta forma:
1. $this->Usuarios->find_first(conditions: estado=A ,limit: 1);
;uando queremos consultar s#lo algunos de los atributos de la entidad 3odemos utili2ar
el 3armetro columns as:
1. $this->Usuarios->find_first(columns: nombre, estado);
;uando es3ecificamos el 3rimer 3armetro de ti3o stringC Acti+e1ecord asumir que son
las condiciones de b[squeda 3ara findEfirstC as:
Libro de Kumbia: Porque Programar debera ser ms fcil ':
1. $Usuarios->find_first(estado=A);
>e esta forma 3odemos tambi/n deducir que estas ! sentencias arroBaran el mismo
resultado:
1. $this->Usuarios->find_first(id=123);
2. $this->Usuarios->find_first(123);
2(.1.( ind
2 find([integer $id], [conditions: ], [order: ], [limit: ], [columns:
])
&l m/todo PindR es el 3rinci3al m/todo de b[squeda de Acti+e1ecordC de+uel+e todas
los registros de una entidad o el conBunto de ocurrencias de acuerdo a unos criterios de
b[squeda Los 3armetros son todos o3cionales 5 su orden no es rele+anteC incluso
3ueden ser combinados u omitidos si es necesario ;uando se in+oca sin 3armetros
de+uel+e todos los registros en la entidad
&Bem3lo:
1. foreach($Usuarios->find(conditions: estado=A ,
2. order: fecha desc) as $usuario){
3. print $usuario&'nombre!
4. }//fin del foreach
&n este eBem3lo buscamos todos los registros cu5o estado sea igual a PAR 5 de+uel+a
/stos ordenados descendentementeC el resultado de este es un arra5 de obBetos de la
misma clase con los +alores de los registros cargados en ellosC en caso de no 0a5an
registros de+uel+e un arra5 +aco
;on el m/todo ind 3odemos buscar un registro en 3articular a 3artir de su id de esta
forma:
1. $this->Usuarios->find(123);
As obtenemos el registro 1!$ e igualmente de+uel+e una instancia del mismo obBeto
Acti+e1ecord en caso de /?ito o false en caso contrario ;omo es un solo registro no
de+uel+e un arra5C sino que los +alores de /ste se cargan en la misma +ariable si e?iste
el registro
Para limitar el n[mero de registros de+ueltosC 3odemos usar el 3armetro limitC as:
1. $this->Usuarios->find(conditions: estado=A ,limit: 5);
;uando queremos consultar s#lo algunos de los atributos de la entidad 3odemos utili2ar
el 3armetro columns as:
1. $Usuarios->find(columns: nombre, estado);
;uando es3ecificamos el 3rimer 3armetro de ti3o stringC Acti+e1ecord asumir que son
las condiciones de b[squeda 3ara findC as:
1. $this->Usuarios->find (estado=A);
Libro de Kumbia: Porque Programar debera ser ms fcil '1
%e 3uede utili2ar la 3ro3iedad count 3ara saber cuntos registros fueron de+ueltos en la
b[squeda
2(.1.5 selectConeLstrin! SselectC"uer'9
&ste m/todo nos 3ermite 0acer ciertas consultas como eBecutar funciones en el motor de
base de datos sabiendo que /stas de+uel+en un solo registro
1 Ht0is=I4suarios=IselectEoneFOcurrentEtimePG
&n el eBem3lo queremos saber la 0ora actual del ser+idor de+uelta desde <5%.L as que
3odemos usar este m/todo 3ara esto
2(.1.4 selectConeLstrin! SselectC"uer'9 Lstatic9
&ste m/todo nos 3ermite 0acer ciertas consultas como eBecutar funciones en el motor de
base de datosC sabiendo que /stas de+uel+en un solo registro &ste m/todo se 3uede
llamar de forma estticaC esto significa que no es necesario que 0a5a una instancia de
Acti+e1ecord 3ara 0acer el llamado
1. ActiveRecord::select_one(current_time)
&n el eBem3lo queremos saber la 0ora actual del ser+idor de+uelta desde <5%.L as que
3odemos usar este m/todo 3ara esto
2(.1.6 eDists
&ste m/todo nos 3ermite +erificar si el registro e?iste o no en la base de datos mediante
su id o una condici#n
1. $Usuarios->id = 3;
2. if($Usuarios->exists()){
3. print CDa eBiste el id , >C!
4. }//fin del if
5. $Usuarios->exists(nombre='Juan Perez')
6. $Usuarios->exists(2); // Un Usuario con id->2?
2(.1.7 indCallCb'
&ste m/todo nos 3ermite reali2ar una b[squeda 3or alg[n cam3o
1. $resultados = $Productos->find_all_by(categoria, Insumos);
2(.1.8 indCb'CXcam#oX
&ste m/todo nos 3ermite reali2ar una b[squeda 3or alg[n cam3o usando el nombre del
m/todo como nombre de /ste >e+uel+e un solo registro
1. $resultado = $Productos->find_by_categoria(Insumos);
2(.1.10 indCallCb'CXcam#oX
&ste m/todo nos 3ermite reali2ar una b[squeda 3or alg[n cam3o usando el nombre del
m/todo como nombre de /ste >e+uel+e todos los registros que coincidan con la
Libro de Kumbia: Porque Programar debera ser ms fcil '!
b[squeda
1. $resultados = $Productos->find_all_by_categoria(Insumos);
2(.2 Aonteos ' ;umatorias
2(.2.1 count
1eali2a un conteo sobre los registros de la entidad con o sin alguna condici#n adicional
&mula la funci#n de agru3amiento count
1. $numero_registros = $Clientes->count();
$numero_registros = $Clientes->count(ciudad = 'BOGOTA');
2(.2.2 sum
1eali2a una sumatoria sobre los +alores num/ricos de el atributo de alguna entidadC
emula la funci#n de agru3amiento sum en el lenguaBe %.L
1. $suma = $Productos->sum(precio);
2. $suma = $Productos->sum(precio, conditions: estado = 'A');
2(.2.3 countCb'Cs"l
1eali2a una sumatoria utili2ando lenguaBe %.L
1. $numero = $Productos->count_by_sql(select count(precio) from productos,
facturas where factura.codigo = 1124 and factura.codigo_producto =
productos.codigo_producto)
2(.3 2romedios, E:Dimos ' Ein?mos
2(.3.1 avera!e
Dusca el +alor 3romedio 3ara un atributo de alguna entidadC emula la funci#n de
agru3amiento a+erage en el lenguaBe %.L
1. $promedio = $Productos->average(precio);
2. $promedio = $Productos->average(precio, conditions: estado = 'A');
2(.3.2 maDimum
Dusca el +alor m?imo 3ara un atributo de alguna entidadC emula la funci#n de
agru3amiento ma? en el lenguaBe %.L
1. $maximo = $Productos->maximum(precio);
2. $maximo = $Productos->maximum(precio, conditions: estado = 'A');
2(.3.3 minumum
Dusca el +alor mnimo 3ara un atributo de alguna entidadC emula la funci#n de
agru3amiento min en el lenguaBe %.L
1. $minimo = $Productos->minimum(precio);
2. $minimo = $Productos->mininum(precio, conditions: estado = 'A');
Libro de Kumbia: Porque Programar debera ser ms fcil '$
2(.( AreacinBActuali0acinBQorrado de /e!istros
2(.(.1 create
;rea un registro a 3artir de los +alores de los atributos del obBeto Acti+e1ecord
1. $Album = new Album();
2. $Album->nombre = Take Off Your Pants and Jacket;
3. $Album->valor = 40000;
4. $Album->create();
5.
6. $Album = new Album();
7. $Album->create(
8. nombre: Take Off Your Pants and Jacket,
9. valor: 40000
10.);
11.
12.$Album = new Album();
13.$Album->create(array(
14. nombre => Take Off Your Pants and Jacket,
15. valor => 40000
16.));
2(.(.2 u#date
Actuali2a un registro a 3artir de los +alores de los atributos del obBeto Acti+e1ecord
1. $album = Album->find(12);
2. $album->nombre = Take Off Your Pants and Jacket;
3. $album->valor = 40000;
4. $album->update();
2(.(.3 u#dateCall
Actuali2a todos los registros de una entidad &l 3rimer 3armetro corres3onde a los
cam3os se3arados 3or comas que se +an a actuali2ar en todos los registros] 5 el segundo
3armetro es la condici#nC aunque no es obligatoria Jambi/n se 3uede es3ecificar un
limit 3ara delimitar el n[mero de registros que debe actuali2arse
1. $Clientes->update_all("estado='A', fecha='2005-02-02'", "id>100");
2. $Clientes->update_all("estado='A', fecha='2005-02-02'", "id>100", "limit:
10");
2(.(.( save
;rea un registro a 3artir de los +alores del obBeto Acti+e1ecord o actuali2a el registro si
5a e?iste
1. $Album = new Album();
2. $Album->nombre = Take Off Your Pants and Jacket;
3. $Album->valor = 40000;
4. $Album->save();
2(.(.5 createCromCre"uest
;rea un registro a 3artir de los +alores que +ienen de SC/E*1E;T que tengan el mismo
Libro de Kumbia: Porque Programar debera ser ms fcil '(
nombre de los atributos del obBeto Acti+e1ecord
1. $Album = new Album();
2. $Album->create_from_request();
2(.(.4 saveCromCre"uest
;rea@Actuali2a un registro a 3artir de los +alores que +ienen de SC/E*1E;T que tengan
el mismo nombre de los atributos del obBeto Acti+e1ecord
1. $Album = new Album();
2. $Album->save_from_request();
2(.(.6 delete
&limina registros de la tabla o el registro actual a 3artir de su id
1 HProductos=IdeleteF1!$G
2(.(.7 deleteCall
&limina todos los datos de una relaci#n mediante el obBeto Acti+e1ecord
1. $Productos->delete_all()
2(.5 Oalidaciones
2(.5.1 validatesC#resenceCo
;uando este m/todo es llamado desde el constructor de una clase Acti+e1ecordC obliga a
que se +alide la 3resencia de los cam3os definidos en la lista Los cam3os marcados
como notEnull en la tabla son automticamente +alidados
1. <?php
2. class Clientes extends ActiveRecord {
3. public function __construct(){
4. $this->validates_presence_of("cedula");
5. }
6. }
7. ?>
2(.5.2 validatesClen!t,Co
;uando este m/todo es llamado desde el constructor de una clase Acti+e1ecordC obliga a
que se +alide la longitud de los cam3os definidos en la lista &l 3armetro minimum
indica que se debe +alidar que el +alor a insertar o actuali2ar no sea menor de ese
tama\o &l 3armetro ma?imum indica que el +alor a insertar@actuali2ar no 3uede ser
ma5or al indicado &l 3armetro tooEs0ort indica el mensaBe 3ersonali2ado que
Acti+e1ecord mostrar en caso de que falle la +alidaci#n cuando es menor 5 tooElong
cuando es mu5 largo
Libro de Kumbia: Porque Programar debera ser ms fcil ''
1. class Clientes extends ActiveRecord {
2.
3. public function __construct(){
4. $this->validates_length_of("nombre", "minumum: 15", "too_short: El nombre
debe tener al menos 15 caracteres");
5. $this->validates_length_of("nombre", "maximum: 40", "too_long: El nombre
debe tener maximo 40 caracteres");
6. $this->validates_length_of("nombre", "in: 15:40",
7. "too_short: El nombre debe tener al menos 15 caracteres",
8. "too_long: El nombre debe tener maximo 40 caracteres"
9. );
10. }
11.
12. }
2(.5.3 validatesCnumericalit'Co
Aalida que ciertos atributos tengan un +alor num/rico antes de insertar # actuali2ar
1. <?php
2.
3. class Productos extends ActiveRecord {
4.
5. public function __construct(){
6. $this->validates_numericality_of("precio");
7. }
8.
9. }
10.?>
2(.5.( validatesCemailCin
Aalida que ciertos atributos tengan un formato de e=mail correcto antes de insertar o
actuali2ar
1. <?php
2. class Clientes extends ActiveRecord {
3.
4. public function __construct(){
5. $this->validates_email_in("correo");
6. }
7.
8. }
9. ?>
2(.5.5 validatesCuni"uenessCo
Aalida que ciertos atributos tengan un +alor [nico antes de insertar o actuali2ar
1. <?php
2. class Clientes extends ActiveRecord {
3. public function __construct(){
4. $this->validates_uniqueness_of("cedula");
5. }
6. }
7. ?>
Libro de Kumbia: Porque Programar debera ser ms fcil '-
2(.5.4 validatesCdateCin
Aalida que ciertos atributos tengan un formato de fec0a acorde al indicado en
config@configini antes de insertar o actuali2ar
1. <?php
2. class Registro extends ActiveRecord {
3.
4. public function __construct(){
5. $this->validates_date_in("fecha_registro");
6. }
7. }
8. ?>
2(.5.6 validatesCormatCo
Aalida que el cam3o tenga determinado formato seg[n una e?3resi#n regular antes de
insertar o actuali2ar
1. <?php
2. class Clientes extends ActiveRecord {
3.
4. public function __construct(){
5. $this->validates_format_of("email", "^(+)@((?:[?a?z0?9]+\.)+[a?z]{2,})
$");
6. }
7.
8. }
9. ?>
2(.4 Jransaccionalidad
4na transacci#n en una base de datos es una serie de cambios que deben ser a3licados
al mismo tiem3o de tal manera que se eBecuten bien cada uno de ellos 5 sin faltar
ninguno
%i el motor de base de datos utili2ado 3or Acti+e 1ecord so3orta transaccionesC 3uedes
em3e2arC finali2ar 5 cancelarlas mediante los m/todos beginC commitC rollback
2(.4.1 commitL9
&ste m/todo nos 3ermite confirmar una transacci#n iniciada 3or el m/todo begin en el
motor de base de datosC si /ste lo 3ermite >e+uel+e true en caso de /?ito 5 false en
caso contrario
1. $Usuarios->commit()
2(.4.2 be!inL9
&ste m/todo nos 3ermite crear una transacci#n en el motor de base de datosC si este lo
3ermite >e+uel+e true en caso de /?ito 5 false en caso contrario
1. $Usuarios->begin()
Libro de Kumbia: Porque Programar debera ser ms fcil '6
2(.4.3 rollbackL9
&ste m/todo nos 3ermite anular una transacci#n iniciada 3or el m/todo begin en el motor
de base de datosC s /ste lo 3ermite >e+uel+e true en caso de /?ito 5 false en caso
contrario
1. $Usuarios->rollback()
2(.6 Otros Eetodos
</todos de funcionalidad e?tra de Acti+e1ecord
2(.6.1 s"lLstrin! Ss"l9
&sta funci#n nos 3ermite eBecutar sentencias %.L directamente en el motor de base de
datos La idea es que el uso de este m/todo no debera ser com[n en nuestras
a3licaciones 5a que Acti+e1ecord se encarga de eliminar el uso del %.L en gran
3orcentaBeC 3ero 0a5 momentos en que es necesario que seamos ms es3ecficos 5
tengamos que recurrir al uso de /ste
2(.7 Aallbacks en Active/ecord
&l Acti+e1ecord controla el ciclo de +ida de los obBetos creados 5 ledosC su3er+isando
cuando se modificanC se almacenan o se borran 4sando callbacks Lo eventos9C el
Acti+e1ecord nos 3ermite inter+enir en esta su3er+isi#n Podemos escribir el c#digo que
3ueda ser in+ocado en cualquier e+ento significati+o en la +ida de un obBeto ;on los
callbacks 3odemos reali2ar +alidaci#n com3leBaC re+isar los +alores que +ienen desde 5
0acia la base de datosC e incluso e+itar que ciertas o3eraciones finalicen 4n eBem3lo de
estos callbacks 3uede ser una +alidaci#n en 3roductos que e+ita que 3roductos VactivosW
sean borrados
1. class User extends ActiveRecord {
2.
3. public before_delete = no_borrar_activos;
4.
5. public function no_borrar_activos(){
6. if($this->estado==A){
7. Flash::error(No se puede borrar Productos Activos);
8. return cancel;
9. }
10. }
11.
12. public function after_delete(){
13. Flash::success("Se borro el usuario $this->nombre");
14. }
15.
16. }
A continuaci#n otros callbacks que 3odemos encontrar en Acti+e1ecord &l orden en el
que son 3resentados es en el que se llaman si estn definidos:
Libro de Kumbia: Porque Programar debera ser ms fcil '7
2(.7.1 beoreCvalidation
&s llamado Busto antes de reali2ar el 3roceso de +alidaci#n 3or 3arte de Kumbia %e
3uede cancelar la acci#n que se est/ reali2ando si este m/todo de+uel+e la 3alabra
TerrorT
2(.7.2 beoreCvalidationConCcreate
&s llamado Busto antes de reali2ar el 3roceso de +alidaci#n 3or 3arte de KumbiaC s#lo
cuando se reali2a un 3roceso de inserci#n en un modelo %e 3uede cancelar la acci#n que
se est/ reali2ando si este m/todo de+uel+e la 3alabra TerrorT
2(.7.3 beoreCvalidationConCu#date
&s llamado Busto antes de reali2ar el 3roceso de +alidaci#n 3or 3arte de KumbiaC s#lo
cuando se reali2a un 3roceso de actuali2aci#n en un modelo %e 3uede cancelar la acci#n
que se est/ reali2ando si este m/todo de+uel+e la 3alabra TerrorT
2(.7.( aterCvalidationConCcreate
&s llamado Busto des3u/s de reali2ar el 3roceso de +alidaci#n 3or 3arte de KumbiaC s#lo
cuando se reali2a un 3roceso de inserci#n en un modelo %e 3uede cancelar la acci#n que
se est/ reali2ando si este m/todo de+uel+e la 3alabra TerrorT
2(.7.5 aterCvalidationConCu#date
&s llamado Busto des3u/s de reali2ar el 3roceso de +alidaci#n 3or 3arte de KumbiaC s#lo
cuando se reali2a un 3roceso de actuali2aci#n en un modelo %e 3uede cancelar la acci#n
que se est/ reali2ando si este m/todo de+uel+e la 3alabra TerrorT
2(.7.4 aterCvalidation
&s llamado Busto des3u/s de reali2ar el 3roceso de +alidaci#n 3or 3arte de Kumbia %e
3uede cancelar la acci#n que se est/ reali2ando si este m/todo de+uel+e la 3alabra
TerrorT
2(.7.6 beoreCsave
&s llamado Busto antes de reali2ar el 3roceso de guardar cuando se llama el m/todo sa+e
en un modelo %e 3uede cancelar la acci#n que se est/ reali2ando si este m/todo
de+uel+e la 3alabra TerrorT
2(.7.7 beoreCu#date
&s llamado Busto antes de reali2ar el 3roceso de actuali2aci#n cuando se llama el m/todo
sa+e o u3date en un modelo %e 3uede cancelar la acci#n que se est/ reali2ando si este
m/todo de+uel+e la 3alabra TerrorT
2(.7.8 beoreCcreate
&s llamado Busto antes de reali2ar el 3roceso de inserci#n cuando se llama el m/todo
sa+e o create en un modelo %e 3uede cancelar la acci#n que se est/ reali2ando si este
m/todo de+uel+e la 3alabra TerrorT
Libro de Kumbia: Porque Programar debera ser ms fcil '9
2(.7.10 aterCu#date
&s llamado Busto des3u/s de reali2ar el 3roceso de actuali2aci#n cuando se llama el
m/todo sa+e o u3date en un modelo
2(.7.11 aterCcreate
&s llamado Busto des3u/s de reali2ar el 3roceso de actuali2aci#n cuando se llama el
m/todo sa+e o create en un modelo
2(.7.12 aterCsave
&s llamado Busto des3u/s de reali2ar el 3roceso de actuali2aci#n@inserci#n cuando se
llama el m/todo sa+eC u3date # create en un modelo
2(.7.13 beoreCdelete
&s llamado Busto antes de reali2ar el 3roceso de borrado cuando se llama el m/todo
delete en un modelo %e 3uede cancelar la acci#n que se est/ reali2ando si este m/todo
de+uel+e la 3alabra TerrorT
2(.7.1( aterCdelete
&s llamado Busto des3u/s de reali2ar el 3roceso de borrado cuando se llama el m/todo
delete en un modelo
Libro de Kumbia: Porque Programar debera ser ms fcil -:
2(.8 2ersistencia
&n ocasiones es necesario mantener 3ersistente los +alores de alg[n obBeto
Acti+e1ecord
;omo sabemos el modelo de a3licaciones Web 5 en es3ecial el de PHPC creaBdestru'e
los obBetos cada +e2 que se eBecuta un scri3t a menos que usemos +ariables de sesi#n
&n +ista a esta necesidadC Kumbia 3ermite mantener los +alores de los 8bBetos
Acti+e1ecord 3or las siguientes ra2ones:
1 %e reali2a muc0as +eces la misma consulta 5 sera bueno mantener estos +alores
mientras se eBecuta la a3licaci#n con tan s#lo reali2ar la consulta una sola +e2
! Los +alores del 8bBeto +an a ser utili2ados en otros mbitos de la a3licaci#n 5 sera
bueno que mantu+ieran su +alor tras terminar la eBecuci#n de un determinado
%cri3t
Para esto definimos la 3ro3iedad de Acti+e1ecord S#ersistent en el modelo que
queremos que sea 3ersistente
1. <?php
2. class Clientes extends ActiveRecord {
3.
4. public $persistent; = true;
5.
6. } //fin de la clase
7. ?>
Nota: &sta 3ro3iedad s#lo afecta a los obBetos Acti+e1ecord que se acceden mediante
St,is@T en los controladores
Libro de Kumbia: Porque Programar debera ser ms fcil -1
2(.10 Tra0a ' Kebu! en Active/ecord
Acti+e1ecord 3ermite 0acer una tra2a de todas las transacciones %.L generadas
internamente en el <odelo &sta tra2a nos 3ermite buscar errores 5@o 0acer seguimiento
de las acciones reali2adas en un determinado obBeto
Para 0abilitar la tra2a a un arc0i+o definimos la 3ro3iedad Slo!!er en el modelo de esta
forma:
1. <?php
2.
3. class Clientes extends ActiveRecord {
4. public $logger = true;
5. }//fin de la clase
6.
7. ?>
>e esta forma Acti+e1ecord mediante la clase Logger crea un arc0i+o en lo!sB con un
nombre como logYYYY-MM-DD.txt con las transacciones %.L generadas internamente
Jambi/n 3odemos 0acerlo de esta forma 3ara acti+arlo 3ara un obBeto en 3articular:
1. $this->Clientes->logger = true;
2. ...
3. ...
4. $this->Clientes->logger = false;
"ncluso 3odemos cambiar el nombre del arc0i+o generado asignndolo a la +ariable
Slo!!er asi:
1. <?php
2. class Clientes extends ActiveRecord {
3. public $logger = "archivo.txt";
4. }//fin de la clase
5. ?>
2(.11 Jra2a en Pantalla
Para 0abilitar la tra2a 3or 3antalla definimos la 3ro3iedad Sdebu! en el modelo de esta
forma:
1. <?php
2. class Clientes extends ActiveRecord {
3.
4. public $debug = true;
5.
6. } //fin de la clase
7. ?>
Libro de Kumbia: Porque Programar debera ser ms fcil -!
2(.12 Eostrar Errores en Ob&etos Active/ecord
Para mostrar todos los errores que de+uel+a el motor de base de datos en caso de una
acci#n indebida o error de sinta?isC etcC debemos asignar a la 3ro3iedad Hdis3la5Eerrors
S trueC en el modelo as:
1. <?php
2. class Clientes extends ActiveRecord {
3.
4. public $display_errors = true;
5.
6. } //fin de la clase
2(.13 Asociaciones
<uc0as a3licaciones trabaBan con m[lti3les tablas en una base de datos 5 normalmente
0a5 relaciones entre esas tablas Por eBem3loC una ciudad 3uede ser el 0ogar de muc0os
clientes 3ero un cliente solo tiene una ciudad &n un esquema de base de datosC estas
relaciones son enla2adas mediante el uso de lla+es 3rimarias 5 forneas
;omo Acti+e1ecord trabaBa con la con+enci#n: La lla+e fornea tiene el nombre de la
tabla 5 termina en idC as: ciudadCidC esto es una relaci#n a la tabla ciudad a su lla+e
3rimaria id
As queC sabiendo estoC quisi/ramos que en +e2 de decir:
1. $ciudad_id = $cliente->ciudad_id;
2. $ciudad = $Ciudad->find($ciudad_id);
3. print $ciudad&'nombre!
meBor fuera:
1. print $cliente->getCiudad()->nombre;
Mran 3arte de la magia que tiene Acti+e1ecord es estoC 5a que con+ierte las lla+es
forneas en sentencias de alto ni+elC fciles de com3render 5 de trabaBar
Libro de Kumbia: Porque Programar debera ser ms fcil -$
);omo usar Asociaciones,
&?isten cuatro ti3os de relaciones im3lementadas en Acti+e1ecord
2(.13.1 2ertenece a
&ste ti3o de relaci#n se efect[a con el m/todo ObelongsEtoPC en esta la lla+e fornea se
encuentra en la tabla del modelo de donde se in+oca el m/todo ;orres3onde a una
relaci#n uno a uno en el modelo entidad relaci#n
belongsEtoFHrelationG
Srelation Lstrin!9: nombre de la relaci#n
Parmetros con nombre:
model: *ombre del ti3o de modelo que debe retornar la consulta de la relaci#n Por
defecto se considera un modelo que corres3onda al nombre de la relaci#n &Bem3lo: %i
HrelationSTautoE+oladorTC entonces modelSAutoAolador
k: nombre de la lla+e fornea mediante la cual se relaciona Por defecto se considera el
nombre de la relaci#n con el sufiBo OEidP &Bem3lo: %i HrelationSTautoE+oladorTC entonces
fkSautoE+oladorEid
&Bem3los de uso:
1. $this->belongs_to('persona');
2. $this->belongs_to('vendedor', 'model: Persona')
3. $this->belongs_to('funcionario', 'model: Persona', 'fk: personal_id')
&n el modelo Libro:
1. class Libro extends ActiveRecord {
2. public function initialize() {
3. $this->belongs_to('persona');
4. }
5. }
Libro de Kumbia: Porque Programar debera ser ms fcil -(
2(.13.2 Tienes un
&ste ti3o de relaci#n se efect[a con el m/todo O0asEonePC en esta la lla+e fornea se
encuentra en la tabla del modelo con el que se quiere asociar ;orres3onde a una
relaci#n uno a uno en el modelo entidad relaci#n
0asEoneFHrelationG
Srelation Lstrin!9: nombre de la relaci#n
Parmetros con nombre:
model: *ombre del ti3o de modelo que debe retornar la consulta de la relaci#n Por
defecto se considera un modelo que corres3onda al nombre de la relaci#n &Bem3lo: %i
HrelationSTautoE+oladorTC entonces modelSAutoAolador
k: nombre de la lla+e fornea mediante la cual se relaciona Por defecto se considera el
nombre de la relaci#n con el sufiBo OEidP &Bem3lo: %i HrelationSTautoE+oladorTC entonces
fkSautoE+oladorEid
&Bem3los de uso:
1. $this->has_one('persona');
2. $this->has_one('vendedor', 'model: Persona')
3. $this->has_one('funcionario', 'model: Persona', 'fk: personal_id')
&n el modelo Persona:
1. class Persona extends ActiveRecord {
2. public function initialize() {
3. $this->has_one('datos_personales');
4. }
5. }
Libro de Kumbia: Porque Programar debera ser ms fcil -'
2(.13.3 Tiene muc,os
&ste ti3o de relaci#n se efect[a con el m/todo O0asEman5PC en esta la lla+e fornea se
encuentra en la tabla del modelo con el que se quiere asociar ;orres3onde a una
relaci#n uno a muc0os en el modelo entidad relaci#n
0asEman5FHrelationG
Srelation Lstrin!9: nombre de la relaci#n
Parmetros con nombre:
model: *ombre del ti3o de modelo que debe retornar la consulta de la relaci#n Por
defecto se considera un modelo que corres3onda al nombre de la relaci#n &Bem3lo: %i
HrelationSTautoE+oladorTC entonces modelSAutoAolador
k: nombre de la lla+e fornea mediante la cual se relaciona Por defecto se considera el
nombre de la relaci#n con el sufiBo OEidP &Bem3lo: %i HrelationSTautoE+oladorTC entonces
fkSautoE+oladorEid
&Bem3los de uso:
1. $this->has_many('persona');
2. $this->has_many('vendedor', 'model: Persona')
3. $this->has_many('funcionario', 'model: Persona', 'fk: personal_id')
&n el modelo Persona:
1. class Persona extends ActiveRecord {
2. public function initialize() {
3. $this->has_many('libro');
4. }
5. }
Libro de Kumbia: Porque Programar debera ser ms fcil --
2(.13.( Tiene ' #ertenece a muc,os
&ste ti3o de relaci#n se efect[a con el m/todo O0asEandEbelongsEtoEman5PC esta se
efect[a a tra+/s de una tabla que se encarga de enla2ar los dos modelos ;orres3onde a
una relaci#n muc0os a muc0os en el modelo entidad relaci#n &ste ti3o de relaci#n tiene
la des+entaBa de que no es so3ortada en el mbito de m[lti3les cone?iones de
Acti+e1ecordC 3ara lograr que funcione con multi3les cone?ionesC se 3uede emular a
tra+/s de dos relaciones 0asEman5 al modelo de la tabla que relaciona
0asEandEbelongsEtoEman5FHrelationG
Srelation Lstrin!9: nombre de la relaci#n
Parmetros con nombre:
model: *ombre del ti3o de modelo que debe retornar la consulta de la relaci#n Por
defecto se considera un modelo que corres3onda al nombre de la relaci#n &Bem3lo: %i
HrelationSTautoE+oladorTC entonces modelSAutoAolador
k: nombre de la lla+e fornea mediante la cual se relaciona Por defecto se considera el
nombre de la relaci#n con el sufiBo OEidP &Bem3lo: %i HrelationSTautoE+oladorTC entonces
fkSautoE+oladorEid
ke': nombre del cam3o que contendr el +alor de la lla+e 3rimaria en la tabla intermedia
que contendr los cam3os de la relaci#n Por defecto corres3onde al nombre del modelo
con que se +a a relacionar con el sufiBo OEidP
t,rou!,: tabla a tra+/s de la cual se establece la relaci#n muc0os a muc0os Por defecto
se forma 3or el nombre de la tabla del modelo que tiene el nombre de tabla mas largo 5
como 3refiBo un OEP 5 el nombre de la tabla del otro modelo
&Bem3los de uso:
1. $this->has_and_belongs_to_many('persona');
2. $this->has_and_belongs_to_many('cargos', 'model: Cargo', 'fk: id_cargo',
'key: id_persona', 'through: cargo_persona');
Libro de Kumbia: Porque Programar debera ser ms fcil -6
&n el modelo Persona:
1. class Persona extends ActiveRecord {
2. public function initialize() {
3. $this->has_and_belongs_to_many('cargo');
4. }
5. }
2(.1( Eulti#les coneDiones en Active/ecord
"magina 3oder utili2ar di+ersas bases de datosC aloBadas en ser+idores diferentes 5 de
manera trans3arenteC tan solo con Acti+e1ecordC si es +erdadC a0ora Kumbia lo 0ace 3or
ti ;on este fin se encuentra el m/todo OsetEmodeP &l [nico incon+eniente es que la
relaci#n O0asEandEbelongsEtoEman5P no 3uede utili2arce en este conte?to a menos que
los modelos que se quieran relacionar 5 la tabla a tra+/s de la cual se relacionan
3ertene2can al mismo OmodePC en cualquier otro caso 3uede obtenerse un resultado
similar utili2ando O0asEman5P 5 ObelongsEtoP
setEmodeFHmodeG
Smode: modo el cual determina la cone?i#n a utili2arC se refiere a los que se encuentran
en en+ironmentini
&Bem3lo:
class Persona{
public function initialize() {
$this->set_mode('production');
}
}
Libro de Kumbia: Porque Programar debera ser ms fcil -7
2(.15 2a!inadores
Para la 3aginaci#n e?isten dos funciones encargadas de esto:
#a!inate
&ste es ca3a2 de 3aginar arra5s o modelosC recibe los siguientes 3armetros:
Para arra5:
Hs : arra5 a 3aginar
3age: numero de 3gina
3erE3age: cantidad de elementos 3or 3gina
&Bem3lo:
$page = paginate($a, 'per_page: 5', 'page: 1');
Para modelo:
Hs: string con nombre de modelo o obBeto Acti+e1ecord
3age: numero de 3gina
3erE3age: cantidad de elementos 3or 3gina
Asimismo recibe todos los 3armetros que 3ueden utili2arse en el m/todo OfindP de
Acti+e1ecord
&Bem3los:
$page = paginate('usuario', 'NOT login=admin', 'order: login ASC', 'per_page:
5', 'page: 1');
$page = paginate($this->Usuario, 'NOT login=admin', 'order: login ASC',
'per_page: 5', 'page: 1');
#a!inateCb'Cs"l
&fect[a 3aginaci#n a tra+/s de una consulta sql 1ecibe los siguientes 3armetros:
Hmodel: string nombre de modelo o obBeto Acti+e1ecord
Hsql: string consulta sql
&Bem3lo:
$page = paginate_by_sql('usuario', 'SELECT * FROM usuario WHERE nombre LIKE
%emilio% ', 'per_page: 5', 'page: 1');
Ambos ti3os de 3aginadores retornan un obBeto O3agePC este obBeto O3ageP es creado a
3artir de std;lassC contiene los siguientes atributos:
ne?t: n[mero de 3gina siguienteC si no 0a5 3agina siguiente +ale OfalseP
3re+: n[mero de 3gina anteriorC si no 0a5 3agina anterior +ale OfalseP
current: n[mero de 3gina actual
total: n[mero de 3aginas totales
items: arra5 de elementos 3aginados
Libro de Kumbia: Porque Programar debera ser ms fcil -9
2(.14 2a!inando en Active/ecord
Acti+e1ecord 5a trae integrado los m/todos 3aginate 5 3aginateEb5EsqlC se com3ortan
igual que 3aginate 5 3aginateEb5EsqlC sin embargo no es necesario 3asar el modelo a
3aginar 5a que 3or defecto toman el modelo que in+oca
&Bem3lo:
$page = $this->Usuario->paginate('per_page: 5', 'page: 1');
&Bem3lo com3leto de uso del 3aginador:
Jenemos una tabla usuario con su corres3ondiente modelo 4suarioC entonces creemos
un controlador el cual 3agine una lista de usuarios 5 asimismo 3ermita buscar 3or
nombreC a3ro+ec0aremos la 3ersistencia de datos del controlador 3ara 0acer una
3aginaci#n inmune a in5ecci#n sql
&n el controlador:
class UsuarioController extends ApplicationController {
private $_per_page = 7;
/**
* Formulario de busqueda
**/
public function buscar() {
$this->nullify('page', 'conditions');
}
/**
* Paginador
**/
public function lista($page='') {
/**
* Cuando se efectua la busqueda por primera vez
**/
if($this->has_post('usuario')) {
$usuario = $this->post('usuario', 'trim', 'addslashes');
if($usuario['nombre']) {
$this->conditions = nombre LIKE '%{$usuario['nombre']}%' ;
}
/**
* Paginador con condiciones o sin condiciones
**/
if(isset($this->conditions) && $this->conditions) {
$this->page = $this->Usuario->paginate($this->conditions, per_page:
$this->_per_page, 'page: 1');
} else {
$this->page = $this->Usuario->paginate(per_page: $this->_per_page,
'page: 1');
}
} elseif($page='next' && isset($this->page) && $this->page->next) {
/**
* Paginador de pagina siguiente
**/
if(isset($this->conditions) && $this->conditions) {
$this->page = $this->Usuario->paginate($this->conditions, per_page:
$this->_per_page, page: {$this->page->next});
} else {
$this->page = $this->Usuario->paginate(per_page: $this->_per_page,
page: {$this->page->next});
}
Libro de Kumbia: Porque Programar debera ser ms fcil 6:
} elseif($page='prev' && isset($this->page) && $this->page->prev) {
/**
* Paginador de pagina anterior
**/
if(isset($this->conditions) && $this->conditions) {
$this->page = $this->Usuario->paginate($this->conditions, per_page:
$this->_per_page, page: {$this->page->prev});
} else {
$this->page = $this->Usuario->paginate(per_page: $this->_per_page,
page: {$this->page->prev});
}
}
}
}
&n la +ista buscar3t0ml
<?php echo form_tag('usuario/lista') ?>
<?php echo text_field_tag('usuario.nombre') ?>
<?php echo submit_tag('Consultar') ?>
<?php echo end_form_tag() ?>
&n la +ista lista30tml
<table>
<tr>
<th>id</th>
<th>nombre</th>
</tr>
<?php foreach($page->items as $p): ?>
<tr>
<td><?php echo $p->id ?></td>
<td><?php echo h($p->nombre) ?></td>
</tr>
<?php endforeach; ?>
</table>
<br>
<?php if($page->prev) echo link_to('usuario/lista/prev', 'Anterior') ?>
<?php if($page->next) echo ' | ' . link_to('usuario/lista/next', 'Siguiente') ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 61
2(.16 Active/ecord ' los Aam#os con Oalores #or
Keecto
%i quieres tener un +alor 3or defecto en un cam3o de tu tablaC 3uedes establecer ese
+alor directamente en la bdC 3ero 3ara que Acti+e1ecord no inter+enga sobre este +alor
es necesario colocarlo como un cam3o *4LLC de esta manera al deBar el cam3o +acio al
momento de reali2ar la inserci#nC Acti+e1ecord no incluira en la +alidaci#n de cam3os
nulos dic0o cam3oC de tal manera que se tomara el +alor 3or defecto en la bd
&n Acti+e1ecord 3ara definir un cam3o nulo se tienen la dos formas equi+alentes
siguientes:
$usuario->direccion = null;
$usuario->direccion = '';
Asimismo se 3ueden definir +alores 3or defecto 3ara los cam3os en el mismo
Acti+e1ecordC solamente se debe asignar el +alor en los cam3os en los m/todos
Oinitiali2ePC ObeforeEcreatePC ObeforeEu3dateP o ObeforeEsa+eP 3ara obtener ese
com3ortamiento
Libro de Kumbia: Porque Programar debera ser ms fcil 6!
25 Meneraci#n >e Formularios
Los generadores de formularios son 0erramientas [tiles 3ara agili2ar el 3roceso de
ca3tura@3resentaci#n de la informaci#n del modelo de datos enfati2ndose en la
+elocidad 5 aumento de la 3roducti+idad Algo im3ortante a tener en cuenta es que no
0a5 generaci#n de c#digoC Kumbia inter3reta e+entualmente las caractersticas de los
modelos 5 genera los formularios a 3artir de estos 4na im3ortante +entaBa de esto es
que cualquier cambio en el modelo se +e inmediatamente refleBado en nuestras
a3licaciones
Las 3rinci3ales caractersticas de los generadores son:
Meneraci#n de Formularios 3rcticosC configurables 5 [tiles en la ma5or 3arte de
casos
Meneraci#n "nmediata de Formularios ;14> F;reateC 1eadC 43dateC>eleteG sobre
entidades de la base de datos
Aalidaci#n Automtica de Ji3os de >atos F*um/ricosC Je?toC Fec0asC&=<ails 5
Jiem3oG
Aalidaci#n de "ntegridad 1elacional FLla+es enicasC Lla+es Forneas 5 Aalores de
>ominioG
Meneraci#n de 1e3ortes P>F 5 HJ<L basados en la informaci#n del modelo
"ntegraci#n con AUAV 5 %er+icios Web
&n esta secci#n se e?3lica c#mo generar r3idamente un formulario A/1K LAreate,
/ead, 1#date, Kelete9 basados en entidades de la base de datosC meBorando la
eficiencia 5 ele+ando la 3roducti+idad
25.1 Ji3os de Formularios
%tandardForm: &s el formulario tradicional con los botones 3ara acti+ar los cam3os del
formulario 5 efectuar las o3eraciones de AdicionarC <odificarC ;onsultarC DorrarC Aisuali2ar
5 1e3orte
NOTA: este com#onente se #iensa reescribir de manera de ,acerlo mas leDible
' estandard
25.2 AentaBas Meneradores de Formularios
Hacen la ma5or 3arte del trabaBo
Meneraci#n de la "nterfa2
Aalidaciones de >atos e "ntegridad
FluBo de &ntrada de >atos
Presentaci#n de "nformaci#n
%e 3ueden ada3tar fcilmente a necesidades es3ecificas
%e 3roducen resultados ms r3idoC sin efectos sobre la calidad ni en trabaBo 3ara
el 3rogramador
Libro de Kumbia: Porque Programar debera ser ms fcil 6$
25.3 >es+entaBas Meneradores de Formularios
*o 0acen todo el JrabaBo
*o se 3uede de3ender com3letamente de ellos
La l#gica est enca3sulada 5 0ace difcil modificar ciertos com3ortamientos de los
formularios
Libro de Kumbia: Porque Programar debera ser ms fcil 6(
24 %tandardForm
%tandardForm es una clase que 3ro3orciona Kumbia 3ara la generaci#n r3ida de
formularios que tengan como obBeti+o el mantenimiento de la informaci#n de tablas 5
ca3tura de datos
24.1 5ntroduccin
%#lo 0a5 que 3reocu3arse 3or el dise\o de la base de datosC es3ecificar sus atributos 5
seguir unas sim3les con+enciones en los nombres de las columnas ms unas lneas
e?tras de c#digoC 3ara obtener un formulario mu5 [til en menos de lo que es3erabas
>ise\aremos algunas tablas eBem3lo:
1. CREATE TABLE `album` (
2. `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
3. `nombre` VARCHAR(45) NOT NULL,
4. `genero_id` MEDIUMINT(8) UNSIGNED NOT NULL,
5. `artista_id` INT(10) UNSIGNED NOT NULL,
6. `valor` DECIMAL(10,0) NOT NULL,
7. `fecha_creado` DATE NOT NULL,
8. `cantidad` DECIMAL(10,0) UNSIGNED NOT NULL,
9. `estado` VARCHAR(1) NOT NULL,
10. `portada` VARCHAR(45),
11. PRIMARY KEY (`id`),
12. KEY `artista_id` (`artista_id`)
13.);
14.
15.CREATE TABLE `genero` (
16. `id` INT(11) NOT NULL AUTO_INCREMENT,
17. `nombre` VARCHAR(50) NOT NULL,
18. PRIMARY KEY (`id`)
19.);
20.
21.CREATE TABLE `artista` (
22. `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
23. `nombre` VARCHAR(50) NOT NULL,
24. PRIMARY KEY (`id`)
25.);
24.2 Arear un controlador #ara el -ormulario Album
1 Para estoC crearemos un fic0ero en el directorio controllersC con el nombre
albumEcontroller303 F%iem3re siguiendo esta con+enci#n: nombre de la tabla des3u/s
gui#n baBo controllerGel controlador es una clase que 0ereda de %tandardFormC con el
nombre Album;ontrollerC 5 la 3ro3iedad scaffold a true F0ace que KumbiaC lea la
informaci#n de la tabla de la base de datos 5 cree un formulario ti3o %tandardFormG
Libro de Kumbia: Porque Programar debera ser ms fcil 6'
3 <?php
4 class AlbumController extends StandardForm{
5 public $scaffold = true;
6 }
7 ?>
;on estas lneas de c#digo tenemos un formulario ;14> listo 3ara su utili2aci#n
&l formulario resultante reali2a +alidaci#n automtica de los ti3os de datos F*um/ricosC
Je?toC Fec0asC &=mailC Jiem3ojGC seg[n el ti3o definido en la estructura de en la base de
datos se com3ortar en el formulario
! &s necesario crear los modelos que +an a ser utili2ados 3ara 0acer las o3eraciones La
clase %tandardForm est integrada con Acti+e1ecord esto significa que de3ende de ella
3ara 0acer todas las o3eraciones de base de datos Para 0acer el m#dulo que utili2ar
Album;ontroller creamos un arc0i+o en models llamado album303:
1. <?php
2. class Album extends ActiveRecord {
3. }
4. ?>
24.3 Aonvenciones de los Nombres de las Aolumnas
Las con+enciones de Kumbia 3ermiten agili2ar el 3roceso de desarrollo de formularios 5
agili2an tareas comunes en este ti3o de formularios A continuaci#n se nombran las
3rinci3ales con+encionesC algunas de /stas no a3lican 3ara los generadores de
formularios] 3ero a3lican siem3re en los modelos Acti+e1ecord:
24.3.1 id
4na columna con este nombre indica que es de naturale2a auto=num/ricaC es decir que
lle+ar un consecuti+o 3or cada registro insertado
&s mu5 im3ortante que sea usado tambi/n como lla+e 3rimaria de la entidad 5a que
Kumbia asume en muc0as situaciones que as lo es F%i lo llamamos diferente de "dC nos
crear un num/rico normal 5 no le asignara el n[mero corres3ondienteG
24.3.2 tablaCid
&s3ecificar una columna con esta con+enci#n le indicar a Kumbia que este cam3o es
una relaci#n fornea a otra entidad del modelo de datos
Por eBem3lo generoEid indica un cam3o forneo a la tabla genero en su cam3o id &s
im3ortante aunque no obligatorio que los cam3os en ambas 3artes sean del mismo ti3o
de dato esto a5uda a meBorar la +elocidad en la que se reali2an las consultas 5 e+ita
com3ortamientos indeseados
24.3.3 cam#oCat
Los cam3os con nombre terminados en Eat son de naturale2a fec0a=tiem3o que son
actuali2ados automticamente al reali2ar una modificaci#n del registro
Libro de Kumbia: Porque Programar debera ser ms fcil 6-
24.3.( cam#oCin
Los atributos terminados en Ein toman la fec0a=tiem3o actual en el momento de ser
insertados
24.3.5 email
Los cam3os con nombre email son ca3turados de forma es3ecial 3ara este ti3o de dato
&?tra a estoC las columnas que en la base de datos definidas como *8J *4LLC sern
+alidadas automticamente 3ara e+itar que no se +iole esta restricci#n Los cam3os de
ti3o fec0a automticamente tienen una a5uda de calendario 5 +alidaci#n de dasC mesesC
a\os 5 bisiestos
24.( Aom#ortamiento de un -ormulario ;tandard
Los formularios generados mediante esta clase tienen 3or defecto - funcionalidades
bsicas: AdicionarC ;onsultarC <odificarC DorrarC Aisuali2ar 5 1e3orte
Los cam3os son +alidados automticamente de acuerdo a su ti3o
Los cam3os 5 botones del formulario son 0abilitados@in0abilitados de3endiendo de
cada acci#n e+itando a los usuarios 0acer o3eraciones indebidas
&l Formulario genera automticamente un re3orte con la 3osibilidad de sacarlo en
formato 2K-, EYAE<, ZO/K, FTE< 5 la 3osibilidad de ordenarlo seg[n
cualquier cam3o acti+o
&l Formulario 3osee una +ista 3ara na+egar 3or los registros ms fcilmente
Permite el uso de 0el3ers 3ara a5udar a los usuarios a la ca3tura de datos
24.5 2ro#iedades de un -ormulario ;tandard
24.5.1 Sscaold LTrue o -alse9
Hace que KumbiaC lea la informaci#n de la tabla de la base de datos 5 cree un formulario
ti3o %tandardForm
24.5.2 Ssource
&s el nombre de la tabla de la base de datos que utili2ar 3ara generar el Formulario
%tandard Por defectoC el nombre de Hsource coge el +alor del nombre del controlador
&Bem3lo : %i el nombre de el controlador es Album;ontrollerC entonces el nombre de la
tabla la cual buscar los datos ser album
&Bem3lo
1. <?php
2. class AlbumController extends StandardForm{
3. public $scaffold = true;
4. public $source = "nombre_tabla";
5.
6. }
Libro de Kumbia: Porque Programar debera ser ms fcil 66
24.5.3 Sorce
&ste atributo es ideal cuando se esta en tiem3o de desarrolloC 5a que cuando se genera
los formulario %tandardForm eston son cargado en la cac0e del na+egadorC 3or ende si
reali2amos algun cambio no sera +isible con solo refrescas el na+egadorC con este
atributo este com3ortamiento cambia 5 si 3odemos +er los cambios que se 0agan sin
necesidad de reiniciar el na+egador
&Bem3lo
1. <?php
2. class AlbumController extends StandardForm{
3. public static $force = true;
4.
5. }
24.4 </todos de la ;lase %tandardForm
&stos m/todos son llamados en el constructor de la clase 5 sir+en 3ara modificar ciertos
com3ortamientos del formulario
1. <?php
2. class AlbumController extends StandardForm {
3. function __construct(){
4. # Ignora el campo portada
5. $this->ignore('portada');
6. }
7. }
8. ?>
24.4.1 setCormCca#tionLStitle9
;ambia el ttulo del formulario 3or uno 3ersonali2ado
24.4.2 useC,el#erLScam#o9
Permite que un Hcam3o forneo tenga la facilidad de un formulario de a5uda e?tra 3ara
insertar alg[n dato que no se encuentre al momento de insertar
&Bem3lo de los Hel3ers:
>ebes tener ! tablas:
1G 4na tabla maestra con alguna relaci#n usando la con+encion tablaEidC 3or eBem3lo
clientes:
;#digo:
1. create table clientes (
2. id inteAer not null primar$ Ee$,
3. nombre varchar(50) not null,
4. ciudad_id integer not null,
5. primar$ Ee$)id*
6. );
Libro de Kumbia: Porque Programar debera ser ms fcil 67
;#digo:
1. create table ciudad (
2. id inteAer not null primar$ Ee$,
3. nombre varchar(50) not null,
4. primar$ Ee$)id*
5. );
&l cam3o ciudadEid 0ace la relaci#nC Kumbia busca un cam3o llamado: nombre,
descri#cion o detalle en la tabla ciudad
A0ora en el controlador:
;#digo:
1. <?php
2.
3. class ClientesController extends StandardForm{
4.
5. public $scaffold = true;
6. public function __construct(){
7. $this->use_helper("ciudad");
8. }
9.
10.?>
24.4.3 setCt'#eCtimeLScam#o9
"ndica que un cam3o es de ti3o time Ftiem3oG as 3odemos 0acer una ca3tura utili2ando
un com3onente es3ecial 3ara /stas
24.4.( setCt'#eCteDtareaLScam#o9
"ndica que un cam3o es de ti3o te?tareaC es3ecial 3ara te?tos largos como comentarios 5
descri3ciones
24.4.5 setCt'#eCima!eLScam#o9
Hace que un Hcam3o 3ermita almacenar direcciones a imgenesC subirlas al ser+idor 5
gestionarlas
24.4.4 setCt'#eCnumericLScam#o9
For2a que un Hcam3o adquiera el ti3o num/ricoC en este caso Kumbia +alida que la
entrada de un cam3o 3or teclado 3ermita solamente teclas num/ricas
24.4.6 setCt'#eCdateLScam#o9
For2a que un Hcam3o sea de ti3o fec0aC mostrando una a5uda de calendario 5 un
selector de fec0as 3or dasC meses 5 a\os
24.4.7 setCt'#eCemailLScam#o9
For2a que un Hcam3o sea de ti3o emailC mostrando un com3onente es3ecial 3ara
Libro de Kumbia: Porque Programar debera ser ms fcil 69
ca3turar correos electr#nicos
24.4.8 setCt'#eC#ass%ordLScam#o9
&s3ecifica que un Hcam3o sea de ti3o 3asswordC ocultando la entrada con asteriscos 5
obligando la reconfirmaci#n del dato
Los ti3o 3assword no a3arecen en +isuali2ar 3or moti+os de seguridad
1so de Encri#tacin en -ormularios ;tandard-orm
Podemos usar el com3onente Password de %tandarForm 3ara encri3tarC 3ero ocurre un
3roblema Por eBem3lo si usamos un algoritmo como el s0a1 # md'C que es de una sola
+aC no 3odremos desencri3tar nue+amente el +alor la 3r#?ima +e2 que el usuario lo +a5a
a editar 3or esto se recomienda usar algoritmos como el A&% con el cual si 3odemos
a3licar desencri3taci#n 5 que esta dis3onible en <5%.L
Los cam3os ti3o 3assword deben ser encri3tados en el beforeEinsert 5 descri3tados en el
afterEfetc0 3ara que todo funcione bien
1. function before_insert(){
2. $this->Usuarios->password = "% aes_encrypt($this-
>post('fl_password'),'semilla')";
3. }
4.
5. function after_fetch(){
6. $this->Usuarios->password = "% aes_decrypt($this->Usuarios-
>password,'semilla')";
7. }
24.4.10 setCteDtCu##erLScam#o9
Hace que los +alores de un cam3o 3ermane2can siem3re en ma5[sculas
24.4.11 setCcomboCstaticLScamo, arra' Svalores9
;rea un combo esttico que 0ace una +alidaci#n de dominio en un Hcam3o con los
H+alores es3ecificados
24.4.12 setCcomboCd'namicLScam#o, Stabla, Scam#oKetalle,
PcolumnCrelation: Scam#oR9
;rea un combo con los datos de la tabla FHtablaGC asociando la cla+e fornea FHcam3oGC 5
llenando el combo con los +alores FHcam3o>etalleG %i el cam3o en la tabla detalle no
tiene el mismo nombre del de la tabla relaci#n entonces se debe usar columnErelation
3ara indicar el nombre de este
;on esta funci#n 3odremos crear dinmicamente Fsin seguir la con+enci#n cam3oEid del
%tandardFormG lo mismo que useE0el3erFHcam3oG
Libro de Kumbia: Porque Programar debera ser ms fcil 7:
&Bem3lo:
>ebes tener ! tablas:
1G 4na tabla maestra con alguna relaci#n 3or eBem3lo clientes:
;#digo:
1. CREATE TABLE `grupos_usuarios` (
2. `id` smallint(6) NOT NULL auto_increment,
3. `nombre` char(15) NOT NULL,
4. `notas` tinytext,
5. PRIMARY KEY (`id`),
6. UNIQUE KEY `nombre` (`nombre`)
7. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
;#digo:
1. CREATE TABLE `usuarios` (
2. `id` smallint(6) NOT NULL auto_increment,
3. `nombre` varchar(100) NOT NULL,
4. `login` char(8) NOT NULL,
5. `password` char(8) NOT NULL,
6. `grupos_usuarios_id` smallint(6) NOT NULL,
7. `notas` tinytext,
8. PRIMARY KEY (`id`),
9. UNIQUE KEY `nombre` (`nombre`),
10. UNIQUE KEY `login` (`login`),
11. KEY `grupos_usuarios_id` (`grupos_usuarios_id`),
12. CONSTRAINT `usuarios_ibfk_1` FOREIGN KEY (`grupos_usuarios_id`) REFERENCES
`grupos_usuarios` (`id`) ON UPDATE CASCADE
13.) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
A0ora en el controlador a33s@default@controllers@usuariosEcontroller303:
<?php
class UsuariosController extends StandardForm {
public $scaffold = true;

public function __construct(){
$this->set_type_password('password');
$this->set_combo_dynamic('grupos_usuarios_id',
'grupos_usuarios',
'nombre');
}
F
24.4.13 i!noreLScam#o9
Hace que un cam3o no sea +isuali2ado en el formularioC ni tenido en cuenta en las
o3eraciones del ;14>
24.4.1( setCsi0eLScam#o, Ssi0e9
;oloca el tama\o de un cam3o te?to en Hsi2e
Libro de Kumbia: Porque Programar debera ser ms fcil 71
24.4.15 setCmaDlen!t,LScam#o, Slen!t,9
;oloca el tama\o m?imo de un cam3o de te?to en Hlengt0
24.4.14 notCbro%seLScam#o, [Scam#o2, ...\9
Hace un cam3o no a3are2ca en la +ista de Aisuali2aci#n &ste cam3o 3uede recibir una
lista de cam3os
24.4.16 notCre#ortLScam#o9
Hace un cam3o no a3are2ca en el re3orte >esa3arece el bot#n de <odificar
24.4.17 setCtitleCima!eLSim9
*ombre de imagen que a3arecer antes del titulo del formulario en forma decorati+a
>ebe estar en el directorio 3ublic@img@
24.4.18 ieldsC#erCro%LSnumber9
8rgani2a los cam3os del formulario colocando Hnumber cam3os en cada fila Por defecto
es 1
24.4.20 unableCinsert
"m3ide que se inserte en el formulario >esa3arece el bot#n de Adicionar
24.4.21 unableCdelete
"m3ide que se borren datos usando el formulario >esa3arece el bot#n de Dorrar
1. <?php
2. class ClienteController extends StandardForm {
3. public $scaffold = true;
4. public function __construct(){
5. $this->unable_delete();
6. }
7. }
8. ?>
24.4.22 unableCu#date
"m3ide que se actualicen datos usando el formulario >esa3arece el bot#n de <odificar
24.4.23 unableC"uer'
"m3ide que se consulte usando el formulario >esa3arece el bot#n de ;onsultar
Libro de Kumbia: Porque Programar debera ser ms fcil 7!
24.4.2( unableCbro%se
"m3ide +isuali2ar la +ista de Aisuali2aci#n >esa3arece el bot#n de Aisuali2ar
1. <?php
2. class ClienteController extends StandardForm {
3. public $scaffold = true;
4. public function __construct(){
5. $this->set_title_image('cliente.jpg');
6. $this->unable_browse();
7. $this->unable_update();
8. }
9. }
10.?>
24.4.25 unableCre#ort
"m3ide la generaci#n del re3orte >esa3arece el bot#n de 1e3orte
24.4.24 routeCtoLScontroller,Saction,Sid9
Hace el enrutamiento desde un controlador a otroC o desde una acci#n a otra
1. <?php
2. return $this->route_to("controller: clientes", "action: consultar", "id:
1");
3. ?>
24.4.26 setC,iddenLScam#o9
;oloca un cam3o oculto en la forma
24.4.27 setC"uer'Conl'LScam#o9
Hace que un cam3o sea de solo lectura
24.4.28 setCca#tionLScam#o, Sca#tion9
;ambia el Label 3or defecto de un cam3o 3or otro
24.4.30 setCactionCca#tionLSaction, Sca#tion9
;ambia el Je?to de los DotonesC de los formularios %tandard
1. <?php
2. class eCuentasController extends StandardForm{
3. public $scaffold = true;
4. public function __construct(){
5. $this->set_action_caption("insert", "Agregar");
6. $this->set_action_caption("report", "Listado");
7.
8. }
9. }
10. ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 7$
24.4.31 setCeventLSaction, Sca#tion9
&sta Funci#n introducida F+ersi#n :(' beta6GC nos facilita la introducci#n de funciones
en los e+entos a ni+el de cam3o FAalidaci#n 3or cam3oG
&sto es un &Bem3loC cuando salimos del cam3o nombreC le 3onemos automticamente el
+alor al cam3o ra2on%ocial
1. <?php
2. class ClientesController extends StandardForm{
3. public $scaffold = true;
4. function __construct(){
5.
6. $this->set_event('nombre','onblur','$C(razonsocial").value =
$C("nombre").value');
7.
8. }
9. }
10.?>
24.4.32 setCattributeLSield, Sattribute,Svalue9
Asigna un atributo a un cam3o del formulario
&Bem3lo:
Por &Bem3lo en un cam3o >escri3cionFte?tareaG le queremos reducirC el n[mero de lneas
5 la longitud:
///n el constructor de la clase:
.unction ((construct)* G
$this&'set(attribute)C4escripcionC, CrowsC, >*!
$this&'set(attribute)C4escripcionC, Ccols%, >H*!
F
24.4.33 s,o%CnotCnullsL9
Hace que a3are2ca un asterisco al lado de los cam3os del formulario que sean
obligatorios
24.4.3( setCmessa!eCnotCnullLSmessa!e9
<uestra un mensaBe 3ersonali2ado 3ara los cam3os del formulario que sean obligatorios.
Libro de Kumbia: Porque Programar debera ser ms fcil 7(
24.6 Eventos del lado del Aliente LAallbacks9
%tandardForm 3osee una serie de e+entos FcallbacksG del lado del cliente usando
tecnologa Ua+ascri3tC 3ara esto debemos crear un arc0i+o Ba+ascri3t con el nombre del
controlador en el directorio 3ublic@Ba+ascri3t@C 3or eBem3lo 3roductosBs
La lista de e+entos es la siguiente:
24.6.1 beoreCenableCinsert
Al o3rimir el bot#n insert 5 antes de que se 0abiliten los in3uts 3ara entrada de datos
24.6.2 aterCenableCinsert
Al o3rimir el bot#n insert 5 des3u/s de que se 0abiliten los in3uts 3ara entrada de datos
24.6.3 beoreCenableCu#date
Al o3rimir el bot#n u3date 5 antes de que se 0abiliten los in3uts 3ara entrada de datos
24.6.( aterCenableCu#date
Al o3rimir el bot#n u3date 5 des3u/s de que se 0abiliten los in3uts 3ara entrada de datos
24.6.5 beoreCenableC"uer'
Al o3rimir el bot#n consultar 5 antes de que se 0abiliten los in3uts 3ara entrada de datos
24.6.4 aterCenableC"uer'
Al o3rimir el bot#n consultar 5 des3u/s de que se 0abiliten los in3uts 3ara entrada de
datos
24.6.6 beoreCvalidation
Antes de reali2ar el 3roceso de +alidaci#n en adicionar 5 modificar des3u/s de o3rimir
ace3tar
24.6.7 aterCvalidation
>es3u/s de reali2ar el 3roceso de +alidaci#n en adicionar 5 modificar des3u/s de o3rimir
ace3tar
24.6.8 beoreCinsert
Al o3rimir ace3tar antes de insertar
24.6.10 beoreCu#date
Al o3rimir ace3tar antes de actuali2ar
24.6.11 beoreC"uer'
Al o3rimir ace3tar antes de consultar
Libro de Kumbia: Porque Programar debera ser ms fcil 7'
24.6.12 beoreCre#ort
Al o3rimir ace3tar antes de sacar re3orte
24.6.13 beoreCcancelCin#utLaction9
Al o3rimir ace3tar antes de sacar re3orte
Algunos eBem3los:
1. function before_validation(){
2. //Muestra el valor de todos los campos antes
3. //de que Kumbia haga el proceso de validacion
4. Fields.each(function(field){
5. alert($C(field).value)
6. })
7. }
1. function before_insert(){
2. //Calcula el valor del IVA antes de insertar
3. $C("valor_iva").value = $V("valor") * 0.12
4. }
1. function before_enable_update(){
2. //Impide la modificacin ya que el estado
3. //del producto es Inactivo
4. if($V("estado")=="I"){
5. alert("No se puede modificar producto inactivo")
6. return false
7. }
8. }
1. function after_cancel_input(action){
2. // Se ejecuta al cancelar la captura
3. // el parametro action indica la accion cancelada
4. // Adicionar, Modificar, Consultar, Reporte
5. if(action=="Adicionar"){
6. alert("Cancelo El proceso de Insercin")
7. return
8. }
9. }
1. function nombre_focus(){
2. alert("Te has parado sobre el campo nombre")
3. }
1. function nombre_blur(){
2. alert("Has salido del campo nombre con valor: "+$C("nombre").value)
3. }
@@*ota: La funci#n H; 3ermite acceder al cam3o@obBeto del formulario %tandardForm
@@La Funci#n HA 3ermite acceder al +alor del cam3o@obBeto sin im3ortar de que ti3o sea
;uando un callback de+uel+e false se anula la acci#n que se est reali2ando
Libro de Kumbia: Porque Programar debera ser ms fcil 7-
24.7 Eventos del lado del ;ervidor LAallbacks9
&n ocasiones queremos eBecutar ciertos 3rocesos antes de reali2ar una inserci#nC
modificaci#n o borrado con el fin de reali2ar +alidacionesC 0acer mo+imientos en otras
entidadesC etc
Para esto los formularios %tandardForm 3oseen una serie de e+entos que llaman a
m/todos de la clase 3ara eBecutar estas o3eraciones antes de 5 des3u/s de
4n e+ento se 3uede definir mediante un nombre a un m/todo en las 3ro3iedades de la
clase as:
1. <?php
2.
3. class AlbumController extends StandardForm {
4.
5. private $after_insert = "mover_kardex";
6.
7. private function mover_kardex(){
8. /* ... */
9. }
10. }
11. ?>
o directamente con el nombre del m/todo:

1. <?php
2.
3. class AlbumController extends StandardForm {
4.
5. private function after_insert(){
6. /* ... */
7. }
8. }
9. ?>
&?isten ! ti3os de e+entos los beforeE Fantes deG 5 los afterE Fdes3u/s deG Los m/todos
beforeE se eBecutan antes de una determinada o3eraci#n 5 cuando de+uel+en false
cancelan la o3eraci#n que se est trabaBando Por eBem3lo un return false desde
beforeEu3date cancelara la actuali2aci#n
Los e+entos before son e?celentes 3ara +alidaciones 3re=o3eraci#n
Los e+entos after funcionan meBor 3ara eBecutar 3rocesos com3lementarios a la
o3eraci#n actual
Los e+entos de %tandardForm son com3lementarios a los e+entos de Acti+e1ecord
A continuaci#n una lista de e+entos:
24.7.1 beoreCinsert
%e eBecuta antes de la o3eraci#n insert %i de+uel+e false cancela la inserci#n
Libro de Kumbia: Porque Programar debera ser ms fcil 76
24.7.2 aterCinsert
%e eBecuta des3u/s de la o3eraci#n insert
24.7.3 beoreCu#date
%e eBecuta antes de la o3eraci#n u3date %i de+uel+e false cancela la actuali2aci#n
1. function before_update(){
2. if ($this->Tareas->finalizada == "F"){
3. Flash::warning("La fecha actualizada");
4. //Actualiza a la fecha de hoy, cuando se finaliza...
5. Ht0is=IJareas=Idatafinali2ada S dateFiY=m=d M:i:siG]
6.
7. }
8. }
24.7.( aterCu#date
%e eBecuta des3u/s de la o3eraci#n u3date
24.7.5 validation
%e eBecuta antes de insertar 5 modificar "deal 3ara +alidaciones de usuario
24.7.4 beoreCdelete
%e eBecuta antes de la o3eraci#n delete %i de+uel+e false cancela el borrado
1. function before_delete(){
2. if($this->Album->estado=='A'){
3. Flash::error('No se puede borrar porque est activo el
Album');
4. //Hace falta que el metodo devuelva false asi le informara a
ActiveRecord que
5. //el evento esta cancelando la accion.
6. return false;
7. }
8. }
24.7.6 aterCdelete
%e eBecuta des3u/s de la o3eraci#n delete
24.7.7 beoreCetc,
%e eBecuta antes de reali2ar la o3eraci#n de mostrar un registro en la consulta
24.7.8 aterCetc,
%e eBecuta des3u/s de reali2ar la o3eraci#n de mostrar un registro en la consultaC 3ero
antes de mostrar el formulario
Para acceder a los +alores que se +an a insertar@actuali2ar@borrar se 3uede 0acer de esta
forma:
Libro de Kumbia: Porque Programar debera ser ms fcil 77
1. <?php
2.
3. class AlbumController extends StandardForm {
4.
5. function before_delete(){
6. if($this->Album->estado=='A'){
7. Flash::error('No se puede borrar porque est activo el Album');
8. }
9. }
10.
11. ?>
>e la misma forma a los +alores que fueron insertados@modificados
24.8 Traba&ando con 5m:!enes
Los formularios %tandardForm 3ermiten 3ersonali2ar algunos atributos 3ara que 3ermitan
a los usuarios de nuestras a3licaciones subir imgenes al ser+idor 5 asociarlas a un
registro determinado &n nuestro eBem3lo el cam3o 3ortada re3resenta la imagen
3ortada de un lbum 5 tiene el com3ortamiento 3resentado anteriormente 4tili2ando el
m/todo 0eredado de %tandarForm llamado set_type_image 3odemos indicarle a kumbia
que debe tratar al cam3o 3ortada como una imagen
1. <?php
2. class AlbumController extends StandardForm {
3. public $scaffold = true;
4. function AlbumController(){
5. $this->set_type_image('portada');
6. }
7. }
8. ?>
Al momento de eBecutarC /ste a3arece como un com3onente 0tml de ti3o file que le
3ermite al usuario seleccionar la imagen de su colecci#n 3ara que sea subida al ser+idor
24.10 Oalidaciones LA nivel de Aam#o9
Jenemos la 3osibilidad de +alidar a ni+el de cam3oC 3or eBem3lo al salir de un cam3oC
eBecute una funci#n
1. $this->set_event(nombre, blur, 'alert("Sali de Nombre")');
&Bem3lo: Al salir del cam3o nombreC nos 3one el mismo +alor en el cam3o ra2onsocialC
como se +e el c#digo Ba+ascri3t insertado en el onblur
1. <?php
2. class ClientesController extends StandardForm{
3.
4. public $scaffold = true;
5. public $template = "menu";
6.
7. function __construct(){
Libro de Kumbia: Porque Programar debera ser ms fcil 79
8. $this- >set_event(razonsocial, blur,
'$C(razonsocial").value = $C(nombre").value');
9. }
10. function ClientesController(){
11. $this->set_action_caption("insert","Agregar");
12. $this->set_action_caption("report","Listado");
13. $this->set_form_caption("Gestin de Clientes");
14. $this->set_title_image("logo.jpg");
15. $this->use_helper('codpostal');
16. }
17.}
18.?>
24.11 Aombos Est:ticos
Kumbia 3ermite el uso de combos estticos 3ara +alidar integridad de dominio Por
eBem3lo el cam3o estado s#lo 3uede tener +alores FActi+o e "nacti+oG 3or lo tanto
3odemos a3licar el m/todo setEcomboEstatic 3ara definir los +alores que 3uede tomar
este cam3o 5 facilitar la ca3tura de datos 3or 3arte de los usuarios
1. <?php
2. class AlbumController extends StandardForm{
3. public $scaffold = true;
4. function AlbumController(){
5. $this&'set(combo(static)@estado@,arra$)
6. arra$)@A@,@A75;I8@*,
7. arra$)@;@,@;:A75;I8@*
8. ));
9. }
10. }
11. ?>
24.12 Aambiando el as#ecto de -ormularios
;tandard-orm
Ha5 ciertas formas de cambiar el as3ecto en cuanto a colores 5 estilos en formularios de
este ti3o &sto lo 0acemos 3ara ada3tar meBor estos formularios a nuestra a3licaci#n
&stos cambios deben ser reali2ados en 3ublic@css@st5lecss o en cualquier css que sea
im3ortado antes de renderi2ar F+isuali2arG la a3licaci#n
Aambiar estilo de los botones como Adicionar, Ace#tar, etc:
%e 3uede definir un estilo general 3ara las etiquetas in3utC selectC te?tareaC etc o definir
la clase css controlDutton que es ms es3ecifica 3ara estos botonesC as:
1. input, select {
2. font-family: Verdana;
3. font-size: 14px;
4. }
5.
6. .controlButton {
7. color: red;
Libro de Kumbia: Porque Programar debera ser ms fcil 9:
8. background: white;
9. border: 1px solid green;
10.}
Aambiar estilo de las ca&as de teDto ' com#onentes:
%e 3uede definir un estilo general 3ara las etiquetas in3utC selectC te?tareaC etc o definir
la clase css con un selector 3ara el id del obBeto que es ms es3ecfica 3ara estos
com3onentesC as:
1. input, select {
2. font-family: Verdana;
3. font-size: 14px;
4. }
5.
6. #flid_nombre, #flid_ciudad_id {
7. color: red;
8. background: white;
9. border: 1px solid green;
10.}
Aambiar los colores de la vista visuali0ar:
;ambiamos los colores intercalados usando las siguientes clases donde 3rimar5 se
refiere a uno de esos colores 5 a secundar5 al otro La clase terminada en acti+e es la
utili2ada cuando el usuario coloca el mouse encima de alguna fila
1. .browse_primary {
2. background: #AEB9FF;
3. }
4.
5. .browse_primary_active {
6. background: #AEB9FF;
7. }
8.
9. .browse_secondary {
10. background: #FFFFFF;
11.}
12.
13..browse_secondary_active {
14. background: #F2F2F2;
15.}
Aambiar los valores #ara un ormulario en es#ecial:
Para esto ante3ondremos el nombre del controlador como clase antes de la clase o del
selector en cuesti#n as:
1. .productos input, select {
2. font-family: Verdana;
3. font-size: 14px;
4. }
5.
6. .productos #flid_nombre, #flid_ciudad_id {
7. color: red;
Libro de Kumbia: Porque Programar debera ser ms fcil 91
8. background: white;
9. border: 1px solid green;
10.}
26 ;ontroladores
1es3onden a acciones de usuario e in+ocan cambios en las +istas o en los modelos seg[n
sea necesario
&n Kumbia los controladores estn se3arados en 3artesC llamadas front controller 5 en un
conBunto de acciones ;ada acci#n sabe como reaccionar ante un determinado ti3o de
3etici#n Las +istas estn se3aradas en la5outsC tem3lates 5 3artials &l modelo ofrece
una ca3a de abstracci#n de la base de datos utili2ada Cadems da funcionalidad
Libro de Kumbia: Porque Programar debera ser ms fcil 9!
agregada a datos de sesi#n 5 +alidaci#n de integridad relacional
&ste modelo a5uda a se3arar el trabaBo en l#gica de negocios FmodelosG 5 la 3resentaci#n
FAistasG Por eBem3loC si usted tiene una a3licaci#n que corra tanto en equi3os de
escritorio 5 en dis3ositi+os de bolsillo entonces 3odra crear dos +istas diferentes
com3artiendo las mismas acciones en el controlador 5 la l#gica del modelo
&l controlador a5uda a ocultar los detalles de 3rotocolo utili2ados en la 3etici#n FHJJPC
modo consolaC etcG 3ara el modelo 5 la +ista FinalmenteC el modelo abstrae la l#gica de
datosC que 0ace a los modelos inde3endientes de las +istas La im3lementaci#n de este
modelo es mu5 li+iana mediante 3eque\as con+enciones se 3uede lograr muc0o 3oder 5
funcionalidad
>ebemos tener siem3re en mente que un controlador 5 una acci#n siem3re +an a ser
eBecutados en cualquier 3etici#n a la a3licaci#n
26.1 E&em#lo
Para 0acer las cosas ms clarasC +eamos un eBem3lo de c#mo una arquitectura <A;
trabaBa 3ara agregar un 3roducto al carrito PrimeroC el usuario interact[a con la interfa2
seleccionando un 3roducto 5 3resionando un bot#nC esto 3robablemente +alida un
formulario 5 en+a una 3etici#n al ser+idor
1. &l controlador recibe la notificaci#n de una acci#n de usuarioC 5 luego de eBecutar
algunas tareas FenrutamientoC seguridadC etcGC entiende que debe eBecutar la
acci#n de agregar en el controlador
2. La acci#n de agregar accede al modelo 5 actuali2a el obBeto del carrito en la sesi#n
de usuario
3. %i la modificaci#n es almacenada correctamenteC la acci#n 3re3ara el contenido
que ser de+uelto en la res3uesta d confirmaci#n de la adici#n 5 una lista com3leta
de los 3roductos que estn actualmente en el carrito La +ista ensambla la
res3uesta de la acci#n en el cuer3o de la a3licaci#n 3ara 3roducir la 3gina del
carrito de com3ras
(. Finalmente es transferida al ser+idor Web que la en+a al usuarioC quien 3uede
leerla e interactuar con ella de nue+o
26.2 Areacin de un Aontrolador
Los controladores en Kumbia deben ser creados en el directorio controllers 5 lle+ar la
siguientes con+enciones 5 caractersticas:
&l arc0i+o debe tener el nombre del controlador 5 la terminaci#n *controller.php
&l arc0i+o debe estar ubicado s#lo en el directorio controllers
&l arc0i+o debe tener al menos una clase 5 una de ellas debe ser el controlador
Libro de Kumbia: Porque Programar debera ser ms fcil 9$
que debe tener un nombre como: Productos;ontrollerC las 3rimeras letras en
ma5[sculas 5 la terminaci#n ;ontroller
1. <?php
2.
3. class ProductosController extends ApplicationController {
4.
5. }
6.
7. ?>
27 A33lication;ontroller
&s la clase 3rinci3al utili2ada 3ara crear controladoresC que son la 3rimera 3arte del
modelo <A; ;ontiene m/todos im3ortantes 3ara facilitar la interacci#n entre /stosC los
modelos 5 la 3resentaci#n
;aractersticas:
Libro de Kumbia: Porque Programar debera ser ms fcil 9(
Los +alores de los atributos de las sub=clases son 3ersistentesC es decir que no se
3ierden cuando termina la eBecuci#n de un scri3t
Automati2a la interacci#n entre la l#gica 5 la 3resentaci#n
&s sencilla de usar
27.1 E+todos de la Alase A##licationAontroller
La clase 3osee una serie de m/todos que son [tiles 3ara el trabaBo con controladores
27.1.1 renderLSvie%9
Aisuali2a una +ista que 3ertenece al mismo controlador &Bem3lo:
1. <?php
2.
3. class ProductosController extends ApplicationController {
4.
5. function index(){
6. $this->render('consultar');
7. }
8.
9. } //fin de la clase
10.
11.?>
&n este caso se +isuali2ara la +ista views+productos+consultar.phtml
27.1.2 redirectLSurl, SsecondsG0.59
1edirecciona la eBecuci#n a otro controlador en un tiem3o de eBecuci#n determinado
1. <?php
2.
3. class ProductosController extends ApplicationController {
4.
5. function index(){
6. $this->redirect('facturas/nueva', 2);
7. }
8.
9. }
10.
11.?>
&n el eBem3lo +a a facturas@nue+a des3u/s de ! segundos
27.1.3 #ostLSvalue9
8btiene acceso orientado a obBetos a los +alores de SC2O;TC Svalue es el ndice 3ara
3asar al arra5 asociati+o
Libro de Kumbia: Porque Programar debera ser ms fcil 9'
27.1.( !etLSvalue9
8btiene acceso orientado a obBetos a los +alores de SC]ETC Svalue es el ndice 3ara
3asar al arra5 asociati+o
27.1.5 re"uestLSvalue9
8btiene acceso orientado a obBetos a los +alores de HE1&.4&%JC H+alue es el ndice 3ara
3asar al arra5 asociati+o
27.1.4 renderC#artialLSname9
Aisuali2a una +ista 3arcial F3artialG que 3ertenece al mismo controlador &Bem3lo:
1. <?php
2.
3. class ProductosController extends ApplicationController {
4.
5. function index(){
6. $this->render_partial('mostrar_menu');
7. }//fin del metodo
8.
9. }//fin de la clase
10.
11.?>
&n este caso se +isuali2ara la +ista 3arcial views+productos+*mostrar*menu.phtml
27.1.6 routeCtoL[#arams: valor\9
Hace el enrutamiento desde un controlador a otroC o desde una acci#n a otra 1ecibe los
3armetros con nombre:
controller: A qu/ controlador se +a a redireccionar
action: A que acci#n se +a a redireccionar
id: "d de la redirecci#n
&Bem3lo:
1. return $this->route_to("controller: clientes", "action: consultar", "id:
1");
&l ti3o de enrutamiento que reali2a es internoC es decir que lo usuarios no notan cuando
estn siendo redireccionados en la a3licaci#n
27.1.7 redirectLSurlCcontrolador9
1eali2a un redireccionamiento a otro controlador@accion mediante HJJP &s [til cuando
queremos 0acer una real redirecci#n que incluso cambie la 41L que a3arece en el
e?3lorador
&Bem3lo:
Libro de Kumbia: Porque Programar debera ser ms fcil 9-
1. $this->redirect(/productos/query);
27.1.8 cac,eCla'outLSminutes9
;ac0/ de la +ista views+laout+ corres3ondiente al controlador durante Hminutes
27.1.10 notCoundLScontroller, Saction9
Puedes definir el m/todo notEfound en cualquier controladorC en caso de estar definido se
llamar cuando no encuentre definida alguna acci#n as es ms fcil controlar este ti3o
de errores:
1. <?php
2. class PruebaController extends ApplicationController {
3.
4. function index(){
5. $this->render_text("Este es el index");
6. }
7.
8. function not_found($controller, $action){
9. Flash::error("No esta definida la accion $action, redireccionando
a index...");
10. return $this->route_to('action: index');
11. }
12. }
13.?>
NOTA: A,ora en la versin 0.5 se inclu'e un vista views+not*found.phtml& esto
,ace "ue no se ,a!a necesario la im#lementacion del metodo notCound, 'a
"ue cuando no eDista un controller o una accin se renderi0ara dic,a vista, esta
#uede ser totalmente #ersonali0ada de manera "ue sea mas comodo el
desarrollo
27.1.11 setCres#onseLSt'#e9
&s3ecifica el ti3o de res3uesta que +a a generar el controlador ;uando es el +alor de
Ht53e es +iew solamente en+a la salida de la +ista ms no del la5outC el tem3late o
cualquier cabecera 0tml &s ideal en salidas AUAV o P>F 8tro +alor 3ara Ht53e es V<L
1. <?php
2. class PruebaController extends ApplicationController {
3.
4. function accion_ajax(){
5. $this->set_response(view);
6. }
7. }
27.1.12 isCalnumLSvalor9
&+al[a si un cam3o es alfanum/rico o no &s [til 3ara +alidar la entrada de datos al
recibirlos 3or 3arte de usuarios
1. <?php
2. class PruebaController extends ApplicationController {
3.
Libro de Kumbia: Porque Programar debera ser ms fcil 96
4. function adicionar(){
5. $nombre = $this->request(nombre);
6. if($this->is_alnum($nombre)==false){
7. Flash::error(Entrada invalidad para precio);
8. return;
9. }
10. /* ..*/
11. }
12. }
13.?>
27.1.13 loadCreacordLSrecord9
;arga los cam3os de un registro Acti+e1ecord como atributos del controladorC recibe
como 3armetro Srecord Active/ecord o string registro Acti+e1ecord a cargarC si es un
string este debe corres3onder al nombre de un modelo %o3orta argumento +ariable
ield: cam3os a cargar se3arados 3or coma
eDce#t: cam3os que no se cargaran se3arados 3or coma
suiD: sufiBo 3ara el atributo en el controlador
#reiD: 3refiBo 3ara el atributo en el controlador
//Ejemplo1:
$usuario = $this->Usuario->find(1);
$this->load_record($usuario);
//Ejemplo2:
$usuario = $this->Usuario->find(1);
$this->load_record($usuario, 'except: id, sexo');
//Ejemplo3:
$usuario = $this->Usuario->find(1);
$this->load_record($usuario, 'field: nombre, apellido');
//Ejemplo4:
$usuario = $this->Usuario->find(1);
$this->load_record($usuario, 'preffix: c_');
//Ejemplo5:
$this->load_record('Usuario');
//Ejemplo6:
$this->load_record('Usuario', 'field: nombre, apellido');
Libro de Kumbia: Porque Programar debera ser ms fcil 97
27.1.1( isCnumericLSvalor9
&+al[a si un cam3o es num/rico o no &s [til 3ara +alidar la entrada de datos al recibirlos
3or 3arte de usuarios
1. <?php
2. class PruebaController extends ApplicationController {
3.
4. function adicionar(){
5. $precio = $this->request(precio);
6. if($this->is_numeric($precio)==false){
7. Flash::error(Entrada invalida para precio);
8. return;
9. }
10. /* ..*/
11. }
12. }
13.?>
Libro de Kumbia: Porque Programar debera ser ms fcil 99
28 8btener +alores desde una de Kumbia
Las 41Ls de Kumbia estn caracteri2adas 3or tener +arias 3artes cada una de ellas con
una funci#n conocida Para obtener desde un controlador los +alores que +ienen en la
41L 3odemos usar algunas 3ro3iedades [tiles en el controlador:
&Bem3lo1:
0tt3:@@wwwkumbia303com@a3licacion@3roductos@buscar@1!
&l sitio es: kumbiaorg
La a3licaci#n es: a3licacion
&l controlador es: 3roductos
La acci#n es: buscar
&l +alor 3ara id es: 1!
*uestro controlador a3licaci#n@3roductosEcontroller303 luce as:
1. <?php
2.
3. class ProductosController extends ApplicactionController {
4.
5. public function buscar($id){
6. /* */
7. }
8. }
9.
10.?>
>entro del m/todo buscar 3odemos obtener el +alor de id osea 1! en nuestro eBem3lo
colocando un 3armetro al controlador Hid 3odemos recoger este +alor 5 utili2arlo
internamente
8tras formas de 0acer esto es utili2ar los m/todos 3ostC get o request as:
1. public function buscar(){
2. $id = $this->request(id);
3. // o tambin
4. $id = $this->id;
5. }
)Amo saber el nombre del controlador actual.
1. public function buscar(){
2. $controlador = $this->controller_name;
3. }
)Amo saber el nombre de la accin actual.
1. public function buscar(){
2. $controlador = $this->action_name;
3. }
Libro de Kumbia: Porque Programar debera ser ms fcil 1::
A0ora +eamos el siguiente eBem3lo:
0tt3:@@wwwkumbiaorg@a3licacion@registro@buscarEfec0a@!::-@1!@:1
&l sitio es: kumbiaorg
La a3licaci#n es: a3licacion
&l controlador es: registro
La acci#n es: buscarEfec0a
La meBor forma de recoger estos +alores es de la siguiente forma:
1. <?php
2.
3. class RegistroController extends ApplicactionController {
4.
5. public function buscar_fecha($ao, $mes, $dia){
6. /* */
7. }
8. }
9.
10.?>
;omo +emos los +alores adicionales en la 41L son automticamente agregados como
3armetros en la acci#n del controlador
)*ue #asa con id en este e&em#lo.
Hid es el +alor del 3rimer 3armetro siem3re as que si nos referimos a /steC
encontramos que tiene el +alor !::-
)Amo #uedo obtener los #ar:metros eDtra si no s+ cu:ntos son.
Aqu usamos la 3ro3iedad del controlador H3arameters que contiene estos +alores as
que el eBem3lo 3odramos reescribirlo as:
1. <?php
2.
3. class RegistroController extends ApplicactionController {
4.
5. public function buscar_fecha(){
6. $ao = $this->parameters[0];
7. $mes = $this->parameters[1];
8. $dia = $this->parameters[2];
9. /* ... */
10. }
11. }
Libro de Kumbia: Porque Programar debera ser ms fcil 1:1
Por [ltimo 3odemos +er todos los 3armetros que +ienen en una url de Kumbia usando la
3ro3iedad del controlador Ht0is=IallE3arameters 4na salida de esta +ariable en el
eBem3lo anterior con 3rintEr muestra:
1. Array
2. (
3. [0] => registro
4. [1] => buscar_fecha
5. [2] => 2006
6. [3] => 12
7. [4] => 01
8. )
Libro de Kumbia: Porque Programar debera ser ms fcil 1:!
30 Persistencia en ;ontroladores
A33lication;ontroller 3osee una funcionalidad mu5 [til que es la 3ersistencia de los
+alores de los atributos del frameworkC +eamos un eBem3lo:
1. <?php
2.
3. class ComprarController extends ApplicationController {
4.
5. /**
6. * Tiene los valores de los items guardados en el
7. * carrito, las propiedades de los controladores
8. * son persistentes es decir que no se pierden a lo
9. * largo de la ejecucin de la aplicacin
10. *
11. * @var array
12. */
13. public $carro , arra$)*!
14.
15. function index(){
16.
17. }
18.
19. /**
20. * Agrega un item al carrito
21. *
22. * @param integer $id
23. */
24. function add_to_cart($id){
25.
26. $this->set_response('view');
27.
28. i.)Jisset)$this&'carro[$id**G
29. $this->carro[$id] = 1;
30. } else {
31. $this->carro[$id]++;
32. }
33.
34. $this->render_partial('carrito');
35.
36. }
37.
38. /**
39. * Elimina todos los items del carrito
40. *
41. */
42. function borrar_items(){
43.
44. //Indica que la vista sera solo parcial
45. $this->set_response('view');
46.
47. $this&'carro , arra$)*!
48.
49. $this->render_partial('carrito');
Libro de Kumbia: Porque Programar debera ser ms fcil 1:$
50.
51. }
52.
53. /**
54. * Elimina un item del carrito
55. *
56. * @param integer $id
57. */
58. function borrar_item($id){
59.
60. //Indica que la vista sera solo parcial
61. $this->set_response('view');
62.
63. unset)$this&'carro[$id*!
64.
65. $this->render_partial('carrito');
66. }
67.
68. }//fin de la clase
69.
70. ?>
;omo +emos el atributo Scarro es un arra5 que contiene los items que se +an agregando
al carro de com3rasC los +alores de esta +ariable se mantienen en cada llamada sin
utili2ar llamadas e?trasC ni com3licaciones
Libro de Kumbia: Porque Programar debera ser ms fcil 1:(
31 Filtros en ;ontroladores
Los controladores en Kumbia 3oseen unos m/todos [tiles que 3ermiten reali2ar ciertas
acciones antes 5 des3u/s de atender las 3eticiones en los controladoresC estos m/todos
son los siguientes:
31.1 beoreCilterLScontroller, Saction, Sid9
&ste m/todo es eBecutado Busto antes de llamar a la acci#n en el controlador 1ecibe
como 3armetros el nombre del controladorC el nombre de la acci#n 5 el id o3cional que
com3onen la 3etici#n al controlador actual &ste m/todo es [til 3ara +alidar si un
determinado usuario o rol tiene acceso a una acci#n en es3ecial "gualmente lo 3odemos
usar 3ara 3roteger nuestro controlador de informaci#n inadecuada que sea en+iada a
ellos 5 utili2arlo 3ara +alidar los datos de entrada
1. <?php
2.
3. class EmpresasController extends ApplicationController {
4.
5. public function before_filter($controlador, $accion, $id){
6. if($accion=='insertar'&&Session::get_data(usuario_autenticado
)==false){
7. Flash::error(El usuario debe estar autenticado para usar este
modulo);
8. return false;
9. }
10. }
11.
12. public function insertar(){
13. /* ... */
14. }
15.
16. }
17.?>
&n el eBem3lo se solicita a33licacion@em3resas@insertarC el m/todo beforeEfilter es
llamado automticamente antes del m/todo insertarC en /steC +alidamos si la acci#n es
insertar 5 si el usuario est autenticado seg[n nuestra +ariable de sesi#n
usuarioEautenticado
31.2 aterCilterLScontroller, Saction, Sid9
&ste m/todo es eBecutado Busto des3u/s de llamar a la acci#n en el controlador 1ecibe
como 3armetros el nombre del controladorC el nombre de la acci#n 5 el id o3cional que
com3onen la 3etici#n al controlador actual &s [til 3ara liberar recursos que 0an sido
usados en las acciones de los controladores o reali2ar redirecciones usando routeEto
Libro de Kumbia: Porque Programar debera ser ms fcil 1:'
31.3 notCoundLScontroller, Saction, Sid9
&ste m/todo es llamado siem3re 5 cuando est/ definido 5 3ermite reali2ar una acci#n de
usuario en caso de que se 0aga una 3etici#n de una acci#n que no e?ista en un
controlador
1. <?php
2. class PruebaController extends ApplicationController {
3.
4. function index(){
5. $this->render_text("Este es el index");
6. }
7.
8. function not_found($controller, $action){
9. Flash::error("No esta definida la accion $action, redireccionando
a index...");
10. return $this->route_to('action: index');
11. }
12. }
13.?>
Libro de Kumbia: Porque Programar debera ser ms fcil 1:-
32 A33lication;ontrollerDase
&s una clase definida en el arc0i+o controllers+application.phpC de esta forma:
1. <?php
2.
3. class ControllerBase {
4.
5.
6. }//fin de la clase
7.
8. ?>
La clase tiene como obBeti+o 3ermitir que se com3artan ciertos m/todos 5 atributos que
deben estar dis3onibles 3ara todos los controladores de la a3licaci#n
1. <?php
2.
3. class ControllerBase {
4.
5. protected function seguridad(){
6. /* ... */
7. }
8.
9. }//fin de la clase
10.
11.?>
5 3or eBem3lo en el controlador 3roductos 3odramos usar este m/todo as:
1. <?php
2.
3. class Productos extends ApplicationController {
4.
5. public function adicionar(){
6.
7. if($this->seguridad()){
8. /* .... */
9. }
10.
11. }
12.
13. }//fin de la clase
14.
15. ?>
&l m/todo seguridad a0ora se encuentra dis3onible 3ara cualquier controlador
Libro de Kumbia: Porque Programar debera ser ms fcil 1:6
33 &nrutamiento 5 1edirecciones
Kumbia 3ro3orciona un 3oderoso sistema de redireccionamiento que 3ermite cambiar el
fluBo de la eBecuci#n de una a3licaci#n entre los controladores <A;
Kumbia 3ermite el re=direccionamiento de ! formas: esttico 5 dinmico
33.1 )2or "u+ re@direccionamiento.
*ecesitamos cambiar el fluBo de la eBecuci#n entre controladoresC bsicamente
E&em#lo: &l usuario trata de acceder a una acci#n que no e?iste 5 queremos
en+iarla a una +lida
E&em#lo: &l usuario de la a3licaci#n no tiene 3ri+ilegios 3ara continuar eBecutando
determinada acci#n 5 debemos en+iarlo a otra
33.2 Est:tico
&l direccionamiento esttico ocurre en el arc0i+o forms+config+routes.ini en donde le
decimos al framework cundo debe redireccionar de acuerdo a los controladores 5@o
acciones solicitadas
&l arc0i+o config+routes.ini se +e as:
1. ; Usa este archivo para definir el enrutamiento esttico entre
2. ; controladores y sus acciones
3. ;
4. ; Un controlador se puede enrutar a otro controlador utilizando '*' como
5. ; comodn as:
6. ; controlador1/accion1/valor_id1 = controlador2/accion2/valor_id2
7. ;
8. ; Ej:
9. ; Enrutar cualquier peticin a posts/adicionar a posts/insertar/*
10.; posts/adicionar/* = posts/insertar/*
11.;
12.; Enrutar cualquier peticin a cualquier controlador en la accin
13.; adicionar a posts/adicionar/*
14.; */adicionar/* = posts/insertar/*
15.
16.[routes]
17.prueba/ruta1/* = prueba/ruta2/*
18.prueba/ruta2/* = prueba/ruta3/*
;ualquier 3oltica definida en este arc0i+o tiene menos rele+ancia sobre un
direccionamiento dinmico
Libro de Kumbia: Porque Programar debera ser ms fcil 1:7
33.3 Kin:mico
8curre cuando en eBecuci#n necesitamos cambiar el fluBo normal 5 3asar a otro
controlador o a otra acci#n
&l 3rinci3al m/todo 3ara 0acer esto es usar el m/todo route*to:
1. route_to([params: valor])
1ecibe los 3armetros con nombre:
controller: A que controlador se +a a redireccionar
action: A que acci#n se +a a redireccionar
id: "d de la redirecci#n
1. return $this->route_to("controller: clientes", "action: consultar", "id:
1");
*o todos los 3armetros son obligatorios s#lo el que sea necesario
Libro de Kumbia: Porque Programar debera ser ms fcil 1:9
3( Filter
Para la Oersin 0.5 se incor3ora el com3onente -ilter el cual 3ro3orciona un conBunto
de filtros que sern a3licados a datos que lo requieran
3(.1 *ue es un -iltro.
4n filtro es utili2ado 0abitualmente 3ara eliminar 3orciones no deseadas de una entrada
de datosC 5 la 3orci#n deseada de la entrada 3asa a tra+/s de la 3roducci#n como filtro
F3or eBem3loC caf/G &n estos escenariosC un filtro es un o3erador que 3roduce un
subconBunto de la entrada &ste ti3o de filtro es [til 3ara a3licaciones web = la su3resi#n
de entrada ilegalC innecesario el recorte de los es3acios en blancoC etc
&sta definici#n bsica de un filtro 3uede ser am3liado 3ara incluir a las transformaciones
generali2adas de entrada 4na transformaci#n que se debe a3licar a las a3licaciones web
es el esca3ar de las entidades HJ<L Por eBem3loC si un cam3o de formulario es
automticamente 3oco fiable de entradaC este +alor debe ser libre de las entidades
HJ<LC a fin de e+itar las +ulnerabilidades de seguridad Para cum3lir con este requisitoC
las entidades HJ<L que a3arecen en la entrada debe ser eliminado o que se 0a5an
esca3ado Por su3uestoC enfoque que es ms a3ro3iado de3ende de la situaci#n 4n filtro
que elimina las entidades HJ<L o3era dentro del mbito de a3licaci#n de la 3rimera
definici#n de filtro = un o3erador que 3roduce un subconBunto de la entrada
3(.2 1tili0acin Q:sica
&n este eBem3lo se le 3asa 3or el constructor de class Filter dosFu33erC 0tmls3ecialc0arsG
filtros que sern a3licados a la cadena
$filter = new Filter('upper', 'htmlspecialchars');
$var = '<b>Hola</b>';
print(r)$.ilter&'appl$)$var**! //K<'#86AK/<'
A continuaci#n se a3lica el filtro de manera dinmica
$filter = new Filter();
$var = '<b>Hola</b>';
print(r) $.ilter&'appl$(.ilter)$var, @upper@, @htmlspecialchars@** //K<'#86AK/<'
8tra forma de a3licar filtros
$var = '<b>Hola</b>';
$filter = new Filter('upper', 'htmlspecialchars');
print(r )$.ilter&'.ilter(value)$var**!
Adicionalmente los filtros so3ortan como 3armetros a filtrar arra5
$var = array('<b>Hola</b>');
$filter = new Filter('upper', 'htmlspecialchars');
print(r) $.ilter&'appl$)$var**!//K<'#86AK/<'
Libro de Kumbia: Porque Programar debera ser ms fcil 11:
3(.3 E+todos de la clase -ilter
A continuaci#n se listan los m/todos dis3onibles en la clase filterC el constructor de la
clase filter 3uede recibir los filtros a ser a3licados
3(.3.1 addCilterLSilter9
Agregar un filtro a la cola de filtros
3(.3.2 a##l'LSvar, [ilters\9 ' a##l'CilterLSvar, [ilters\9
A3lica un filtros o un gru3o de filtros a la +ariable H+ar
3(.3.3 !etCinstanceL9
8btiene una instancia singlenton
3(.( -iltros Kis#onibles
Actualmente se cuenta con una serie de filtros que 3ueden utili2ados
3(.(.1 addslas,es
Filtra una cadena 0aciendo addslas0es
3(.(.2 alnun
Filtra una cadena 3ara que contenga solo al30a=numeic
3(.(.3 al#,a
Filtra una cadena 3ara que contenga solo alfab/tico
3(.(.( date
Filtra una cadena 3ara que contenga el formato fec0aC debe cum3lir con un 3atr#n
3(.(.5 di!it
Filtra una cadena 3ara que contenga solo >gitosC sigue siendo un string lo que retorna el
m/todo
3(.(.4 ,tmlentities
Filtra una cadena 5 0ace que todos los caracteres que tengan una entidad equi+alente en
HJ<L sern cambiados a esas entidades
3(.(.6 ,tmls#ecialc,ars
Filtra una cadena 0tmls3acialc0ars
Libro de Kumbia: Porque Programar debera ser ms fcil 111
3(.(.7 u##er
Filtra una cadena 3ara que contenga solo <a5usculas
3(.(.8 trim
Filtra una cadena 0aciendo trim
3(.(.10 stri#ta!s
Filtra una cadena 3ara eliminar etiquetas
3(.(.11 stri#s#ace
Filtra una cadena 3ara eliminar es3acios
3(.(.12 stri#slac,es
Filtra una cadena 0aciendo stri3slas0es
3(.(.13 numeric
Filtra una cadena 3ara que contenga solo numerico
3(.(.1( nl2br
Filtra una cadena con+irtiendo caracteres de nue+a linea en cbrI
3(.(.15 md5
Filtra una cadena encri3tando a md'
3(.(.14 lo%er
Filtra una cadena 3ara que contenga solo minuscula
3(.(.16 i#v(
Filtra una cadena 3ara que sea de ti3o i3+(C debe cum3lir con el 3atr#n
3(.(.17 int
Filtra una cadena 3ara que sea de ti3o enteroC retorna un integer m/todo
Libro de Kumbia: Porque Programar debera ser ms fcil 11!
35 Aistas
Kumbia 3osee un sistema de 3resentaci#n basado en +istas F+iewsG que +iene siendo el
tercer com3onente del sistema <A; F<odel Aiew ;ontrollerG
&l framework a3lica un 3atr#n de dise\o llamado Jem3lateAiew que 3ermite utili2ar un
sistema de 3lantillas 5 +istas que son reutili2ables 3ara no re3etir c#digo 5 darle ms
3oder a nuestra 3resentaci#n
Las +istas deberan contener una cantidad mnima de c#digo en PHP 3ara que fuese
suficientemente entendible 3or un dise\ador Web 5 ademsC 3ara deBar a las +istas s#lo
las tareas de +isuali2ar los resultados generados 3or los controladores 5 3resentar las
ca3turas de datos 3ara usuarios
Jambi/n 3ro3orciona unas a5udas FAistas Hel3ersG que generan cierto c#digo mu5
com[n en a3licaciones Web aumentando la 3roducti+idad
Aisuali2ar informaci#n de los modelosC mensaBes de los controladores e interfa2 de
usuario
>eben gestionar cualquier salida de la A3licaci#n
Permiten reutili2ar c#digo utili2ado 3ara 3resentaci#n en forma de 3lantillas
Permiten cac0ear las +istas 3ara acelerar el rendimiento
Permiten el uso de %mart5 como motor de Plantillas
35.1 2or"ue usar Oistas.
Las a3licaciones Web 5 %itios generalmente tienen una estructura en la cual se 3uede
identificar una cabeceraC unas barras de na+egaci#n 5 un 3ie de 3agina Y si tu+i/ramos
muc0as 3ginas entonces tendramos que re3etir el c#digo de los encabe2ados 5 del
dise\o inicial tantas +eces como 3ginas tu+i/ramos Las +istas son una soluci#n a esto
&n la figura 3odemos obser+ar la estructura de un sitio o a3licaci#n Web ;ada bloque
re3resenta en nuestro caso una +ista que debe ser abstrada 3ara que no sea re3etida en
cada +isuali2aci#n
Libro de Kumbia: Porque Programar debera ser ms fcil 11$
;omo lateralC 3ie de 3gina 5 cabecera se re3iten siem3reC entonces 3odramos ubicarlos
a ni+el de la5out en donde serian com[n a cualquier acci#n del controlador al cual
3ertene2ca el la5out
8tra alternati+a es crear un 3artial 3ara estos $ bloques 5 reutili2arlos en otros la5outs
Los 3artials re3resentan 3eque\as unidades de +istas 5 son utili2ados 3are re3resentar
3eque\os fragmentos de c#digo
La +ista 3rinci3al +iews@inde?30tml re3resenta la +ista su3erior donde cualquier cambio
a esta +ista afecta las ca3as inferiores
La estructura del sistema de +istas es el siguiente:
35.2 1so de Oistas
Jal 5 como se +io en Primera A3licaci#n en KumbiaC las +istas son automticamente
+isuali2adas si se sigue la con+enci#n de nombrarlas con el mismo nombre de la acci#n
dentro de un directorio con el nombre del controlador en +iews
<as vistas, la'outs, tem#lates ' #artiales tienen la e?tensi#n .#,tml que indica que
es #,# con ,tml
E&em#lo: %i tu+i/ramos un controlador ;lientes 5 queremos mostrar una +ista 3ara su
acci#n adicionar entonces 0acemos lo siguiente:
1. <?php
2. class ClientesController extends ApplicationController {
3.
4. function adicionar(){
5.
6. }
7. }
8. ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 11(
5 la +ista sera el arc0i+o views+clientes+adicionar.phtml:
1. <h2>Hola desde Accin Adicionar</h2>
*o es necesario definir una +ista 3ara cada acci#n en un controladorC esto debe 0acerse
s#lo 3ara aqu/llas que requieran 3resentar informaci#n al usuario
Las +istas que sean 3resentadas mediante AUAV deben reali2ar un llamado a Ht0is=
IsetEres3onseFT+iewTG en su res3ecti+o m/todo del controlador As lograremos una
salida o3timi2ada 3ara AUAV
35.3 1so de <a'outs
Kumbia tambi/n 3ermite o3cionalmente el uso de una 3lantilla su3erior a ni+el de
controlador que se encuentra en el directorio views+laouts .
Para nuestro eBem3lo anterior tenemos el arc0i+o views+laouts+clientes.phtml::
1. <h1>Este es el Controlador Clientes<h1>
2. <? content() ?>
&l llamado a contentL9 0ace que el contenido de la +ista 3ara acci#n se muestre en esa
3arte del la5out
4n llamado a clientes+adicionar nos +isuali2ara:
Este es el Controlador Clientes
Hola desde Acci#n Adicionar
*o es obligatorio definir un la5out 3ara todos los controladoresC si este no e?iste KumbiaC
+a a simularlo
35.( 1so de Tem#lates
&l sistema de +istas tambi/n 3ermite el uso de Jem3latesC esto sim3lemente 3ermite
utili2ar el la5out de otro controlador en el controlador actualC as no re3etimos c#digo 5
3odemos usar el mismo la5out en +arios controladores
1. <?php
2.
3. class ClientesController extends ApplicationController {
4.
5. public $template = "administracion";
6.
7. function adicionar(){
8. /* ... */
9. }
10.
11. }
12.
13.?>
Libro de Kumbia: Porque Programar debera ser ms fcil 11'
>e esta forma 0acemos que ;lientes utilice el la5out
views+laouts+administracion.phtml
35.5 1so de 2artials
Los 3artials F3arcialesG son 3eque\as +istas que 3ueden incluirse dentro de otra +ista 5
que e+itan re3etir c#digo
4n 3artial se reconoce 3orque em3ie2a con * FunderscoreG antes del nombre de la +ista
%e 3uede 0acer el llamado a +isuali2ar un partial usando la funci#n render*partial de
esta forma:
1. <?php echo render_partial('menu') ?>
>e esta forma estaramos mostrando el arc0i+o _menu.phtml del directorio del
controlador actual
35.4 1so de A;; en 3umbia
Kumbia todo su entorno se eBecuta en la car3eta a #ublicB a 3esar que cuando nos
encontramos desarrollando las +istas de nuestra a3licaci#n la +amos deBando en el
directorio a##sBdeaultBvie%sB
&sto significa que cuando se le indica alguna ruta de alguna imagen 3or decir algo a tus
A;; estas deberan estar res3ecto a #ublicB.
4n eBem3lo sencilloC imaginemos que deseas incluir una imagen como back!round 5
nuestra imagen se encuentra en la car3eta #ublicBim!B. *uestra +ista esta en
a##sBdeaultBvie%sBindeD.#,tml Festa en la +ista 3rinci3al de todo el frameworkG
A0ora editamos el arc0i+o que contiene los estilos en este caso sera
#ublicBcssBst'le.css
body {
background-image: url("/nombre_mi_aplicacion/img/error.gif");
}
>onde nombreCmiCa#licacion es el nombre de tu car3eta donde esta el frameworkC
esta es una utili2aci#n bsica
%in embargo kumbia maneBa unas +ariables 3ara e+itar cambios grandes a ni+el de los
arc0i+os ;%%C un escenario 3osible es si cambiamos el nombre de la car3eta rai2 del
framework 3orque, sencillo si cmbianos el nombre de la a3licaci#n Fen este caso el
nombre de la car3eta ra2GC esto conlle+a a cambiar estas rutas a en todos los ;%%
&n la +ersi#n :' de Kumbia 0emos encontrado una soluci#n a este 3roblema la cual
cuando inclu5es los arc0i+os css que contengan alguna ruta de arc0i+o como fue en el
eBem3lo anterior una imagenC lo ideal seria incluir este arc0i+o ;%% como se muestra
abaBo
<?php echo stylesheet_link_tag('style', 'use_variables: true')?>
Libro de Kumbia: Porque Programar debera ser ms fcil 11-
8bser+en el 3armetro useCvariablesC con este 3armetro 3odemos 0acer en el algo
como se muestra a continuaci#n en los arc0i+os ;%% 5 nos basamos en el mismo eBem3lo
anterior
background-image: url("@path/img/error.gif");
^#at, contiene el nombre de la car3eta ra2 del framework
^im!C#at, contiene la ruta 0asta la car3eta #ublicBim!, es decir que el mismo eBem3lo
anterior tendra un funcionamiento igual de la siguiente manera
background-image: url("@img_path/error.gif");
^cssC#at, contiene la ruta 0asta la car3eta #ublicBcss, esto tiene una utilidad si en
nuestro arc0i+o ;%% se 0iciera una inclusi#n de otro arc0i+o ;%%
@import url("@css_path/otro_css.css");
35.6 1so de contentL9
&sta funci#n tiene como obBeti+o indicar al sistema de 3lantillas en que 3arte de la +ista
se +a a +isuali2ar el siguiente ni+el de +ista %i 3or eBem3lo se 3retende +isuali2ar una
+ista 5 el llamado a contentFG no esta 3resente en el la5outC entonces la +ista no se +a a
+isuali2ar
Libro de Kumbia: Porque Programar debera ser ms fcil 116
35.7 Fel#ers
Kumbia 3osee una serie de m/todos que facilitan 5 agili2an la escritura de c#digo HJ<L
al escribir una +ista
&l obBeti+o de los 0el3ers es el de enca3sular grandes cantidades de c#digo HJ<L o
Ua+ascri3t minimi2ndolo en una sola funci#n
A continuaci#n la referencia de estos:
35.7.1 linkCtoLSaccion, SteDto, [S#arametros\9
Permite 0acer un enlace a una acci#n controlador &sta funci#n 3uede recibir n
3armetros que corres3onden a atributos 0tml corres3ondientes a la etiqueta TaT
1. <?php echo link_to('compras/buscar/2', 'Buscar el Producto #2') ?>
35.7.2 linkCtoLSaccion, SteDto, [S#arametros\9
Permite 0acer un enlace a una acci#n en el controlador actual &sta funci#n 3uede recibir
n 3armetros que corres3onden a atributos 0tml corres3ondientes a la etiqueta TaT
<?php echo link_to('buscar/2', 'Buscar el Producto #2', 'class: enlace_producto) ?
>
35.7.3 linkCtoCremoteLSaccion, SteDto, Sob&etoCaCactuali0ar,
[S#arametros\9
Permite 0acer un enlace que al 0acer clic sobre el reali2a una 3etici#n AUAV que actuali2a
un contenedor Fdi+C s3anC tdC etcG del documento actual denominado 3or
HobBetoEaEactuali2ar Je?to es el te?to del enlace
1. <?php echo link_to_remote(Cargar algo con AJAX, update: midiv, action:
saludo/hola) ?>
2.
3. <div id=midiv>Este texto ser actualizado</div>;
Jambi/n 3uede recibir los 3armetros beforeC success 5 oncom3lete que tienen c#digo
Ba+ascri3t que ser eBecutado antesC des3u/s 5 al com3letar la transacci#n AUAV
res3ecti+amente
1. <?php echo link_to_remote("cata/y", "texto", "update: midiv", "success: new
Effect.Appear('midiv')") ?>
2. <div id='midiv' style='display:none'></div>
Adicionalmente se 3uede usar el 3armetro confirm 3ara indicar que se debe reali2ar una
confirmaci#n antes de 0acer la 3etici#n AUAV:
1. <?php echo link_to_remote(Borrar Producto, update: midiv, action:
productos/borrar/11, confirm: Esta seguro desea borrar el producto?) ?>
2.
3. <div id=midiv>Este texto ser actualizado</div>;
Libro de Kumbia: Porque Programar debera ser ms fcil 117
linkEtoEremote 3uede recibir n 3armetros adicionales que corres3onden a atributos 0tml
corres3ondientes a la etiqueta TaT
35.7.( buttonCtoCremoteCactionLSaccion, SteDto, Sob&etoCaCactuali0ar,
[S#arametros\9
1eali2a la misma tarea que linkEtoEremote sino que crea un bot#n en +e2 de un enlace
35.7.5 &avascri#tCincludeCta!LSarc,ivoC&s9
"nclu5e un arc0i+o Ba+ascri3t que esta ubicado en 3ublic@Ba+ascri3t *o es necesario
indicar la e?tensi#n Bs
1. <?php echo javascript_include_tag(funciones) ?>
2. // <script type='text/javascript'
3. src='/aplicacion/public/funciones.js'></script>
35.7.4 &avascri#tClibrar'Cta!LSarc,ivoC&s9
"nclu5e un arc0i+o Ba+ascri3t que 3ertenece a kumbia en 3ublic@Ba+ascri3t@kumbia *o es
necesario indicar la e?tensi#n Bs
<?php echo javascript_ilibrary_tag(validations) ?>
<script type='text/javascript'src='/aplicacion/public/kumbia/validations.js'>
</script>
35.7.6 st'les,eetClinkCta!LSarc,ivoCcss, , [useCvariables: true\9
"nclu5e un arc0i+o css que est ubicado en 3ublic@css *o es necesario indicar la
e?tensi#n css
<?php echo stylesheet_link_tag(estilos) ?>
//<link rel='stylesheet' type='text/css' href='/contab/public/css/estilos .css'/>
<?php echo stylesheet_link_tag(carpeta/estilos) ?>
//<link rel='stylesheet' type='text/css' href='/contab/public/carpeta/estilos
.css'/>
&l 3armetro OuseCvariables: trueR nos 3ermite 0acer uso de las +ariables ^#at,C
^im!C#at, 5 ^ccsC#at,C estas +ariables nos facilitan la 3rogramaci#n 5a que nos
ol+idamos de las rutas del frameworkC 3orque internamente este las constru5e 3or
nosotros tal como se e?3lico arriba
35.7.7 im!Cta!LSsrc9
Menera una etiqueta imgC el 3rimer 3armetro corres3onde al nombre del arc0i+o de
imagen que se encuentra en 3ublic@img Puede recibir TnT 3armetros adicionales de la
etiqueta 0tml TimgT 3ara cambiar los atributos de /sta
<?php echo img_tag(carro.gif, width: 100, border: 0) ?>
<?php echo img_tag(subdir_en_img/foto.jpg, width: 100, border: 0) ?>
Jambi/n 3uede indicarse el 3armetro drag: true 3ara indicar que la imagen se 3uede
arrastrar
Libro de Kumbia: Porque Programar debera ser ms fcil 119
35.7.8 ormCremoteCta!LSaction, Sob&etoC"ueCactuali0a9
Permite crear un formulario que al ser en+iadoC genera una 3etici#n AUAV 5 no una
3etici#n normal &l 3armetro Haction indica que acci#n se est solicitando 5 el segundo
3armetro el contenedor 0tml donde se +a a colocar el resultado de la 3etici#n
Jodos los elementos del formularios son seriali2ados 5 en+iados remotamente 3or
m/todo M&J 3or defecto al o3rimirse cualquier bot#n de submit o de image dentro del
formulario
Jambi/n 3uede recibir los 3armetros beforeC success 5 oncom3lete que tienen c#digo
Ba+ascri3t que sera eBecutado antesC des3u/s 5 al com3letar la transacci#n AUAV
res3ecti+amente
Adicionalmente se 3uede usar el 3armetro confirm 3ara indicar que se debe reali2ar una
confirmaci#n antes de 0acer la 3etici#n AUAV
1. <?php echo form_remote_tag(saludo/hola, update: midiv) ?>
2. Tu Nombre?: <?php echo text_field_tag(nombre) ?>
3. <?php echo submit_tag("Envio") ?>
4. <?php echo end_form_tag() ?>
5. <div id=midiv>Este texto ser actualizado</div>
Puede recibir TnT 3armetros adicionales de la etiqueta 0tml TformT 3ara cambiar los
atributos de esta %e debe cerrar el formulario usando la funcion endEformEtag
Jambi/n se 3ueden agregar e+entos Ba+ascri3t tales como successC before 5 oncom3lete:
1. <?php echo form_remote_tag(saludo/hola, update: midiv, before:
alert('Se ha enviado el Formulario')) ?>
2. Tu Nombre?: <?php echo text_field_tag(nombre) ?>
3. <?php echo submit_tag("Envio") ?>
4. <?php echo end_form_tag() ?>
5. <div id=midiv>Este texto ser actualizado</div>
35.7.10 ormCta!LSaction9
Permite escribir r3idamente el inicio de un formulario 0tml Puede recibir TnT 3armetros
adicionales de la etiqueta 0tml TformT 3ara cambiar los atributos de /ste %e debe cerrar
el formulario usando la funci#n endEformEtag
1. c,303 ec0o formEremoteEtagFOsaludo@0olaPG ,I
2. Ju *ombre,: c,303 ec0o te?tEfieldEtagFOnombrePG ,I
3. c,303 ec0o submitEtagFi&n+ioiG ,I
(. c,303 ec0o endEformEtagFG ,I
35.7.11 endCormCta!L9
Permite 0acer el cierre 0tml de un formulario creado con formEremoteEtag o formEtag
35.7.12 comillasLSteDto9
Menera un te?to entre comillas &s [til 3ara e+itar conflictos de comillas al en+iar
3armetros a los 0el3ers
1. <?php echo comillas(Texto) ?> // Texto
Libro de Kumbia: Porque Programar debera ser ms fcil 1!:
35.7.13 submitCta!LSca#tion9
Permite crear un bot#n de submit donde Hca3tion es el te?to del bot#n Puede recibir TnT
3armetros adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo submit_tag("Enviar Formulario") ?>
35.7.1( submitCima!eCta!LSca#tion, Ssrc9
Permite crear un bot#n de submit con imagen donde Hca3tion es el te?to del bot#n 5 Hsrc
el nombre del arc0i+o de imagen que se encuentra en 3ublic@img Puede recibir TnT
3armetros adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo submit_tag("Enviar Formulario") ?>
35.7.15 buttonCta!LSca#tion9
Permite crear un bot#nC donde Hca3tion es el te?to del bot#n Puede recibir TnT
3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos
de /sta
1. <?php echo button_tag("Adicionar") ?>
35.7.14 teDtCieldCta!LSnombre9
Permite crear una caBa de te?to con atributo name Hnombre e id id/ntico Puede recibir
TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los
atributos de /sta
1. <?php echo text_field_tag("nombre", size: 40, maxlength: 45) ?>
35.7.16 c,eckboDCieldCta!LSnombre9
Permite crear una c0eck bo? con atributo name Hnombre e id id/ntico Puede recibir TnT
3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos
de /sta
1. <?php echo checkbox_field_tag("acepta_contrato", value: S, checked:
true) ?>
35.7.17 numericCieldCta!LSnombre9
Permite crear una caBa de te?to con +alidaci#n num/rica automtica &l com3onente es
creado con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con
nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo numeric_field_tag("precio", size: 10) ?>
35.7.18 teDtu##erCieldCta!LSnombre9
Permite crear una caBa de te?to con entrada de te?to en ma5[sculas [nicamente &l
com3onente es creado con atributo name Hnombre e id id/ntico Puede recibir TnT
3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos
de /sta
1. <?php echo textupper_field_tag("nombre", size: 40, maxlength: 45) ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 1!1
35.7.20 dateCieldCta!LSnombre9
;rea un com3onente 3ara ca3turar fec0as que tiene a\oC mes 5 da
1. <?php echo date_field_tag("fecha") ?>
35.7.21 ileCieldCta!LSnombre9
Permite crear una caBa de te?to 3ara subir arc0i+os con atributo name Hnombre e id
id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT
3ara cambiar los atributos de esta
1. <?php echo file_field_tag("archivo") ?>
35.7.22 radioCieldCta!LSnombre, Slista9
Permite generar una lista de selecci#n [nica con m[lti3le res3uesta utili2ando in3uts ti3o
radio Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT
3ara cambiar los atributos de esta &l atributo T+alueT indica el +alor 3or defecto
1. <?php echo radio_field_tag(sexo, array(
2. M =>Masculino,
3. F =>Femenino,
4. ), value: M) ?>
35.7.23 teDtareaCta!LSnombre9
Permite generar un com3onente de te?tarea Puede recibir TnT 3armetros con nombre
adicionales de la etiqueta 0tml Tte?tareaT 3ara cambiar los atributos de esta
1. <?php echo textarea_tag("descripcion", cols: 40, rows: 10) ?>
35.7.2( #ass%ordCieldCta!LSnombre9
Permite crear una caBa de te?to 3ara ca3turar contrase\as con atributo name Hnombre e
id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml
Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo password_field_tag("archivo") ?>
35.7.25 ,iddenCieldCta!LSname9
Permite crear un in3ut oculto con atributo name Hnombre e id id/ntico Puede recibir TnT
3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos
de /sta
1. <?php echo hidden_field_tag("archivo") ?>
35.7.24 selectCta!LSname, Slista9
Permite crear una etiqueta 0tml select con atributo name Hnombre e id id/ntico Puede
recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml TselectT 3ara cambiar
los atributos de esta &l 3armetro lista es o3cional 5 3ermite crear la lista de o3tions
3ara el select
1. <?php echo select_tag("ciudad", array(
2. 1 => Bogot,
Libro de Kumbia: Porque Programar debera ser ms fcil 1!!
3. 2 => Cali,
4. 3 => Medellin
5. )) ?>
35.7.26 o#tionCta!LSvalor, SteDto9
Permite crear una etiqueta 8PJ"8* con +alor H+alor 5 te?to Hte?to Puede recibir TnT
3armetros con nombre adicionales de la etiqueta 0tml To3tionT 3ara cambiar los
atributos de /sta
1. <?php echo select_tag("ciudad") ?>
2. <?php echo option_tag(0, Seleccione una..., selected: true ?>
3. <? foreach($Ciudades->find() as $ciudad): ?>
4. <?php echo option_tag($ciudad->id, $ciudad->nombre) ?>
5. <? enforeach: ?>
6. </select>
35.7.27 u#loadCima!eCta!LSnombre9
Permite crear un com3onente que lista las imgenes del directorio 3ublic@img@u3load 5
3ermite subir una imagen a este directorio
1. <?php echo upload_image_tag("archivo") ?>
35.7.28 setCdro##ableLSnombre, Saccion9
"ndica que un obBeto del documento identificado con id Hnombre recibir obBetos
arrastrables Al colocar un obBeto arrastrable sobre /steC se llamara a la 0andle de la
funci#n Ba+ascri3t Haccion
1. <?php echo set_dropable(carrito, agregar_al_carrito) ?>
Aer >ro3abbles en 1eferencia scri3taculous 3ara ms informaci#n
35.7.30 redirectCtoLSurl, Sse!undos9
Permite reali2ar una redirecci#n a Hurl al cabo de Hsegundos
1. <?php echo redirect_to(/accion/otra/, 3) ?>
35.7.31 renderC#artialLSvistaC#artial, SvalorGUU9
Permite incluir un 3artial del controlador actual en la +ista actual Los 3artials em3ie2an
3or E 3ero H+istaE3artial no debe lle+ar el underscore inicial &l +alor H+alor es 3asado al
3artial 5 3uede ser usado en el en una +ariable con el nombre del 3artial de forma global
<?php echo render_partial(menu) ?>
35.7.32 brCbreakLSnumero9
La funci#n cuenta Hnumero +eces que es llamada 5 luego im3rime un cbrI &s [til 3ara
se3arar en +arias lineas contenidos que est/n siendo im3resos dentro de un ciclo 5
necesiten ser se3arados 3ara ordenarlos &n el eBem3lo se im3rimen $ ciudades 5 el resto
+an a la otra linea 5 as sucesi+amente
1. <? foreach($Ciudades->find() as $ciudad): ?>
2. <?php echo $ciudad->nombre ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 1!$
3. <?php echo br_break(3) ?>
4. <? enforeach: ?>
35.7.33 trCbreakLSnumero9
La funci#n cuenta Hnumero +eces que es llamada 5 luego im3rime un c@trIctrI &s [til
3ara se3arar en +arias filas contenidos que est/n siendo im3resos dentro de un ciclo 5
necesiten ser se3arados 3ara ordenarlos en una tabla &n el eBem3lo se im3rimen (
ciudades 5 el resto +an a la otra fila 5 as sucesi+amente
1. <table>
2. <? foreach($Ciudades->find() as $ciudad): ?>
3. <td><?php echo $ciudad->nombre ?></td>
4. <?php echo tr_break(4) ?>
5. <? enforeach: ?>
6. </table>
35.7.3( trCcolorLScolor1, Scolor2, [Scolorn...\9
La funci#n 0ace una im3resi#n de tr con el atributo bgcolor que es intercalado entre los
colores definidos en la lista de 3armetros &sto genera filas de colores que son fciles de
leer en tablas
1. <table>
2. <? foreach($Ciudades->find() as $ciudad): ?>
3. <td><?php echo $ciudad->nombre ?></td>
4. <?php echo tr_color('#CCDEFF', '#FFFFFF') ?>
5. <? enforeach: ?>
6. </table>
35.7.35 u#daterCselectLSnombre9
Permite generar una lista %&L&;J que al cambiar su +alor seleccionado Fonc0angeG
reali2a una 3etici#n aBa? que actuali2a un contenedor 0tml en+iando como 3armetro id
el +alor seleccionado en la lista
1. <?php echo updater_select(ciudad, action: detalles/ciudad,
ciudaddiv) ?>
2. <?php echo option_tag(0, Seleccione una..., selected: true ?>
3. <? foreach($Ciudades->find() as $ciudad): ?>
4. <?php echo option_tag($ciudad->id, $ciudad->nombre) ?>
5. <? enforeach: ?>
6. </select>
7. <div id='ciudaddiv'>Detalles de esta Ciudad</div>
35.7.34 teDtCieldC%it,Cautocom#leteLSnombre9
Permite crear una caBa de te?to que 3ermite autocom3letar su +alor mediante una lista
generada dinmicamente usando AUAV Puede recibir TnT 3armetros con nombre
adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de esta
&Bem3lo:
vie%sBclientesBindeD.#,tml:
Libro de Kumbia: Porque Programar debera ser ms fcil 1!(
1. <script type='text/javascript'>
2. function mostrar_codigo_ciudad(caja_texto, opcion_lista){
3. alert(El codigo de la ciudad seleccionada es +opcion_lista.id)
4. }
5. </script>
6. <?php echo text_field_with_autocomplete(ciudad, after_update:
mostrar_codigo_ciudad, action: clientes/buscar_por_nombre) ?>
controllersBclientesCcontroller.#,#:
1. <?php
2. class ClientesController extends ApplicationController {
3. // Usamos set_response('view') porque el controlador va
4. // a generar una salida tipo AJAX
5. function buscar_por_nombre(){
6. $nombre = $this->request('nombre');
7. $this->set_response('view');
8. $this->clientes = $this->Clientes->find(nombre like '%
$nombre%');
9. }
10. }
11.?>
vie%sBclientesBbuscarC#orCnombre.#,tml:
1. <ul>
2. <? foreach($clientes as $cliente): ?>
3. <li id='<?php echo $cliente->id ?>'>$cliente->nombre
4. <? endforeach; ?>
5. </ul>
Los estilos de las listas generadas 3ueden ser cambiados mediante la clase autocom3lete
que esta definida en 3ublic@css@st5lecss
35.7.36 truncateLSteDto, SnumeroG09
%i no esta definido numero o es : elimina es3acios 5 caracteres de retorno a la derec0a
de la cadena Hte?oC en caso contrario de+uel+e los 3rimeros Hnumero caracteres de
i2quierda a derec0a
1. <?php echo truncate(Kumbia Web Framework ); // Kumbia Web
Framework
2. <?php echo truncate(Kumbia Web Framework , 6); // Kumbia
35.7.37 ,i!,li!,tLSteDto, SteDtoCaCresaltar9
Hace un resaltado de un te?to dentro de de otro usando la clase ;%% 0ig0lig0t que est
definida en 3ublic@css@st5lecss
1. <?php echo highlight(Texto a Resaltar, Resaltar) ?>
35.7.38 mone'LSvalor9
"m3rime un +alor con formato num/rico con H 5 decimales
Libro de Kumbia: Porque Programar debera ser ms fcil 1!'
1. <?php echo money(10000); // $ 10,000.00 ?>
35.7.(0 dateCieldCta!LSname9
<uestra un calendarioC es un com3onente nue+o que fue integrado
1. <?php echo date_field_tag('fecha') ?>
35.7.(1 selectCta!L9
;rea una lista %&L&;J
1 c,303 ec0o selectEtagFTmarcaEidTC T<arcaTC Tconditions: ti3oSi!iTC To3tion: nombreTG ,I
! c,303 ec0o selectEtagFTmarcaEidTC T<arcaTC T%&L&;J N F18< marca WH&1& ti3oSi!iTC To3tion: nombreT G ,I
$ c,303 ec0o selectEtagFTse?oTC arra5FT<T SI T<asculinoTC TFT SI TFemeninoTGC TincludeEblank: %eleccione
unoTG I,
Libro de Kumbia: Porque Programar debera ser ms fcil 1!-
35.8 Oeriicar env?o de datos al controlador
&sto re3resenta otro a+ance en la +ersi#n :' el controlador dis3one de tres m/todos
3ara +erificar datos en+iados a el
35.8.1 ,asC#ostLSname9
Aerifica que el cam3o llamado Sname 0alla sido en+iado 3or m/todo P8%J al
controlador %o3orta argumento +ariable 3ermitiendo +erificar el en+o de datos de
manera simultanea
35.8.2 ,asC!etLSname9
Aerifica que el cam3o llamado Sname 0alla sido en+iado 3or m/todo M&J al controlador
%o3orta argumento +ariable 3ermitiendo +erificar el en+o de datos de manera
simultanea
35.8.3 ,asCre"uestLSname9
Aerifica que el cam3o llamado Sname 0alla sido en+iado 3or m/todo M&J o P8%J al
controlador %o3orta argumento +ariable 3ermitiendo +erificar el en+io de datos de
manera simultanea
&Bem3lo
1. class UsuarioController extends ApplicationController {
2. public function guardar() {
3. if ($this->has_post('nombre', 'cedula')) {
4. $usuario = new Usuario();
5. $usuario-> nombre = $this->post('nombre');
6. $usuario-> cedula = $this->post('cedula');
7. }
8. }
9. }
&n la linea $ se 3uede a3reciar como se +erifica de manera simultanea que 0allan sido
en+iados mediante el m/todo P8%J los argumentos nombre 5 cedula
Libro de Kumbia: Porque Programar debera ser ms fcil 1!6
35.10 Fel#ers de usuario en 3umbia
4na biblioteca de 0el3ersC 3ermite organi2ar los 0el3ers 3ara ser utili2ados dentro la
a3licaci#nC Kumbia organi2a los 0el3ers de usuario en el directorio Oa##sB,el#ersP 5
estos son cargados en la a3licaci#n mediante la funci#n OuseE0el3erP Por defecto los
0el3ers ubicados en main.#,# son cargados automticamente 5 estn dis3onibles en
toda la a3licaci#n
1. class UsuarioController extends ApplicationController {
2. public function buscador_potencial() {
3. use_helper('buscador');
4. $this->render_text('Helper cargado');
5. }
6. }
&n este eBem3loC Kumbia busca en el directorio Oa33s@0el3ersP el arc0i+o
Obuscador.#,#P 5 lo carga
La funci#n OuseE0el3erP 3ermite cargar m[lti3les 0el3ers en una sola in+ocaci#n a tra+/s
del uso de argumento +ariable
useC,el#erLUbuscadorU, Ucar!adorU, UileCs#litterU9I
Libro de Kumbia: Porque Programar debera ser ms fcil 1!7
35.11 -ormularios no intrusivos
Kumbia dis3one de di+ersos 0el3ers 3ara crear elementos de entrada en los formulariosC
a0ora se 3ueden construir los formularios de manera no intrusi+aC consideremos el 0el3er
OteDtCieldCta!PC el nombre del cam3o se 3uede indicar tal que:
1. <?php echo text_field_tag('form.field') ?>
Menera el siguiente c#digo 0tml
1. <input type=text id=form_field name=form[field]>
&s decir el OP es utili2ado 3ara se3arar el nombre del formulario o secci#n de formularioC
del nombre del cam3o
Al ser en+iado el formulario 3or m/todo P8%JC los cam3os corres3ondientes se 3ueden
acceder en el arra5 global HEP8%JC de la siguiente manera HEP8%JQTformTRQTfieldTRC es decir
son cargados en un arra5 Asimismo se 3ueden acceder fcilmente desde el controlador
con los m/todos 3ostC get 5 requestC de la misma manera como se defini# el nombre en
el 0el3er
1. $this->post('form.field')
Y 3uedes obtener el arra5 de la siguiente manera
1. $this->post('form')
&sto 3uede ser de +erdadera utilidad utili2ndose en conBunto a -ilter
Libro de Kumbia: Porque Programar debera ser ms fcil 1!9
35.12 Autocar!a de Ob&etos
A la 0ora de crear el cam3oC el 0el3er internamente +erificar si se 0a 3asado al
controlador alg[n atributo cu5o nombre corres3onda con el nombre del formulario
indicado en el 0el3er 3ara cam3o de entrada Fte?tEfieldEtagC selectEtagC c0eckEfieldEtagC
etcGC si el atributo en el controlador es un obBetoC el 0el3er cargar el atributo de ese
obBetoC que corres3onda al nombre del cam3o como +alor 3or defecto
&Bem3lo
&n la +ista:
nuevo.phtml
1. <?php echo form_tag('usuario/crear') ?>
2. <p><?php echo text_field_tag('usuario.cedula') ?></p>
3. <p><?php echo text_field_tag('usuario.nombre') ?></p>
4. <p><?php echo submit_tag('Guardar') ?></p>
5. <?php echo end_form_tag() ?>
&n el controlador:
usuarioCcontroller.#,#
1. class UsuarioController extends ApplicationController {
2. public function nuevo() {
3. $this->usuario = object_from_params('cedula: 15234543');
4. }
5.
6. }
A0ora un eBem3lo mas com3leto el cual a3ro+ec0a las caractersticas de FilterC los
Formularios no "ntrusi+os 5 la Autocarga de 8bBetos
&Bem3lo
&n la +ista:
nuevo.#,tml
1. <?php echo form_tag('usuario/crear') ?>
2. <p><?php echo text_field_tag('usuario.cedula') ?></p>
3. <p><?php echo text_field_tag('usuario.nombre') ?></p>
4. <p><?php echo submit_tag('Guardar') ?></p>
5. <?php echo end_form_tag() ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 1$:
&n el controlador:
usuarioCcontroller.#,#
1. class UsuarioController extends ApplicationController {
2. public function nuevo() {
3. $this->nullify('usuario');
4. }
5.
6. public function crear() {
7. if($this->has_post('usuario')) {
8. $usuario = new Usuario($this->post('usuario', 'trim',
'upper'));
9. if ($usuario->save()) {
10. Flash::success('Operacin exitosa');
11. } else {
12. $this->usuario = $usuario;
13. }
14. }
15. $this->render('nuevo');
16. }
17.}
Libro de Kumbia: Porque Programar debera ser ms fcil 1$1
35.13 2a!inador
Para 3aginar Acti+e1ecord dis3one de los m/todo 3aginate 5 3aginateEb5Esql
Jodos los 3aginadores retornan un obBeto std;lassC el cual contiene los siguientes
atributos:
items: un arra5 de items que corres3onde a los elementos de la 3gina
neDt: n[mero de 3gina siguienteC si no e?isteC es false
#rev: n[mero de 3gina 3re+iaC si no e?isteC es false
current: n[mero de 3gina actual
total: total de 3ginas e?istentes
3(.7.1 #a!inateL9
Parmetros con nombre:
#a!e: n[mero de 3gina F3or defecto 1G
#erC#a!e: cantidad de items 3or 3gina F3or defecto 1:G
Ace3ta todos los 3armetros con nombre del m/todo indL9
&Bem3lo:
&n el controlador
usuarioCcontroller.#,#
1. class UsuarioController extends ApplicationController {
2. public function page_femenino($page=1) {
3. if(!is_numeric($page)) {
4. $page = 1;
5. }
6. $this->page = $Usuario->paginate(sexo='F', 'columns: nombres,
apellidos', page: $page, 'per_page: 7');
7. }
8. }
&n la +ista
#a!eCemenino.#,tml
1. <?php foreach($page->items as $item): ?>
2. <?php echo $item->nombres.' '.$item->apellidos ?>
3. <br>
4. <?php endforeach; ?>
5.
6. <?php if($page->prev): ?>
7. <?php echo link_to(usuario/page_femenino/$page->prev, 'Anterior') ?>
8. <?php endif; ?>
9. <?php echo $page->current ?>
10.<?php if($page->next): ?>
11. <?php echo link_to(usuario/page_femenino/$page->next, 'Siguiente') ?
>
12.<?php endif; ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 1$!
35.1( #a!inateCb'Cs"lL9
Parmetros con nombre:
#a!e: n[mero de 3gina F3or defecto 1G
#erC#a!e: cantidad de items 3or 3gina F3or defecto 1:G
&Bem3lo:
&n el controlador
usuarioCcontroller.#,#
1. class UsuarioController extends ApplicationController {
2. public function page_femenino($page=1) {
3. if(!is_numeric($page)) {
4. $page = 1;
5. }
6. $this->page = $Usuario->paginate_by_sql(SELECT nombres,
apellidos FROM usuario WHERE sexo='F', page: $page, 'per_page: 7');
7. }
8. }
&n la +ista
#a!eCemenino.#,tml
1. <?php foreach($page->items as $item): ?>
2. <?php echo $item->nombres.' '.$item->apellidos ?>
3. <br>
4. <?php endforeach; ?>
5.
6. <?php if($page->prev): ?>
7. <?php echo link_to(usuario/page_femenino/$page->prev, 'Anterior') ?>
8. <?php endif; ?>
9. <?php echo $page->current ?>
10.<?php if($page->next): ?>
11. <?php echo link_to(usuario/page_femenino/$page->next, 'Siguiente') ?
>
12.<?php endif; ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 1$$
34 Denc0mark
Denc0mark es un com3onente que nos 3ermite 0acer 3rofiler de un scri3t de nuestras
a3licacionesC de manera que 3odemos contralar los cuellos de botellas que se formen en
la im3lementacion de alguna funcionalidadC esta t/cnica es am3liamente utili2ada 3or los
desarrollos con+encionales mu5 a menudo 3ara medir el tiem3o de eBecucion que 3uede
tardar una 3gina en generarseC util 3ara la o3timi2acion en cuanto a tiem3o de nuestra
a3licaci#n
3(.5 E+todos Qenc,mark
;on estos metodos se 3uede reali2ar tareas antes mencionadas
3(.5.1 startCclockLSname9
"nicia el reloB de eBecucion recibe un nombre esto 3ara e+itar colisiones 5 3oder reali2ar
+arios Denc0mark en la misma eBecucion
1. Benckmark::start_clock('INICIO');
3(.5.2 timeCeDecutionLSname9
8btiene el tiem3o de eBecucion de un Denc0mark recibe el nombre Hname con que
inicialmente se creo el benc0mark
1. Benchmark::time_execution('INICIO');
3(.5.3 memor'Cusa!eLSname9
8btiene la meoria usuada 3or un scri3tC recibe el nombre Hname con que inicialmente se
creo el benc0mark
1. Benchmark::memori_usage('INICIO');
Libro de Kumbia: Porque Programar debera ser ms fcil 1$(
36 A;L
La Lista de ;ontrol de Acceso o A;Ls Fdel ingl/sC Access ;ontrol ListG es un conce3to de
seguridad informtica usado 3ara fomentar la se3araci#n de 3ri+ilegios &s una forma de
determinar los 3ermisos de acceso a3ro3iados a un determinado obBetoC de3endiendo de
ciertos as3ectos del 3roceso que 0ace el 3edido
;ada lista A;L contiene una lista de 1olesC unos resources 5 unas acciones de accesoC
+eamos esto mediate un eBem3lo sencillo
1. <?php
2.
3. class PacienteController extends ApplicationController {
4. public $acl;
5.
6. public function __construct(){
7. $this->acl = new Acl();
8.
9. //agregando el rol
10. $this->acl->add_role(new AclRole('invitados'));
11. $this->acl->add_role(new AclRole('admin'));
12.
13. //agregando los recurso
14. $f = array("agregar", "modificar");
15. $this->acl->add_resource(new AclResource('paciente'), $f);
16.
17. }
18. /******************************************************************/
19.
20. public function agregar(){
21.
22. //permitiendo el acceso
23. $this->acl->allow('admin', 'paciente', 'agregar');
24.
25.
26. //verificando si admin tiene acceso a la accion agregar
27. if($this->acl->is_allowed('admin', 'paciente', 'agregar')){
28. print ("Permitido");
29.
30. }else{
31. print ("No Permitido");
32. }
33.
34. }
35.}
&?3liquemos un 3oco antes de 3rofundi2ar sobre una im3lementaci#n mas robusta en
base a los A;LC en 3rimer lugar creamos una instancia de la class AclC 3osterior
agregamos rolesC los roles en teora son los 3erfiles de usuario o como bien lo 0allamos
definido en nuestra arquitectura de seguridad en este caso Oin+itadosP5 OadminP C luego
se a3recia que agregamos los resourcesFrecursosG que 3ara efecto del eBem3lo son las
acciones de nuestro controller OagregarP 5 OmodificarP las cuales las definimos en un
arra5 tambi/n se 3uede 3asar directamente 3or el constructor de la class a nuestro
Libro de Kumbia: Porque Programar debera ser ms fcil 1$'
resource le damos un nombre O3acienteP
!"#A$ ,os -oles por defecto no tienen permiso so%re los recurso definidos
Por ultimo se comien2a a eBecutar la acci#n OagregarP de nuestro controlador O3acienteP
tal como llamamos a nuestro 1esourceC de acuerdo a la nota de arriba le damos 3ermisos
a nuestro 1ole sobre el recurso 5 3ara finali2ar +alidamos si el 1ole PadminR tiene
3ermisos sobre la acci#n Pa!re!arR de nuestro 1ecurso P#acienteR.
36.1 E+todos de la Alase AA<
36.1.1 addCroleLAcl/ole SroleOb&ect, SaccessCin,eritsGUU9
Agrega un 1ol a la Lista A;L
1. $acl->add_role(new Acl_Role('administrador'), 'consultor');
36.1.2 addCin,eritLSrole, SroleCtoCin,erit9
Hace que un rol 0erede los accesos de otro 1ol
36.1.3 isCroleLSroleCname9
Aerifica si un rol e?iste en la lista o no
36.1.( isCresourceLSresourceCname9
Aerifica si un resource e?iste en la lista o no
36.1.5 addCresourceLAcl/esource Sresource9
Agrega un 1esource a la Lista A;L
1. //Agregar un resource a la lista:
2. $acl->add_resource(new AclResource('clientes'), 'consulta');
3. //Agregar Varios resources a la lista:
4. $acl->add_resource(new AclResource('clientes'), 'consulta', 'buscar',
'insertar');
36.1.4 addCresourceCaccessLSresource, SaccessClist9
Agrega accesos a un 1esource
36.1.6 dro#CresourceCaccessLSresource, SaccessClist9
&limina un acceso del resorce
36.1.7 allo%LSrole, Sresource, Saccess9
Agrega un acceso de la lista de resources a un rol
Libro de Kumbia: Porque Programar debera ser ms fcil 1$-
1. //Acceso para invitados a consultar en clientes
2. $acl->allow('invitados', 'clientes', 'consulta');
3.
4. //Acceso para invitados a consultar e insertar en clientes
5. $acl->allow('invitados', 'clientes', array('consulta', 'insertar'));
6.
7. //Acceso para cualquiera a visualizar en productos
8. $acl->allow('*', 'productos', 'visualiza');
9.
10.//Acceso para cualquiera a visualizar en cualquier resource
11.$acl->allow('*', '*', 'visualiza');
36.1.8 den'LSrole, Sresource, Saccess9
>enegar un acceso de la lista de resources a un rol
1. //Denega acceso para invitados a consultar en clientes
2. $acl->deny('invitados', 'clientes', 'consulta');
3.
4. //Denega acceso para invitados a consultar e insertar en clientes
5. $acl->deny('invitados', 'clientes', array('consulta', 'insertar'));
6.
7. //Denega acceso para cualquiera a visualizar en productos
8. $acl->deny('*', 'productos', 'visualiza');
9.
10.//Denega acceso para cualquiera a visualizar en cualquier resource
11.$acl->deny('*', '*', 'visualiza');
36.1.10 isCallo%edLSrole, Sresource, SaccessClist9
>e+uel+e true si un HroleC tiene acceso en un resource
1. //Andres tiene acceso a insertar en el resource productos
2. $acl->is_allowed('andres', 'productos', 'insertar');
3.
4. //Invitado tiene acceso a editar en cualquier resource?
5. $acl->is_allowed('invitado', '*', 'editar');
6. //Invitado tiene acceso a editar en cualquier resource?
7. $acl->is_allowed('invitado', '*', 'editar');
Libro de Kumbia: Porque Programar debera ser ms fcil 1$6
37 Aut0
Kumbia en su +ersi#n :' incor3ora un nue+o com3onente 3ara el maneBo de
autenticaci#n de usuario 3or di+ersos m/todosC esto nace con la idea de seguir
facilitando el desarrollo de a3licaciones en base al framework
1. public function autenticar ()
2. {
3. $pwd = md5($this->request('clave'));
4. $auth = new Auth("model", "class: Usuario", "nombre: {$this-
>request('login')}", "clave: $pwd");
5. if ($auth->authenticate()) {
6. Flash::success(Correcto);
7. } else {
8. Flash::error(Fall);
9. }
10.}
&l uso de este com3onente es sencilloC 3ero mu5 3otente 0agamos una descri3ci#n sobre
lo que 0ace el c#digo que se muestra arribaC imaginemos que tenemos un formulario
donde se le solicita el OloginP 5 O3asswordP al usuario 5 este formulario se en+a a una
acci#n de nuestro controlador que la llamamos OautenticarP 3ara ilustrar el eBem3loC en
3rinci3io debemos tener en cuenta que tenemos guardada el O3asswordP del usuario en
un Has0 <>'C 5a 0emos mencionado que el m/todo .this/0request1.inde23C e?trae un
inde? del arreglo HE1&.4&%JC en la l?nea 3 obtenemos el +alor del in#ut cla+e que
definimos en el formulario 5 le a3licamos el algoritmo <>' este +alor ser almacenado
en el atributo S#%d.
&n la l?nea ( creamos una instancia de la clase Aut0 5 3or el constructor de la clase le
3asamos los 3armetros necesario 3ara entienda cual sera el m/todo de autenticaci#n
PmodelRC en segundo lugar le decimos cual es el nombre del modelo P1suarioRC de
aqu en adelante los dems 3armetros que le 3asemos sern tomados como
condicionesC en este eBem3lo le 3asamos el nombre de usuario 5 la cla+eC 5a con esto la
clase Aut,C reali2a el 3roceso de conectarse a la D> 5 +erificar las condiciones que le
3asamos 3or el constructor
Pero con esto no basta a0ora debemos +erificar si ese usuario e?isteC es 3or esto que en
la l?nea 5 +erificamos si se reali2o correctamente el 3roceso de autenticaci#n de usuario
el m/todo aut,enticateL9 retorna una arra5 con el resultado de la autenticaci#nC es decir
con los datos del usuario
Ya con este 3roceso tenemos nuestro usuario Flos datosG dis3onible en toda la eBecuci#n
de la a3licaci#n
La forma de acceder a esos datos es 3or medio del m/todo
Aut,::!etCactiveCidentit'L9I obser+emos que es un m/todo esttico 3or lo que no es
necesario crear una instancia de la claseC este m/todo nos retorna una arra5 con los
datos del usuario com3uesto 3or los cam3os que est/n en la tabla 4suario
;omo eBercicio obser+en lo que se almacena
1. print_r (Auth::get_active_identity());
Libro de Kumbia: Porque Programar debera ser ms fcil 1$7
38 Programaci#n <odular
Kumbia en la versi(n 0.4 incor3ora una nue+a forma de 3rogramar que 0ace nuestras
a3licaciones mas 3rofesionales 5 mantenibles en el tiem3o 5 es que a0ora 3uedes
agru3ar controladores 3or m#dulos con la intenci#n de minimi2ar los ni+eles de entro3a
que se 3uede generar al momento de desarrollar nuestros sistemas
&ntendamos esta nue+a forma de 3rogramar en el kumbia mediante un eBem3lo sencilloC
3or lo general todos los sistemas cuentan con un modulo de usuario, donde este se
debe encargar de reali2ar las tareas relacionado con el usuario 3odemos nombrar
algunas de estas tareas:
Autenticar 4suarios
1egistrar 4suarios
Listar 4suarios
&liminar 4suarios
&tc
&stas 3ueden ser las funcionalidades mas basicas que 3ueden e?istirC de la forma como
se +enia 0aciendo 3or lo general se creaba un controller
a##sBdeaultBcontrollersBusuariosCcontroller.#,# 5 este se encargaba de toda esta
gesti#nC esta 3ractica 0ace que tengamos controladores mu5 largo 5 dificil de entender
A0ora si 0acemos un cambio tendremos nuestro codigo muc0as mas ordenado 5 es lo
que 3ro3one Kumbia con la 2ro!ramacin EodularC donde en +e2 de re3osar todas las
acciones en el mismo controlador tener un directorio
a##sBdeaultBcontrollersB1suariosB 5 en este se encuentren controladores 3ara cada
accion de la que encarga el modulo 4suariosC 3or eBem3lo se 3odria tener un controlador
autenticarCcontroller.#,# 5 este tal como su nombre indica se encargaria de
autenticar un usuario otra +entaBa que se nos 3resenta en este momento es que con solo
+er el nombre del arc0i+o 3odemos identicar de que se encarga
Las 41LTs se siguen com3ortando de la misma maneraC solo que tendremos un ni+el
adicional
0tt3:@@local0ost@:'@4suarios@autenticar@inde?
local,ost >ominio
0.5 *ombre de la a3licaci#n
1suarios <odulo
autenticar controller
indeD acci#n
&n el directorio vie%s debemos agru3ar nuestras +istas de la misma formaC siguiendo el
eBem3lo deberiamos tener una estructura como la siguiente
vie%sB1suariosBautenticarB
vie%s >irectorio de las Aistas
1suarios *ombre del <odulo
autenticar Jodas lsa Aistas del controller autenticar
Libro de Kumbia: Porque Programar debera ser ms fcil 1$9
(0 1so de -las,
Flas0 es una clase mu5 [til en Kumbia que 3ermite 0acer la salida de mensaBes de errorC
ad+ertenciaC informati+os 5 /?ito de forma estndar
(0.1 -las,::error
Permite en+iar un mensaBe de error al usuario Por defecto es un mensaBe de letras color
roBo 5 fondo color rosa 3ero estos 3ueden ser alterados en la clase css en 3ublic
@css@st5lecss llamada errorEmessage
1. Flash::error(Ha ocurrido un error);
(0.2 -las,::success
Permite en+iar un mensaBe de /?ito al usuario Por defecto es un mensaBe de letras color
+erdes 5 fondo color +erde 3astel 3ero estos 3ueden ser alterados en la clase css en
3ublic @css@st5lecss llamada successEmessage
1. Flash::success(Se realiz el proceso correctamente);
(0.3 -las,::notice
Permite en+iar un mensaBe de informaci#n al usuario Por defecto es un mensaBe de letras
color a2ules 5 fondo color a2ul 3astel] 3ero estos 3ueden ser alterados en la clase css en
3ublic @css@st5lecss llamada noticeEmessage
1. Flash::notice(No hay resultados en la bsqueda);
(0.( -las,::%arnin!
Permite en+iar un mensaBe de ad+ertencia al usuario Por defecto es un mensaBe de letras
color a2ules 5 fondo color a2ul 3astel 3ero estos 3ueden ser alterados en la clase css en
3ublic @css@st5lecss llamada warningEmessage
1. Flash::warning(Advertencia: No ha iniciado sesin en el sistema);
Libro de Kumbia: Porque Programar debera ser ms fcil 1(:
(1 "ntegrar F<A;G en Kumbia
%iguiendo la arquitectura <A;C +amos a +er un eBem3lo de como integrar controladoresC
0acer consultas 5 en+iar salida desde un controlador a las +istas
(1.1 E&em#lo ;encillo
Jenemos el controlador controllers+inventario*controller.php:
1. <?php
2.
3. class InventarioController extends ApplicationController {
4.
5. function consultar(){
6.
7. $this->productos = $this->Productos->find();
8.
9. }//fin del metodo
10.
11. }//fin de la clase
12.
13.?>
Jenemos el modelo models+productos.php:
1. <?php
2.
3. class Productos extends ActiveRecord {
4.
5.
6. }
7.
8. ?>
Jenemos la +ista views+inventario+consultar.phtml:
1. <?php
2.
3. foreach($productos as $producto){
4. #rint iH3roducto=Inombrei]
5. }
6.
7. ?>
Haremos una 3etici#n a inventario+consultar 3or eBem3lo
0tt3:@@local0ost@demo@in+entario@consultarC el 3roceso es el siguiente:
1. Kumbia busca el controlador in+entario en el directorio controllers con el nombre
in+entario 5 su terminaci#n Ccontroller.#,# como est con+enido
2. Kumbia a0ora busca un m/todo en esta clase que corres3onda a la acci#n consultar
5 la eBecuta
Libro de Kumbia: Porque Programar debera ser ms fcil 1(1
3. &n este m/todo reali2amos una b[squeda de los 3roductos actuales mediante el
modelo Acti+e1ecord 5roductosC todos los modelos de la a3licaci#n 3ueden ser
accedidos desde la a3licaci#n mediante .this/0C como en el eBem3lo
(. &l resultado de la b[squeda es almacenado en St,is@T#roductos
5. Al finali2ar la eBecuci#n del m/todo consultarC el framework locali2a la +ista
vie%sBinventarioBconsultar.#,tml 5 si e?iste la +isuali2a
4. Las 3ro3iedades del controlador en este caso St,is@T#roductos se con+ierten en
+ariables del mismo nombre en la +istaC las cuales uso 3ara mostrar los 3roductos en
3antallaF+ariable de instanciaG
Libro de Kumbia: Porque Programar debera ser ms fcil 1(!
(2 4so de Paquetes F*ames3acesG
PHP' no so3orta el uso de 3aquetesC lo cual es una gran des+entaBa 5a que no 3odemos
a3o5arnos en estos 3ara agru3ar clases buscando cierto ti3o de inde3endencia 3ara
administrarlas a ni+el l#gico
Kumbia 3ermite emular el conce3to de 3aquetes Fa ni+el fsicoG mu5 conocido en Ua+a e
integrarlo a nuestras a3licaciones
Los 3aquetes son gru3os relacionados de clases e interfaces 5 3ro3orcionan un
mecanismo con+eniente 3ara maneBar un gran Buego de clases e interfaces 5 e+itar los
conflictos de nombres
Los 3aquetes 3ermiten 0acer una organi2aci#n de clases mediante directorios
&n el siguiente eBem3lo tenemos una serie de arc0i+os con clases 5 que contienen cierta
funcionalidad en la cual no +amos a 3rofundi2ar 5 llamaremos clases de usuario
&ste directorio est ubicado en la ra2 del framework 5 contiene subdirectorios con clases
que deben integrarse a nuestra a3licaci#n
Kumbia 3ro3orciona un m/todo 3ara incluir los arc0i+os en forma de 3aquetes de esta
forma:
1. kumbia::import('app.lib.*');
As incluiramos todos los arc0i+os 303 que estn en app+li% La funci#n tambi/n 3uede
0acer una im3ortaci#n recursi+a Por eBem3lo:
1. kumbia::import('app.com.*');
"m3ortara el contenido de com 5 sus sub=directorios
1. kumbia::import('app.com.os.*');
5 as solo los de a##BcomBosB
Libro de Kumbia: Porque Programar debera ser ms fcil 1($
(3 4sando AUAV
(3.1 5ntroduccin
AUAV Fabre+iatura de As5nc0ronous Ua+a%cri3t and V<LG es una t/cnica que e?tiende el
modelo tradicional Web 5 3ermite reali2ar 3eticiones en %egundo 3lano a un sitio Web sin
recargar el documento actual
*os 3ermite 0acer todo ti3o de cosas como las que 3uedes +er en M<ailC Moogle <a3s o
Moogle %uggest Podramos llegar a decir que AUAV acerca un 3oco las a3licaciones Web a
a3licaciones de escritorio
*ormalmente el modelo tradicional funciona de la siguiente manera:
&l usuario origina una 3etici#nC 3uede ser en+iando informaci#n desde un
formulario o solicitando alg[n documentoC
&l ser+idor Web atiende la 3etici#n busca el documento relacionado 5 de+uel+e
com3letamente una 3agina nue+a al usuario
;omo se 3uede +er el ser+idor Web 5 el e?3lorador de "nternet se encuentran en un
3roceso continuo de 3arar@andar] esto e?ige al usuario estar siem3re es3erando a que el
ser+idor atienda su 3etici#n 5 luego +ol+er a trabaBar 5 as sucesi+amente
Dueno 3uesC AUAV 3ermite solucionar esto 5 adems ofrecernos funcionalidad e?tra que
3odemos a3ro+ec0ar de muc0as formas Podemos 0acer 3eticiones en segundo 3lano Fel
usuario no se da cuenta que 0a5 una 3etici#n en 3rocesoC t/cnicamente )no,GC de esta
forma 3odemos solicitar informaci#n al ser+idor 5 reem3la2ar 3artes actuales del
documento sin que 0a5a esas molestas es3eras en todo momento
&l ser+idor Web 3uede de+ol+er c#digo HJ<LC Ua+a%cri3tC V<L 5 3odemos utili2arlo 3ara
todo ti3o de cosasC desde cambiar la a3arienciaC contenido 5 com3ortamiento del
documento actual en un abrir 5 cerrar de oBos
;on AUAV tambi/n obtenemos algo de rendimiento e?tra 5a que estamos solicitando al
ser+idor s#lo la 3arte que necesitamos 5 no todo el documento cada +e2
(3.2 YE<Ftt#/e"uest
AUAV utili2a una caracterstica im3lementada en el "nternet &?3lorer 5 que r3idamente
lleg# a otros e?3loradores basados en Mecko como el Firefo? 5 otros Fcomo el 83era 5 el
%afariG &sta caracterstica es un obBeto Ua+a%cri3t llamado V<LHtt31equest que 3ermite
reali2ar 3eticiones a un ser+idor Web desde el e?3lorador 5 mani3ular la res3uesta del
ser+idor des3u/s de /stas *#tese que este obBeto tambi/n so3orta otros ti3os de
res3uestas a3arte de V<L
Las 3eticiones de AUAV son 3rinci3almente asincr#nicas es decir que no bloquean los
e+entos en el e?3lorador 0asta que esta termine Flo contrario de las sincr#nicasG &sto es
una gran +entaBa 5a que 3odemos reali2ar m[lti3les 3eticiones sin que una interfiera con
la otra 5 mani3ulndolas de acuerdo a e+entos 5 estados de cone?i#n Aunque se
escuc0a un 3oco com3leBo en realidad es ms fcil de lo que 3arece adicional a esto
Libro de Kumbia: Porque Programar debera ser ms fcil 1((
aumenta la fle?ibilidad de nuestras a3licaciones
Anteriormente 3ara reali2ar este ti3o de cosas se usaba muc0os obBetos "F1A<& 3ero la
calidadC lim3ie2a 5 3oder de AUAV frente a "F1A<& es indiscutible
(3.3 )Aomo usar A_AY en 3umbia.
Kumbia 3osee so3orte 3ara funciones AUAV con el framework Protot53e 5 tambi/n sin /l
1ecordemos que 3rotot53e F0tt3:@@3rotot53econionetG est incluida 3or defecto al igual
que las funciones drag=and=dro3 Farrastrar 5 soltarGC effects FefectosG 5 controls
FcontrolesG de %cri3taculous
&l so3orte 3ara estas librerasC est 3or defecto en la lnea que dice: <?
umbia_use_e!!ects"# ?$ en vie%sBindeD.#,tml esta funci#n inclu5e los documentos
Ba+ascri3ts necesarios 3ara usarlas
(3.( linkCtoCremote
Permite 0acer un llamado sencillo mediante AUAV que solicita un fragmento HJ<L 5 lo
actuali2a en un contenedor Fdi+C s3anC tdC etcG del documento actual
1. <?php echo link_to_remote("Cargar algo con AJAX", "update: midiv", "action:
saludo/hola") ?>
2.
3. <div id="midiv">Este texto ser actualizado</div>
La funci#n link*to*remote generalmente toma $ 3armetros:
1. &l Je?to del enlace
2. &l id del obBeto HJ<L que se +a a actuali2ar en este caso midi+
3. La acci#n de la cual se obtendrn la informaci#n 3ara actuali2ar
;uando el usuario 0ace clic sobre el +inculo la acci#n 0ola en el controlador saludo ser
in+ocada en segundo 3lano 5 cualquier informaci#n obtenida ser reem3la2ada en el di+
&l controlador VcontrollersBsaludoW tiene una acci#n llamada 0ola:
1. <?php
2. class SaludoController extends ApplicationController {
3. function hola(){
4. #Indica que el resultado sera solo una parte de la vista actual
5. $this->set_response('view');
6. }//fin del metodo
7. }//fin de la clase
8. ?>
La im3lementaci#n +aca del m/todo indica que no 0a5 l#gica 3ara esta acci#n sin
embargo Kumbia carga automticamente la +ista con el nombre 0ola30tml en
views+saludo+ que contiene lo siguiente:
1. <h2>Esto es Kumbia con AJAX</h2><?php echo time() ?>
Al 3robarlo el te?to VEsto es 3umbia con A_AYW 5 el timestam# actual a3arecern
como 3or arte de magia en el di+ indicado
Libro de Kumbia: Porque Programar debera ser ms fcil 1('
Antes:
Y des3u/s:
Libro de Kumbia: Porque Programar debera ser ms fcil 1(-
(3.5 ormCremoteCta!
&sta funci#n es mu5 [til 5a que con+ierte un formulario tradicional en un formulario AUAV
%u funcionamiento 3ermite en+iar los +alores de los com3onentes del formulario 5
en+iarlos usando el V<LHtt31equest Los datos son recibidos normalmente en las
acciones de los controladores como si 0ubiesen sido en+iados de la forma tradicional &n
el siguiente eBem3lo crearemos un formulario AUAV que nos 3reguntar nuestro nombre 5
des3u/s remotamente una acci#n en un controlador nos en+iar un emoti+o saludo
*uestra +ista de eBem3lo debe lucir as:
1. <?php echo form_remote_tag(ejemplo/hola, update: midiv) ?>
2. Tu Nombre?: <?php echo text_field_tag(nombre) ?>
3. <?php echo submit_tag("Envio") ?>
4. <?php echo end_form_tag() ?>
5. <div id=midiv>Este texto ser actualizado</div>
.ue se +e as:
A0ora +amos a modificar la +ista del eBem3lo 3asado 3ara que reciba nuestro nombre 5
nos salude As que views+ejemplo+hola.phtml se +e a0ora de esta manera:
1. <h2>Hola <?php echo $_REQUEST[nombre] ?>!</h2>
>e esta forma cuando demos clic en en+o se +isuali2ar esto:
Libro de Kumbia: Porque Programar debera ser ms fcil 1(6
(( Ua+a%cri3t 5 Kumbia
&ste lenguaBe no era mu5 querido 3or los 3rogramadores antes de que naciera AUAV 3ues
era a +eces utili2ado 3ara crear molestos efectos o 3ara abrir +entanas intrusi+as 5 cosas
3or el estilo ;on AUAV el uso de Ua+ascri3t se increment# sustancialmente Kumbia 3osee
una serie funciones 3ara trabaBar con AUAV que son inde3endientes de las definidas en
3rotot53e 5 que igualmente 3oseen una alta funcionalidad 3ara 0acer todo ti3o de cosas
((.1 El Ob&eto A_AY
&l obBeto AUAV enca3sula toda la funcionalidad 3ara utili2ar el obBeto YE<Ftt#/e"uest
de forma ms fcil e intuiti+a *o +amos a enfocarnos en c#mo funciona este obBetoC esto
deB/moslo de tarea :G
((.2 AUAV+iew1equest
&s la 3rinci3al funci#n detrs de las funciones link*to*remote 5 form*remote*tag 3ues
es la encargada de 0acer una 3etici#n a un controlador 5 +isuali2arla en un contenedor
Aeamos su sinta?is:
1. <script type=text/javascript>
2. new AJAX.viewRequest(
3. {
4. action: saludo/hola,
5. container: midiv
6. }
7. )
8. </script>
La funci#n recibe un 0as0 con estos dos 3armetros mnimos que son la acci#n de la cual
+a a traer la informaci#n 3ara mostrar 5 container donde la +a a mostrar &sta funci#n al
igual que otras que +amos a +er ms adelante 3osee unos callbacks que son acciones
que se eBecutan a medida que se 3roduce el 3roceso AUAV 4na a3licaci#n 3rctica de los
callbacks es la de mostrar indicadores de 3rogreso cuando una acci#n toma un 3oco ms
de tiem3o de lo que la 3aciencia de un usuario 3uede aguantar
1. <script type=text/javascript>
2. new AJAX.viewRequest(
3. {
4. action: saludo/hola,
5. container: midiv,
6. callbacks: {
7. before: $(spinner).show(),
8. success: $(spinner).hide(),
9. complete: new Effect.BlindDown(midiv)
10. }
11. }
12. )
13.</script>
14.
15.<div id=midiv style=display:none></div>
16.<?php echo img_tag(spinner.gif, id: spinner, style: display:none); ?>
Libro de Kumbia: Porque Programar debera ser ms fcil 1(7
Analicemos un 3oco que 0ace esto Hemos agregado al 0as0 otro 0as0 llamado callbacks
que tiene los nombres de unos e+entos que se +an eBecutando 3or todo el 3roceso de la
acci#n AUAV
La 3rimera que +emos se llama beforeC esta es eBecutada antes de em3e2ar la o3eraci#n
AUAV 3uede ser tanto un string con Ba+ascri3t con un 0andle a una funci#n aBa?
Fentendamos 0andle como el nombre la funci#n sin comillasG &n el string +emos el P.
16spinner73.show138C en este c#digo 3odemos +er que se esta +isuali2ando el obBeto
s3inner %i no tiene e?3eriencia con la librera 3rotot53e le recomiendo ec0e un +ista2o a
0tt3:@@3rotot53eBsorgC la forma en que esta escrito nos 3ermite 0acer una referencia a la
imagen s3inner Fque es un indicador de 3rogresoG 5 mostrarla 5a que se encuentra
in+isible 3ara el usuario &scribirla de esa forma en +e2 de escribir:
document.getElementById(spinner).style.display=;
es la magia que tiene la librera 3rotot53e &l segundo e+ento es success que se eBecuta
al terminar la eBecuci#n de la o3eraci#n AUAV el ultimo es com3lete que se eBecuta al
com3letar la carga del resultado de+uelto 3or la acci#n Kumbia
Jambi/n 3odemos +er que el e+ento com3lete tiene algo nue+o: %!!ect.&lindDo'n esto
nos indica que al com3letar la carga se +a a reali2ar un efecto +isual de 3ersiana 3ara
mostrar el contenido de una forma ms llamati+a 3ara el usuario &n un ca3tulo
3osterior +amos a detallar ms los efectos +isuales
((.3 A_AY.Dml/e"uest
;on AUAV tambi/n 3odemos mani3ular res3uestas V<L del ser+idor &n ocasiones es [til
cuando necesitamos tratar informaci#n formateada 3or eBem3lo una +alidaci#n o retornar
el nombre de un cliente consultando 3or su c/dula Aeamos como funciona:
1. <script type=text/javascript>
2. new AJAX.xmlRequest(
3. {
4. action: consultas/cliente,
5. asynchronous: false,
6. parameters: id=+$(documento).value,
7. callbacks: {
8. complete: function(xml){
9. row = xml. getElementsByTagName(row)
10. alert(row[0].getAttribute(nombre))
11. }
12. }
13. )
14.</script>
*o nos asustemos con este c#digo Aeamos 3aso 3or 3aso que 0ace &l 3armetro action
cum3le la misma tarea que en el eBem3lo 3asadoC indicar de que acci#n 5 controlador se
tomar la salida ?ml 3ara des3u/s mani3ularla 5 obtener los datos deseados &l siguiente
es 3aremeters cum3le la funci#n de en+iar datos adicionales a la acci#n en la o3eraci#n
Libro de Kumbia: Porque Programar debera ser ms fcil 1(9
AUAV Los callbacks son los mismos de AUAV+iew1equest con la diferencia que un
3armetro es3ecial es en+iado al callback com3lete &ste 3ermite mediante las funciones
>8< mani3ular el rbol V<L 5 obtener los datos requeridos &n nuestro caso estamos
consultado los tags que se llamen growh 5 mostrando con un alert el +alor de su atributo
gnombreh
4n 3armetro interesante es as5nc0ronous: Fel mismo de AFas5nc0ronousG UFa+ascri3tG
AFndG VFmlGG que 3or defecto tiene un +alor de true ;uando una cone?i#n con
V<LHtt31equest no es asincr#nica sino todo lo contrario es decir sincr#nica toma un
com3ortamiento similar a la tradicional] o seaC que mientras no se com3lete la eBecuci#n
de la o3eraci#n AUAV el usuario no 3odr 0acer nadaC 5a que los e+entos son congelados
3or 3arte del e?3lorador <u5 [til cuando estamos 0aciendo o3eraciones criticas o que
de3enden de otras 3osteriores
>el lado del ser+idor tenemos que 3reocu3arnos 3or de+ol+er al cliente un documento
V<L +lido con la informaci#n a mostrar en este Kumbia 3ro+ee la clase
sim3leV<L1es3onse que 3ermite de forma r3ida crear una salida V<L 3ara la funci#n
AUAV?ml1equest Aqu +emos como creamos un tag que internamente se llama row con
un atributo cedula con el +alor de la c/dula corres3ondiente Por [ltimoC el m/todo
out1es3onse de+uel+e la salida al cliente %i no queremos usar sim3leV<L1es3onse
3odemos nosotros mismos 0acer una salida ?ml +lidaC 3ara mani3ularla 3osteriormente
en el e?3lorador cliente
1. <?php
2. class ConsultasController extends ApplicationController {
3. function cliente(){
4. $this->set_response('xml');
5. $response = new simpleXMLResponse();
6. $response&'add:ode)arra$)CcedulaC ,' LL22MH?H**!
7. $response->outResponse();
8. }
9. }
10. ?>
((.( A_AY.eDecute
La idea de esta funci#n es 3recisamente la de eBecutar una acci#n en un controlador 3ero
sin es3erar ning[n ti3o de res3uesta &s meBor cuando no im3orta lo que de+uel+a la
acci#n 5a utili2a menos recursos que AUAV+iew1equest o AUAV?ml1equest Posee los
mismos callbacks que las funciones antes mencionadas
1. <script type=text/javascript>
2. new AJAX.execute(
3. {
4. action: admin/logout,
5. onComplete: function(){
6. alert(Se ejecut la accin AJAX);
7. }
8. }
9. )
10.</script>
Libro de Kumbia: Porque Programar debera ser ms fcil 1':
((.5 A_AY."uer'
&sta es una de las funciones ms [tiles que tiene Kumbia en cuanto a AUAV %u
funcionamiento es mu5 sencilloC +eamos un eBem3lo:
1. <script type=text/javascript>
2. alert(AJAX.query(saludo/hola))
3. </script>
1. <?php
2. class SaludoController extends ApplicationController {
3. function hola(){
4. return Hola Amigos!;
5. }
6. }
7. ?>
).ue ms 3uedo e?3licar, %encillamente [til 5 3rctico
((.4 A&aD./e"uest ' A&aD.1#dater
&n Kumbia tambi/n 3uede utili2ar las funciones AUAV que 3ro3orciona la librera
Protot53e &l m/todo 3rinci3al es ABa?1equest que 0ace un 3a3el ms general 3ero ms
fle?ible 3ara trabaBar transacciones AUAV &ncuentre ms informaci#n en: "ntroducci#n a
ABa? de Protot53e
&n el siguiente eBem3lo mostramos una com3araci#n entre AUAV+iew1equest C
ABa?1equest 5 ABa?43dater
1. new ANaB.2e+uest)@/tienda/compras/datos@, G
method:@Aet@,
on3uccess: .unction)transport*G
$)@midiv@*.inner#506 , transport.response5eBt
F
F
*!
2. new AOAP.view2e+uest)
3. G
4. action: "compras/datos%,
5. container: "midiv%,
6. F
Libro de Kumbia: Porque Programar debera ser ms fcil 1'1
7. *
8.
9. new ANaB.9pdater)@midiv@, @/tienda/compras/datos@, G method: @Aet@ F*!
Los tres c#digos 0acen la misma tarea 0acer una 3etici#n 5 actuali2ar el obBeto midi+
>e3endiendo de la fle?ibilidad que necesitemos usaremos alguna de ellas
((.1 A&aD.2eriodical1#dater
;uando necesitamos que un obBeto sea actuali2ado frecuentemente de forma automtica
3odemos usar este m/todo que cum3le con esa funci#n
new ANaB.1eriodical9pdater)@products@, @/some(url@,
G
method: @Aet@,
insertion: ;nsertion.5op,
.re+uenc$: L,
deca$: 2
F*!
Frecuencia es el n[mero de segundos que 3asa entre cada 3etici#nC deca5 es el n[mero
de segundos de es3era que tiene antes de 0acer una nue+a 3etici#n cuando la anterior
no 0a tenido /?ito o se 0a demorado
Libro de Kumbia: Porque Programar debera ser ms fcil 1'!
(5 %ession
La clase %ession 3ro3orciona un acceso orientado a obBetos a datos de sesi#n Los datos
de sesi#n son usualmente utili2ados 3ara mantener +alores a tra+/s de toda la eBecuci#n
de una sesi#n de a3licaci#n &l caso ms com[n es mantener alguna +ariable 3ara indicar
si un usuario est logeado en el sistema o 3or eBem3lo mantener la direcci#n de la cual
+iene un usuario antes de solicitarle autenticaci#n 5 3oderlo redireccionar des3u/s a ella
de nue+o
Kumbia seriali2a automticamente los datos de sesi#n &sto significa que 3uedes guardar
con seguridad obBetos 5 en algunos casos +alores de recurso FresourceG como cone?iones
a bases de datos
(5.1 </todos de la clase %ession
&sta clase 3ro3orciona m/todos estticos 3ara el acceso@asignaci#n de +alores de sesi#n
(5.1.1 ;ession::setCdataLSname, Svalor9
Asigna un +alor de sesi#n
1. Session::set_data('nombre_cliente', 'Guillermo Blanco');
(5.1.2 ;ession::!etCdataLSname, Svalor9
>e+uel+e un +alor de sesi#n
1. Session::get_data('nombre_cliente');
(5.1.3 ;ession::unsetCdataLSname9
&limina +alores de sesi#n:
1. Session::unset_data('nombre_cliente');
(5.1.( ;ession::issetCdataLSname9
&limina +alores de sesi#n:
1. Session::isset_data('nombre_cliente');
A 3artir de la +ersi#n :(-1;( tambi/n se 3uede usar:
(5.1.5 ;ession::setLSname, Svalor9
Asigna un +alor de sesi#n
1. Session::set('nombre_cliente', 'Guillermo Blanco');
(5.1.4 ;ession::!etLSname, Svalor9
>e+uel+e un +alor de sesi#n
1. Session::get('nombre_cliente');
Libro de Kumbia: Porque Programar debera ser ms fcil 1'$
(4 Loggers
Los Loggers 3ermiten crear logs 3ara almacenar informaci#n que 3ueda ser utili2ada
3ara registrar transaccionesC re+isar mo+imientosC 0acer un debugC etc
Para crear un log 3uede utili2ar la clase Logger de Kumbia:
1. //Empieza un log en logs/logDDMMY.txt
2. $myLog = new Logger();
3.
4. $myLog->log("Loggear esto como un debug", Logger::DEBUG);
5.
6. //Esto se guarda al log inmediatamente
7. $myLog->log("Loggear esto como un error", Logger::ERROR);
8.
9. //Inicia una transaccin
10.$myLog->begin();
11.
12.//Esto queda pendiente hasta que se llame a commit para guardar
13.// rollback para cancelar
14.$myLog->log("Esto es un log en la fila", Logger::WARNING)
15.$myLog->log("Esto es un otro log en la fila", Logger::WARNING)*
16.
17.//Se guarda al log
18.$myLog->commit();
19.
20.//Cierra el Log
21.$myLog->close();
Libro de Kumbia: Porque Programar debera ser ms fcil 1'(
(4.1 E+todos de la Alase <o!!er
(4.1.1 constructor
&l constructor de la clase Logger recibe el nombre del arc0i+o donde se guardar el logC
este log se almacena en el directorio logs+C si no se es3ecifica el nombre del arc0i+o
creado es logYYYY<<>>t?t
(4.1.2 lo!LSmessa!e, St'#e9
Muarda un mensaBe en en log (type 3uede ser <o!!er::KEQ1]C <o!!er::E//O/C
<o!!er::ZA/N5N]C <o!!er::A1;TOE
1. $myLog->log("Esto es un log en la fila", Logger::WARNING);
2. $myLog->log("Esto es un otro log en la fila", Logger::WARNING);
(4.1.3 be!inL9
Logger 3ermite crear transacciones 3ara e+itar la escritura a disco cada +e2 que se llame
a log sino 0asta que se llame al m/todo commit o se cancele mediante rollback
1. //Inicia una transaccin
2. $myLog->begin();
(4.1.( commitL9
Logger 3ermite crear transacciones 3ara e+itar la escritura a disco cada +e2 que se llame
a log sino 0asta que se llame al m/todo commit # se cancele mediante rollback ;ommit
ace3ta la transacci#n 5 los +alores se escriben al arc0i+o
1. $myLog->begin();
2. $myLog->log("Esto es un log en la fila", Logger::WARNING);
3. $myLog->log("Esto es un otro log en la fila", Logger::WARNING);
4. $myLog->commit();
(4.1.5 rollbackL9
Logger 3ermite crear transacciones 3ara e+itar la escritura a disco cada +e2 que se llame
a log sino 0asta que se llame al m/todo commit o se cancele mediante rollback 1ollback
cancela la transacci#n 5 los +alores no se escriben al arc0i+o
1. $myLog->begin();
2. $myLog->log("Esto es un log en la fila", Logger::WARNING);
3. $myLog->log("Esto es un otro log en la fila", Logger::WARNING);
4. $myLog->rollback();
(4.1.4 close
;ierra el log 3ara que no se 3ueda escribir ms en /l
1. $myLog->close();
Libro de Kumbia: Porque Programar debera ser ms fcil 1''
(6 Protot53e en Kumbia
&stas son algunas funciones que a5udan al 3rogramador usando Ua+a%cri3t 5 la librera
Protot53e en la +ersi#n e?tendida de Kumbia:
Ha5 muc0as +entaBas 3ara usar las funciones Protot53e:
Protot53e enca3sula muc0os detalles incom3atibles de los e?3loradores Web 5 los
0ace com3atibles con esto no debemos 3reocu3arnos 3or 3robar que funcione
bien tanto en Firefo? 5 en "nternet &?3lorer 5 0asta en %afari
*uestro c#digo Ua+a%cri3t se 0ace ms legible 5 3otente
Protot53e elimina muc0os de los memor5 leaks Fconflictos de memoriaG mu5
comunes cuando usamos ABa? # &+entos Fe+ent 0andlersG en "nternet &?3lorer
Algunos 3untos a tener en cuenta:
;omo sabemosC la l#gica adicional enca3sulada en 3rotot53e consume
ligeramente un 3oco ms de anc0o de banda Para esto e?isten +ersiones
com3rimidas de 3rotot53e cuando esto sea un 3roblema
&?isten mas des+entaBas,
Libro de Kumbia: Porque Programar debera ser ms fcil 1'-
(7 &fectos Aisuales 5 %cri3tAculo4s
Los efectos +isuales estn incluidos 3or defecto en la +ista 3rinci3al )ie's*index.phtml
con la sentencia kum%ia$$javascript*use*drag13. Kumbia utili2a los efectos +isuales de
la librera Ua+a%cri3t scri3taculousC dis3onible en 0tt3:@@scri3taculous
Los efectos +isuales nos 3ermiten dar una e?3eriencia de usuario agradable e inno+adora
que en ciertos casos 3uede a5udar a 0acer nuestra a3licaci#n ms llamati+a
;on esta librera se 3odemos a3ro+ec0ar el uso a+an2ado de efectos grficosC arrastrar 5
soltarC te?tos con autocom3letadores en aBa? 5 muc0as cosas usadas en las A3licaciones
Web !: de 0o5
Las animaciones usadas estn basadas en tiem3o 5 no en ca3asC de esta forma
a3ro+ec0amos de una meBor forma los recursos del e?3lorador 5 adems nos
aseguramos que funcione tanto en Firefo?C "nternet &?3lorerC %afari 5 otros como
Konqueror
A continuaci#n se encuentra la traducci#n com3leta e integraci#n de Kumbia con esta
librera:
(7.1 Eectos Q:sicos
&?isten seis efectos bsicos que son la base 3ara los dems efectos ms a+an2ados
&stos son &ffect83acit5C &ffect%caleC &ffect<or30C &ffect<o+eC &ffectHig0lig0t 5
&ffectParallel
La sinta?is bsica 3ara iniciar un efecto es:
new Effect.EffectName(elemento, parametros-requeridos, [optiones] );
4n elemento 3uede ser un string que contiene el id de un obBeto 0tml o el obBeto mismo
en si
Los 3armetros requeridos de3enden del efecto que est/ siendo llamado 5 la ma5ora de
+eces no son necesarios
&l 3armetro o3ciones es usado 3ara es3ecificar 3ersonali2aci#n adicional al efecto Ha5
o3ciones generales 5 es3ecificas
AdicionalmenteC los 3armetros o3cionales 3ueden tener e+entos FcallbacksGC as se
3uede es3ecificar que cierta funci#n o 3rocedimiento Ba+ascri3t sea eBecutado mientras el
efecto est corriendo Los callbacks son llamados con el obBeto del efecto que es en+iado
A continuaci#n un eBem3lo de esto:
1. .unction callbacE)obN*G
2. .or)var i in obN.e..ects*G
3. alert)obN.e..ects[i[@element@.id*!
4. F
5. F
Libro de Kumbia: Porque Programar debera ser ms fcil 1'6
Aallback Kescri#cin
before%tart &s llamado en todos los efectos 3rinci3ales antes de que em3iece la
animaci#n &s el e+ento que se llama al iniciar el efecto
before43date &s llamado antes de cada iteraci#n del ciclo de animaci#n
after43date &s llamado des3u/s de cada iteraci#n del ciclo de animaci#n
afterFinis0 &s llamado des3u/s de la ultima iteraci#n del ciclo de animaci#n &s
es el e+ento que se llama al finali2ar el efecto
4n eBem3lo del uso de callbacks:
1. .unction mi7all<acE8nQinish)obN*G
2. alert)C/l id del obNeto al +ue le aplicamos el e.ecto es :C R
obN.element.id*!
3. F
4. .unction mi7all<acE8n3tart)obN*G
5. alert)C/l elemento al cual aplicamos este e.ecto es :C R obN.element*!
6. F
7. new /..ect.#iAhliAht)m$8bNect,
8. G startcolor:@#......@,
9. endcolor:@#....cc@,
10. duration: H.S,
11. a.terQinish: mi7all<acE8nQinish,
12. be.ore3tart: mi7all<acE8n3tart
13. F
14.*!
(7.1.1 Eect.O#acit'
&ste efecto cambia la o3acidad de un elemento Ftrans3arenciaG
%inta?is
new /..ect.8pacit$)@id(del(elemento@, [opciones*!
new /..ect.8pacit$)elemento, [opciones*!
&Bem3lo sim3le:
new /..ect.8pacit$)@id(del(elemento@, Gduration:H.S, .rom:L.H, to:H.TF*!
Har trans3arente un elemento desde el 1::Z 0asta el 6:Z de trans3arencia en un
tiem3o de medio segundo
Kdiv id,@=one7ode@'/sto es la =ona de cUdiAoK/div'
Ka hre.,@#@ on7licE,@new /..ect.8pacit$)C=one7odeC, Gduration:L.H, .rom:L.H,
to:H.HF*!return .alse!@'8cultar Vona de 7odiAoK/a'
Ka hre.,@#@ on7licE,@new /..ect.8pacit$)C=one7odeC, Gduration:L.H, .rom:H.H,
to:L.HF*!return .alse!@'0ostrar Vona de 7odiAoK/a'
Libro de Kumbia: Porque Programar debera ser ms fcil 1'7
(7.1.2 Eect.;cale
&ste efecto cambia las dimensiones Fanc0o 5 altoG 5 las unidades base de em Ftama\o de
letraG de un obBeto Permite 3roducir un smoot0C escalamiento relati+o automtico de
todo el contenido del elemento escalado
%inta?is
new /..ect.3cale)@id(del(elemento@, porcentaNe, [opciones*!
new /..ect.3cale)elemento, porcentaNe, [opciones*!
(7.1.3 Eect.Eor#,
&ste efecto cambia las 3ro3iedades ;%% de un elemento
%inta?is
%encillo :
1. $)@eNemplo(morph@*.morph)@bacEAround:#H?H! color:#...@*!
;om3leBo :
1. new /..ect.0orph)@error(messaAe@,G
2. st$le:@bacEAround:#.HH! color:#...!@R
3. @border: 2HpB solid #.??! .ont&si=e:2em@,
4. duration: H.?
5. F*!
&stilos como lla+es de un arra5 F0asG deben tener nombres Ba+ascri3t en +e2 de nombres
css: %t5le as a 0as0 FeB gbackground;olorh en +e2 de gbackground=colorhG:
1. new /..ect.0orph)@eBample@,G
2. st$le:G
3. width:@2HHpB@
4. F
5. F*!
Jambi/n 3uede usar HFgelementEidhGmor30Fkwidt0:h!::3?hlGC que es ms corto
>etalles
&ffect<or30 toma los estilos originales dados 3or reglas ;%% o atributos inline en
consideraci#n cuando se calculan las transformaciones JrabaBa con todas las
3ro3iedades ;%% de tama\o 5 colorC inclu5endo margenesC 3addingsC bordesC o3acidad t
colores de te?to 5 fondo
(7.1.( Eect.Eove
&ste efecto 3ermite mo+er un elemento &ffect<o+eD5 es un nombre antiguo
E&em#lo
&sto mo+er un obBeto a la esquina de la +entana F?S:C 5S:G
1. new Effect.Move (obj,{ x: 0, y: 0, mode: 'absolute'});
Libro de Kumbia: Porque Programar debera ser ms fcil 1'9
&sto mo+er un obBeto $:3? arriba 5 !:3? a la derec0a Fel modo 3redeterminado es
grelati+ehG:
1. new /..ect.0ove )obN,G B: 2H, $: &>H, mode: @relative@F*!
(7.2 Eectos Aombinados
Joda la combinaci#n de efectos est basada en cinco de los efectos bsicos ;ore &ffectsC
5 3ueden ser usados como base de eBem3lo si se desean crear efectos 3ersonali2ados
&ffectA33ear C &ffectFade
&ffectPuff
&ffect>ro38ut
&ffect%0ake
&ffectHig0lig0t
&ffect%witc08ff
&ffectDlind>own C &ffectDlind43
&ffect%lide>own C &ffect%lide43
&ffectPulsate
&ffect%quis0
&ffectFold
&ffectMrow
&ffect%0rink
AdicionalmenteC e?iste la utilidad &ffecttoggle que 3ermite cambiar el estado de
+isibilidad a un obBeto con animaciones A33ear@FadeC %lide o Dlind
&ffecttoggle usa cualquiera de los siguientes 3ares:
2arametro To!!le A#arece con Kesa#arece con
A33ear &ffectA33ear &ffectFade
%lide &ffect%lide>own &ffect%lide43
Dlind &ffectDlind>own &ffectDlind43
(7.2.1 Eect.A##ear
Hace que un elemento a3are2ca %i el elemento tenia un dis3la5:none] en los estilos del
elemento entonces A33ear mostrar automticamente el obBeto &sto significa que debe
ser agregado como un atributo del obBeto 5 no como una regla ;%% en la cabecera del
documento # un arc0i+o e?terno
Funciona bien en todos los elementos 0tml e?ce3to tablas 5 filas de tablas &n internet
e?3lorer solo en elementos que tengan ca3as como di+sC 3C s3anC etc
&Bem3los
new /..ect.Appear)@id(o.(element@*!
new /..ect.Appear)@id(o.(element@, G duration: >.H F*!
Libro de Kumbia: Porque Programar debera ser ms fcil 1-:
(7.2.2 Eect.-ade
Hace que un elemento se disuel+a 5 quede oculto al final del efecto colocando la
3ro3iedad ;%% dis3la5 en none &s lo contrario a &ffectA33ear
&Bem3los
new /..ect.Qade)@id(o.(element@*!
new /..ect.Qade)@id(o.(element@,
G transition: /..ect.5ransitions.wobble F*
Funciona bien en todos los elementos 0tml e?ce3to tablas 5 filas de tablas &n internet
e?3lorerC s#lo en elementos que tengan ca3as como di+sC 3C s3anC etc
(7.2.3 Eect.2u
>a la ilusi#n de que un obBeto se est esfumando estilo una nube de 0umo
&Bem3los
new Effect.Puff('id_of_element');
// con opciones
new Effect.Puff('id_of_element', {duration:3});
(7.2.( Eect.Kro#Out
Hace que un elemento se oculte 5 se disuel+a al mismo tiem3o
&Bem3los
1. new Effect.DropOut('id_of_element');
JrabaBa bien con elementos ti3o bloqueFdi+sC 3C s3anC etcG 3ero no con tablas
(7.2.5 Eect.;,ake
<ue+e el elemento re3etidamente de i2quierda a derec0a 0aciendo un efecto de
+ibraci#n
&Bem3los
1. new /..ect.3haEe)@id(o.(element@*!
((.1.1 Eect.;%itc,O
Hace un efecto de un switc0 estilo tele+isi#n
&Bem3los
1. new /..ect.3witch8..)@id(o.(element@*!
JrabaBa bien con elementos ti3o bloqueFdi+sC 3C s3anC etcG 3ero no con tablas
((.1.2 Eect.QlindKo%n
%imula que se agranda un elemento estilo 3ersiana &s lo contrario de Dlind43
&Bem3los
new /..ect.<lind4own)@id(o.(element@*!
Libro de Kumbia: Porque Programar debera ser ms fcil 1-1
new /..ect.<lind9p)@id(o.(element@*!
// #acer la transiciUn mWs larAa
new /..ect.<lind4own)@id(o.(element@, Gduration:>F*!
JrabaBa bien con elementos ti3o bloqueFdi+sC 3C s3anC etcG 3ero no con tablas
((.1.3 Eect.Qlind1#
%imula que se acorta un elemento estilo 3ersiana &s lo contrario de Dlind>own
&Bem3los
new /..ect.<lind4own)@id(o.(element@*!
new /..ect.<lind9p)@id(o.(element@*!
// #acer la transiciUn mWs larAa
new /..ect.<lind9p)@id(o.(element@, Gduration:>F*!
JrabaBa bien con elementos ti3o bloqueFdi+sC 3C s3anC etcG 3ero no con tablas
((.1.( Eect.;lideKo%n
Hace un efecto de desli2amiento 0acia abaBo 3ara mostrar un obBeto &s lo contrario de
%lide43
&Bem3los
new Effect.SlideDown('id_of_element');
new Effect.SlideUp('id_of_element');
// Hacer la transicin ms larga
new Effect.SlideDown('id_of_element', {duration:3});
&s necesario incluir un di+ adicional 3ara que el efecto funcione correctamente:
<div id="x"><div>contents</div></div>
(7.3 E:s 5normacin
%cri3tAculo4s tiene muc0as cosas ms interesantes como %lidersC Listas 8rdenablesC
Autocom3letadores AUAV 5 &dici#n "n=Place Para encontrar la referencia com3leta de
estas funciones +isite:
>rag And >ro3 : >raggablesC >ro33ablesC %ortablesC %lider
Autocom3letion : Autocom3letado de cam3os ti3o AUAV
"n Place &diting : ;am3os de Je?to editables AUAV
Libro de Kumbia: Porque Programar debera ser ms fcil 1-!
(8 Aentanas Protot53eWindows
Las Aentanas Protot53e son +entanas no intrusi+as que reem3la2an los 3o3=u3s 5 nos
3ermiten interactuar con los usuarios de las a3licaciones de forma ms estructuraC
estili2ada 5 segura
&stas +entanas fueron creadas 3or %ebastien Mru0ier F0tt3:@@?ilinuscomC 0tt3:@@itsebcomG
basndose en scri3taculous 5 3rotot53e framework Finalmente fueron ada3tadas al
core de Kumbia 3ara que 3uedan ser utili2adas sin menor com3licaciones
(8.1 1so de las Oentanas 2rotot'#e
1. &n el siguiente eBem3lo abrimos una +entana con las o3ciones mnimasC
1. <?php echo javascript_include_tag("scriptaculous/window") ?>
2. <?php echo stylesheet_link_tag("../themes/default") ?>
3. <?php echo stylesheet_link_tag("../themes/mac_os_x") ?>
4.
5. <div style='display:none' id='contenido'><h1>Hola a Todos</h1></div>
6.
7. <script type'text/javascript'>
8. new Event.observe(window, "load", function(){
9. var unaVentana = new Window({
10. className: "mac_os_x",
11. width: 300,
12. height: 200,
13. title: "Bienvenido a Kumbia"
14. })
15. unaVentana.setHTMLContent($('contenido').innerHTML)
16. unaVentana.showCenter()
17. })
18.</script>
Libro de Kumbia: Porque Programar debera ser ms fcil 1-$
&n el eBem3loC cargamos las libreras necesarias 3ara utili2ar las +entanas Protot53e
inclu5endo el arc0i+o windowBs como indica en el eBem3lo en la linea 1 5 los css de los
temas que +an a ser usadosC en este caso el tema de <ac 8% V
Lo siguiente es cargar la +entana a 3artir de un e+entoC 3ara esto a3ro+ec0amos la
utilidad &+entobser+e de 3rotot53e 3ara agregar una funci#n Ba+ascri3t que se eBecute al
momento de cargar FloadG la +entana del e?3lorador La referencia a window en la lnea 7
se refiere a el obBeto >8< window
&n la funci#n del e+ento creamos una instancia de la clase Window que recibe como
3armetros algunas o3ciones bsicas 3ara crear la +entana 4samos la +ariable
una+entana 3ara referirnos a la +entana creada con la utilidad Protot53e Window
&n la lnea 1' indicamos que el contenido de la +entana es el contenido del di+ con idC
contenido
Por ultimo +isuali2amos en 3antalla la +entana usando el m/todo sho',enter"# 3ara
ubicar la +entana en el centro de la 3antalla
;omo 3odemos +er las +entanas 3ueden ser minimi2adas usando el bot#n amarilloC
ma?imi2adas usando el bot#n +erde 5 cerradas usando el bot#n roBo 4suarios
familiari2ados con Windows o Linu? 3referirn usar otros temas como Aista
Libro de Kumbia: Porque Programar debera ser ms fcil 1-(
(8.2 /eerencia de Alases ' Ob&etos de 2rotot'#e
Zindo%s
(8.3 Alase Zindo%
E+todo Kescri#cin
initiali2eFidC o3tionsG ;ontructor de la clase Window que es usado cuando se crea una nue+a
+entana new WindowFidC o3tionsG
Ar!umentos:
id KOE id de la +entana que debe ser [nico
o#tions Has0 de o3ciones 3ara la +entanaC las cla+es 3ara este 0as0
se listan a continuaci#n
83ciones 3ara el argumento o3tions:
Alave
2redeterminad
o
Kescri#cin
id Menerado window >8< id >ebe ser [nico
class*ame dialog PrefiBo del nombre de la clase
title *inguno Jitulo de la +entana
url *inguno 41L del contenido de la +entana Fse usa un iframeG
3arent bod5
*odo 3adre de la +entanaC debe cambiar cuando
queramos que la +entana 3ertene2ca a un determinado
obBeto del >8<
to3 a bottom to3::
Posici#n su3erior FJo3G o inferior FDottomG de la +entana
en 3i?eles
rig0t a left left:: Posici#n derec0a o i2quierda de la +entana en 3i?eles
widt0 @ 0eig0t 1:: Anc0o 5 alto de la +entana
ma?Widt0 @
ma?Heig0t
none <?imo anc0o 5 alto de la +entana
minWidt0 @ minHeig0t 1::@!: <nimo anc0o 5 alto de la +entana
resi2able true
&s3ecifica si se le 3uede cambiar el tama\o a la
+entana o no
closable true &s3ecifica si la +entana 3uede ser cerrada o no
minimi2able true &s3ecifica si la +entana 3uede ser minimi2ada o no
ma?imi2able true &s3ecifica si la +entana 3uede ser ma?imi2ada o no
draggable true &s3ecifica si la +entana 3uede ser mo+ida o no
s0ow&ffect
&ffectA33ear #
&lements0ow
&fecto scri3taculous con el cual se muestra la +entana
&l +alor 3or defecto de3ende si scri3taculous est
dis3onible
0ide&ffect &ffectFade # &fecto scri3taculous con el cual se oculta la +entana &l
Libro de Kumbia: Porque Programar debera ser ms fcil 1-'
&lement0ide
+alor 3or defecto de3ende si scri3taculous esta
dis3onible
s0ow&ffect83tions none
83ciones utili2adas en el efecto 3ara mostrar la
+entana 1e+isar secci#n de &fectos Aisuales
0ide&ffect83tions none
83ciones utili2adas en el efecto 3ara ocultar la +entana
1e+isar secci#n de &fectos Aisuales
effect83tions none
83ciones 3ara mostrar 5 ocultar 1e+isar secci#n de
&fectos Aisuales
onload none Funci#n 8nload de la +entana 3rinci3alC di+ o iframe
o3acit5 1 83acidad de la +entana
recenterAuto true
1ecentrar la +entana cuando el tama\o de la +entana
3rinci3al 0a cambiado
gridV 1
<o+imiento 5 ABuste de tama\o de la +entana usara una
grilla de este tama\o en V
gridY 1
<o+imiento 5 ABuste de tama\o de la +entana usara una
grilla de este tama\o en Y
wired>rag false
<o+imiento@ABuste de Jama\o utili2ara una ca3a wiredC
3ersonali2able en `classNameTC%iredCrame del
arc0i+o css de la clase
destro58n;lose false
>estruir obBeto de la +entana cuando el obBeto se oculteC
3or defecto la +entana es tan solo ocultada
all callbacks none
Jodos los callbacks Fe+entosG usados en la +entana:
onDestroy onStart-esi.e onStartMo)e on-esi.e onMo)e
on%nd-esi.e on%ndMo)e on/ocus on&lur on&e!oreSho'
onSho' on0ide onMinimi.e onMaximi.e on,lose
E+todo Kescri#cin
destro5FG >estructor del obBeto de la +entana
get"dFG >e+uel+e el Window id de la +entana
set>estro58n;loseFG La +entana ser destruida al 0acer clic en el bot#n en cerrar en +e2
de ocultarla
set;lose;allbackFfunctionG &s3ecifica la funci#n que ser llamada al cerrar la +entana %i esta
funci#n de+uel+e true la +entana 3uede ser cerrada
set;ontentFidC autoresi2eC
auto3ositionG
&s3ecifica el obBeto que ser insertado como el contenido de la
+entana *o funciona con 41Ls@"frames
Ar!umentos:
id &lemento a insertar en la +entana
autoresi0e Ldeault alse9 ABusta el tama\o 3ara que concuerde
con su contenido
auto#osition Ldeault alse9 "ndica si la 3osici#n de la +entana es
la del obBeto insertado
setHJ<L;ontentF0tmlG &s3ecifica el contenido usando un c#digo HJ<L como 3armetro
set41LFurlG &s3ecifica el contenido de la +entana usando una 41L &l contenido
ser +isuali2ado dentro de un iframe
Libro de Kumbia: Porque Programar debera ser ms fcil 1--
get41LFG 8btener la 41L del iframe interno de la +entanaC solo si este e?iste
refres0FG Actuali2a el contenido de la +entana
setABa?;ontentFurlC
o3tionsC s0ow;enteredC
s0ow<odalG
&s3ecifica el contenido de la +entana usando una 3etici#n AUAV La
3etici#n debe de+ol+er c#digo HJ<L 1e+isa la documentaci#n de
ABa?1equest 3ara o3ciones detalladas del 3armetro o3tions
;uando la res3uesta sea obtenidaC la +entana es +isuali2ada
get;ontentFG >e+uel+e el contenido de la +entana 5a sea desde el iframe o el di+
interno
set;ookieFnameC e?3iresC
3at0C domainC secureG
&s3ecifica la informaci#n de la cookie que almacena los datos de
tama\o 5 3osici#n de la +entana
setLocationFto3C leftG &s3ecifica la 3osici#n su3erior e i2quierda de la +entana
get%i2eFG 8btiene un 0as0 con los +alores de anc0o 5 alto de la +entana
set%i2eFwidt0C 0eig0tG &s3ecifica el tama\o de anc0o 5 alto de la +entana
u3dateWidt0FG 1ecom3utar el tama\o de la +entana con base en el anc0o de su
contenido
u3dateHeig0tFG 1ecom3utar el tama\o de la +entana con base en el alto de su
contenido
toFrontFG ;oloca a la +entana 3or encima de todas las dems +entanas
abiertas
s0owFmodalG <uestra@Aisuali2a la +entana &l 3armetro boleano modal indica si la
+entana se muestra en modo modal &l modo modal 0ace que la
+entana 3ida siem3re la atenci#n durante el tiem3o que este abierta
"deal 3ara los cuadros de dialogo
s0ow;enterFmodalC to3C
leftG
<uestra la +entana en el centro de la 3gina &l 3armetro boleano
modal indica si la +entana se muestra en modo modal &l modo
modal 0ace que la +entana 3ida siem3re la atenci#n durante el
tiem3o que este abierta "deal 3ara los cuadros de dialogo %i se
indica el 3armetro to3 se centrar solamente 0ori2ontalmente 5
+ice+ersa
minimi2eFG <inimi2a la +entanaC s#lo la barra su3erior es +isuali2ada
ma?imi2eFG <a?imi2a la +entana 0asta el tama\o m?imo de rea +isible de la
+entana
is<inimi2edFG >e+uel+e true si la +entana est minimi2ada
is<a?imi2edFG >e+uel+e true si la +entana est ma?imi2ada
set83acit5Fo3acit5G &s3ecifica la o3acidad de la +entana : es trans3arente 5 1 es o3aca
4n :' es semi=o3aca o semi=trans3arente
setm"nde?F2inde?G &s3ecifica la 3ro3iedad ;%% 2"nde? de la +entana que indica su
3osici#n de atrs 0acia adelante de los obBetos +isuali2ados en la
3antalla 4n +alor alto asegura que la +entana se muestre 3or
encima de todos los dems obBetos de la 3gina
setJitleFtitleG &s3ecifica el ttulo de la +entana
getJitleFG 8btiene el ttulo de la +entana
set%tatusDarFG &s3ecifica el te?to de la barra de estado de la +entana
Libro de Kumbia: Porque Programar debera ser ms fcil 1-6
(8.( E&em#los de 2rotot'#e Zindo%s
(8.(.1 Abriendo una Oentana ;encilla
&ste eBem3lo abre una sencilla +entana con algunos 3armetros como los efectos de
mostrar 5 ocultar Jambi/n usa un wired frame al mo+erse o aBustar su tama\o
1. var win = new Window({
2. className: "dialog",
3. width: 350,
4. height: 400,
5. zIndex: 100,
6. resizable: true,
7. title: "Sample window",
8. showEffect: Effect.BlindDown,
9. hideEffect: Effect.SwitchOff,
10. draggable:true,
11. wiredDrag: true
12.})
13.win.getContent().innerHTML= "<div style='padding:10px'> Este es el
contenido</div>"
14.win.setStatusBar("Status bar info");
15.win.showCenter();
(8.(.2 Abrir una ventana usando una 1/<
&n este eBem3lo abrimos en una +entana el sitio de kumbiaorg *#tese que usa un
iframe interno en la +entana creada
1. var win = new Window({
2. className: "spread",
3. title: "Sitio de Kumbia",
4. top:70,
5. left:100,
6. width:300,
7. height:200,
8. url: "http://www.kumbia.org/",
9. showEffectOptions: {
10. duration:1.5
11. }
12.})
13.win.show();
Libro de Kumbia: Porque Programar debera ser ms fcil 1-7
(8.(.3 Abre una ventana con un contenido eDistente
Abre un contenidoC usando un di+ e?istente &ste di+ tiene un id llamado testEcontent
1. contentWin = new Window({
2. maximizable: false,
3. resizable: false,
4. hideEffect: Element.hide,
5. showEffect: Element.show,
6. minWidth: 10,
7. destroyOnClose: true
8. })
9. contentWin.setContent('test_content', true, true)
10.contentWin.show();
Libro de Kumbia: Porque Programar debera ser ms fcil 1-9
(8.(.( Abriendo una cuadro de dialo!o usando A_AY
1. Dialog.alert({
2. url: "info_panel.html",
3. options: {
4. method: 'get'
5. }
6. }, {
7. className: "alphacube",
8. width: 540,
9. okLabel: "Close"
10.});
(8.(.5 Abrir un cuadro de Kialo!o de Alerta
1 Dialog.alert("Prueba de un alert usando Dialog", {
2 width:300,
3 height:100,
4 okLabel: "cerrar",
5 ok: function(win) {
6 alert("validate alert panel");
7 return true;
8 }
9 });
Libro de Kumbia: Porque Programar debera ser ms fcil 16:
50 Funciones de 1e3ortes
Para la +ersi#n :' se encuentra la +ersi#n 1- de esta librera
50.1 Eanual de /eerencia de -2K-
FP>F F0tt3:@@wwwf3dforg@G es una librera PHP que es incluida en la distribuci#n Kumbia
5 que facilita la creaci#n de re3ortes 5 documentos en formato P>F
50.2 ).u/ es FP>F,
FP>F es una clase escrita en PHP que 3ermite generar documentos P>F directamente
desde PHPC es decirC sin usar la biblioteca P>Flib La +entaBa es queC mientras P>Flib es
de 3ago 3ara usos comercialesC la F de FP>F significa Free Fgratis 5 libreG: 3uede usted
usarla 3ara cualquier 3ro3#sito 5 modificarla a su gusto 3ara satisfacer sus necesidades
FP>F tiene otras +entaBas: funciones de alto ni+el &sta es una lista de sus 3rinci3ales
caractersticas:
&lecci#n de la unidad de medidaC formato de 3gina 5 mrgenes
Mesti#n de cabeceras 5 3ies de 3gina
%alto de 3gina automtico
%alto de lnea 5 Bustificaci#n del te?to automticos
Admisi#n de imgenes FUP&M 5 P*MG
;olores
&nlaces
Admisi#n de fuentes JrueJ53eC J53e1 5 codificaci#n
;om3resi#n de 3gina
FP>F no necesita de ninguna e?tensi#n 3ara PHP Fe?ce3to la biblioteca 2lib si se +a
a acti+ar la o3ci#n de com3resi#nG 5 funciona con PHP( 5 PHP'
La [ltima +ersi#n del manual de FP>F se 3uede encontrar en: 0tt3:@@wwwf3dforg@es@doc@
inde?303
Los re3ortes en P>F son 0o5 en da una e?celente alternati+a a los re3ortes HJ<L
tradicionales
Menerar re3ortes P>F tiene unas +entaBas significati+as:
4n documento P>F enca3sula las fuentes que necesite 3ara que su documento se
+ea tal 5 como lo dise\o
Las margenesC tama\os 5 ti3os de 3a3el son ms fciles de mani3ular 3ara que al
reali2ar la im3resi#n se +ea tal 5 como es3eramos
"deal cuando queremos que los re3ortes generados no sean modificados 3or los
usuarios de las a3licaciones
>es+entaBas de los re3ortes en P>F:
Algunos datos co3iados desde un documento P>F son difciles de mani3ular
&l tama\o de un arc0i+o P>F es ligeramente ms grande que el un re3orte en
HJ<L
&s necesario que el usuario tenga instalado un +isor P>F como AcrobatC M0ostAiew
o ?3df
Libro de Kumbia: Porque Programar debera ser ms fcil 161
51 ;orreo &lectr#nico
Kumbia a3ro+ec0a la librera libre PHP<ailer 3ara 3ro3orcionar un m/todo ms com3leto
de en+o de correos electr#nicos en a3licaciones desarrolladas con el Framework
51.1 ).u/ es PHP<ailer,
PHP<ailer es una clase 303 3ara en+iar emails basada en el com3onente acti+e ser+er
A%P<ail Permite de una forma sencilla tareas com3leBas como 3or eBem3lo:
&n+iar mensaBes de correo con fic0eros adBuntos Fattac0mentsG
en+iar mensaBes de correo en formato HJ<L
;on PHP<ailer se 3ueden en+iar emails +a sendmailC PHP mailFGC o con %<JP Lo ms
recomendable es usando smt3 3or dos ra2ones:
;on 303mailer se 3ueden usar +arios ser+idores %<JP &sto 3ermite re3artir la
carga entre +arias com3utadorasC con lo que se 3odrn en+iar un ma5or n[mero
de mensaBes en un tiem3o menor
Adems los ser+idores %<JP 3ermiten mensaBes con m[lti3les toTs FdestinatariosGC
ccTs FLas direcciones que a3are2can en este cam3o recibirn el mensaBe Jodos los
destinatarios +ern las direcciones que a3arecen en la secci#n ;cGC bccTs FLas
direcciones que a3are2can en el cam3o Dcc recibirn el mensaBe %in embargoC
ninguno de los destinatarios 3odr +er las direcciones que fueron incluidas en la
secci#n DccG 5 1e3l5=tos Fdirecciones de res3uestaG
<as sobre las caractersticas de PHP<ailer
51.2 )Por qu/ usar 303mailer,
&s 3osible en+iar email con la funci#n mailL9 de 303C 3ero dic0a funci#n no 3ermite
algunas de las ms 3o3ulares caractersticas que 3ro3orcionan los clientes de correo
usados actualmente &ntre estas caractersticas se encuentran el en+o de email con
fic0eros adBuntos
PHP<ailer 0ace fcil esta difcil tarea de en+iar correos con estas caractersticas 5 3uedes
incluso utili2ar tu 3ro3io ser+idor smt3 aunque /ste requiera autenticaci#n Fun nombre de
usuario 5 contrase\aGC con lo que se 3odr usar una cuenta gratuita de correo obtenida
3or eBem3lo en 0ot3o3
Libro de Kumbia: Porque Programar debera ser ms fcil 16!
51.3 2F2Eailer en Accin con ]mail
a##sBcontrollersBmailCcontroller.#,#
1. <?php
2. class MailController extends ApplicationController
3. {
4. /**
5. * Muestra el boton enviar
6. *
7. */
8. public function index ()
9. {}
10. /**
11. * Envia el Mail
12. *
13. */
14. public function enviar ()
15. {
16. $mail = new PHPMailer();
17. $mail->IsSMTP();
18. $body = "Hola,<br>This is the HTML BODY<br>";
19. $mail->SMTPAuth = true; // enable SMTP authentication
20. $mail->SMTPSecure = "ssl"; // sets the prefix to the servier
21. $mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server
22. $mail->Port = 465; // set the SMTP port for the GMAIL server
23. $mail->Username = "username@gmail.com"; // GMAIL username
24. $mail->Password = "pass."; // GMAIL password
25. $mail->AddReplyTo("deivinsontejeda@kumbiaphp.com", "First Last");
26. $mail->From = "deivinsontejeda@kumbiaphp.com";
27. $mail->FromName = "Deivinson Tejeda";
28. $mail->Subject = "PHPMailer Prueba con KUMBIA";
29. $mail->Body = "Hi,<br>This is the HTML BODY<br>";
30. $mail->AltBody = "To view the message, please use an HTML compatible
email viewer!";
31. $mail->WordWrap = 50; // set word wrap
32. $mail->MsgHTML($body);
33. $mail->AddAddress("deivinsontejeda@kumbiaphp.com", "Deivinson
Tejeda");
34. $mail->AddAttachment("images/phpmailer.gif"); // attachment
35. $mail->IsHTML(true); // send as HTML
36. if (! $mail->Send()) {
37. echo "Mailer Error: " . $mail->ErrorInfo;
38. } else {
39. echo "Message sent!";
40. }
41. }
42.F
a##sBvie%sBmailBindeD.#,tml
1. <?php echo link_to('mail/enviar', 'Enviar Mail')?>
Libro de Kumbia: Porque Programar debera ser ms fcil 16$
52 "ntegraci#n con %mart5
52.1 ).u/ es %mart5,
%mart5 es un motor de 3lantillas 3ara PHP <s es3ecficamenteC esta 0erramienta
facilita la manera de se3arar la a3licaci#n l#gica 5 el contenido en la 3resentaci#n La
meBor descri3ci#n est en una situaci#n donde la a3licaci#n del 3rogramador 5 la 3lantilla
del dise\ador Buegan diferentes rolesC o en la ma5ora de los casos no la misma 3ersona
Por eBem3lo: >igamos que usted crea una 3agina webC es decirC des3liega el artculo de
un diario &l encabe2ado del artculoC el rotuloC el autor 5 el cuer3o son elementos del
contenidoC /stos no contienen informaci#n de c#mo quieren ser 3resentados fstos son
3asados 3or la a3licaci#n %mart5C donde el dise\ador edita la 3lantillaC 5 usa una
combinaci#n de etiquetas HJ<L 5 etiquetas de 3lantilla 3ara formatear la 3resentaci#n
de estos elementos FHJ<LC tablasC color de fondoC tama\o de letrasC 0oBas de estiloC
etcG 4n da el 3rogramador necesita cambiar la manera de recu3erar el contenido del
artculo Fun cambio en la a3licaci#n l#gicaG &ste cambio no afectar al dise\ador de la
3lantillaC el contenido llegar a la 3lantilla e?actamente igual >e la misma maneraC si el
dise\ador de la 3lantilla quiere redise\arla en su totalidadC estos cambios no afectarn la
a3licaci#n l#gica Por lo tantoC el 3rogramador 3uede 0acer cambios en la a3licaci#n
l#gica sin que sea necesario reestructurar la 3lantilla Y el dise\ador de la 3lantilla 3uede
0acer cambios sin que 0a5a rom3imiento con la a3licaci#n l#gica
A0ora un 3eque\o resumen sobre que no 0ace %mart5 %mart5 no intenta se3arar
com3letamente la l#gica de la 3lantilla *o 0a5 3roblema entre la l#gica 5 su 3lantilla
baBo la condici#n que esta l#gica sea estrictamente 3ara 3resentaci#n 4n conseBo:
mantener la a3licaci#n l#gica fuera de la 3lantillaC 5 la 3resentaci#n fuera de la a3licaci#n
l#gica &sto tiene como finalidad tener un obBeto mas mani3ulable 5 escalable 3ara un
futuro 3r#?imo
4n [nico as3ecto acerca de %mart5 es la com3ilaci#n de la 3lantilla >e esta manera
%mart5 lee la 3lantilla 5 crea los scri3ts de PHP 4na +e2 creadosC son eBecutados sobre
/l Por consiguiente no e?iste ning[n costo 3or anali2ar gramaticalmente cada arc0i+o de
tem3late 3or cada requisici#nC 5 cada tem3late 3uede lle+ar toda la +entaBa del
com3ilador de cac0e de PHP tal como mend Accelerator F0tt3:@@www2endcom@G o PHP
Accelerator F0tt3:@@www303=acceleratorcoukG
Algunas de las caractersticas de %mart5:
&s e?tremamente r3ido
&s eficiente 5a que 3uede inter3retar el trabaBo mas sucio
*o anali2a gramaticalmente desde arriba el tem3lateC solo com3ila una +e2
&l esta atento 3ara solo recom3ilar los arc0i+os de 3lantilla que fueron cambiados
4sted 3uede crear funciones 0abituales 5 modificadores de +ariables
customi2adosC de modo que el lenguaBe de la 3latilla es altamente e?tensible
%inta?is de etiquetas delimitadoras 3ara configuraci#n de la 3lantillaC as lo 3uede
usar klC kkllC C etc
Los construtoress if@elseif@else@endif son 3asados 3or el inter3retador de PHPC as la
sinta?is de la e?3resi#n kif l 3uede ser com3leBa o sim3le de la forma que usted
quiera
Permite un anidamiento ilimitado de sectionsC ifsC etc
Libro de Kumbia: Porque Programar debera ser ms fcil 16(
&s 3osible incrustar directamente codigo PHP en los arc0i+os de 3lantillaC aunque
esto 3uede no ser necesarioFno recomendadoG dado que la 0erramienta se 3uede
aBustar
%o3orte de cac0ing incrustado
Fuentes de Plantilla absoluto
Funciones 0abituales de mani3ulaci#n de cac0e
Arquitectura de Plugin
52.2 ;omo se integra %mart5 a Kumbia
&s mu5 sencillo integrar %mart5 a KumbiaC 3ara la muestra un bot#n:
Jenemos un controlador controllers+saludo*controller.php:
1. <?php
2.
3. class SaludoController extends ApplicationController {
4.
5. function hola(){
6.
7. $this->name = "Andrs Felipe";
8. $this&'.echa , date)CD&m&d #:iC*!
9.
10. }
11.
12. }
13.
14.?>
A0ora tenemos la +ista views+saludo+hola.tplC *#tese que la e?tensi#n 30tml cambi# a
t3l lo que indica que es una 3lantilla de %mart5C a0ora aqu tenemos:
1. {* Smarty *}
2.
3. Hello {$name}, {$fecha}!
;on esto +isuali2amos en 3antalla:
1. Hello Andrs Felipe, 2007-02-27 01:13!
Los +alores de los atributos de los controladores 3asan automticamente como +alores
de %mart5C esto es trans3arente 5 adems ganamos +elocidad 5a que la +ista es
cac0eada 0asta que +uel+e a cambiar
Libro de Kumbia: Porque Programar debera ser ms fcil 16'
53 ;oders
;omo dice el lema del framework OPorque 3rogramar debera ser ms fcilPC los ;oders
son esto 5 muc0o ms Los coders es una iniciati+a 3or 3arte del gru3o de desarrollo
3ara im3lementar una caracterstica en Kumbia que 3ermita que el framework identifique
determinadas situaciones en las cuales 3ueda crear arc0i+osC codificar o configurar
com3onentes de la a3licaci#n sin que el 3rogramador deba 0acerlo
Los coders son una soluci#n inno+adora a un 3roblema general de los frameworks de
e?igir al desarrollador reali2ar O?P # O5P 3asos que son ob+ios u obligatorios 3ara 3oder
obtener un resultado ms inmediato %i sumsemos todos estos 3asos 3odramos darnos
cuenta c#mo em3e2amos a 3erder tiem3o 5 deBamos de ser tan 3roducti+os
&sta metodologa re3resenta una ma5or interacci#n entre el desarrollador 5 su
framework con la meta de lograr de con+ertir a Kumbia en una 0erramienta que trabaBe
en sincrona con los obBeti+os de quien lo use
53.1 Acti+ar los ;oders
Los coders estn des0abilitados 3or seguridad al iniciar un 3ro5ecto usando Kumbia Por
esto deben ser acti+ados en config+config.ini acti+ando la lnea que dice:
1. Interactive = On
&sto debe ser reali2ado en el a3artado QdefaultR
53.2 Probar los coders
Los coders son una caracterstica que se encuentra en >esarrolloC 3or esto se 3resentan
eBem3los 3ara algunos de ellos
Para 3robar los coders es necesario Ocometer erroresP o ol+idarnos de 0acer un
determinado 3aso );#mo es esto, ;uando cometemos un error 3uede ser 3or !
situacionesC ol+idamos reali2ar algo o realmente estamos cometiendo algo indebido Los
coders de Kumbia trabaBan sobre las situaciones en las cuales ol+idamos reali2ar un
determinado 3aso 3ara e+itar 3roducir la e?ce3ci#n o el error que se est generando
53.3 1n e&em#lo #r:ctico
Pasos 3re+ios 3ara +er el eBem3lo:
;rear una base de datos 5 una tabla clientes con algunos cam3os de 3rueba
;onfigurar la cone?i#n a la base de datos en Kumbia en el arc0i+o config@configini
Acti+ar los coders como se e?3lica en el 3rrafo anterior
Abrir el e?3lorador 5 +er la direcci#n 0tt3:@@local0ost@:'1@clientesC donde demo es
el nombre de tu 3ro5ecto en Kumbia
Al abrir el e?3lorador encontramos un mensaBe como este:
Libro de Kumbia: Porque Programar debera ser ms fcil 16-
Al reali2ar la 3etici#n de este controlador Kumbia 0a generado una e?ce3ci#n que se
3uede +isuali2ar en roBo 5 fondo rosa que indica el nombre de la e?ce3ci#n 5 su ti3oC con
esto fcilmente 3odemos +er que 0emos ol+idado o toda+a no 0emos trabaBado en la
codificaci#n de un formulario que trabaBe con la tabla clientes
%in embargo 3ara nuestra fortuna Kumbia 0a identificado que 3uede reali2ar esta tarea
3or nosotros mostrndonos el cuadro de dilogo en la 3arte su3erior con fondo lila
Adicional a esto Kumbia 0a identificado que el nombre del controlador coincide con el
nombre de una tabla en la base de datos 5 nos ofrece la o3ci#n de crear un formulario de
ti3o %tandardForm como o3ci#n 3redeterminada
&scogemos esta o3ci#n 5 damos clic en Ace3tar
Paso siguiente un 80L:
Libro de Kumbia: Porque Programar debera ser ms fcil 166
Kumbia 0a generado un formulario con base en la tabla %tandarForm creando los
arc0i+os controllers@clientesEcontroller303 codificando lo siguiente:
1. <?php
2.
3. class ClientesController extends StandardForm {
4.
5. public $scaffold = true;
6.
7. public function __construct(){
8.
9. }
10.
11. }
12.
13.?>
Libro de Kumbia: Porque Programar debera ser ms fcil 167
5 adicional a estoC 0a creado el modelo corres3ondiente en el directorio models con el
nombre de clientes303:
1. <?php
2.
3. class Clientes extends ActiveRecord {
4.
5. }
6.
7. ?>
Y si en este momento 3iensasC 5o 3odra 0aber 0ec0o esoC Kumbia te res3onde: no te
molestes 5o lo 0ar/ 3or ti
Libro de Kumbia: Porque Programar debera ser ms fcil 169
5( Meneraci#n de Mrficas
&sto es otras de las meBoras que incor3ora Kumbia en su versi(n 0.4 a0ora tenemos un
m#dulo 3ara la generaci#n de Mrficas esto se logra mediante <ibc,art
,i%chart son unas libreras 3ara la generaci#n de re3ortes grficos a modo estadsticosC
la im3lementaci#n de estas libreras es mu5 sencillas
&ntre los grficos que son generados se encuentran:
Mrficos de Darra FHori2ontal 5 AerticalG
Mrficos de Lineales
Jortas
NOTA: #ara "ue las librer?as <ibc,art uncionen correctamente es necesario
tener so#orte ]K en 2F2
!"#A$ 9stas ,i%rer:as no son cargadas por defecto a que la utili)aci(n de las
mismas son para casos puntuales& por este motivo si deseas hacer cualquier
tipo de prue%as con las prue%as es necesario que las mismas sean cargadas
como m(dulo& esto se hace con la finalidad de no utili)ar recursos que no ser'n
utili)ados.
1ara cargar las librerias como un m2dulo debemos editar el archi)o config+%oot.ini y
agregar li%chart.li%chart
;on esto tendremos las libreras dis3onible en cualquier 3unto de eBecuci#n de la
a3licaci#n
Pueden +er algunos eBem3los bien 3rcticos sobre la generaci#n de grficas en el
siguiente enlace
Libro de Kumbia: Porque Programar debera ser ms fcil 17:
52.1 <ibc,art en Accin
Aeamos un eBem3lo donde se 3odr a3reciar una forma sencilla de utili2ar las Libreras
Libc0art en nuestras a3licaciones
Lo 3rimero que 0aremos es crear un controller
a##sBcontrollersBlibc,artCcontroller.#,#
1. <?php
2. class LibchartController extends ApplicationController
3. {
4. /**
5. * Muestra un enlace
6. *
7. */
8. public function index ()
9. {}
10. /**
11. * Genera una grafica
12. */
13. public function grafica ()
14. {
15. $chart = new HorizontalBarChart(600, 170);
16. $dataSet = new XYDataSet();
17. $dataSet->addPoint(new Point("Versin 0.5", 60));
18. $dataSet->addPoint(new Point("Versin 0.4", 40));
19. $dataSet->addPoint(new Point("Versin 0.3", 20));
20. $chart->setDataSet($dataSet);
21. $chart->getPlot()->setGraphPadding(new Padding(5, 30, 20, 140));
22. $chart->setTitle("Crecimiento de Kumbia");
23. //le damos la ruta y el nombre del archivo
24. $chart->render("public/img/demo.png");
25. }
26.F
6a vista views/libchart/index.phtml
1. <?php echo link_to('libchart/grafica', 'Generar Grfica')?>
6a vista views/libchart/grafica.phtml esta vista es la +ue muestra la imaAen +ue
en un principio .ue Aenerada por nuestro controlador con su acciUn grafica.
1. <?php echo img_tag('demo.png') ?>
Algo im3ortante de notar en este eBem3lo cuando generamos la grfica le dimos un
directorio F3ublic@img@demo3ngG 5 luego con el 0el3er im!Cta!L9 obtu+imos la imagenC
este 0el3er 3or defecto el busca la imagen demo.#n! en el directorio #ublicBim! 3or
esa ra2#n es que en ning[n momento se lo coloca una ruta sim3lemente el nombre de la
imagen generada
Libro de Kumbia: Porque Programar debera ser ms fcil 171
55 Pasos de Daile en Kumbia
%i nos encontrramos con un letrero en la calle que diceC TPasos de Daile en KumbiaT
3robablemente 3ensaras que se trata de 3asarla bien 5 de disfrutarC 5 la +erdad estamos
de acuerdo
Los 3asos de baile deben usarse de acuerdo a cada ocasi#n: si la m[sica es mu5 r3ida
debers mo+erte ms r3ido 3ero si es ms 3ausada entonces debers 0acerlo un 3oco
ms lento
<uc0as +eces nos 3reguntamos si usamos el 3aso indicado de3endiendo de la situaci#nC
s#lo con la e?3eriencia sabrs cundo es ms con+eniente
&ste ca3tulo del libro de Kumbia 3retende reunir muc0as de las situaciones ms
comunes que se 3uedan 3resentar en una a3licaci#n 5 detallarla 3ara que lo 3uedas
a3licar en un caso ms concreto
Los TPasos de DaileT 3ro3uestos en esta secci#n cubren al 3[blico que 5a tiene algo de
e?3eriencia usando el framework o que al menos 0an ledo con disci3lina 0asta esta
secci#n del libro &n cualquier caso 3uedes ec0arle una oBeada e ir a otra 3arte del libro
3ara recordar o resol+er dudas
Para 3robar los eBem3los de esta secci#n debes usar la [ltima +ersi#n de Kumbia
3referiblementeC o alguna +ersi#n reciente <uc0as de las caractersticas que se
3resentan son e?3licaciones a nue+as funcionalidades del framework que merecen
alguna e?3licaci#n ms 3recisa
54 ;reando tus 3ro3ios arc0i+os de
configuraci#n ini
Arc0i+os "*" son los estndar de Kumbia 3ara definir 3armetros de configuraci#n
Puedes crear tus 3ro3ios arc0i+os 5 definir +ariables 3ersonali2adas de tu a3licaci#n
4n eBem3lo: config+mi*configuracion.ini
1. [mi_config]
2. variable1 = "Esto es una Variable"
3. variable2 = true
A0ora la cargamos desde cualquier 3arte de nuestra a3licaci#n as:
1. $configuracion = Config::read('mi_configuracion.ini');
2. # Imprime el valor de la variable1
3. print $con.iAuracion&'mi(con.iA&'variableL!
54.1 <eer la coni!uracin Actual
&l obBeti+o de este eBem3lo es leer la configuraci#n actual de forms@config@configini 5
mostrar alguna informaci#n adems de saber en qu/ entorno estamos trabaBando
Libro de Kumbia: Porque Programar debera ser ms fcil 17!
1. <?php
2.
3. class EjemploController extends ApplicationController {
4.
5. function index(){
6.
7. $config = Config::read("config.ini");
8.
9. Flash::notice("Trabajando en el Host de MySQL : {$config-
>database->host}");
10.
11. if($config->mode=="production"){
12. Flash::notice("Trabajando en modo
Producci&oacute;n");
13. }
14. if($config->mode=="development"){
15. Flash::notice("Trabajando en modo Desarrollo");
16. }
17.
18. }
19.
20. }
21.
22.?>
Libro de Kumbia: Porque Programar debera ser ms fcil 17$
54.2 <eer Arc,ivos EDcel con 3umbia
&sta clase 3ermite leer arc0i+os &?cel Fcon &?tension ?lsG
&ncuentra ms informaci#n en:
http://ustrem.or/en/articles/readin-!ls-with-php-en/
http://sourcefore.net/pro"ect/showfiles.php#roup$id%&&'()
1. <?php
2.
3. include_once "lib/excel/main.php";
4.
5. class ExcelController extends ApplicationController{
6.
7. public function index(){
8. //creamos la Clase ,
9. $reader=new Spreadsheet_Excel_Reader();
10. //Encoding
11. //windows-1251 for example:
12. //$reader->setOutputEncoding('CP-1251');
13. $reader->setUTFEncoder('iconv');
14. $reader->setOutputEncoding('UTF-8');
15. $reader->read("public/img/upload/Libro1.xls");
16. $data = $reader->sheets[0];
17. foreach($data['cells'] as $row){
18. foreach($row as $cell){
19. $this->render_text("$cell");
20. }
21. }
22. }
23. }
24.?>
Nota: Para usar encoding debes tener instalada la e?tension icon+C cualquier otra salida
en unicode
<s &Bem3los:
&n esta +ista de K4<D"AC Leo de un fic0ero ?lsC 5 creo una tabla con filas 5 columnasC 5
miro si est re3etido escribo una fila con los +alores de los cam3os:
1. <?php
2.
3. include_once "lib/excel/main.php";
4.
5. $reader = new Spreadsheet_Excel_Reader();
6. $reader->setUTFEncoder("iconv");
7. $reader->setOutputEncoding('UTF-8');
8. $reader->read("public/img/upload/Libro1.xls");
9. $data = $reader->sheets[0];?>
10.<table cellspacing='0' cellpadding='2' border='1' style='border: 1px solid
#CFCFCF'>
11. <tr class="date">
12. <h1><b>Correo</b></h1>
13. </tr>
Libro de Kumbia: Porque Programar debera ser ms fcil 17(
14. <?$db=DbBase::raw_connect()();?>
15. <? for ($i = 1; $i <= $reader->sheets[0]['numRows']; $i++) {
16. $db->query("select * from ecuentas where baja<>'1' and email='{$reader-
>sheets[0]['cells'][$i][2]}'");
17. if ($db->num_rows()>0){
18. echo)CKtr'C*!
19. while ($fila=$db->fetch_array()){
20. $t = 0;
21. while ($t <= 26){
22. echo )CKtd id,@repe@'C*!
23. echo $.ila[$db&'.ield(name)$t*!
24. echo )CK/td'C*!
25. $t++;
26. }
27. }
28. echo)CK/tr'C*!
29. }
30. echo )CKtr'C*!
31. for ($j = 1; $j <= $reader->sheets[0]['numCols']; $j++)
32. {
33. if ($db->num_rows()>0){
34. echo )CKtd id,@repe@'C*!
35. }else{
36. echo )CKtd id,@norepe@'C*!
37. }
38. echo $reader&'sheets[H[@cells@[$i[$N!
39. echo )CK/td'C*!
40. }
41. echo CK/tr'C!
42. }
43. $db->close();
44.?>
45.</table>
Algunas otras cosas:
1. <?php
2. include_once "lib/excel/main.php";
3.
4. $data = new Spreadsheet_Excel_Reader();
5. // Tipo de Salida
6. $data->setOutputEncoding('CP1251');
7. /***
8. * Si deseas cambiar 'iconv' por mb_convert_encoding:
9. * $data->setUTFEncoder('mb');
10. *
11. **/
12. /***
13. * Por defecto los indices de filas y columnas empiezan con 1
14. * Para cambiar el indice inicial usa:
15. * $data->setRowColOffset(0);
16. *
17. **/
18. /***
Libro de Kumbia: Porque Programar debera ser ms fcil 17'
19. * Some function for formatting output.
20. * $data->setDefaultFormat('%.2f');
21. * setDefaultFormat - set format for columns with unknown formatting
22. *
23. * $data->setColumnFormat(4, '%.3f');
24. * setColumnFormat - set format for column (apply only to number fields)
25. *
26. **/
27. $data->read('jxlrwtest.xls');
28. /*
29. $data->sheets[0]['numRows'] - count rows
30. $data->sheets[0]['numCols'] - count columns
31. $data->sheets[0]['cells'][$i][$j] - data from $i-row $j-column
32. $data->sheets[0]['cellsInfo'][$i][$j] - extended info about cell
33. $data->sheets[0]['cellsInfo'][$i][$j]['type'] = "date" | "number" |
"unknown"
34. if 'type' == "unknown" - use 'raw' value, because cell contain value
with format '0.00';
35. $data->sheets[0]['cellsInfo'][$i][$j]['raw'] = value if cell without
format
36. $data->sheets[0]['cellsInfo'][$i][$j]['colspan']
37. $data->sheets[0]['cellsInfo'][$i][$j]['rowspan']
38. */
39. error(reportinA)/(A66 X /(:85;7/*!
40. for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
41. for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
42. echo C\CC.$data&'sheets[H[@cells@[$i[$N.C\C,C!
43. }
44. echo C\nC!
45. }
46. //print_r($data);
47. //print_r($data->formatRecords);
48. ?>
54.3 1tili0ando la consola 5nteractiva i2F2
iPHP es una consola interacti+a de PHP 5 Kumbia escrita 3ara facilitar las tareas de
>ebug de nuestras a3licaciones 5 0acer 3ruebas de benc0mark FeficienciaG 5 de unidad
Fcon 3034nit o cualquier otroG
iPHP es un scri3t que es 3arte del n[cleo de Kumbia PHP Framework 5 que cum3le una
tarea im3ortante al facilitar las tareas de 3ruebasC debug 5 soluci#n de 3roblemas al
crear una a3licaci#n en PHP
iPHP 0ace un acercamiento a otras tecnologas de consola interacti+a que 3oseen
lenguaBes inter3retados como 1ub5 o P5t0on
>ebido a que e+ita el uso inmediato de un ser+idor Web 3ara 3robar funciones
es3ecificas de usuarioC reali2ar 3rocesos de debugC crear controladores 5 modelosC 0acer
o3eraciones en 303 5 en general eBecutar cualquier c#digo que 303 sin crear un arc0i+o o
usar un ser+idor Web
Libro de Kumbia: Porque Programar debera ser ms fcil 17-
54.3.1 createCstandardormLSnombre9
Permite crear una clase %tandardForm automticamente
54.3.2 createCmodelLSnombre9
Permite crear una clase Acti+e1ecord automticamente
54.3.3 createCcontrollerLSnombre9
Permite crear una clase A33lication automticamente
Libro de Kumbia: Porque Programar debera ser ms fcil 176
54.( Oalidar un 1suario
Las +alidaciones de login de usuarios son mu5 comunes en cualquier a3licaci#n Web o
sitio &n el 3resente eBem3lo reali2amos una 3eque\a +alidaci#n donde tomamos los
+alores recibidos de una +ista 5 contra un modelo +erificamos si el 3assword 5 el nombre
de usuario son correctos
&m3e2amos creando un controlador que se llamar login en
controllers@loginEcontroller303 &n controlador se +er as con su acci#n 3or defecto
inde?:
1. <?php
2.
3. class LoginController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. }
10.
11.?>
;reamos el formulario en la +ista corres3ondiente a su acci#n en +iews@login@inde?30tml
as:
1. <? content() ?>
2. <?php echo form_tag("login/validar") ?>
3. <div style='text-align:center; width: 200px'>
4. <div>
5. <div style='float:left; font-weight: bold'>Usuario:</div>
6. <div style='float:left'><?php echo text_field_tag("usuario") ?
></div>
7. </div>
8. <div>
9. <div style='float:left; font-weight: bold'>Password:</div>
10. <div style='float:left'><?php echo
password_field_tag("password") ?></div>
11. </div>
12. <div>
13. <div style='float:left'><?php echo submit_tag("Ingresar") ?
></div>
14. </div>
15.</div>
16.<?php echo end_form_tag() ?>
>e momento nuestro formulario se debe +er as:
Libro de Kumbia: Porque Programar debera ser ms fcil 177
;omo 3odemos +er en la +ista al reali2ar el submit sobre el formulario se eBecutar la
acci#n +alidar en el controlador loginC as que +amos a codificarlo:
1. <?php
2.
3. class LoginController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. function validar(){
10.
11. $nombre_usuario = $this->request("usuario");
12. $password = $this->request("password");
13.
14. if($nombre_usuario=="felipe"&&$password=="mipassword"){
15. Flash::success("Bienvenido Felipe");
16. } else {
17. Flash::error("Usuario/Password incorrectos");
18. $this->route_to("action: index");
19. }
20. }
21.
22. }
23.
24.?>
Libro de Kumbia: Porque Programar debera ser ms fcil 179
Lo que 0acemos es recibir los +alores de usuario 5 3assword que +ienen de la +ista 5
cargarlos en ! +ariables locales A continuaci#n 0emos reali2ado una +alidaci#n sencilla
con +alores de usuario 5 3assword fiBos &n caso de /?ito mostrar un mensaBe de
bien+enidaC en caso contrario lo enrutar de nue+o al formulario de ingreso 5 mostrar
un mensaBe de error en la forma Busto donde est el llamado a contentFG
;omo se 3udo +erC el eBem3lo muestra una +alidaci#n que aunque [til como eBem3lo no
muestra el caso 0abitual que resulta al +alidar contra una tabla de usuarios en la base de
datos
Aamos a crear una tabla en <5%.L llamada usuarios con la siguiente estructura:
^==========^==============^======^=====^=========^================^
a Field a J53e a *ull a Ke5 a >efault a &?tra a
^==========^==============^======^=====^=========^================^
a id a intF11G a *8 a P1" a *4LL a autoEincrement a
a nombre a +arc0arF1::G a *8 a a a a
a login a +arc0arF$!G a *8 a a a a
a 3assword a +arc0arF(:G a *8 a a a a
^==========^==============^======^=====^=========^================^
4na caracterstica es3ecial de esta tabla es el cam3o 3assword que tiene un ti3o de dato
c0arF(:GC esto debido a que en este cam3o se +an a guardar +alores encri3tado con s0a1
que genera una cadena de (: caracteres
Para 3oder interactuar entre la tabla 5 nuestro controlador loginC +amos a necesitar de un
modeloC 3ara esto creamos el arc0i+o models*usuarios.php:
Libro de Kumbia: Porque Programar debera ser ms fcil 19:
1. <?php
2.
3. class Usuarios extends ActiveRecord {
4.
5. }
6.
7. ?>
A0ora 3odemos reali2ar la +alidaci#n seg[n los registros guardados en la base de datos
;ambiamos la acci#n +alidar 3ara que +erifique usando el modelo reci/n creado as:
1. <?php
2.
3. class LoginController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. function validar(){
10.
11. $nombre_usuario = $this->request("usuario");
12. $password = $this->request("password");
13.
14. if($this->Usuarios->find_first("login = '$nombre_usuario'
and password = sha1('$password')")){
15. Flash::success("Bienvenido {$this->Usuarios-
>nombre}");
16. } else {
17. Flash::error("Usuario/Clave incorrectos");
18. return $this->route_to("action: index");
19. }
20.
21. }
22.
23. }
24.
25.?>
54.5 Arear un /e#orte usando -2K-
&n el 3resente eBem3lo se +a a crear un re3orte usando en formato P>F usando FP>F %e
trata de reali2ar un +olcado de la tabla 5 reali2ar la salida a este conocido formato
Primero que todo debemos 0abilitar la e?tensi#n FP>F 3ara que se cargue 3or defecto al
iniciar la a3licaci#n
&sto lo 0acemos en coni!Bboot.ini
QmodulesR
e?tensions S f3dff3df
Libro de Kumbia: Porque Programar debera ser ms fcil 191
A0ora +amos a crear un controlador eBem3lo con una acci#n re3orte en
controllers+pdf*controller.php$
1. <?php
2. class PdfController extends ApplicationController
3. {
4. /**
5. * Muestra el enlace
6. *
7. */
8. public function index ()
9. {}
10. /**
11. * Genera un PDF
12. *
13. */
14. public function reporte ()
15. {
16. $this->set_response('view');
17. $pdf = new FPDF();
18. $pdf->AddPage();
19. $pdf->SetFont('Arial', 'B', 16);
20. $pdf->Cell(40, 10, 'Hecho en Kumbia!');
21. //Nombre del PDF
22. $this->file = "public/temp/".md5(uniqid()).".pdf";
23. $pdf->Output($this->file, null);
24. }
25.}
*ecesitaremos dos +istas la 3rimera Finde?30tmlG nos muestra un link al cual al
momento de 0acerle click eBecutara la acci#n re3orte del controller Pdf 5 otra +ista que
for2ara la descarga del arc0i+o P>F
vie%sB#dBindeD.#,tml
<?php echo link_to('pdf/reporte', 'Generar PDF')?>
vie%sB#dBre#orte.#,tml
1. <?php
2. if ($file != null) {
3. echo "<script type='text/javascript'> " . "window.open('" . KUMBIA_PATH
. "$file', false); </script>";
4. Flash::success("<h4><font color='navy'>Reporte
Generado...</font></h4>");
5. }
6. content();
7. Y'
Libro de Kumbia: Porque Programar debera ser ms fcil 19!
54.4 Aombos Actuali0ables con A_AY
Los combos actuali2ables son una caracterstica mu5 no+edosa de las a3licaciones Web
actuales &l eBem3lo ms claro de esto lo encontramos algunas +eces en los formularios
de registro cuando escogemos nuestro 3as 5 los de3artamentos o 3ro+incias se cargan
automticamente seg[n corres3onda
&l 3resente eBem3lo reali2a esta tarea utili2ando la forma ms sencilla aunque
generalmente esta tarea se reali2a consultando una salida V<L 5 cambiando las o3ciones
del combo a 3artir de estoC aunque esto es ms com3licado
&m3e2amos con un controlador eBem3lo 5 una acci#n inde? en
controllers+ejemplo*controller.php$
1. <?php
2.
3. class EjemploController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. }
10.
11.?>
A0ora +amos a crear dos tablas en <5%.L: 3ais 5 ciudad con la siguiente estructura:
mysql> create table pais (
-> id integer not null auto_increment,
-> nombre varchar(50),
-> primary key(id)
-> );
mysql> create table ciudad (
-> id integer not null auto_increment,
-> pais_id integer not null,
-> nombre varchar(50),
-> primary key(id)
-> );
"ngresamos algunos datos de 3rueba:
mysql> select * from pais;
+----+-----------+
| id | nombre |
+----+-----------+
| 1 | Colombia |
| 2 | Venezuela |
| 3 | Mexico |
| 4 | Argentina |
+----+-----------+
4 rows in set (0.20 sec)
Libro de Kumbia: Porque Programar debera ser ms fcil 19$
mysql> select * from ciudad;
+----+---------+--------------+
| id | pais_id | nombre |
+----+---------+--------------+
| 1 | 1 | Bogot |
| 2 | 1 | Cali |
| 3 | 1 | Medellin |
| 4 | 2 | Maracaibo |
| 5 | 2 | Caracas |
| 6 | 3 | Mexico DF |
| 7 | 3 | Monterrey |
| 8 | 4 | Buenos Aires |
+----+---------+--------------+
8 rows in set (0.04 sec)
Para que 3odamos interactuar con las tablas debemos crear los modelos 3ais 5 ciudad en
models:
1. <?php
2.
3. class Ciudad extends ActiveRecord {
4.
5. function __construct(){
6. $this->belongs_to("pais");
7. }
8.
9. }
10.
11.?>
1. <?php
2.
3. class Pais extends ActiveRecord {
4.
5. function __construct(){
6. $this->has_many("ciudad");
7. }
8.
9. }
10.
11.?>
Libro de Kumbia: Porque Programar debera ser ms fcil 19(
A0ora +amos a crear la +ista donde mostramos ambos combos en
views+ejemplo+inde2.phtml:
1. <h2>Combos Actualizables con Kumbia</h2>
2. <div>
3. <select id='pais_id'>
4. <option>Seleccione una...</option>
5. <? foreach($Pais->find() as $pais): ?>
6. <option value='<?php echo $pais->id ?>'><?php echo $pais-
>nombre ?></option>
7. <? endforeach; ?>
8. </select>
9. </div>
10.<div id='div_ciudad'>
11. <select id='ciudad_id'>
12. <option>Seleccione una...</option>
13. </select>
14.</div>
*uestro eBem3lo en el e?3lorador se +e as de momento:
Libro de Kumbia: Porque Programar debera ser ms fcil 19'
A0ora en la +ista +amos a agregar un e+ento a el 3rimer combo que eBecute una acci#n
aBa? que actualice los +alores del combo corres3ondiente:
1. <h2>Combos Actualizables con Kumbia</h2>
2. <div>
3. <select id='pais_id'>
4. <option>Seleccione una...</option>
5. <? foreach($Pais->find() as $pais): ?>
6. <option value='<?php echo $pais->id ?>'><?php echo $pais-
>nombre ?></option>
7. <? endforeach; ?>
8. </select>
9. </div>
10.<div id='div_ciudad'>
11. <select id='ciudad_id'>
12. <option>Seleccione una...</option>
13. </select>
14.</div>
15.
16.<script type="text/javascript">
17. new Event.observe("pais_id", "change", function(){
18. new AJAX.viewRequest({
19. action: "ejemplo/obtener_ciudades/"+$F("pais_id"),
20. container: "div_ciudad"
21. })
22. })
23.</script>
&l e+ento se llama al reali2ar el cambio de la o3ci#n seleccionada en 3aisEidC en +e2 de
reali2ar un t3ico onc0angeSTT lo 0acemos con un obser+er que es ms 3rofesional &l
AUAV+iew1equest actuali2a el contenedor di)_ciudad con la +ista de la acci#n
obtener_ciudades en el controlador e3emplo
*#tese que en+iamos como 3armetro el +alor seleccionado en 3aisEid que lo obtenemos
con el 0el3er HFFG
A0ora creamos la acci#n obtenerEciudades en el controladorC consultando las ciudades
que corres3onden al 3as del 3armetro H3aisEid:
1. <?php
2.
3. class EjemploController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. function obtener_ciudades($pais_id){
10.
11. $this->set_response("view");
12.
13. //Usando Asociaciones
14. //$this->ciudades = $this->Pais->find($pais_id)-
Libro de Kumbia: Porque Programar debera ser ms fcil 19-
>getCiudad();
15.
16. //Usando find
17. //$this->ciudades = $this->Ciudad->find("pais_id =
'$pais_id'");
18.
19. //Usando find_by
20. $this->ciudades = $this->Ciudad->find_by_pais_id($pais_id);
21.
22. }
23.
24. }
25.
26.?>
;omo +emos la consulta 3uede reali2arse de +arias formas aunque 0a5 algunas otras
msC se 3uede consultar en Ht0is=Iciudades las ciudades que corres3ondan al 3as
seleccionado
&n la +ista )ie's*e3emplo*obtener_ciudades.phtml +ol+emos a generar el combo 3ero con
los +alores de ciudad corres3ondientes:
1. <select id='ciudad_id'>
2. <option>Seleccione una...</option>
3. <? foreach($ciudades as $ciudad): ?>
4. <option value='<?php echo $ciudad->id ?>'><?php echo $ciudad-
>nombre ?></option>
5. <? endforeach; ?>
6. </select>
;on eso terminamos nuestro eBem3lo el cual 3odemos +isuali2ar a0ora en el e?3lorador:
Libro de Kumbia: Porque Programar debera ser ms fcil 196
Libro de Kumbia: Porque Programar debera ser ms fcil 197
54.6 Aambiando el Aontrolador #or Keecto
4no de los 3asos que generalmente siem3re 0acemos al iniciar un 3ro5ecto en Kumbia
es cambiar el controlador 3or defecto &sto lo cambiamos en el arc0i+o
controllers@a33lication303:
1. <?php
2. /**
3. * Todas las controladores heredan de esta clase en un nivel superior
4. * por lo tanto los metodos aqui definidos estan disponibles para
5. * cualquier controlador.
6. *
7. * @category Kumbia
8. * @package Controller
9. **/
10.class ControllerBase
11.{
12. public function init ()
13. {
14. Kumbia::route_to("controller: index");
15. }
16.}
54.7 Kevolviendo una salida YE<
&l 3resente eBem3lo 3resenta una 3ers3ecti+a general 3ara generar salidas V<L desde
las acciones de nuestros controladores
Las salidas V<L son mu5 utili2adas Bunto con AUAV de a0 la V en su nombre Jambi/n
3uedes usarlas 3ara generar salidas estructuradas 3ara intercambiar informaci#n entre
diferentes a3licaciones
&l eBem3lo +a a crear una 3eque\a salida V<L que ser mostrada luego a 3artir de una
3etici#n AUAV
;reamos un controlador eBem3lo en controllersBe&em#loCcontroller.#,#:
1. <?php
2.
3. class EjemploController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. function obtener_xml(){
10.
11. //Indicamos que es una salida xml
12. $this->set_response("xml");
13.
14. //Creamos un manejados XML de Kumbia
15. //Tambien se puede usar SimpleXML, SAX o DOM
16. $xml = new simpleXMLResponse();
Libro de Kumbia: Porque Programar debera ser ms fcil 199
17.
18. //Agregamos algunos nodos a la salida
19. $xml->addNode(array("valor" => "salida xml 1", "texto" =>
"esto es otro nodo"));
20. $xml->addNode(array("valor" => "salida xml 2", "texto" =>
"otro nodo mas"));
21.
22. //Generamos la salida
23. $xml->outResponse();
24.
25. }
26.
27. }
28.
29.?>
&l m/todo obtenerE?ml reali2a la salida V<L tal 5 como est comentado A0ora +eamos la
+ista +iews@eBem3lo@inde?30tml donde reali2amos la 3etici#n AUAV:
1. <script type="text/javascript">
2. new Event.observe(window, "load", function(){
3. new AJAX.xmlRequest({
4. action: "ejemplo/obtener_xml",
5. callbacks: {
6. oncomplete: function(transport){
7. xml = transport.responseXML
8. rows = xml.getElementsByTagName("row");
9. for(i=0;i<=rows.length-1;i++){
10. alert(rows[i].getAttribute("valor"))
11. }
12. }
13. }
14. })
15. })
16.</script>
Al final +isuali2amos unos mensaBes de Je?to con la salida que fue consultada en
obtener_xml as:
Libro de Kumbia: Porque Programar debera ser ms fcil !::
54.8 1sar Aom#onentes Edicin 5n@2lace
&n momentos tu a3licaci#n 3uede tener com3onentes que 3ueden ser editados 3or los
usuarios de /sta &l obBeti+o de este eBem3lo es dotar estas 3artes de una forma fcil 5
r3ida de editarlas sin tener que ir a un nue+o formularioC abrir una +entana nue+a o
recargar la 3gina
Para esto +amos a a3ro+ec0ar el com3onente "nPlace&ditor de scri3taculous que facilita
la tarea 3ara nuestro beneficio
Para nuestro eBem3lo +amos a codificar la +ista F+iews@eBem3lo@inde?30tmlG de la acci#n
inde? en eBem3lo que tiene una im3lementaci#n +acaC con lo siguiente:
1. <div style='float:left'><b>Tu Nombre: </b></div>
2.
3. <div id='nombre' style='float:left'>Andres Felipe</div>
4.
5. <script type='text/javascript'>
6. new Ajax.InPlaceEditor("nombre", "/demo/ejemplo/guardar_nombre", {
7. cancelText: "Cancelar",
8. clickToEditText: "Click para editar"
9. })
10.</script>
Para crear un editor "n=Place sim3lemente creamos un di+ o un s3an 5 le agregamos un
id en nuestro caso con el id nombre %eguido a esto creamos un nue+o ABa?"nPlace&ditor
que se refiere a nombreC seguido a esto una url que en+a el +alor del com3onente
des3u/s de editarlo 5 unas o3ciones adicionales 3ara traducir algunos te?tos al es3a\ol

*uestro formulario debera +erse as al dar clic sobre el di+ nombre:
;omo +emos un bot#n de 8K 5 uno de cancelar a3arecen 5 el te?to se 0a 0ec0o editable
Libro de Kumbia: Porque Programar debera ser ms fcil !:1
al dar clic sobre el di+ Al o3rimir guardar el te?to es en+iado a la acci#n AUAV indicada
con un 3armetro +alue con el +alor del com3onente
Para nuestro eBem3lo 0emos definido el m/todo guardarEnombre de esta forma:
1. <?php
2.
3. class EjemploController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. function guardar_nombre(){
10.
11. $this->set_response(view);
12.
13. $nombre = $this->request("value");
14.
15. $this->render_text("Se guard&oacute; $nombre");
16.
17. }
18.
19. }
20.
21.?>
As al guardar a3arecer el te?to T%e guard#T 5 el nombre que fue en+iado desde el
formulario
54.10 Areando un <ive ;earc,
Li+e %earc0 es la no+edad en b[squedas en "nternet 5 tambi/n las de re3roductores
como iJunes en donde em3ie2as a escribir 5 automticamente la a3licaci#n em3ie2a a
filtrar resultados 0asta cuando terminas de escribir 5a tienes lo que estabas buscando
4na a3licaci#n mu5 conocida de esto la encuentras en los clientes de correo como Mmail
donde escribes alguna 3arte de la direcci#n a donde deseas en+iar el mensaBe e
inmediatamente em3ie2as a +er los contactos que coinciden con lo 3oco que 0as escrito
;omo 3arte de scri3taculous tenemos el com3onente Auto;om3letion que 3ermite
reali2ar 3eticiones AUAV mientras escribimos en una caBa de Je?to A3licando esto
tendremos un sistema de b[squeda mu5 llamati+o en 3ocas lineas
Para nuestro eBem3lo crearemos un cam3o donde el usuario +a a escribir un nombre 3ero
le a5udaremos con algunas sugerencias de datos ingresados anteriormente
"niciamos el eBem3lo creando el controlador eBem3lo en
controllers*e3emplo_controller.php con la acci#n inde? de esta forma:
Libro de Kumbia: Porque Programar debera ser ms fcil !:!
1. <?php
2.
3. class EjemploController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. }
10.
11.?>
&n la corres3ondiente +ista de la acci#n inde? F en +iews@eBem3lo@inde?30tmlG lo
siguiente:
1. <div style='text-align:center'>
2.
3. <b>B&uacute;squeda:</b> <?php echo text_field_with_autocomplete("nombre",
"action: ejemplo/ver_sugerencias") ?>
4.
5. </div>
&l te?to se +a a llenar con los +alores que de+uel+a la acci#n eBem3lo@+erEsugerencias
que codificamos as:
1. <?php
2.
3. class EjemploController extends ApplicationController {
4.
5. function index(){
6.
7. }
8.
9. function ver_sugerencias(){
10.
11. $this->set_response("view");
12.
13. $nombre = $this->request("nombre");
14.
15. $this->clientes = $this->Clientes->find("nombre like '%
$nombre%'");
16.
17. }
18.
19. }
20.
21.?>
&n la +ista +iews@eBem3lo@+erEsugerencias30tml cargamos los +alores en una lista ul 5
cada o3ci#n en un li >es3u/s de esto Autocom3leter carga automticamente los +alores
5 los transforma en cada o3ci#n de la lista:
Libro de Kumbia: Porque Programar debera ser ms fcil !:$
1. <ul>
2. <? foreach($clientes as $cliente): ?>
3. <li id='<?php echo $cliente->id ?>'><?php echo $cliente->nombre ?
></li>
4. <? endforeach ?>
5. </ul>
6.
Libro de Kumbia: Porque Programar debera ser ms fcil !:(
56 Mlosario de ;once3tos
56.1 AUAV
&n las a3licaciones Web tradicionales los usuarios interact[an mediante formulariosC que
al en+iarseC reali2an una 3etici#n al ser+idor Web &l ser+idor se com3orta seg[n lo
en+iado en el formulario 5 contesta en+iando una nue+a 3gina Web %e des3erdicia
muc0o anc0o de bandaC 5a que gran 3arte del HJ<L en+iado en la segunda 3gina WebC
5a estaba 3resente en la 3rimera AdemsC de esta manera no es 3osible crear
a3licaciones con un grado de interacci#n similar al de las a3licaciones 0abituales &n
a3licaciones AUAV se 3ueden en+iar 3eticiones al ser+idor Web 3ara obtener 5o
[nicamente la informaci#n necesariaC em3leando %8AP o alg[n otro lenguaBe 3ara
ser+icios Web basado en V<LC 5 usando Ua+a%cri3t en el cliente 3ara 3rocesar la
res3uesta del ser+idor Web &sto redunda en una ma5or interacci#n gracias a la
reducci#n de informaci#n intercambiada entre ser+idor 5 cliente 5a que 3arte del 3roceso
de la informaci#n lo 0ace el 3ro3io clienteC liberando al ser+idor de ese trabaBo La
contra3artida es que la descarga inicial de la 3gina es ms lenta al tenerse que baBar
todo el c#digo Ua+a%cri3t
56.2 Eodelo Oista Aontrolador LEOA9
&s un 3atr#n de dise\o de software que se3ara los datos de una a3licaci#nC la interfa2 de
usuarioC 5 la l#gica de control en tres com3onentes distintos &l 3atr#n <A; se +e
frecuentemente en a3licaciones WebC donde la +ista es la 3gina HJ<L 5 el c#digo que
3ro+ee de datos dinmicos a la 3gina
Eodelo: &sta es la re3resentaci#n es3ecfica del dominio de la informaci#n sobre la cual
funciona la a3licaci#n &l modelo es otra forma de llamar a la ca3a de dominio La l#gica
de dominio a\ade significado a los datos] 3or eBem3loC calculando si 0o5 es el
cum3lea\os del usuario o los totalesC im3uestos o 3ortes en un carrito de la com3ra
Oista: &ste 3resenta el modelo en un formato adecuado 3ara interactuarC usualmente un
elemento de la interfa2 de usuario &Bem3lo un Formulario
Aontrolador: &ste res3onde a e+entosC usualmente acciones del usuario e in+oca
cambios en el modelo 5 3robablemente en la +ista <uc0as a3licaciones utili2an un
mecanismo de almacenamiento 3ersistente Fcomo 3uede ser una base de datosG 3ara
almacenar los datos <A; no menciona es3ecficamente esta ca3a de acceso a datos &s
com[n 3ensar que una a3licaci#n tiene tres ca3as 3rinci3ales: 3resentaci#n F"4GC
dominioC 5 acceso a datos &n <A;C la ca3a de 3resentaci#n est 3artida en controlador 5
+ista La 3rinci3al se3araci#n es entre 3resentaci#n 5 dominio] la se3araci#n entre A; es
menos clara Aunque se 3ueden encontrar diferentes im3lementaciones de <A;C el fluBo
que sigue el control generalmente es el siguiente:
1. &l usuario interact[a con la interfa2 de usuario de alguna forma F3or eBem3loC el
usuario 3ulsa un bot#nC enlaceG
Libro de Kumbia: Porque Programar debera ser ms fcil !:'
2. &l controlador recibe F3or 3arte de los obBetos de la interfa2=+istaG la notificaci#n de
la acci#n solicitada 3or el usuario &l controlador gestiona el e+ento que llegaC
frecuentemente a tra+/s de un gestor de e+entos F0andlerG o callback
3. &l controlador accede al modeloC actuali2ndoloC 3osiblemente modificndolo de
forma adecuada a la acci#n solicitada 3or el usuario F3or eBem3loC el controlador
actuali2a el carro de la com3ra del usuarioG Los controladores com3leBos estn a
menudo estructurados usando un 3atr#n de comando que enca3sula las acciones 5
sim3lifica su e?tensi#n
(. &l controlador delega a los obBetos de la +ista la tarea de des3legar la interfa2 de
usuario La +ista obtiene sus datos del modelo 3ara generar la interfa2 a3ro3iada
3ara el usuario donde se refleBa los cambios en el modelo F3or eBem3loC 3roduce un
listado del contenido del carro de la com3raG &l modelo no debe tener
conocimiento directo sobre la +ista %in embargoC el 3atr#n de obser+ador 3uede
ser utili2ado 3ara 3ro+eer cierta indirecci#n entre el modelo 5 la +istaC 3ermitiendo
al modelo notificar a los interesados de cualquier cambio 4n obBeto +ista 3uede
registrarse con el modelo 5 es3erar a los cambiosC 3ero aun as el modelo en s
mismo sigue sin saber nada de la +ista &l controlador no 3asa obBetos de dominio
Fel modeloG a la +ista aunque 3uede dar la orden a la +ista 3ara que se actualice
*ota: &n algunas im3lementaciones la +ista no tiene acceso directo al modeloC
deBando que el controlador en+e los datos del modelo a la +ista
5. La interfa2 de usuario es3era nue+as interacciones del usuarioC comen2ando el
ciclo nue+amente
56.3 Framework
&n el desarrollo de softwareC un framework es una estructura de so3orte definida en la
cual otro 3ro5ecto de software 3uede ser organi2ado 5 desarrollado J3icamenteC un
framework 3uede incluir so3orte de 3rogramasC libreras 5 un lenguaBe de scri3ting entre
otros software 3ara a5udar a desarrollar 5 unir los diferentes com3onentes de un
3ro5ecto 4n framework re3resenta una arquitectura de software que modela las
relaciones generales de las entidades del dominio Pro+ee una estructura 5 una
metodologa de trabaBo la cual e?tiende o utili2a las a3licaciones del dominio
56.( Acti+e1ecord
&s un 3atr#n de software utili2ado en a3licaciones robustasC que 3ermite trabaBar los
registros de una tabla en una base de datos como instancias de una claseC 3or eBem3lo
;lientes # Productos en los cuales 3odemos a3licar m/todos DuscarC Muardar 5 Dorrar sin
necesidad de utili2ar sentencias %.L
56.5 ;caold LAndamia&e9
&l %caffold es un 3atr#n de desarrollo que 3ermite crear ca3turas de formularios 5 +istas
de forma dinmica seg[n los atributos de una entidad en el modelo de datos
56.4 2ro!ramacin Orientada a Ob&etos
&s un 3aradigma de 3rogramaci#n que define los 3rogramas en t/rminos de iclases de
obBetosiC obBetos que son entidades que combinan estado Fes decirC datosGC
com3ortamiento Festo esC 3rocedimientos o m/todosG e identidad F3ro3iedad del obBeto
que lo diferencia del restoG La 3rogramaci#n orientada a obBetos e?3resa un 3rograma
Libro de Kumbia: Porque Programar debera ser ms fcil !:-
como un conBunto de estos obBetosC que colaboran entre ellos 3ara reali2ar tareas &sto
3ermite 0acer los 3rogramas 5 m#dulos ms fciles de escribirC mantener 5 reutili2ar
56.6 ;a3a de Abstracci#n de >atos
&s una ca3a estndar 3ara el acceso a datosC la im3lementaci#n de /staC reduce un 3oco
el rendimiento 3ero aumenta en forma im3ortante la escalabilidad de las a3licaciones
4n eBem3lo de esto es 8>D; F83en >ataDase ;onnecti+it5GC en donde 3odemos acceder
a cualquier base de datos sin necesidad de cambiar funciones nati+as del lenguaBe
56.7 PHP
&l fcil uso 5 la similaridad con los lenguaBes ms comunes de 3rogramaci#n
estructuradaC como ; 5 PerlC 3ermiten a la ma5ora de los 3rogramadores
e?3erimentados crear a3licaciones com3leBas con una cur+a de a3rendi2aBe mu5 sua+e
Jambi/n les 3ermite in+olucrarse con a3licaciones de contenido dinmico sin tener que
a3render todo un nue+o gru3o de funciones 5 3rcticas La 3rinci3al +entaBa se basa en
ser un lenguaBe multi3lataforma ;a3acidad de cone?i#n con la ma5ora de los
maneBadores de base de datos que se utili2an en la actualidad Leer 5 mani3ular datos
desde di+ersas fuentesC inclu5endo datos que 3ueden ingresar los usuarios desde
formularios HJ<L ;a3acidad de e?3andir su 3otencial utili2ando la enorme cantidad de
m#dulos Fllamados e?tTs o e?tensionesG Posee una mu5 buena documentaci#n en su
3gina oficial &s LibreC 3or lo que se 3resenta como una alternati+a de fcil acceso 3ara
todos Permite las t/cnicas de Programaci#n 8rientada a 8bBetos
56.8 )Por qu/ Patrones,
Los 3atrones son soluciones abstradas del 3roblemas del da a da de muc0os
desarrolladores alrededor del mundo &?isten muc0os 5 mu5 +ariados 5 cada uno tiene
su ra2#n de e?istir 5 sus casos ideales de a3licaci#n Algunos de ellos son el <A;
F<odeloCAistaC;ontroladorG cu5a funci#n es se3arar la l#gica de la 3resentaci#nC tambi/n
esta el 81<F<a3eo 8bBeto=1elacionalG cu5a funci#n es 3ermitirnos trabaBar tablas como
clases 5 registros como obBetosC as es ms natural 3ara nosotros 5 buenoC entre otras
+entaBas
*o todos los 3atrones solucionan todo ti3o de 3roblemasC cada uno tiene su 3ro3ia
funcionalidadC es nuestro deber 0acer de estos una soluci#n fcil de reutili2arC e?tender o
mantener 3ara beneficio de nuestro 3ro5ecto
Familiari2arse con ciertos 3atrones 3uede resultar un tanto com3licado si lle+amos
trabaBando muc0o tiem3o con determinada metodologa que 3uede estar 3atentada o ser
una creada 3or nosotros mismos PeroC )Podras e+aluar que tan eficiente es trabaBar con
estos 3atrones a0ora,
<s adelante entraremos en detalle sobre el uso de estos 3atronesC sus +entaBas 5
a3licaci#n
Patrones de >ise\o: 0tt3:@@eswiki3ediaorg@wiki@PatronesEdeEdiseZ;$ZD1o
<A;: 0tt3:@@eswiki3ediaorg@wiki@<A;
Acti+e1ecord: 0tt3:@@wwwmartinfowlercom@eaa;atalog@acti+e1ecord0tml
Acti+e1ecord
&?3licando la "m3lementaci#n <A;
Libro de Kumbia: Porque Programar debera ser ms fcil !:6
57 J0e M*4 Meneral Public License FMPLG
Aersion !C Uune 1991
;o35rig0t F;G 1979C 1991 Free %oftware FoundationC "nc
'9 Jem3le PlaceC %uite $$:C DostonC <A :!111=1$:6 4%A
&+er5one is 3ermitted to co35 and distribute +erbatim co3ies of t0is license documentC but c0anging it is not
allowed
Preamble
J0e licenses for most software are designed to take awa5 5our freedom to s0are and c0ange it D5 contrastC
t0e M*4 Meneral Public License is intended to guarantee 5our freedom to s0are and c0ange free software==to
make sure t0e software is free for all its users J0is Meneral Public License a33lies to most of t0e Free
%oftware FoundationTs software and to an5 ot0er 3rogram w0ose aut0ors commit to using it F%ome ot0er
Free %oftware Foundation software is co+ered b5 t0e M*4 Librar5 Meneral Public License insteadG You can
a33l5 it to 5our 3rogramsC too
W0en we s3eak of free softwareC we are referring to freedomC not 3rice 8ur Meneral Public Licenses are
designed to make sure t0at 5ou 0a+e t0e freedom to distribute co3ies of free software Fand c0arge for t0is
ser+ice if 5ou wis0GC t0at 5ou recei+e source code or can get it if 5ou want itC t0at 5ou can c0ange t0e
software or use 3ieces of it in new free 3rograms] and t0at 5ou know 5ou can do t0ese t0ings
Jo 3rotect 5our rig0tsC we need to make restrictions t0at forbid an5one to den5 5ou t0ese rig0ts or to ask 5ou
to surrender t0e rig0ts J0ese restrictions translate to certain res3onsibilities for 5ou if 5ou distribute co3ies
of t0e softwareC or if 5ou modif5 it For e?am3leC if 5ou distribute co3ies of suc0 a 3rogramC w0et0er gratis or
for a feeC 5ou must gi+e t0e reci3ients all t0e rig0ts t0at 5ou 0a+e You must make sure t0at t0e5C tooC
recei+e or can get t0e source code And 5ou must s0ow t0em t0ese terms so t0e5 know t0eir rig0ts
We 3rotect 5our rig0ts wit0 two ste3s: F1G co35rig0t t0e softwareC and F!G offer 5ou t0is license w0ic0 gi+es
5ou legal 3ermission to co35C distribute and@or modif5 t0e software
AlsoC for eac0 aut0orTs 3rotection and oursC we want to make certain t0at e+er5one understands t0at t0ere is
no warrant5 for t0is free software "f t0e software is modified b5 someone else and 3assed onC we want its
reci3ients to know t0at w0at t0e5 0a+e is not t0e originalC so t0at an5 3roblems introduced b5 ot0ers will not
reflect on t0e original aut0orsT re3utations
Finall5C an5 free 3rogram is t0reatened constantl5 b5 software 3atents We wis0 to a+oid t0e danger t0at
redistributors of a free 3rogram will indi+iduall5 obtain 3atent licensesC in effect making t0e 3rogram
3ro3rietar5 Jo 3re+ent t0isC we 0a+e made it clear t0at an5 3atent must be licensed for e+er5oneTs free use
or not licensed at all
J0e 3recise terms and conditions for co35ingC distribution and modification follow
J&1<% A*> ;8*>"J"8*% F81 ;8PY"*MC >"%J1"D4J"8* A*> <8>"F";AJ"8*
: J0is License a33lies to an5 3rogram or ot0er work w0ic0 contains a notice 3laced b5 t0e co35rig0t 0older
sa5ing it ma5 be distributed under t0e terms of t0is Meneral Public License J0e iProgramiC belowC refers to
an5 suc0 3rogram or workC and a iwork based on t0e Programi means eit0er t0e Program or an5 deri+ati+e
work under co35rig0t law: t0at is to sa5C a work containing t0e Program or a 3ortion of itC eit0er +erbatim or
wit0 modifications and@or translated into anot0er language FHereinafterC translation is included wit0out
limitation in t0e term imodificationiG &ac0 licensee is addressed as i5oui
Acti+ities ot0er t0an co35ingC distribution and modification are not co+ered b5 t0is License] t0e5 are outside
its sco3e J0e act of running t0e Program is not restrictedC and t0e out3ut from t0e Program is co+ered onl5 if
its contents constitute a work based on t0e Program Finde3endent of 0a+ing been made b5 running t0e
ProgramG W0et0er t0at is true de3ends on w0at t0e Program does
Libro de Kumbia: Porque Programar debera ser ms fcil !:7
1 You ma5 co35 and distribute +erbatim co3ies of t0e ProgramTs source code as 5ou recei+e itC in an5
mediumC 3ro+ided t0at 5ou cons3icuousl5 and a33ro3riatel5 3ublis0 on eac0 co35 an a33ro3riate co35rig0t
notice and disclaimer of warrant5] kee3 intact all t0e notices t0at refer to t0is License and to t0e absence of
an5 warrant5] and gi+e an5 ot0er reci3ients of t0e Program a co35 of t0is License along wit0 t0e Program
You ma5 c0arge a fee for t0e 305sical act of transferring a co35C and 5ou ma5 at 5our o3tion offer warrant5
3rotection in e?c0ange for a fee
! You ma5 modif5 5our co35 or co3ies of t0e Program or an5 3ortion of itC t0us forming a work based on t0e
ProgramC and co35 and distribute suc0 modifications or work under t0e terms of %ection 1 abo+eC 3ro+ided
t0at 5ou also meet all of t0ese conditions:
aG You must cause t0e modified files to carr5 3rominent notices stating t0at 5ou c0anged t0e files and t0e
date of an5 c0ange
bG You must cause an5 work t0at 5ou distribute or 3ublis0C t0at in w0ole or in 3art contains or is deri+ed from
t0e Program or an5 3art t0ereofC to be licensed as a w0ole at no c0arge to all t0ird 3arties under t0e terms of
t0is License
cG "f t0e modified 3rogram normall5 reads commands interacti+el5 w0en runC 5ou must cause itC w0en started
running for suc0 interacti+e use in t0e most ordinar5 wa5C to 3rint or dis3la5 an announcement including an
a33ro3riate co35rig0t notice and a notice t0at t0ere is no warrant5 For elseC sa5ing t0at 5ou 3ro+ide a
warrant5G and t0at users ma5 redistribute t0e 3rogram under t0ese conditionsC and telling t0e user 0ow to
+iew a co35 of t0is License F&?ce3tion: if t0e Program itself is interacti+e but does not normall5 3rint suc0 an
announcementC 5our work based on t0e Program is not required to 3rint an announcementG
J0ese requirements a33l5 to t0e modified work as a w0ole "f identifiable sections of t0at work are not
deri+ed from t0e ProgramC and can be reasonabl5 considered inde3endent and se3arate works in t0emsel+esC
t0en t0is LicenseC and its termsC do not a33l5 to t0ose sections w0en 5ou distribute t0em as se3arate works
Dut w0en 5ou distribute t0e same sections as 3art of a w0ole w0ic0 is a work based on t0e ProgramC t0e
distribution of t0e w0ole must be on t0e terms of t0is LicenseC w0ose 3ermissions for ot0er licensees e?tend
to t0e entire w0oleC and t0us to eac0 and e+er5 3art regardless of w0o wrote it
J0usC it is not t0e intent of t0is section to claim rig0ts or contest 5our rig0ts to work written entirel5 b5 5ou]
rat0erC t0e intent is to e?ercise t0e rig0t to control t0e distribution of deri+ati+e or collecti+e works based on
t0e Program
"n additionC mere aggregation of anot0er work not based on t0e Program wit0 t0e Program For wit0 a work
based on t0e ProgramG on a +olume of a storage or distribution medium does not bring t0e ot0er work under
t0e sco3e of t0is License
$ You ma5 co35 and distribute t0e Program For a work based on itC under %ection !G in obBect code or
e?ecutable form under t0e terms of %ections 1 and ! abo+e 3ro+ided t0at 5ou also do one of t0e following:

aG Accom3an5 it wit0 t0e com3lete corres3onding mac0ine=readable source codeC w0ic0 must be distributed
under t0e terms of %ections 1 and ! abo+e on a medium customaril5 used for software interc0ange] orC
bG Accom3an5 it wit0 a written offerC +alid for at least t0ree 5earsC to gi+e an5 t0ird 3art5C for a c0arge no
more t0an 5our cost of 305sicall5 3erforming source distributionC a com3lete mac0ine=readable co35 of t0e
corres3onding source codeC to be distributed under t0e terms of %ections 1 and ! abo+e on a medium
customaril5 used for software interc0ange] orC
cG Accom3an5 it wit0 t0e information 5ou recei+ed as to t0e offer to distribute corres3onding source code
FJ0is alternati+e is allowed onl5 for noncommercial distribution and onl5 if 5ou recei+ed t0e 3rogram in obBect
code or e?ecutable form wit0 suc0 an offerC in accord wit0 %ubsection b abo+eG
J0e source code for a work means t0e 3referred form of t0e work for making modifications to it For an
e?ecutable workC com3lete source code means all t0e source code for all modules it containsC 3lus an5
associated interface definition filesC 3lus t0e scri3ts used to control com3ilation and installation of t0e
e?ecutable Howe+erC as a s3ecial e?ce3tionC t0e source code distributed need not include an5t0ing t0at is
normall5 distributed Fin eit0er source or binar5 formG wit0 t0e maBor com3onents Fcom3ilerC kernelC and so
onG of t0e o3erating s5stem on w0ic0 t0e e?ecutable runsC unless t0at com3onent itself accom3anies t0e
Libro de Kumbia: Porque Programar debera ser ms fcil !:9
e?ecutable
"f distribution of e?ecutable or obBect code is made b5 offering access to co35 from a designated 3laceC t0en
offering equi+alent access to co35 t0e source code from t0e same 3lace counts as distribution of t0e source
codeC e+en t0oug0 t0ird 3arties are not com3elled to co35 t0e source along wit0 t0e obBect code
( You ma5 not co35C modif5C sublicenseC or distribute t0e Program e?ce3t as e?3ressl5 3ro+ided under t0is
License An5 attem3t ot0erwise to co35C modif5C sublicense or distribute t0e Program is +oidC and will
automaticall5 terminate 5our rig0ts under t0is License Howe+erC 3arties w0o 0a+e recei+ed co3iesC or rig0tsC
from 5ou under t0is License will not 0a+e t0eir licenses terminated so long as suc0 3arties remain in full
com3liance
' You are not required to acce3t t0is LicenseC since 5ou 0a+e not signed it Howe+erC not0ing else grants 5ou
3ermission to modif5 or distribute t0e Program or its deri+ati+e works J0ese actions are 3ro0ibited b5 law if
5ou do not acce3t t0is License J0ereforeC b5 modif5ing or distributing t0e Program For an5 work based
on t0e ProgramGC 5ou indicate 5our acce3tance of t0is License to do soC and all its terms and conditions for
co35ingC distributing or modif5ing t0e Program or works based on it
- &ac0 time 5ou redistribute t0e Program For an5 work based on t0e ProgramGC t0e reci3ient automaticall5
recei+es a license from t0e original licensor to co35C distribute or modif5 t0e Program subBect to t0ese terms
and conditions You ma5 not im3ose an5 furt0er restrictions on t0e reci3ientsT e?ercise of t0e rig0ts granted
0erein You are not res3onsible for enforcing com3liance b5 t0ird 3arties to t0is License
6 "fC as a consequence of a court Budgment or allegation of 3atent infringement or for an5 ot0er reason Fnot
limited to 3atent issuesGC conditions are im3osed on 5ou Fw0et0er b5 court orderC agreement or ot0erwiseG
t0at contradict t0e conditions of t0is LicenseC t0e5 do not e?cuse 5ou from t0e conditions of t0is License "f
5ou cannot distribute so as to satisf5 simultaneousl5 5our obligations under t0is License and an5 ot0er
3ertinent obligationsC t0en as a consequence 5ou ma5 not distribute t0e Program at all For e?am3leC if a
3atent license would not 3ermit ro5alt5=free redistribution of t0e Program b5 all t0ose w0o recei+e co3ies
directl5 or indirectl5 t0roug0 5ouC t0en t0e onl5 wa5 5ou could satisf5 bot0 it and t0is License would be to
refrain entirel5 from distribution of t0e Program
"f an5 3ortion of t0is section is 0eld in+alid or unenforceable under an5 3articular circumstanceC t0e balance
of t0e section is intended to a33l5 and t0e section as a w0ole is intended to a33l5 in ot0er circumstances
"t is not t0e 3ur3ose of t0is section to induce 5ou to infringe an5 3atents or ot0er 3ro3ert5 rig0t claims or to
contest +alidit5 of an5 suc0 claims] t0is section 0as t0e sole 3ur3ose of 3rotecting t0e integrit5 of t0e free
software distribution s5stemC w0ic0 is im3lemented b5 3ublic license 3ractices
<an5 3eo3le 0a+e made generous contributions to t0e wide range of software distributed t0roug0 t0at
s5stem in reliance on consistent a33lication of t0at s5stem] it is u3 to t0e aut0or@donor to decide if 0e or s0e
is willing to distribute software t0roug0 an5 ot0er s5stem and a licensee cannot im3ose t0at c0oice
J0is section is intended to make t0oroug0l5 clear w0at is belie+ed to be a consequence of t0e rest of t0is
License
7 "f t0e distribution and@or use of t0e Program is restricted in certain countries eit0er b5 3atents or b5
co35rig0ted interfacesC t0e original co35rig0t 0older w0o 3laces t0e Program under t0is License ma5 add an
e?3licit geogra30ical distribution limitation e?cluding t0ose countriesC so t0at distribution is 3ermitted onl5 in
or among countries not t0us e?cluded "n suc0 caseC t0is License incor3orates t0e limitation as if written in
t0e bod5 of t0is License
9 J0e Free %oftware Foundation ma5 3ublis0 re+ised and@or new +ersions of t0e Meneral Public License from
time to time %uc0 new +ersions will be similar in s3irit to t0e 3resent +ersionC but ma5 differ in detail to
address new 3roblems or concerns
&ac0 +ersion is gi+en a distinguis0ing +ersion number "f t0e Program s3ecifies a +ersion number of t0is
License w0ic0 a33lies to it and ian5 later +ersioniC 5ou 0a+e t0e o3tion of following t0e terms and conditions
eit0er of t0at +ersion or of an5 later +ersion 3ublis0ed b5 t0e Free %oftware Foundation
"f t0e Program does not s3ecif5 a +ersion number of t0is LicenseC 5ou ma5 c0oose an5 +ersion e+er 3ublis0ed
b5 t0e Free %oftware Foundation
1: "f 5ou wis0 to incor3orate 3arts of t0e Program into ot0er free 3rograms w0ose distribution conditions are
differentC write to t0e aut0or to ask for 3ermission For software w0ic0 is co35rig0ted b5 t0e Free %oftware
FoundationC write to t0e Free %oftware Foundation] we sometimes make e?ce3tions for t0is
Libro de Kumbia: Porque Programar debera ser ms fcil !1:
8ur decision will be guided b5 t0e two goals of 3reser+ing t0e free status of all deri+ati+es of our free
software and of 3romoting t0e s0aring and reuse of software generall5
*8 WA11A*JY
11 D&;A4%& JH& P18M1A< "% L";&*%&> F1&& 8F ;HA1M&C JH&1& "% *8 WA11A*JY F81 JH& P18M1A<C J8
JH& &VJ&*J P&1<"JJ&> DY APPL";ADL& LAW &V;&PJ WH&* 8JH&1W"%& %JAJ&> "* W1"J"*M JH&
;8PY1"MHJ H8L>&1% A*>@81 8JH&1 PA1J"&% P18A">& JH& P18M1A< iA% "%i W"JH84J WA11A*JY 8F A*Y
K"*>C &"JH&1 &VP1&%%&> 81 "<PL"&>C "*;L4>"*MC D4J *8J L"<"J&> J8C JH& "<PL"&> WA11A*J"&% 8F
<&1;HA*JAD"L"JY A*> F"J*&%% F81 A PA1J";4LA1 P41P8%& JH&
&*J"1& 1"%K A% J8 JH& .4AL"JY A*> P&1F81<A*;& 8F JH& P18M1A< "% W"JH Y84 %H84L> JH&
P18M1A< P18A& >&F&;J"A&C Y84 A%%4<& JH& ;8%J 8F ALL *&;&%%A1Y %&1A";"*MC 1&PA"1 81
;811&;J"8*
1! "* *8 &A&*J 4*L&%% 1&.4"1&> DY APPL";ADL& LAW 81 AM1&&> J8 "* W1"J"*M W"LL A*Y ;8PY1"MHJ
H8L>&1C 81 A*Y 8JH&1 PA1JY WH8 <AY <8>"FY A*>@81 1&>"%J1"D4J& JH& P18M1A< A% P&1<"JJ&>
AD8A&C D& L"ADL& J8 Y84 F81 >A<AM&%C "*;L4>"*M A*Y M&*&1ALC %P&;"ALC "*;">&*JAL 81
;8*%&.4&*J"AL >A<AM&% A1"%"*M 84J 8F JH& 4%& 81 "*AD"L"JY J8 4%& JH& P18M1A< F"*;L4>"*M D4J
*8J L"<"J&> J8 L8%% 8F >AJA 81 >AJA D&"*M 1&*>&1&> "*A;;41AJ& 81 L8%%&% %4%JA"*&> DY Y84 81
JH"1> PA1J"&% 81 A FA"L41& 8F JH& P18M1A< J8 8P&1AJ& W"JH A*Y 8JH&1 P18M1A<%GC &A&* "F %4;H
H8L>&1 81 8JH&1 PA1JY HA% D&&* A>A"%&> 8F JH& P8%%"D"L"JY 8F %4;H >A<AM&%
&*> 8F J&1<% A*> ;8*>"J"8*%
Libro de Kumbia: Porque Programar debera ser ms fcil !11

También podría gustarte