ndice de contenido
1 ! $ ( Agradecimientos 1! "ntroducci#n 1$ %obre &l Libro de Kumbia 1' )*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 Kumbia 16 - Kumbia en su Punto 17 - 1 "ntroducci#n 17 - ! ).u/ es un Framework, 17 6 Kumbia +s 8tros Frameworks 19 7 ).u/ es Kumbia, !: 9 )&st 0ec0o kumbia 3ara m, !! 1: *ue+e 1a2ones 3ara 4sar Kumbia !$ 11 "nstalando Kumbia !( 11 1 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 !11 6 "nstalaci#n 5 ;onfiguraci#n con 8racle !11 7 >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:@@www assembla com@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 $! 16 1 "ntroducci#n $! 16 ! ;a3a de Abstracci#n "nde3endiente $! 16 $ Ada3tadores Kumbia $! 17 &squema de Acceso a Dases de >atos en Kumbia $$ 17 1 <odelos $$ 19 Acceso >irecto a 1>D<% $( 19 1 La ;lase >dDase $( 19 ! ;rear una instancia de >bDase $(
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 19 ( 7 Find 19 ( 9 "n .uer5 19 ( 1: "n .uer5 Assoc 19 ( 11 "n .uer5 *um 19 ( 1! Fetc0 8ne 19 ( 1$ Jable &?ists !: )Por qu/ usar una ca3a de Abstracci#n, !1 La Aida sin Acti+e1ecord !! KParmetros con *ombreL !$ 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 Pro3iedades %o3ortadas !$ ' ;on+enciones en Acti+e1ecord !$ ' 1 ;on+enciones Menerales !$ ' ! "d !$ ' $ cam3oEid !$ ' ( cam3oEat !$ ' ' cam3oEin !$ - ;on+enciones 3ara 1>D<s !$ - 1 ;on+enciones &s3eciales 3ara Postgre%.L !$ - ! ;on+enciones &s3eciales 3ara 8racle !( Acti+e 1ecord AP" !( 1 ;onsulta !( 1 1 distinct !( 1 1 findEallEb5Esql Fstring HsqlG
!( 1 ! findEb5Esql Fstring HsqlG !( 1 $ findEfirst !( 1 ( find !( 1 ' selectEoneFstring HselectEquer5G !( 1 - selectEoneFstring HselectEquer5G FstaticG !( 1 6 e?ists !( 1 7 findEallEb5 !( 1 9 findEb5ENcam3oN !( 1 1: 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 +alidatesEformatEof !( - Jransaccionalidad !( - 1 commitFG !( - ! beginFG !( - $ rollbackFG !( 6 8tros <etodos !( 6 1 sqlFstring HsqlG !( 7 ;allbacks en Acti+e1ecord !( 7 1 beforeE+alidation !( 7 ! beforeE+alidationEonEcreate !( 7 $ beforeE+alidationEonEu3date !( 7 ( afterE+alidationEonEcreate !( 7 ' afterE+alidationEonEu3date !( 7 - afterE+alidation !( 7 6 beforeEsa+e !( 7 7 beforeEu3date !( 7 9 beforeEcreate !( 7 1: afterEu3date !( 7 11 afterEcreate !( 7 1! afterEsa+e !( 7 1$ beforeEdelete !( 7 1( afterEdelete
(9 ': '1 '! '! '! '! '! '! '$ '$ '$ '$ '$ '$ '$ '$ '( '( '( '( '( '( '' '' '' '' '' '' ''''6 '6 '6 '6 '6 '7 '7 '7 '7 '9 '9 '9 '9 '9 '9 '9 '9 '9 -: -: -: -: -:
!( 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+e1ecord 6: !( 16 Acti+e1ecord 5 los ;am3os con Aalores 3or >efecto 6! !' Meneraci#n >e Formularios 6$ !' 1 Ji3os de Formularios 6$ !' ! AentaBas Meneradores de Formularios 6$ !' $ >es+entaBas Meneradores de Formularios 6( !- %tandardForm 6' !- 1 "ntroducci#n 6' !- ! ;rear un controlador 3ara el Formulario Album 6' !- $ ;on+enciones de los *ombres de las ;olumnas 6!- $ 1 id 6!- $ ! tablaEid 6!- $ $ cam3oEat 6!- $ ( cam3oEin 66 !- $ ' email 66 !- ( ;om3ortamiento de un Formulario %tandard 66 !- ' Pro3iedades de un Formulario %tandard 66 !- ' 1 Hscaffold FJrue o FalseG 66 !- ' ! Hsource 66 !- ' $ Hforce 67 !- - </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!
'
!- - !! unableEu3date !- - !$ unableEquer5 !- - !( unableEbrowse !- - !' unableEre3ort !- - !- routeEtoFHcontrollerCHactionCHidG !- - !6 setE0iddenFHcam3oG !- - !7 setEquer5Eonl5FHcam3oG !- - !9 setEca3tionFHcam3oC Hca3tionG !- - $: setEactionEca3tionFHactionC Hca3tionG !- - $1 setEe+entFHactionC Hca3tionG !- - $! setEattributeFHfieldC HattributeCH+alueG !- - $$ s0owEnotEnullsFG !- - $( setEmessageEnotEnullFHmessageG !- 6 &+entos del lado del ;liente F;allbacksG !- 6 1 beforeEenableEinsert !- 6 ! afterEenableEinsert !- 6 $ beforeEenableEu3date !- 6 ( afterEenableEu3date !- 6 ' beforeEenableEquer5 !- 6 - afterEenableEquer5 !- 6 6 beforeE+alidation !- 6 7 afterE+alidation !- 6 9 beforeEinsert !- 6 1: beforeEu3date !- 6 11 beforeEquer5 !- 6 1! beforeEre3ort !- 6 1$ beforeEcancelEin3utFactionG !- 7 &+entos del lado del %er+idor F;allbacksG !- 7 1 beforeEinsert !- 7 ! afterEinsert !- 7 $ beforeEu3date !- 7 ( afterEu3date !- 7 ' +alidation !- 7 - beforeEdelete !- 7 6 afterEdelete !- 7 7 beforeEfetc0 !- 7 9 afterEfetc0 !- 9 JrabaBando con "mgenes !- 1: Aalidaciones FA ni+el de ;am3oG !- 11 ;ombos &stticos !- 1! ;ambiando el as3ecto de Formularios %tandardForm !6 ;ontroladores !6 1 &Bem3lo !6 ! ;reaci#n de un ;ontrolador !7 A33lication;ontroller !7 1 </todos de la ;lase A33lication;ontroller !7 1 1 renderFH+iewG !7 1 ! redirectFHurlC HsecondsS: 'G !7 1 $ 3ostFH+alueG !7 1 ( getFH+alueG !7 1 ' requestFH+alueG !7 1 - renderE3artialFHnameG !7 1 6 routeEtoFQ3arams: +alorRG !7 1 7 redirectFHurlEcontroladorG !7 1 9 cac0eEla5outFHminutesG
7! 7! 7$ 7$ 7$ 7$ 7$ 7$ 7$ 7( 7( 7( 7( 7' 7' 7' 7' 7' 7' 7' 7' 7' 7' 7' 7' 7776 76 77 77 77 77 77 77 77 77 79 79 9: 9: 9! 9$ 9$ 9( 9' 9' 9' 9' 9999996
!9 $: $1
$! $$
$(
$'
!7 1 1: notEfoundFHcontrollerC HactionG !7 1 11 setEres3onseFHt53eG !7 1 1! isEalnumFH+alorG !7 1 1$ loadEreacordFHrecordG !7 1 1( isEnumericFH+alorG 8btener +alores desde una de Kumbia Persistencia en ;ontroladores Filtros en ;ontroladores $1 1 beforeEfilterFHcontrollerC HactionC HidG $1 ! afterEfilterFHcontrollerC HactionC HidG $1 $ notEfoundFHcontrollerC HactionC HidG A33lication;ontrollerDase &nrutamiento 5 1edirecciones $$ 1 )Por qu/ re=direccionamiento, $$ ! &sttico $$ $ >inmico Filter $( 1 .ue es un Filtro, $( ! 4tili2aci#n Dsica $( $ </todos de la clase Filter $( $ 1 addEfilterFHfilterG $( $ ! a33l5FH+arC QfiltersRG 5 a33l5EfilterFH+arC QfiltersRG $( $ $ getEinstanceFG $( ( Filtros >is3onibles $( ( 1 addslas0es $( ( ! alnun $( ( $ al30a $( ( ( date $( ( ' digit $( ( - 0tmlentities $( ( 6 0tmls3ecialc0ars $( ( 7 u33er $( ( 9 trim $( ( 1: stri3tags $( ( 11 stri3s3ace $( ( 1! stri3slac0es $( ( 1$ numeric $( ( 1( nl!br $( ( 1' md' $( ( 1- lower $( ( 16 i3+( $( ( 17 int Aistas $' 1 Porque usar Aistas, $' ! 4so de Aistas $' $ 4so de La5outs $' ( 4so de Jem3lates $' ' 4so de Partials $' - 4so de ;%% en Kumbia $' 6 4so de contentFG $' 7 Hel3ers $' 7 1 linkEtoFHaccionC Hte?toC QH3arametrosRG $' 7 ! linkEtoFHaccionC Hte?toC QH3arametrosRG $' 7 $ linkEtoEremoteFHaccionC Hte?toC HobBetoEaEactuali2arC QH3arametrosRG $' 7 ( buttonEtoEremoteEactionFHaccionC Hte?toC HobBetoEaEactuali2arC QH3arametrosRG
96 96 96 97 99 1:: 1:$ 1:' 1:' 1:' 1:1:6 1:7 1:7 1:7 1:9 11: 11: 11: 111 111 111 111 111 111 111 111 111 111 111 111 11! 11! 11! 11! 11! 11! 11! 11! 11! 11! 11! 11$ 11$ 11( 11' 11' 1111116 117 117 117 117 119
$' 7 ' Ba+ascri3tEincludeEtagFHarc0i+oEBsG $' 7 - Ba+ascri3tElibrar5EtagFHarc0i+oEBsG $' 7 6 st5les0eetElinkEtagFHarc0i+oEcssC C QuseE+ariables: trueRG $' 7 7 imgEtagFHsrcG $' 7 9 formEremoteEtagFHactionC HobBetoEqueEactuali2aG $' 7 1: formEtagFHactionG $' 7 11 endEformEtagFG $' 7 1! comillasFHte?toG $' 7 1$ submitEtagFHca3tionG $' 7 1( submitEimageEtagFHca3tionC HsrcG $' 7 1' buttonEtagFHca3tionG $' 7 1- te?tEfieldEtagFHnombreG $' 7 16 c0eckbo?EfieldEtagFHnombreG $' 7 17 numericEfieldEtagFHnombreG $' 7 19 te?tu33erEfieldEtagFHnombreG $' 7 !: dateEfieldEtagFHnombreG $' 7 !1 fileEfieldEtagFHnombreG $' 7 !! radioEfieldEtagFHnombreC HlistaG $' 7 !$ te?tareaEtagFHnombreG $' 7 !( 3asswordEfieldEtagFHnombreG $' 7 !' 0iddenEfieldEtagFHnameG $' 7 !- selectEtagFHnameC HlistaG $' 7 !6 o3tionEtagFH+alorC Hte?toG $' 7 !7 u3loadEimageEtagFHnombreG $' 7 !9 setEdro33ableFHnombreC HaccionG $' 7 $: redirectEtoFHurlC HsegundosG $' 7 $1 renderE3artialFH+istaE3artialC H+alorSTTG $' 7 $! brEbreakFHnumeroG $' 7 $$ trEbreakFHnumeroG $' 7 $( trEcolorFHcolor1C Hcolor!C QHcolorn RG $' 7 $' u3daterEselectFHnombreG $' 7 $- te?tEfieldEwit0Eautocom3leteFHnombreG $' 7 $6 truncateFHte?toC HnumeroS:G $' 7 $7 0ig0lig0tFHte?toC Hte?toEaEresaltarG $' 7 $9 mone5FH+alorG $' 7 (: dateEfieldEtagFHnameG $' 7 (1 selectEtagFG $' 9 Aerificar en+o de datos al controlador $' 9 1 0asE3ostFHnameG $' 9 ! 0asEgetFHnameG $' 9 $ 0asErequestFHnameG $' 1: Hel3ers de usuario en Kumbia $' 11 Formularios no intrusi+os $' 1! Autocarga de 8bBetos $' 1$ Paginador $( 7 1 3aginateFG $' 1( 3aginateEb5EsqlFG $- Denc0mark $( ' </todos Denc0mark $( ' 1 startEclockFHnameG $( ' ! timeEe?ecutionFHnameG $( ' $ memor5EusageFHnameG $6 A;L $6 1 </todos de la ;lase A;L $6 1 1 addEroleFAcl1ole Hrole8bBectC HaccessEin0eritsSTTG
119 119 119 119 1!: 1!: 1!: 1!: 1!1 1!1 1!1 1!1 1!1 1!1 1!1 1!! 1!! 1!! 1!! 1!! 1!! 1!! 1!$ 1!$ 1!$ 1!$ 1!$ 1!$ 1!( 1!( 1!( 1!( 1!' 1!' 1!' 1!1!1!6 1!6 1!6 1!6 1!7 1!9 1$: 1$! 1$! 1$$ 1$( 1$( 1$( 1$( 1$( 1$' 1$1$-
$7 $9 (:
(1 (! ($
((
('
(-
(6 (7
$6 1 ! addEin0eritFHroleC HroleEtoEin0eritG $6 1 $ isEroleFHroleEnameG $6 1 ( isEresourceFHresourceEnameG $6 1 ' addEresourceFAcl1esource HresourceG $6 1 - addEresourceEaccessFHresourceC HaccessElistG $6 1 6 dro3EresourceEaccessFHresourceC HaccessElistG $6 1 7 allowFHroleC HresourceC HaccessG $6 1 9 den5FHroleC HresourceC HaccessG $6 1 1: isEallowedFHroleC HresourceC HaccessElistG Aut0 Programaci#n <odular 4so de Flas0 (: 1 Flas0::error (: ! Flas0::success (: $ Flas0::notice (: ( Flas0::warning "ntegrar F<A;G en Kumbia (1 1 &Bem3lo %encillo 4so de Paquetes F*ames3acesG 4sando AUAV ($ 1 "ntroducci#n ($ ! V<LHtt31equest ($ $ );omo usar AUAV en Kumbia, ($ ( linkEtoEremote ($ ' formEremoteEtag Ua+a%cri3t 5 Kumbia (( 1 &l 8bBeto AUAV (( ! AUAV +iew1equest (( $ AUAV ?ml1equest (( ( AUAV e?ecute (( ' AUAV quer5 (( - ABa? 1equest 5 ABa? 43dater (( 1 ABa? Periodical43dater %ession (' 1 </todos de la clase %ession (' 1 1 %ession::setEdataFHnameC H+alorG (' 1 ! %ession::getEdataFHnameC H+alorG (' 1 $ %ession::unsetEdataFHnameG (' 1 ( %ession::issetEdataFHnameG (' 1 ' %ession::setFHnameC H+alorG (' 1 - %ession::getFHnameC H+alorG Loggers (- 1 </todos de la ;lase Logger (- 1 1 constructor (- 1 ! logFHmessageC Ht53eG (- 1 $ beginFG (- 1 ( commitFG (- 1 ' rollbackFG (- 1 - close Protot53e en Kumbia &fectos Aisuales 5 %cri3t Aculo 4s (7 1 &fectos Dsicos (7 1 1 &ffect 83acit5 (7 1 ! &ffect %cale (7 1 $ &ffect <or30
1$1$1$1$1$1$1$1$6 1$6 1$7 1$9 1(: 1(: 1(: 1(: 1(: 1(1 1(1 1($ 1(( 1(( 1(' 1(' 1(1(6 1(9 1(9 1(9 1': 1'1 1'! 1'! 1'$ 1'( 1'( 1'( 1'( 1'( 1'( 1'( 1'( 1'' 1'1'1'1'1'1'1'1'6 1'7 1'7 1'9 1'9 1-:
(9
': '1
'! '$
'6
(7 1 ( &ffect <o+e (7 ! &fectos ;ombinados (7 ! 1 &ffect A33ear (7 ! ! &ffect Fade (7 ! $ &ffect Puff (7 ! ( &ffect >ro38ut (7 ! ' &ffect %0ake (( 1 1 &ffect %witc08ff (( 1 ! &ffect Dlind>own (( 1 $ &ffect Dlind43 (( 1 ( &ffect %lide>own (7 $ <s "nformaci#n Aentanas Protot53eWindows (9 1 4so de las Aentanas Protot53e (9 ! 1eferencia de ;lases 5 8bBetos de Protot53e Windows (9 $ ;lase Window (9 ( &Bem3los de Protot53e Windows (9 ( 1 Abriendo una Aentana %encilla (9 ( ! Abrir una +entana usando una 41L (9 ( $ Abre una +entana con un contenido e?istente (9 ( ( Abriendo una cuadro de dialogo usando AUAV (9 ( ' Abrir un cuadro de >ialogo de Alerta Funciones de 1e3ortes ': 1 <anual de 1eferencia de FP>F ': ! ).u/ es FP>F, ;orreo &lectr#nico '1 1 ).u/ es PHP<ailer, '1 ! )Por qu/ usar 303mailer, '1 $ PHP<ailer en Acci#n con Mmail "ntegraci#n con %mart5 '! 1 ).u/ es %mart5, '! ! ;omo se integra %mart5 a Kumbia ;oders '$ 1 Acti+ar los ;oders '$ ! Probar los coders '$ $ 4n eBem3lo 3rctico Meneraci#n de Mrficas '! 1 Libc0art en Acci#n Pasos de Daile en Kumbia ;reando tus 3ro3ios arc0i+os de configuraci#n ini '- 1 Leer la configuraci#n Actual '- ! Leer Arc0i+os &?cel con Kumbia '- $ 4tili2ando la consola "nteracti+a iPHP '- $ 1 createEstandardformFHnombreG '- $ ! createEmodelFHnombreG '- $ $ createEcontrollerFHnombreG '- ( Aalidar un 4suario '- ' ;rear un 1e3orte usando FP>F '- - ;ombos Actuali2ables con AUAV '- 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 Mlosario de ;once3tos '6 1 AUAV
1-: 1-1 1-1 1-1 1-! 1-! 1-! 1-! 1-! 1-$ 1-$ 1-$ 1-( 1-( 1-1-1-9 1-9 1-9 16: 161 161 16! 16! 16! 16$ 16$ 16$ 16( 16' 16' 16166 166 166 166 171 17! 17$ 17$ 17$ 17' 176 177 177 177 179 19! 19( !:: !:: !:! !:' !:6 !:6
1:
'6 ! <odelo Aista ;ontrolador F<A;G '6 $ Framework '6 ( Acti+e1ecord '6 ' %caffold FAndamiaBeG '6 - Programaci#n 8rientada a 8bBetos '6 6 ;a3a de Abstracci#n de >atos '6 7 PHP '6 9 )Por qu/ Patrones, '7 J0e M*4 Meneral Public License FMPLG
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 gutierre2andresfeli3eXgmail com >ei+inson JeBeda dei+insonteBedaXkumbia303 com &milio %il+eira emilio rstXkumbia303 com ;/sar ;aballero aka P0illi3o 30illi3oXkumbia303 com Y a toda la comunidad que rodea a KumbiaC con sus 3reguntasC notificaciones de errores FDugTsGC a3ortacionesC etc
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
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 sourceforge net 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 kumbia303 com <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
1(
1'
>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
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
"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
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
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
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
17
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:
Abstracci#n de la base de datos <a3eo 8bBeto=1elacional <odelo <A; F<odeloC AistaC ;ontroladorG
Plantillas FJem3lateAiewG Aalidaci#n de Formularios Administraci#n de ;ac0/ %caffolding "nteracci#n AUAV Meneraci#n de Formularios &fectos Aisuales %eguridad !:
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 .
!1
;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
!!
!$
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:@@kumbia sourceforge net &l nombre del 3aquete tiene un nombre como kumbia=+ersion=notes formatoC 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
5n ormacin: %i desea instalar la ultima beta de Kumbia debe ingresar al gru3o en google 5 descargarlo de los arc0i+os del gru3o &n 0tt3:@@grou3s google com@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 ...
!'
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
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
Advertencia: &n 8racle la funcionalidad limit 3odra no funcionar como se es3era 4tilice la condici#n rownum c numeroEfilas 3ara 0acer esto.
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
;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 <antenimiento de ;lientes &Bem3lo:
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.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
!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(
!9
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
$:
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 etc G 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 etc GC 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
$1
$!
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
$$
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
$(
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
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:@@es wiki3edia org@wiki@%ingleton
$'
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
-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.(.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();
$-
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. ?>
$6
&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. ?>
$7
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
$9
30. 31.
(:
&l ma3eo Ob&eto@/elacional soluciona esto 5 3ro3orciona un alto 3otencial 3ara 0acer las a3licaciones ms fciles de mantener
*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
(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. ?>
%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
;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
(!
4na instancia de esta clase ser un obBeto con los atributos de la tabla album:
1ead
FLeerGC
43date
Acti+e1ecord im3lementa automticamente las cuatro o3eraciones bsicas sobre una tabla: ;rearC LeerC Actuali2ar 5 Dorrar
($
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. 2. 3. 4. $Album = new Album(); $Album->nombre = Take Off Your Pants and Jacket; $Album->valor = 40000; $Album->save();
Adicionalmente a esto 3uede utili2ar el m/todo VcreateW as como los m/todos como VcreateC romCre"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.));
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 V indWC 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,>?
((
"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 V indC irstW de+uel+e el 3rimer registro que coincida con la b[squeda 5 V indW todos los registros
('
Advertencia: &n 8racle la funcionalidad limit 3odra no funcionar como se es3era 4tilice la condici#n rownum c numeroEfilas 3ara 0acer esto.
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.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
(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
(7
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
&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
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
&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:
':
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 P indR 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);
'1
%e 3uede utili2ar la 3ro3iedad count 3ara saber cuntos registros fueron de+ueltos en la b[squeda
&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. 2. 3. 4. 5. 6. $Usuarios->id = 3; if($Usuarios->exists()){
print CDa eBiste el id , >C!
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
'!
b[squeda
1. $resultados = $Productos->find_all_by_categoria(Insumos);
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.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');
'$
2(.(.2 u#date
Actuali2a un registro a 3artir de los +alores de los atributos del obBeto Acti+e1ecord
1. 2. 3. 4. $album = Album->find(12); $album->nombre = Take Off Your Pants and Jacket; $album->valor = 40000; $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. 2. 3. 4. $Album = new Album(); $Album->nombre = Take Off Your Pants and Jacket; $Album->valor = 40000; $Album->save();
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
''
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. ?>
'-
2(.5.4 validatesCdateCin
Aalida que ciertos atributos tengan un formato de fec0a acorde al indicado en config@config ini 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(.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()
'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()
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:
'7
2(.7.1 be oreCvalidation
&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 be oreCvalidationConCcreate
&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 be oreCvalidationConCu#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.( a terCvalidationConCcreate
&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 a terCvalidationConCu#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 a terCvalidation
&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 be oreCsave
&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 be oreCu#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 be oreCcreate
&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
'9
2(.7.10 a terCu#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 a terCcreate
&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 a terCsave
&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 be oreCdelete
&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( a terCdelete
&s llamado Busto des3u/s de reali2ar el 3roceso de borrado cuando se llama el m/todo delete en un modelo
-:
2(.8 2ersistencia
&n ocasiones Acti+e1ecord es necesario mantener 3ersistente los +alores de alg[n obBeto ;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
-1
>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(.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
-$
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')
-(
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')
-'
--
-6
-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
-9
&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}); }
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}); } } } }
<?php echo form_tag('usuario/lista') ?> <?php echo text_field_tag('usuario.nombre') ?> <?php echo submit_tag('Consultar') ?> <?php echo end_form_tag() ?>
61
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
6!
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
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
6$
*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
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.);
6'
;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 album 303:
1. <?php 2. class Album extends ActiveRecord { 3. } 4. ?>
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
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.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. }
66
24.5.3 S orce
&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.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 >ebes tener ! tablas: de los Hel3ers:
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. );
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
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
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
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>
71
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. 3. 4. 5. 6. 7. 8. ?> class ClienteController extends StandardForm { public $scaffold = true; public function __construct(){ $this->unable_delete(); } }
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
7!
24.4.2( unableCbro%se
"m3ide +isuali2ar la +ista de Aisuali2aci#n >esa3arece el bot#n de Aisuali2ar
1. <?php 2. 3. 4. 5. 6. 7. 8. 9. 10.?> class ClienteController extends StandardForm { public $scaffold = true; public function __construct(){ $this->set_title_image('cliente.jpg'); $this->unable_browse(); $this->unable_update(); } }
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: 1"); 3. ?> consultar", "id:
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
7$
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.
7(
24.6.1 be oreCenableCinsert
Al o3rimir el bot#n insert 5 antes de que se 0abiliten los in3uts 3ara entrada de datos
24.6.2 a terCenableCinsert
Al o3rimir el bot#n insert 5 des3u/s de que se 0abiliten los in3uts 3ara entrada de datos
24.6.3 be oreCenableCu#date
Al o3rimir el bot#n u3date 5 antes de que se 0abiliten los in3uts 3ara entrada de datos
24.6.( a terCenableCu#date
Al o3rimir el bot#n u3date 5 des3u/s de que se 0abiliten los in3uts 3ara entrada de datos
24.6.5 be oreCenableC"uer'
Al o3rimir el bot#n consultar 5 antes de que se 0abiliten los in3uts 3ara entrada de datos
24.6.4 a terCenableC"uer'
Al o3rimir el bot#n consultar 5 des3u/s de que se 0abiliten los in3uts 3ara entrada de datos
24.6.6 be oreCvalidation
Antes de reali2ar el 3roceso de +alidaci#n en adicionar 5 modificar des3u/s de o3rimir ace3tar
24.6.7 a terCvalidation
>es3u/s de reali2ar el 3roceso de +alidaci#n en adicionar 5 modificar des3u/s de o3rimir ace3tar
24.6.8 be oreCinsert
Al o3rimir ace3tar antes de insertar
24.6.10 be oreCu#date
Al o3rimir ace3tar antes de actuali2ar
24.6.11 be oreC"uer'
Al o3rimir ace3tar antes de consultar
7'
24.6.12 be oreCre#ort
Al o3rimir ace3tar antes de sacar re3orte
24.6.13 be oreCcancelCin#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
7-
&?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 be oreCinsert
%e eBecuta antes de la o3eraci#n insert %i de+uel+e false cancela la inserci#n
76
24.7.2 a terCinsert
%e eBecuta des3u/s de la o3eraci#n insert
24.7.3 be oreCu#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.( a terCu#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 be oreCdelete
%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 a terCdelete
%e eBecuta des3u/s de la o3eraci#n delete
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. ?>
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
&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(){
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.?>
9:
8. 9. 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;
91
8. 9. 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 etc G 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 etc GC 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
&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 9$
que debe tener un nombre como: Productos;ontrollerC las 3rimeras letras en ma5[sculas 5 la terminaci#n ;ontroller
1. <?php 2. 3. 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:
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.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.?>
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
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.?>
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:
9-
1. $this->redirect(/productos/query);
27.1.8 cac,eCla'outLSminutes9
;ac0/ de la +ista views+la out+ corres3ondiente al controlador durante Hminutes
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 notC ound, '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.
96
function adicionar(){ $nombre = $this->request(nombre); if($this->is_alnum($nombre)==false){ Flash::error(Entrada invalidad para precio); return; } /* ..*/ }
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 su iD: sufiBo 3ara el atributo en el controlador #re iD: 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');
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.?>
99
>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. }
1::
A0ora +eamos el siguiente eBem3lo: 0tt3:@@www kumbia org@a3licacion@registro@buscarEfec0a@!::-@1!@:1 &l sitio es: kumbia org 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. }
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] 4. [1] 5. [2] 6. [3] 7. [4] 8. )
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. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
class ComprarController extends ApplicationController { /** * Tiene los valores de los items guardados en el * carrito, las propiedades de los controladores * son persistentes es decir que no se pierden a lo * largo de la ejecucin de la aplicacin * * @var array */
public $carro , arra$)*!
function index(){ } /** * Agrega un item al carrito * * @param integer $id */ function add_to_cart($id){ $this->set_response('view');
i.)Jisset)$this&'carro[$id **G
$this->carro[$id] = 1; } else { $this->carro[$id]++; } $this->render_partial('carrito'); } /** * Elimina todos los items del carrito * */ function borrar_items(){ //Indica que la vista sera solo parcial $this->set_response('view');
$this&'carro , arra$)*!
$this->render_partial('carrito');
1:$
50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. ?>
} /** * Elimina un item del carrito * * @param integer $id */ function borrar_item($id){ //Indica que la vista sera solo parcial $this->set_response('view');
unset)$this&'carro[$id *!
;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
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:
&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
1:'
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.?>
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
*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/*
en
este
arc0i+o
tiene
menos
rele+ancia
sobre
un
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: 1ecibe los 3armetros con nombre:
1. route_to([params: valor])
controller: A que controlador se +a a redireccionar action: A que acci#n se +a a redireccionar id: "d de la redirecci#n
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
11:
3(.3.3 !etCinstanceL9
8btiene una instancia singlenton
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
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
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
&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:
11(
*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
&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:
11'
>e esta forma 0acemos que ;lientes utilice el la5out views+la outs+administracion.phtml
>e esta forma estaramos mostrando el arc0i+o _menu.phtml del directorio del controlador actual
>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')?>
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");
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:
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>;
117
linkEtoEremote 3uede recibir n 3armetros adicionales que corres3onden a atributos 0tml corres3ondientes a la etiqueta TaT
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>
<?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
119
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.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
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.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") ?>
1!1
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) ?>
1!!
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.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 ?>
1!$
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. 2. 3. 4. 5. 6. <table> <? foreach($Ciudades->find() as $ciudad): ?> <td><?php echo $ciudad->nombre ?></td> <?php echo tr_break(4) ?> <? enforeach: ?> </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>
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. 2. 3. 4. 5. <ul> <? foreach($clientes as $cliente): ?> <li id='<?php echo $cliente->id ?>'>$cliente->nombre <? endforeach; ?> </ul>
Los estilos de las listas generadas 3ueden ser cambiados mediante la clase autocom3lete que esta definida en 3ublic@css@st5le css
, 6); //
35.7.38 mone'LSvalor9
"m3rime un +alor con formato num/rico con H 5 decimales
1!'
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 uno TG I,
1!-
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
1!6
busca
en
el
directorio
Oa33s@0el3ersP
el
arc0i+o
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, U ileCs#litterU9I
1!7
&s decir el O P 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')
1!9
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. 2. 3. 4. 5. <?php echo form_tag('usuario/crear') ?> <p><?php echo text_field_tag('usuario.cedula') ?></p> <p><?php echo text_field_tag('usuario.nombre') ?></p> <p><?php echo submit_tag('Guardar') ?></p> <?php echo end_form_tag() ?>
1$:
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. }
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. }
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.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');
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 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.}
PacienteController extends ApplicationController { public $acl; public function __construct(){ $this->acl = new Acl(); //agregando el rol $this->acl->add_role(new AclRole('invitados')); $this->acl->add_role(new AclRole('admin')); //agregando los recurso $f = array("agregar", "modificar"); $this->acl->add_resource(new AclResource('paciente'), $f); } /******************************************************************/ public function agregar(){ //permitiendo el acceso $this->acl->allow('admin', 'paciente', 'agregar'); //verificando si admin tiene acceso a la accion agregar if($this->acl->is_allowed('admin', 'paciente', 'agregar')){ print ("Permitido"); }else{ print ("No Permitido"); } }
&?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.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
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');
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());
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##sBde aultBcontrollersBusuariosCcontroller.#,# 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##sBde aultBcontrollersB1suariosB 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
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@st5le css 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@st5le css 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@st5le css 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@st5le css llamada warningEmessage
1. Flash::warning(Advertencia: No ha iniciado sesin en el sistema);
1(:
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
1(!
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.*');
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.( linkCtoCremote
Permite 0acer un llamado sencillo mediante AUAV que solicita un fragmento HJ<L 5 lo
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 0ola 30tml 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:
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>
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
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); ?>
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:@@3rotot53eBs orgC 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. 3. 4. 5. 6. 7. 8. 9. 10. ?> class ConsultasController extends ApplicationController { function cliente(){ $this->set_response('xml'); $response = new simpleXMLResponse();
$response&'add:ode)arra$)CcedulaC ,' LL22MH?H**!
$response->outResponse(); } }
((.( 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>
1':
((.5 A_AY."uer'
&sta es una de las funciones ms [tiles que tiene Kumbia en cuanto a AUAV 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. ?>
%u
1'1
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
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.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');
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();
1'(
(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();
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,
1'-
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
1'6
Kescri#cin &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 &s llamado antes de cada iteraci#n del ciclo de animaci#n &s llamado des3u/s de cada iteraci#n del ciclo de animaci#n &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
(7.1.1 E ect.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'
1'7
(7.1.2 E ect.;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 E ect.Eor#,
&ste efecto cambia las 3ro3iedades ;%% de un elemento
%inta?is
%encillo : ;om3leBo :
1. $)@eNemplo(morph@*.morph)@bacEAround:#H?H! color:#...@*! 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*!
>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.( E E&em#lo
ect.Eove
&ste efecto 3ermite mo+er un elemento &ffect <o+eD5 es un nombre antiguo &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'});
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*!
&ffect &ffect &ffect &ffect &ffect &ffect &ffect &ffect &ffect &ffect &ffect &ffect &ffect
A33earC &ffect Fade Puff >ro38ut %0ake Hig0lig0t %witc08ff Dlind>ownC &ffect Dlind43 %lide>ownC &ffect %lide43 Pulsate %quis0 Fold Mrow %0rink
AdicionalmenteC e?iste la utilidad &ffect toggle que 3ermite cambiar el estado de +isibilidad a un obBeto con animaciones A33ear@FadeC %lide o Dlind &ffect toggle usa cualquiera de los siguientes 3ares: 2arametro To!!le A33ear %lide Dlind A#arece con &ffect A33ear &ffect %lide>own &ffect Dlind>own Kesa#arece con &ffect Fade &ffect %lide43 &ffect Dlind43
(7.2.1 E ect.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*!
1-:
(7.2.2 E ect.-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 &ffect A33ear
&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 E ect.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.( E ect.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 E ect.;,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 E ect.;%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 E ect.QlindKo%n
%imula que se agranda un elemento estilo 3ersiana &s lo contrario de Dlind43
&Bem3los
new /..ect.<lind4own)@id(o.(element@*!
1-1
JrabaBa bien con elementos ti3o bloqueFdi+sC 3C s3anC etcG 3ero no con tablas
((.1.3 E ect.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.( E ect.;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>
>rag And >ro3: >raggablesC >ro33ablesC %ortablesC %lider Autocom3letion: Autocom3letado de cam3os ti3o AUAV "n Place &diting: ;am3os de Je?to editables AUAV
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:@@?ilinus comC 0tt3:@@itseb comG basndose en scri3t aculo us 5 3rotot53e framework Finalmente fueron ada3tadas al core de Kumbia 3ara que 3uedan ser utili2adas sin menor com3licaciones
1-$
&n el eBem3loC cargamos las libreras necesarias 3ara utili2ar las +entanas Protot53e inclu5endo el arc0i+o window Bs 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 &+ent obser+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
1-(
(8.2 /e erencia de Alases ' Ob&etos de 2rotot'#e Zindo%s (8.3 Alase Zindo%
E+todo
initiali2eFidC o3tionsG
Kescri#cin
;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
minWidt0 @ minHeig0t 1::@!: resi2able closable minimi2able ma?imi2able draggable s0ow&ffect 0ide&ffect true true true true true &ffect A33ear # &lement s0ow &ffect Fade #
1-'
&lement 0ide s0ow&ffect83tions 0ide&ffect83tions effect83tions onload o3acit5 recenterAuto gridV gridY wired>rag destro58n;lose none none none none 1 true 1 1 false false
defecto de3ende
si
scri3t aculo us
esta
83ciones utili2adas en el efecto 3ara mostrar la +entana 1e+isar secci#n de &fectos Aisuales 83ciones utili2adas en el efecto 3ara ocultar la +entana 1e+isar secci#n de &fectos Aisuales 83ciones 3ara mostrar 5 ocultar 1e+isar secci#n de &fectos Aisuales Funci#n 8nload de la +entana 3rinci3alC di+ o iframe 83acidad de la +entana 1ecentrar la +entana cuando el tama\o de la +entana 3rinci3al 0a cambiado <o+imiento 5 ABuste de tama\o de la +entana usara una grilla de este tama\o en V <o+imiento 5 ABuste de tama\o de la +entana usara una grilla de este tama\o en Y <o+imiento@ABuste de Jama\o utili2ara una ca3a wiredC 3ersonali2able en `classNameTC%iredC rame del arc0i+o css de la clase >estruir obBeto de la +entana cuando el obBeto se oculteC 3or defecto la +entana es tan solo ocultada 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
all callbacks
none
E+todo
destro5FG get"dFG set>estro58n;loseFG
Kescri#cin
>estructor del obBeto de la +entana >e+uel+e el Window id de la +entana 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 Lde ault alse9 ABusta el tama\o 3ara que concuerde con su contenido auto#osition Lde ault alse9 "ndica si la 3osici#n de la +entana es la del obBeto insertado setHJ<L;ontentF0tmlG set41LFurlG &s3ecifica el contenido usando un c#digo HJ<L como 3armetro &s3ecifica el contenido de la +entana usando una 41L &l contenido ser +isuali2ado dentro de un iframe
1--
get41LFG refres0FG setABa?;ontentFurlC o3tionsC s0ow;enteredC s0ow<odalG get;ontentFG set;ookieFnameC e?3iresC 3at0C domainC secureG setLocationFto3C leftG get%i2eFG set%i2eFwidt0C 0eig0tG u3dateWidt0FG u3dateHeig0tFG toFrontFG s0owFmodalG
8btener la 41L del iframe interno de la +entanaC solo si este e?iste Actuali2a el contenido de la +entana &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 >e+uel+e el contenido de la +entana 5a sea desde el iframe o el di+ interno &s3ecifica la informaci#n de la cookie que almacena los datos de tama\o 5 3osici#n de la +entana &s3ecifica la 3osici#n su3erior e i2quierda de la +entana 8btiene un 0as0 con los +alores de anc0o 5 alto de la +entana &s3ecifica el tama\o de anc0o 5 alto de la +entana 1ecom3utar el tama\o de la +entana con base en el anc0o de su contenido 1ecom3utar el tama\o de la +entana con base en el alto de su contenido ;oloca a la +entana 3or encima de todas las dems +entanas abiertas <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 <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 <inimi2a la +entanaC s#lo la barra su3erior es +isuali2ada <a?imi2a la +entana 0asta el tama\o m?imo de rea +isible de la +entana >e+uel+e true si la +entana est minimi2ada >e+uel+e true si la +entana est ma?imi2ada &s3ecifica la o3acidad de la +entana : es trans3arente 5 1 es o3aca 4n : ' es semi=o3aca o semi=trans3arente &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 &s3ecifica el ttulo de la +entana 8btiene el ttulo de la +entana &s3ecifica el te?to de la barra de estado de la +entana
1-6
1-7
1-9
16:
50 Funciones de 1e3ortes
Para la +ersi#n : ' se encuentra la +ersi#n 1 - de esta librera
50.1 Eanual de /e erencia de -2KFP>F F0tt3:@@www f3df org@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
&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:@@www f3df org@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
&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
16!
a##sBvie%sBmailBindeD.#,tml
16$
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
} }
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: 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
1. Hello Andrs Felipe, 2007-02-27 01:13!
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
;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@config ini 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
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:
166
Kumbia 0a generado un formulario con base en la tabla %tandarForm creando los arc0i+os controllers@clientesEcontroller 303 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.?>
167
5 adicional a estoC 0a creado el modelo corres3ondiente en el directorio models con el nombre de clientes 303:
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
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 tener so#orte ]K en 2F2 uncionen correctamente es necesario
!"#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
17:
Algo im3ortante de notar en este eBem3lo cuando generamos la grfica le dimos un directorio F3ublic@img@demo 3ngG 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
171
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ón"); 13. } 14. if($config->mode=="development"){ 15. Flash::notice("Trabajando en modo Desarrollo"); 16. } 17. 18. } 19. 20. } 21. 22.?>
17$
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>
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>
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. ?>
17-
54.3.2 createCmodelLSnombre9
Permite crear una clase Acti+e1ecord automticamente
54.3.3 createCcontrollerLSnombre9
Permite crear una clase A33lication automticamente
176
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.?>
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:
19:
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 con i!Bboot.ini QmodulesR e?tensions S f3df f3df
191
eBem3lo
con
una
acci#n
re3orte
en
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#d BindeD.#,tml
<?php echo link_to('pdf/reporte', 'Generar PDF')?>
vie%sB#d Bre#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'
19!
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) -> );
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.?>
19(
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 onc0angeST T 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)-
19-
>getCiudad(); 15. 16. 17. '$pais_id'"); 18. 19. 20. 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:
196
197
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:
!::
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ó $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
!:!
&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@+erEsugerencias 30tml 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:
!:$
1. <ul> 2. <? foreach($clientes as $cliente): ?> 3. <li id='<?php echo $cliente->id ?>'><?php echo $cliente->nombre ? ></li> 4. <? endforeach ?> 5. </ul> 6.
!:(
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
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
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.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
Patrones de >ise\o: 0tt3:@@es wiki3edia org@wiki@PatronesEdeEdiseZ;$ZD1o <A;: 0tt3:@@es wiki3edia org@wiki@<A; Acti+e1ecord: 0tt3:@@www martinfowler com@eaa;atalog@acti+e1ecord 0tml Acti+e1ecord &?3licando la "m3lementaci#n <A; !:6
!: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 announcement G 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+e G 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
!: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
!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*%
!11