Anda di halaman 1dari 211

Kumbia PHP Framework

Porque Programar debera ser ms fcil

Libro de Kumbia: Porque Programar debera ser ms fcil

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 $(

Libro de Kumbia: Porque Programar debera ser ms fcil

4so de la Funci#n DbDase::rawEconnectFG 19 $ Pro3iedades de la ;lase >bDase 19 $ 1 Hdb=I"dE;onnection 19 $ ! Hdb=Ilast1esult.uer5 19 $ $ Hdb=Idb4ser 19 $ ( Hdb=IdbHost 19 $ ' Hdb=IdbPort 19 $ - Hdb=IdbPass 19 $ 6 Hdb=Ilast&rror 19 $ 7 Hdb=Idb*ame 19 ( </todos de la ;lase >D 19 ( 1 .uer5 ;lose 19 ( ! Fetc0 Arra5 19 ( $ *um 1ows Field *ame 19 ( ( >ata %eek 19 ( ' Affected 1ows 19 ( - &rror 19 ( 6 *o &rror 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

$( $( $( $( $( $( $( $( $' $' $' $' $' $' $$$$$$6 $6 $6 $6 $7 $7 $7 $9 (: (1 (! (! (! (! ($ ($ (( (( (' (((6 (6 (6 (6 (6 (6 (7 (7 (7 (7 (7 (9 (9 (9 (9

Libro de Kumbia: Porque Programar debera ser ms fcil

!( 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 -: -: -: -: -:

Libro de Kumbia: Porque Programar debera ser ms fcil

!( 9 Persistencia -1 !( 1: Jra2a 5 >ebug en Acti+e1ecord -! !( 11 Jra2a en Pantalla -! !( 1! <ostrar &rrores en 8bBetos Acti+e1ecord -$ !( 1$ Asociaciones -$ );omo usar Asociaciones, -( !( 1$ 1 Pertenece a -( !( 1$ ! Jienes un -' !( 1$ $ Jiene muc0os -!( 1$ ( Jiene 5 3ertenece a muc0os -6 !( 1( <ulti3les cone?iones en Acti+e1ecord -7 !( 1' Paginadores -9 !( 1- Paginando en Acti+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!

Libro de Kumbia: Porque Programar debera ser ms fcil

'

!- - !! 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

Libro de Kumbia: Porque Programar debera ser ms fcil

!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

Libro de Kumbia: Porque Programar debera ser ms fcil

$' 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$-

Libro de Kumbia: Porque Programar debera ser ms fcil

$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-:

Libro de Kumbia: Porque Programar debera ser ms fcil

(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

Libro de Kumbia: Porque Programar debera ser ms fcil

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

!:6 !:7 !:9 !:9 !:9 !:9 !:9 !1: !1:

Libro de Kumbia: Porque Programar debera ser ms fcil

11

1 Agradecimientos
&ste manual es 3ara agradecer a quienes con su tiem3o 5 a3o5o en gran o en 3oca medida 0an a5udado a que este framework sea cada da meBor A todos ellos Mracias Jotales: Andres Feli3e Mutierre2 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

Libro de Kumbia: Porque Programar debera ser ms fcil

1!

2 "ntroducci#n
Kumbia naci# en un esfuer2o 3or no esfor2arme 3ara 0acer las cosas Puede sonar raro 3ero as fue 4n da em3ec/ a 0acer un 3ro5ecto de un sistema de informaci#n donde 0aban muc0os formularios 5 diBe: = &sta cosa siem3re es lo mismoC as que si 5o 0iciera algo 3ara no re3etir tanto 5 s#lo escribir lo que cambiaba en cada formulario entonces sera ms r3ido >es3u/s de 0aber terminado las funciones 3ara generar los formularios me d cuenta que 0aban quedado mu5 bien 5 entonces lo em3ec/ 0a im3lementar en otras cosas As es que Kumbia naci# de una a3licaci#n real 5 lo 3use a dis3osici#n de la ;omunidad <i trabaBo era mu5 inde3endiente del obBeti+o de sistema de informaci#n que se iba a desarrollar con los generadores de formulariosC as que me 3ro3use usarlo en otro 3ro5ecto &l resultado fue mu5 buenoC 0aba logrado desarrollar algo ms del 6:Z de un sistema de informaci#n en tan s#lo unos das &ntonces me 3use a organi2ar las funcionesC comentar el c#digo 5 meBorar la instalaci#n 3ara que 3udieran ser usadas en otros 3ro5ectos &n esa /3oca 3ro3use llamar el 3ro5ecto AuroraFormsC agregu/ alguna funcionalidad e?tra 5 decid darle 3ro3aganda en algunos foros de "nternet .uise darle un tono interesante al 3ro5ecto 3romulgu/ las facilidades que ofreca 5 3use un demo 3ara que otros 3udieran comentar sobre /l &s3eraba que muc0a gente se interesaraC 3ero lo [nico que logr/ fue muc0as crticas Oconstructi+asP &l 3ro5ecto no tena documentaci#n as que era como decirles miren lo que s/ 0acerC 3ero no les digo c#mo usarlo *o era mi intenci#n 3ero fue un error 3ublicar sin documentar "gualmente es necesario 0acer muc0as cosas 3ara crear un 3ro5ecto de software libre 5 no 3ens/ que tu+iera que tener en cuenta tantas cosas 3ara que as fuese 8tro 3aso im3ortante fue acoger la licencia M*4@MPL en +e2 de otraC como la D%> o la <"JC que aunque son menos restricti+as no fa+orecen el mo+imiento del software libre 5 eso es algo que quise transmitir con el 3ro5ecto Pienso que el software libre 3ermite crear el ambiente de colaboraci#n ideal que quera lograr con el 3ro5ectoC liberar las ideas 3ermite que otros inter+engan 5 busquen el camino ideal es3erando a3ortar 5 a5udar con algo que le 3ueda ser+ir a toda la comunidad Duscar la meBor forma de 0acer las cosas a +eces 3uede resultar difcilC 3ues si encontramos algunaC que 3robablemente 3are2ca la meBorC no siem3re es ace3tada 3or los dems 5 terminan rec0a2ando las ideas que queremos +enderC as demos todos los argumentos del caso Jiem3o des3u/s fui contratado 3ara desarrollar un software algo grande 5 que 3atrocinaba el esfuer2o de trabaBar en Kumbia &l resultado fue mu5 buenoC siem3re me em3e\o en dar lo meBor cuando trabaBo en un 3ro5ectoC as que el framework em3e2# a crecer 5 la funcionalidad agregada forma gran 3arte de lo que 0o5 es como tal

Libro de Kumbia: Porque Programar debera ser ms fcil

1$

JrabaBar en una a3licaci#n real con caractersticas +erstiles increment# la estabilidad 5 las soluciones creadas 3ara necesidades reales aument# su funcionalidad Alg[n tiem3o des3u/s fue agregado el 3ro5ecto a 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

Libro de Kumbia: Porque Programar debera ser ms fcil

1(

3 %obre &l Libro de Kumbia


&l libro de Kumbia es un intento 3or comunicar todo lo que este framework 3uede 0acer 3or usted Le 3ermite descubrir todos los rincones 5 a3render 3or qu/ Kumbia 3uede ser la 0erramienta que estaba es3erando 3ara em3e2ar a desarrollar su 3ro5ecto ;umbia es el nombre de un ritmo musical del ;aribe 5 Kumbia es un 3roducto colombiano 3ara el mundo Programar debe ser tan bueno como bailar 5 Kumbia es un baileC un baile 3ara 3rogramar ;ada da el libro sigue tomando +alor gracias a los a3ortes de la comunidad NOTA: Este libro se tratan los nuevos avances de la versin 0.5 de kumbia, de la misma orma se a!radece a la comunidad "ue acom#a$a a este rame%ork, "ue noti i"uen las me&oras de manera "ue el #ro'ecto si!a creciendo.

Libro de Kumbia: Porque Programar debera ser ms fcil

1'

( )*ue+o en uso de Frameworks,


(.1 )*u+ ,ace un -rame%ork.

>efine una Filosofa de JrabaBo Pro3orciona libreras 5 funciones que deberan 0acer la +ida del 3rogramador ms feli2 A0orrar trabaBo 5 tiem3o Producir a3licaciones ms fciles de mantener &+itar c#digo du3licado ;rear A3licaciones <ulti=;a3a

(.2 /eali0ar a#licaciones orientadas a 1suarios


Preocu3arse 3or interfacesC l#gica 5 3rocesos ms intuiti+os 5 3rcticos 3ara usuarios 4sar frameworks 3ara e+itar estar 3ensando en los OdetallesP 5 facilitar el trabaBo Duscar en qu/ manera 3odra ser ms fcilC sin que aumente el trabaBo considerablemente Atacar necesidades reales 5 no desarrollar en su3uestos de utilidad %er fantico de la 3roducti+idad

(.3 )2or "u+ 3umbia ' no otro -rame%ork.


"m3lementa los meBores 3atrones de 3rogramaci#n orientados a la Web Fomenta la utili2aci#n de caractersticas Web ! : en nuestro software Hace la ma5or 3arte del trabaBo 5 se ocu3a de los OdetallesP <antener una a3licaci#n es ms fcil &s software libreC 3or lo tanto obtiene todas las +entaBas que /ste 3ro3orciona %u >ocumentaci#n esta 3rinci3almente en es3a\ol

Libro de Kumbia: Porque Programar debera ser ms fcil

1-

5 %obre Kumbia
Kumbia es un web framework libre escrito en PHP' Dasado en las meBores 3rcticas de desarrollo webC usado en software comercial 5 educati+oC Kumbia fomenta la +elocidad 5 eficiencia en la creaci#n 5 mantenimiento de a3licaciones webC reem3la2ando tareas de codificaci#n re3etiti+as 3or 3oderC control 5 3lacer %i 0a +isto a 1ub5=1ails@P5t0on=>Bango encontrar a Kumbia una alternati+a 3ara 3ro5ectos en PHP con caractersticas como:

%istema de Plantillas sencillo Administraci#n de ;ac0/ %caffolding A+an2ado <odelo de 8bBetos 5 %e3araci#n <A; %o3orte 3ara AUAV Meneraci#n de Formularios ;om3onentes Mrficos %eguridad

5 muc0as cosas ms Kumbia 3uede ser la soluci#n que est buscando &l n[mero de 3rerrequisitos 3ara instalar 5 configurar es mu5 3eque\oC a3enas 4ni? o Windows con un ser+idor web 5 PHP' instalado Kumbia es com3atible con motores de base de datos como <5%.LC Postgre%.L 5 8racle 4sar Kumbia es fcil 3ara 3ersonas que 0an usado PHP 5 0an trabaBado 3atrones de dise\o 3ara a3licaciones de "nternet cu5a cur+a de a3rendi2aBe est reducida a un da &l dise\o lim3io 5 la fcil lectura del c#digo se facilitan con Kumbia >esarrolladores 3ueden a3licar 3rinci3ios de desarrollo como >1YC K"%% o VPC enfocndose en la l#gica de a3licaci#n 5 deBando atrs otros detalles que quitan tiem3o Kumbia intenta 3ro3orcionar facilidades 3ara construir a3licaciones robustas 3ara entornos comerciales &sto significa que el framework es mu5 fle?ible 5 configurable Al escoger Kumbia esta a3o5ando un 3ro5ecto libre 3ublicado baBo licencia M*4@MPL

Libro de Kumbia: Porque Programar debera ser ms fcil

16

4 Kumbia en su Punto
4.1 5ntroduccin
Kumbia es un framework PHP' basado en el modelo <A; Permite la se3araci#n de las reglas de negocioC l#gica de a3licaci#n 5 +istas de 3resentaci#n de una a3licaci#n web Adems 3osee otras 0erramientas 5 clases que a5uden a acortar el tiem3o de desarrollo de una a3licaci#n web

4.2 )*u+ es un -rame%ork.


&n el desarrollo de softwareC un framework es una estructura de so3orte definida en la cual otro 3ro5ecto de software 3uede ser organi2ado 5 desarrollado J3icamenteC un framework 3uede incluir so3orte de 3rogramasC libreras 5 un lenguaBe de scri3ting entre otros software 3ara a5udar a desarrollar 5 unir los diferentes com3onentes de un 3ro5ecto 4n framework agrega funcionalidad e?tendida a un lenguaBe de 3rogramaci#n] /staC automati2a muc0os de los 3atrones de 3rogramaci#n 3ara orientarlos a un determinado 3ro3#sito 4n framework 3ro3orciona una estructura al c#digo 5 0ace que los desarrolladores escriban c#digo meBorC ms entendible 5 mantenible Adems 0ace la 3rogramaci#n ms fcilC con+irtiendo com3leBas funciones en sencillas instrucciones &st usualmente escrito en el lenguaBe que e?tiende Kumbia est escrito en PHP' 4n framework 3ermite se3arar en ca3as la a3licaci#n &n generalC di+ide la a3licaci#n en tres ca3as: La l#gica de 3resentaci#n que administra las interacciones entre el usuario 5 el software La L#gica de >atos que 3ermite el acceso a un agente de almacenamiento 3ersistente u otros

La l#gica de dominio o de negocioC que mani3ula los modelos de datos de acuerdo a los comandos recibidos desde la 3resentaci#n

Los Web framework 3retenden facilitar el desarrollo de A3licaciones web F sitios webC intranetsC etcG PHP es conocido 3or su sim3licidad 5 es am3liamente usado en este cam3o %#lo PHP 3uede utili2ar casi cualquier motor de base de datosC administrar sesionesC acceder a arc0i+os del ser+idorC etcC 3ero cuando las a3licaciones crecen 5 su com3leBidad aumenta un framework sol+enta muc0os 3roblemas 5 facilita muc0as tareas

Libro de Kumbia: Porque Programar debera ser ms fcil

17

6 Kumbia +s 8tros Frameworks


&n un mercado inundado de frameworks <A; que 3rometen ser la soluci#n de desarrollo a cualquier ti3o de 3ro5ectoC Kumbia 3retende ser una soluci#n a cualquier ti3o de 3ersona desde el 3rinci3ianteC 3asando 3or el desarrollador que no tiene tiem3o 3ara a3render un nue+o frameworkC 0asta la em3resa de desarrollo de software Lo im3ortante es que e?ista una necesidad 5 que Kumbia 3ueda a5udarte a 0acerla realidad Kumbia es inno+ador 5 su 3rinci3al enfoque es desarrollar 0erramientas 5 escribir cada com3onente del framework 3ensando en que sea fcil de usar 3ara cualquiera que lea su documentaci#n ;ualquier framework 3ara la Web res3etable tiene una a3licaci#n del 3atr#n <A;C un 81< F<a3eo obBeto relacionalGC generaci#n de logsC enrutamientoC 3lantillasC facilidades Ba+ascri3tC uso de aBa? 5 otras cosillas ms &ntoncesC )cul es la diferencia, La diferencia est en cunto tiem3o dedicas a leer su documentaci#nC cuntas +eces debes recurrir a ellaC cuntas +eces debes recordar sinta?is com3leBaC 5 lo ms im3ortante: )>es3u/s de cunto tiem3o obtienes resultados, Je in+itamos a com3arar a Kumbia con otros frameworks 5 darte cuentaC c#mo usando otras 0erramientasC escribes ?C 5C 2 c#digoC 0aces 1C !C $C etc 3asos 3ara 0acer una sim3le tarea 5 c#mo en Kumbia esto est reducido a su mnima unidad con lo que te 0aces ms 3roducti+oC a3rendes ms r3ido 5 das meBores soluciones antici3ndote a la com3etencia

Libro de Kumbia: Porque Programar debera ser ms fcil

19

7 ).u/ es Kumbia,
Kumbia es un esfuer2o 3or 3roducir un framework que a5ude a reducir el tiem3o de desarrollo de una a3licaci#n web sin 3roducir efectos sobre los 3rogramadores &st basado en los siguientes conce3tos:

;om3atible con muc0as 3lataformas Fcil de instalar 5 configurar Fcil de a3render Listo 3ara a3licaciones comerciales ;on+enci#n sobre ;onfiguraci#n %im3le en la ma5or 3arte de casos 3ero fle?ible 3ara ada3tarse a casos ms com3leBos %o3ortar muc0as caractersticas de A3licaciones Web Actuales %o3ortar las 3racticas 5 3atrones de 3rogramaci#n mas 3roducti+os 5 eficientes Producir a3licaciones fciles de mantener Dasado en %oftware Libre

&l 3rinci3al 3rinci3io es 3roducir a3licaciones que sean 3rcticas 3ara el usuario final 5 no s#lo 3ara el 3rogramador La ma5or 3arte de tareas que le quiten tiem3o al desarrollador deberan ser automati2adas 3or Kumbia 3ara que /l 3ueda enfocarse en la l#gica de negocio de su a3licaci#n *o deberamos rein+entar la rueda cada +e2 que se afronte un nue+o 3ro5ecto de software Para satisfacer estos obBeti+os Kumbia est escrito en PHP' Adems 0a sido 3robado en a3licaciones reales que trabaBan en di+ersas reas con +ariedad de demanda 5 funcionalidad &s com3atible con las bases de datos dis3onibles actuales mas usadas:

<5%.L Postgre%.L 8racle

&l modelo de obBetos de Kumbia es utili2ado en tres diferentes ca3as:


Abstracci#n de la base de datos <a3eo 8bBeto=1elacional <odelo <A; F<odeloC AistaC ;ontroladorG

;aractersticas comunes de A3licaciones Web son automati2adas 3or Kumbia:


Plantillas FJem3lateAiewG Aalidaci#n de Formularios Administraci#n de ;ac0/ %caffolding "nteracci#n AUAV Meneraci#n de Formularios &fectos Aisuales %eguridad !:

Libro de Kumbia: Porque Programar debera ser ms fcil

Kumbia utili2a otros 3ro5ectos de software libre 3ara com3lementar su funcionalidad:


FP>F: 1e3ortes en formato P>F Protot53e: Ua+ascri3t crossbrowser %cri3taculous: &fectos +isuales PHP<ailer: ;orreo &lectr#nico %mart5: <otor de Plantillas 3otente 5 fcil de usar

Se tiene previsto que para la version 0.6 del framwork se migre de framework para el manejo de AJAX hacia JQuer .

Libro de Kumbia: Porque Programar debera ser ms fcil

!1

8 )&st 0ec0o kumbia 3ara m,


*o im3orta si usted es el e?3erto en PHP' o un 3rinci3ianteC lo que im3orta es el tama\o del 3ro5ecto que quiera desarrollar %i +a a crear un software 3eque\o de ms o menos 1: 3ginas con acceso limitado a bases de datosC sin obligaci#n en desem3e\o 5 dis3onibilidadC entonces 3uede utili2ar PHP sin Kumbia

;on Kumbia 3uede crear a3licaciones grandes o medianasC con l#gica de negocios com3leBa 5 alta dis3onibilidad en donde PHP soloC no sera suficiente %i 3lanea mantener o e?tender sus a3licaciones en el futuro 5 necesita c#digo li+ianoC entendible 5 efecti+o %i desea dedicar tiem3o al dise\o 5 usabilidad de su a3licaci#n 5 ol+idarse de los detalles %i desea usar las [ltimas caractersticas en interacci#n con el usuario Fcomo AUAVG en forma intuiti+a sin tener que escribir cientos de lneas de Ua+a%cri3t %i quiere desarrollar r3ido 5 con buena calidad

&n estos casos Kumbia est 0ec0o 3ara usted

Libro de Kumbia: Porque Programar debera ser ms fcil

!!

10 *ue+e 1a2ones 3ara 4sar Kumbia


19 Es mu' -:cil de 1sar: &m3e2ar con Kumbia es demasiado fcilC es s#lo descom3rimir 5 em3e2ar a trabaBar 29 /ealmente A!ili0amos Traba&o ;rear una a3licaci#n mu5 funcional con KumbiaC es cuesti#n de 0oras o minutosC as que 3odemos darle gusto a nuestros clientes sin que afecte nuestro tiem3o Mracias a las m[lti3les 0erramientas que 3ro3orciona el framework 3ara agili2ar el trabaBo 3odemos 0acer ms en menos tiem3oC 39 ;e#arar la <!ica de la 2resentacin. 4na de las meBores 3rcticas de desarrollo orientado a la Web es se3erar la l#gicaC de los datos 5 la 3resentaci#nC con Kumbia es sencillo a3licar el 3atr#n <A;F<odeloC AistaC ;ontroladorG 5 0acer nuestras a3licaciones mas fciles de mantener 5 de crecer (9 /educcin del uso de otros <en!ua&es: Mracias a los Hel3ers 5 a otros 3atrones como Acti+e1ecord e+itamos el uso de lenguaBes %.L o HJ<L Fen menor 3orcentaBeGC 5a que Kumbia 0ace esto 3or nosotrosC con esto logramos c#digo mas claroC natural 5 con menos errores 59 =3umbia ,abla Es#a$ol>: La documentaci#nC mensaBes de errorC arc0i+os de configuraci#nC comunidadC desarrolladoresC KK0ablan es3a\olLLC con esto no tenemos que entender a medias otros Frameworks o quedarnos cru2ados de manos 3orque no 3odemos 3edir a5uda 49 A#render a usar 3umbia es cuestin de 1 d?a: ;uando Leemos toda la documentaci#n no tardamos ms de 1 daC esto nos 3ermite ado3tar todo su 3oder sin 3erder tiem3o le5endo largas guas 69 ;in darnos cuenta a#licamos los 2atrones de dise$o de moda: Los 3atrones de dise\o son 0erramientas que facilitan el trabaBo reali2ando abstracci#nC reduciendo c#digo o 0aciendo ms fcil de entender la a3licaci#n ;uando trabaBas en Kumbia a3licas muc0os 3atrones 5 al final te das cuenta que eran mas fciles de usar de lo que se escuc0aban 79 3umbia es so t%are <ibre: *o tienes que 3reocu3arte 3or licenciar nadaC Kumbia 3romue+e las comunidades de a3rendi2aBeC el conocimiento es de todos 5 cada uno sabe c#mo a3ro+ec0arlo meBor 89 A#licaciones /obustas, )no sab?a "ue ten?a una.: A3licaciones em3resariales requieren arquitecturas robustasC Kumbia 3ro3orciona una arquitectura fcil de a3render 5 de im3lementar sin com3licarnos con conce3tos raros o rebuscados

Libro de Kumbia: Porque Programar debera ser ms fcil

!$

11 "nstalando Kumbia
11.1 2rerre"uisitos
&s necesario instalar el la mquina con Windows !:::@VP@!::$ # Linu?@4*"V un ser+idor Web A3ac0e en cualquier +ersi#n Puedes utili2ar ""% con "sa3iE1ewrite instalado "nstalar PHP'^ Frecomendado ' !G 5 alg[n motor de base de datos so3ortado si se necesitase

11.2 5nstalando
Kumbia se distribu5e en un 3aquete com3rimido listo 3ara usar %e 3uede descargar la [ltima +ersi#n de 0tt3:@@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

11.3 Aon i!uracin de A#ac,e


Kumbia utili2a un m#dulo llamado modErewrite 3ara la utili2aci#n de 41L% ms entendibles 5 fciles de recordar en nuestras a3licaciones Por estoC el m#dulo debe ser configurado e instalado en A3ac0e Para estoC debe c0equear que el m#dulo est/ 0abilitado Para 0abilitar el m#dulo distribuciones M*4@Linu?
_ a!enmod rewrite Luego debemos editar el arc0i+o de configuracion de a3ac0eC esto con la finalidad que el ser+idor web tenga la ca3acidad de leer los arc0i+os .,taccess, en la +ersion ! ! ? de a3ac0e el arc0i+o se encuentra BetcBa#ac,e2Bsites@availableBde ault

Libro de Kumbia: Porque Programar debera ser ms fcil

!(

<Directory /> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> &n el >ocument1oot F>irectorio 1a2 de A3ac0eG debe lle+ar la o3ci#n Allo%Override All

3ara que A3ac0e lea el arc0i+o .,taccess 5 llame a modCre%rite. Posterior a esto 0a5 que indicar al ser+idor web cual ser el orden de 3referencias en cuanto a los arc0i+os inde?C 3or defecto en 3rimer orden se eBecutan los arc0i+os indeD.,tml esto 0a5 que cambiarlo 3or indeD.#,# &n +ersion ! ! ? de a3ac0e solo 0a5 que editar el arc0i+o que se encuentra BetcBa#ac,e2Bmods@enabledBdir.con
1. DirectoryIndex index.php index.html ...

11.3.1 )2or "u+ es im#ortante Eod@/e%rite.


1eWrite es un m#dulo de a3ac0e que 3ermite reescribir las urls que 0an utili2ado nuestros usuarios a otras ms com3licadas 3ara ellos Kumbia enca3sula esta com3leBidad 3ermiti/ndonos usar 41L% bonitas o lim3ias como las que +emos en blogs o en muc0os sitios donde no a3arecen los , # los ` o las e?tensiones del ser+idor F 303C as3C as3?C etcG Adems de estoC con mod=rewriteC kumbia 3uede 3roteger nuestras a3licaciones ante la 3osibilidad de que los usuarios 3uedan +er los directorios del 3ro5ecto 5 3uedan acceder a arc0i+os de clasesC modelosC l#gicaC etcC sin que sean autori2ados ;on mod=rewrite el [nico directorio que 3ueden +er los usuarios es el contenido del directorio 3ublicC el resto 3ermanece oculto 5 s#lo 3uede ser +isuali2ado cuando 0a reali2ado una 3etici#n en forma correcta 5 tambi/n es correcto seg[n nuestra l#gica de a3licaci#n ;uando escribes direcciones utili2ando este ti3o de 41LsC ests a5udando tambi/n a los motores de b[squeda a inde?ar meBor tu informaci#n !"#A$ Se tra%aja actualmente para que este requisito no sea indispensa%le& se estima que esta mejora ser' incorporada en la versi(n 0.6 del framework& de manera que se pueda utili)ar el framework en servidores compartidos o en aquellos hosting que no ofrecen este m(dulo de apache

Libro de Kumbia: Porque Programar debera ser ms fcil

!'

11.( Aon i!uracin de 2F2


Actualmente Kumbia no necesita configuraciones es3eciales de PHP

11.5 2or"ue 3umbia utili0a 2F25.


Kumbia trabaBa s#lo con PHP' PHP' es la +ersi#n ms a+an2adaC estable 5 es el futuro de este lenguaBe Posee un so3orte ms com3leto a la orientaci#n a obBetosC iteradoresC e?ce3ciones 5 un so3orte a ?ml ms 3otente 4suarios que quieran dar un toque realmente 3rofesional a sus a3licaciones sabrn +alorar las cualidades de PHP' 5 abandonarn el uso de PHP( Alguna +e2 se 3ens# en desarrollar una +ersi#n es3ecifica de Kumbia 3ara PHP(C sin embargo esto era dar un 3aso atrs Ho5 en daC el ma5or 3roblema que tiene PHP' es el 3aso a ser+idores de 0osting com3artido con esta +ersi#nC que 0o5 en da mantienen com3atibilidad con PHP(C 5a que el cambio generara 3roblemas con a3licaciones e?istentes en ellas Pero esto 3oco a 3oco se deBa atrs 5 cada +e2 ms ser+idores tienen la ultima +ersi#n de PHP

11.4 Aon i!uracin de E';*<


;uando se utili2a una base de datos <Y%.L' debe +erificarse que el sqlEmode no est/ en modalidad estricta Para +alidar esto debe ingresar a la lnea de comando de <Y%.L': m5sql =0 local0ost =u root =3 5 luego eBecutar el siguiente select: m5sqlI select XXglobal sqlEmode] >e3endiendo de la configuraci#n que tenga le dar un resultado 3arecido a esto: ^=============================================== ^ a XXglobal sqlEmode ^=============================================== ^ a %J1";JEALLEJADL&% ^=============================================== ^ a a

Para cambiar este 3armetroC a uno adecuado al frameworkC debe eBecutar el siguiente comando:

m5sqlI set Qglobal a sessionR sqlEmode S ] o cambiar la configuraci#n del arc0i+o m'.ini en su sistema o3erati+o Para +er otros 3armetros +er el siguiente enlace Q1R

11.6 5nstalacin ' Aon i!uracin con Oracle


Kumbia trabaBa con la e?tensi#n de PHP 8;"7 &stas funciones le 3ermiten acceder a bases de datos 8racle 1:C 8racle 9C 8racle 7 5 8racle 6 usando la "nterfa2 de Llamados 8racle F8;" 3or sus siglas en "ngl/sG &llas so3ortan la +inculaci#n de +ariables PHP a Libro de Kumbia: Porque Programar debera ser ms fcil !-

reci3ientes 8racleC tienen so3orte com3leto L8DC F"L& 5 18W">C 5 le 3ermiten usar +ariables de definici#n entregadas 3or el usuario Para que 8;"7 trabaBe es necesario instalar el cliente instantneo de oracle Luego 0a5 que agregar a la +ariable de entorno PAJH del sistema la ruta a donde fue descom3rimido el cliente instantneo 2ATFGH2ATF HIc:Jinstantclient10C2J 1einiciar A3ac0e

Advertencia: &n 8racle la funcionalidad limit 3odra no funcionar como se es3era 4tilice la condici#n rownum c numeroEfilas 3ara 0acer esto.

11.7 Ketalles Es#ec? icos #ara ;O


"nstalando Kumbia en VA<PP en Windows
&l 3rocedimiento 3ara instalar VA<PP en Windows es el siguiente: 1 >escargar VA<PP de A3ac0e Friends ! "nstalar VA<PP b Habitilitar "nstalar A3ac0e 5 <5%.L como %er+icio $ &ditar el arc0i+o c:\Archivos de Programa\xampp\apache\conf\httpd.conf ( >escomentar L"uitar el M9 de la lnea donde dice: LoadModule rewrite_module modules/mod_rewrite.so ' 1einiciar el ser+icio de A3ac0e desde el Panel de ;ontrol de VA<PP - ;o3iar el 3aquete de Kumbia a: c:\Archivos de Programa\xampp\apache\htdocs\ 6 ;ontinuar *ormalmente

"nstalando Kumbia en VA<PP en M*4@Linu?


&l 3rocedimiento 3ara instalar VA<PP en cualquier distribuci#n M*4@Linu? es el siguiente: 1 ! $ ( >escargar VA<PP de A3ac0e Friends "nstalar VA<PP ;o3iar el 3aquete de 3umbia a Bo#tBlam##B,tdocsB ;ontinuar la instalaci#n normalmente

"nstalando Kumbia en >ebian@4buntu Linu?


"nstala A#ac,e2NE';*<5N2F25 si no lo tienes instalado usando la gua en este blog o en 4buntu=es &n KebianB1buntu tienes que usar el comando 3ara 0abilitar modCre%rite en A#ac,e: 5 luego en editas el arc0i+o:
/etc/apache2/sites-enabled/000-default 1. # a2enmod rewrite

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

1einicias A3ac0e con:


# /etc/init.d/apache2 restart

;ontinuar normalmente

12 ;reaci#n de Pro5ectos
12.1 5ntroduccin
&n Kumbia un 3ro5ecto es un conBunto de ser+icios que com3arten un nombre de dominio 5 un conBunto de modelos de datos &n un 3ro5ecto las o3eraciones estn l#gicamente agru3adas en controladoresC /stos 3ueden trabaBar inde3endientemente o de forma distribuida con los otros del mismo 3ro5ecto Probablemente una a3licaci#n contenga al menos ! controladores que administren el front 5 el back office de un 3ro5ecto 4n controlador re3resenta una o ms 3ginas con un mismo 3ro3#sito <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.2 5niciar un 2ro'ecto


0tt3:@@www assembla com@wiki@s0ow@kumbia@Parte1=;a3itulo(

12.3 >irectorios de Kumbia


0tt3:@@www assembla com@wiki@s0ow@kumbia@Parte1=;a3itulo(

12.( 8tros >irectorios


0tt3:@@www assembla com@wiki@s0ow@kumbia@Parte1=;a3itulo(

12.5 1esumen
%i 3ensamos en con+enci#n sobre configuraci#nC entonces 3odemos tambi/n 3ensar que mientras todo est/ en su lugarC meBorar el orden de la a3licaci#n 5 ser ms fcil encontrar 3roblemasC 0abilitar@in0abilitar m#dulos 5 en sntesis mantener la a3licaci#n

Libro de Kumbia: Porque Programar debera ser ms fcil

!7

13 &?3licando la ;onfiguraci#n
13.1 5ntroduccin
Kumbia 3osee una configuraci#n 3or defecto que debe funcionar bien en la ma5or 3arte de casos aunque /sta 3uede 3ersonali2arse de acuerdo a necesidades es3ecficas de cada 3ro5ecto %e 0a 3ensado en configurar al mnimo 3ara 3oder em3e2ar 0a trabaBar 5 deBar que Kumbia escoBa la configuraci#n ms #3tima Kumbia utili2a arc0i+os formato ini 3ara 0acer la configuraci#n ,tt#:BB%%%.assembla.comB%ikiBs,o%BkumbiaB2arte1@Aa#itulo(

1( A 3artir de un <odelo <A;


&n 1969C Jr5g+e 1eenskaug desarroll# una arquitectura 3ara desarrollar a3licaciones interacti+as &n este dise\o e?istan tres 3artes: modelosC +istas 5 controladores &l modelo <A; 3ermite 0acer la se3araci#n de las ca3as de interfa2C modelo 5 l#gica de control de /sta La 3rogramaci#n 3or ca3asC es un estilo de 3rogramaci#n en la que el obBeti+o 3rimordial es la se3araci#n de la l#gica de negocios de la l#gica de dise\oC un eBem3lo bsico de esto es se3arar la ca3a de datos de la ca3a de 3resentaci#n al usuario La +entaBa 3rinci3al de este estiloC es que el desarrollo se 3uede lle+ar a cabo en +arios ni+eles 5 en caso de alg[n cambio s#lo se ataca al ni+el requerido sin tener que re+isar entre c#digo me2clado Adems 3ermite distribuir el trabaBo de creaci#n de una a3licaci#n 3or ni+elesC de este modoC cada gru3o de trabaBo est totalmente abstrado del resto de ni+elesC sim3lemente es necesario conocer la AP" F"nterfa2 de A3licaci#nG que e?iste entre ni+eles La di+isi#n en ca3as reduce la com3leBidadC facilita la reutili2aci#n 5 acelera el 3roceso de ensamblar o desensamblar alguna ca3aC o sustituirla 3or otra distinta F3ero con la misma res3onsabilidadG &n una a3licaci#n Web una 3etici#n se reali2a usando HJJP 5 es en+iado al controlador &l controlador 3uede interactuar de muc0as formas con el modeloC luego el 3rimero llama a la res3ecti+a +ista Finterfa2 de usuarioG la cual obtiene el estado del modelo 5 lo muestra al usuario en una res3uesta HJJP

Libro de Kumbia: Porque Programar debera ser ms fcil

!9

15 &?3licando la "m3lementaci#n <A;


15.1 "ntroducci#n
Kumbia a3ro+ec0a los meBores 3atrones de 3rogramaci#n orientada a la web en es3ecial el 3atr#n <A; F<odelosC AistaC ;ontroladoresG &ste ca3tulo describe el funcionamiento general de este 3aradigma en Kumbia &l obBeti+o de este 3atr#n es el reali2ar 5 mantener la se3araci#n entre la l#gica de nuestra a3licaci#nC los datos 5 la 3resentaci#n &sta se3araci#n tiene algunas +entaBas im3ortantesC como:

Podemos identificar ms fcilmente en qu/ ca3a se est 3roduciendo un 3roblema con s#lo saber su naturale2a Podemos crear +arias 3resentaciones sin necesidad de escribir +arias +eces la misma l#gica de a3licaci#n

;ada 3arte funciona inde3endiente 5 cualquier cambio centrali2a el efecto sobre las demsC as que 3odemos estar seguros que una modificaci#n en un com3onente reali2ar bien las tareas en cualquier 3arte de la a3licaci#n

Libro de Kumbia: Porque Programar debera ser ms fcil

$:

15.2 Aonce#tos
La base de Kumbia es el EOAC un tradicional 3atr#n de dise\o que funciona en tres ca3as: Eodelos: 1e3resentan la informaci#n sobre la cual la a3licaci#n o3eraC su l#gica de negocios Oistas: Aisuali2an el modelo usando 3ginas Web e interactuando con los usuarios de /stas Aontroladores: 1es3onden a acciones de usuario e in+ocan cambios en las +istas o en los modelos seg[n sea necesario

&n Kumbia los controladores estn se3arados en 3artesC llamadas front controller 5 un en un conBunto de acciones ;ada acci#n sabe c#mo reaccionar ante un determinado ti3o de 3etici#n Las +istas estn se3aradas en la5outsC tem3lates 5 3artials &l modelo ofrece una ca3a de abstracci#n de la base de datos utili2ada adems dan funcionalidad agregada a datos de sesi#n 5 +alidaci#n de integridad relacional &ste modelo a5uda a se3arar el trabaBo en l#gica de negocios FmodelosG 5 la 3resentaci#n FAistasG Por eBem3loC si usted tiene una a3licaci#n que corra tanto en equi3os de escritorio 5 en dis3ositi+os de bolsillo entonces 3odra crear dos +istas diferentes com3artiendo las mismas acciones en el controlador 5 la l#gica del modelo &l controlador a5uda a ocultar los detalles de 3rotocolo utili2ados en la 3etici#n FHJJPC modo consolaC 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

Libro de Kumbia: Porque Programar debera ser ms fcil

$1

14 Primera A3licaci#n en Kumbia


El #resente ca#?tulo tiene como ob&etivo entender la creacin de una #rimera a#licacin usando 3umbia, "ue nos servir: #ara entender la ar"uitectura EOA ' al!unos caracter?sticas interesantes. Nuestra 2rimera A#licacin

16 <odelos 5 Dases de >atos en Kumbia


16.1 "ntroducci#n
Kumbia 3osee una doble ca3a de abstracci#n de base de datos La 3rimera mantiene un acceso uniforme que e+ita reescribir c#digo en caso de cambiar el motor de almacenamiento 5 la segunda llamada Acti+e1ecord que est basada en su anlogo de 1ails] 3ermite ma3ear las relaciones de la base de datos a obBetos &ste ma3eo 3ermite el fcil acceso 5 modificaci#n de las relaciones de la base de datos &ste ca3tulo e?3lica la creaci#n de estos obBetosC la forma en que trabaBan 5 c#mo integrarlos con las dems 3artes de la arquitectura

16.2 ;a3a de Abstracci#n "nde3endiente


Kumbia 3osee una 3rimera ca3a que e+ita la reescritura del c#digo que accede a bases de datos en caso de cambiar de un motor a otro Posee todas las funciones bsicas 3ara efectuar o3eraciones sobre tablasC mantener cone?ionesC eBecutar consultasC etc sin 3erder inde3endencia &sta ca3a funciona baBo la ca3a obBeto relacional 5 es am3liamente usada 3or todo el framework >ebera ser usada en caso de necesitar un acceso de baBo ni+el a la base de datos 8tra +entaBa es que cursores 5 streams de cone?i#n son enca3sulados en obBetos e+itando escribir c#digo re3etiti+o

16.3 Ada3tadores Kumbia


<ientras estos ada3tadores est/n dis3onibles se 3uede tener acceso a un motor de base de datos en 3articular Actualmente e?isten: <5%.LC Postgre%.L FDetaG 5 8racle FbetaG

Libro de Kumbia: Porque Programar debera ser ms fcil

$!

17 &squema de Acceso a Dases de >atos en Kumbia

17.1 Eodelos
La segunda ca3a de abstracci#n de datos utili2a un ma3eo obBeto@relacional 3ara re3resentar las entidades del modelo de datos en nuestras a3licaciones &stos modelos son 3arte integral de la arquitectura <A; F<odel Aiew ;ontrollerG 5 estn basados en el 3atr#n Acti+e1ecord ;aractersticas de los modelos: "m3lementan las clases de la ca3a de negocios: ProductosC ;lientesC FacturasC &m3leadosC etc <antienen los datos 5 su l#gica Buntos: 4n 3roducto tiene una cantidad 5 se +ende s#lo si est acti+o 1e3resentar relaciones en el modelo: 4na ;liente tiene muc0as Facturas

Libro de Kumbia: Porque Programar debera ser ms fcil

$$

18 Acceso >irecto a 1>D<%


18.1 La ;lase >dDase
La clase PKbQaseR 3ersonali2ada 3ara cada motor es cargada automticamente 5 est dis3onible globalmente &l +alor database.t'#e en con i!Benvironment.iniC indica qu/ dri+er se debe cargar automticamente

18.2 Arear una instancia de KbQase 4so de la Funci#n DbDase::rawEconnectFG


Ya que los 3armetros de cone?i#n de la base de datos estn definidos en con i!Benvironment.ini 3odemos utili2ar esta funci#n 3ara crear el obBeto db
&Bem3lo: 1. <?php 2. $db = DbBase::raw_connect(); 3. ?>

18.3 Pro3iedades de la ;lase >bDase


18.3.1 Sdb@T5dCAonnection
Posee una referencia al stream de cone?i#n a la base de datos

18.3.2 Sdb@Tlast/esult*uer'
4ltima sentencia %.L eBecutada en la base de datos en la instancia

18.3.3 Sdb@Tdb1ser
4suario de la base de datos utili2ado 3ara crear la cone?i#n

18.3.( Sdb@TdbFost
Host de la base de datos utili2ado 3ara crear la cone?i#n

18.3.5 Sdb@Tdb2ort
Puerto de la base de datos utili2ado 3ara crear la cone?i#n

18.3.4 Sdb@Tdb2ass
Password del 4suario de la base de datos utili2ado 3ara crear la cone?i#n

Libro de Kumbia: Porque Programar debera ser ms fcil

$(

18.3.6 Sdb@TlastError
eltimo error generado 3or el motor de la base de datos 3roducido en alguna o3eraci#n %.L

18.3.7 Sdb@TdbName
*ombre de la base de datos actual

18.( </todos de la ;lase >D


18.(.1 *uer'
Kescri#cin: Permite en+iar sentencias %.L al motor de base de datos &l 3armetro debug 3ermite +er un mensaBe del %.L que es en+iado al motor de base de datos Sintaxis: Hdb=Iquer5Fstring HsqlC Qbool HdebugSfalseRG &Bem3lo:
1. <?php 2. 3. 4. ?> $db = DbBase::raw_connect(); $db->query(update clientes set estado = A);

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

18.(.2 -etc, Arra'


Kescri#cin: 1ecorre el cursor eBecutado en la [ltima o3eraci#n select Sintaxis: Hdb=Ifetc0Earra5FQcursor HcursorRC Qint Hti3oEresultadoS>DED8JHRG &Bem3lo:
1. <?php 2. 3. 4. 5. 6. 7. 8. ?> $db = DbBase::raw_connect(); $db->query(select codigo, nombre from productos); while($producto = $db->fetch_array()){
print$producto[nombre !

}//fin while $db->close();

Los ti3os de resultado 3ueden ser:

Libro de Kumbia: Porque Programar debera ser ms fcil

$'

db::KQCA;;OA: Arra5 con ndices asociati+os de los nombres de los cam3os db::KQCN1E: Arra5 con ndices num/ricos que indican la 3osici#n del cam3o en el select db::KQCQOTF: Arra5 con ndices tanto num/ricos como asociati+os

18.(.3 Num /o%s


Kescri#cin: >e+uel+e el n[mero de filas de la [ltima instrucci#n select en+iada al motor de base de datos Sintaxis: Hdb=InumErowsFQcursor HcursorRG] &Bem3lo:
1. <?php 2. $db = DbBase::raw_connect(); 3. $db->query(select codigo, nombre from productos); 4. print "#a$ %.$db&'num(rows)*." productos "! 5. $db->close(); 6. ?>

-ield Name
Kescri#cin: >e+uel+e el nombre del cam3o en la 3osici#n Hnumber del [ltimo select en+iado al motor de base de datos Sintaxis:
1. $db->field_name(int $number, [cursor $cursor]);

18.(.( Kata ;eek


Kescri#cin: %e mue+e a la 3osici#n Hnumber del cursor de la [ltima instrucci#n select en+iada al motor de base de datos Sintaxis:
1. $db->data_seek(int $number, [cursor $cursor]);

18.(.5 A ected /o%s


Kescri#cin: >e+uel+e el n[mero de filas afectadas en la [ltima instrucci#n insertC u3date o delete Sintaxis:
1. $db->affected_rows();

18.(.4 Error
Kescri#cin: >e+uel+e la cadena descri3ti+a del [ltimo error generado 3or base de datos 3roducido 3or la [ltima instrucci#n %.L Sintaxis:
1. $db->error();

Libro de Kumbia: Porque Programar debera ser ms fcil

$-

18.(.6 No Error
Kescri#cin: >e+uel+e el n[mero interno del [ltimo error generado 3or base de datos 3roducido 3or la [ltima instrucci#n %.L %inta?is:
1. $db->no_error();

18.(.7 -ind
Kescri#cin: &Becuta un %elect en el motor con los 3armetros en+iados 5 de+uel+e un Arra5 con los resultados Sintaxis:
1. $db->find(string $table, [string $where=1=1], [string $fields=*], [string $orderBy=1]);

&Bem3lo:
1. <?php 2. $db = DbBase::raw_connect(); 3. foreach($db->find(productos) as $producto){ 4. print $producto[nombre ! 5. } //fin del foreach 6. $db->close(); 7. ?>

18.(.8 5n *uer'
>escri3ci#n: >e+uel+e el resultado de una instrucci#n %.L en un arra5 listo 3ara ser recorrido Sintaxis: Hdb=IinEquer5Fstring HsqlC Qbool HdebugSfalseRC Qint Hti3oEresultado S db::>DED8JHRG] &Bem3lo:
1. <?php 2. $db = DbBase::raw_connect(); 3. foreach($db->in_query(select * from productos) as $producto){ 4. print $producto[nombre ! 5. }//fin del foreach 6. $db->close(); 7. ?>

18.(.10 5n *uer' Assoc


Kescri#cin: >e+uel+e el resultado de una instrucci#n %.L en un arra5 con inde?ado asociati+o listo 3ara ser recorrido Sintaxis:
1. $db->in_query_assoc(string $sql, [bool $debug=false]);

Libro de Kumbia: Porque Programar debera ser ms fcil

$6

18.(.11 5n *uer' Num


Kescri#cin: >e+uel+e el resultado de una instrucci#n %.L en un arra5 con inde?ado num/rico listo 3ara ser recorrido Sintaxis:
1. $db->in_query_num(string $sql, [bool $debug=false]);

18.(.12 -etc, One


Kescri#cin: >e+uel+e la 3rimera fila de un select una sola fila Sintaxis:
1. $db->fetch_one(string $sql, [bool $debug=false]);

&s [til cuando el select de+uel+e

&Bem3lo:
1. <?php 2. $db = DbBase::raw_connect()(); 3. $producto = $db->fetch_one(select * from producto where codigo = 1); 4. print $producto[nombre ! 5. $db->close(); 6. ?>

18.(.13 Table EDists


Kescri#cin: >e+uel+e +erdadero si la tabla Htable e?iste en la base de datosC falso de lo contrario Sintaxis:
1. $db->table_exists(string $table);

Libro de Kumbia: Porque Programar debera ser ms fcil

$7

20 )Por qu/ usar una ca3a de Abstracci#n,


Las Dases de datos son relaciones 5 PHP'@Kumbia es orientado a obBetos 3or lo tanto deberamos acceder a las D> en forma orientada a obBetos Para esto necesitamos una interfa2 que transforme la l#gica de obBetos a la relacional 5 +ice+ersa &ste 3roceso es llamado ma3eo obBeto=relacional o en ingl/s 81< F8bBect=1elational <a33ingGC 5 es usado 3or Kumbia en su arquitectura <A; %e trata de dar a los obBetosC acceso a los datos sin deBar de lado las reglas de la l#gica de negocios 4n beneficio de la ca3a da abstracci#n ob&etoBrelacional es que 3re+iene un 3oco el uso de sinta?is es3ecfica de un motor de base de datosC 5a que automticamente traduce los llamados a los obBetos modelos en instrucciones %.L o3timi2adas 3ara el motor actual &sto significa que cambiar de un motor de base de datos a otro en la mitad del 3ro5ecto es ms fcil de lo que se imagina Pasar de Postgre%.L a <5%.L o a 8racle requiere de un cambio de una lnea de configuraci#n 4na ca3a de abstracci#n enca3sula la l#gica de datos &l resto de la a3licaci#n no necesita saber sobre instrucciones %.LC aunque 3uede 0acerlo si lo requiere Aer las filas como obBetos 5 las tablas como clases tiene otro beneficio Permiten crear nue+os accesos 3ara nuestras tablas Por eBem3lo si tenemos una clase ;lientes 5 tiene un cam3o 3rimer nombreC otro segundo nombre 5 a3ellidos entonces 3odemos crear un acceso llamado get*ombre as:
1. public function getNombre(){ 2. return $this->primer_nombre. .$this->segundo_nombre. . 3. $this->apellidos; 4. }

Kumbia 3ro3orciona una serie de clases LActive/ecord ' ;ession/ecord9 que 3ermiten reali2ar este ma3eo 5 adems eBecutar o3eraciones nati+as sobre las relaciones de la base de datos de forma ms 0umana 5 entendible

Libro de Kumbia: Porque Programar debera ser ms fcil

$9

21 La Aida sin Acti+e1ecord


Anteriormente las a3licaciones eran bolas de c#digoC me2claban %.LC ;%%C HJ<LC PHPC Ua+a%cri3tC etc Al menos los que buscbamos un orden mnimo conseguamos se3arar algunas cosas] 3ero el %.L 5 el PHP siem3re iban ligados as que 0acer cambios en el modelo relacional 3odra ser fatal 5a que da\aba muc0as 3artes de la a3licaci#n que 5a estaban 3robadas &ste no es un 3roblema e?clusi+o de PHPC tambi/n lo tienen otros lenguaBes o estilos de 3rogramaci#n que no re3aran en esto Por eBem3lo en Aisual Dasic *&J 5 en PHP tradicional:
1. Dim nit As String = 808111827-2 2. Dim Query As String = "select count(*) from clientes where nit = " & nit & 3. Dim command As New System.Data.OleDb.OleDbCommand(Query, con) 4. Dim cnt As Int32 = 0 5. Try 6. con.Open() 7. Dim cursor As OleDb.OleDbDataReader = command.ExecuteReader() 8. cursor.Read() 9. If cursor.GetInt32() = 0 Then 10. new System.Data.OleDb.OleDbCommand(insert into clientes values( & nit & , 11. EMPRESA DE TELECOMUNICACIONES ETB)) 12. Else 13. new System.Data.OleDb.OleDbCommand(update clientes set razon_social 14. = EMPRESA DE TELECOMUNICACIONES ETB where nit = & nit & ) 15. End If 16. cursor.Close() 17. Catch dbError As OleDBException 18. Dim i As Integer 19. For i = 0 To dbError.Errors.Count - 1 20. MessageBox.Show(dbError.Errors(i).Message + ControlChars.Cr) 21. Next i 22.End Try 23. 24.<?php 25. $nit = 808111827-2 ; 26. $+ , m$s+l(+uer$)"select count)-* .rom clientes where nit , $nit%*! 27. $.ila , m$s+l(.etch(arra$)$+*! 28. if($fila[0]==0){ 29. m$s+l(+uer$ )"insert into clientes values )$nit, /012/3A 4/
5/6/7809:;7A7;8:/3 /5<%*!

30. 31.

} else { where nit = $nit); }

m$s+l(+uer$ )"update clientes set ra=on(social , /012/3A 4/ 5/6/7809:;7A7;8:/3 /5<

32. 33. 34. ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

(:

&l ma3eo Ob&eto@/elacional soluciona esto 5 3ro3orciona un alto 3otencial 3ara 0acer las a3licaciones ms fciles de mantener

22 KParmetros con *ombreL


KWowLC Algo mu5 im3ortante en Kumbia es la a3licaci#n de los 3armetros con nombreC /sta es una caracterstica mu5 im3ortante usada a lo largo del framework 5 que es mu5 [til fsta 3ermite en+iar los 3armetros en un orden inde3endiente sin que esto im3ida que funcione bien Los 3armetros con nombre son una caracterstica utili2ada en otros lenguaBes como 1ub5 en donde son am3liamente usados La im3lementaci#n nos 3ermite de forma sencilla en+iar los +alores de los 3armetros de todo ti3o de funciones sin 3reocu3arnos 3or el orden correcto de estos &l uso es Unombre: valorUC es mu5 im3ortante mantener el orden sintctico 3ara que funcionen bien:

*o es3acios delante del nombre del 3armetro 5 /ste no debe contener es3acios Los dos 3untos g:h deben ir a continuaci#n del nombre del 3armetroC sin es3acios entre /ste 5 el nombre 4n es3acio obligatorio des3u/s de los g:h &l +alor 3uede ser cualquier +alor

Libro de Kumbia: Porque Programar debera ser ms fcil

(1

23 Acti+e1ecord
&s la 3rinci3al clase 3ara la administraci#n 5 funcionamiento de modelos Acti+e1ecord es una im3lementaci#n de este 3atr#n de 3rogramaci#n] 5 est mu5 influenciada 3or la funcionalidad de su anloga en 1ub5 dis3onible en 1ails Acti+e1ecord 3ro3orciona la ca3a obBeto=relacional que sigue rigurosamente el estndar 81<: Jablas en ;lasesC ;am3os en Atributos 5 1egistros en 8bBetos Facilita el entendimiento del c#digo asociado a base de datos 5 enca3sula la l#gica es3ecifica 0aci/ndola ms fcil de usar 3ara el 3rogramador
1. <?php 2. $Clientes->nit = 808111827-2; 3. $Clientes->razon_social = EMPRESA DE TELECOMUNICACIONES ETB 4. $Clientes->save(); 5. ?>

23.1 AentaBas del Acti+e 1ecord


%e trabaBan las entidades del <odelo ms naturalmente como obBetos Las acciones como "nsertarC ;onsultarC Actuali2arC DorrarC etc de una entidad del <odelo estn enca3suladas as que se reduce el c#digo 5 se 0ace ms fcil de mantener ;#digo ms fcil de entender 5 mantener 1educci#n del uso del %.L en un 7:ZC con lo que se logra un alto 3orcentaBe de inde3endencia del motor de base de datos <enos OdetallesP ms 3racticidad 5 utilidad Acti+e1ecord 3rotege en un gran 3orcentaBe de ataques de %.L in5ection que 3uedan llegar a sufrir tus a3licacionesC esca3ando caracteres que 3uedan facilitar estos ataques

23.2 ;rear un <odelo en Kumbia


Lo 3rimero es crear un arc0i+o en el directorio models con el mismo nombre de la relaci#n en la base de datos Por eBem3lo: modelsBclientes.#,# Luego creamos una clase con el nombre de la tabla e?tendiendo alguna de las clases 3ara modelos &Bem3lo:
1. <?php 2. class Clientes extends ActiveRecord { 3. 4. }

;olumnas 5 Atributos
8bBetos Acti+e1ecord corres3onden a registros en una tabla de una base de datos Los obBetos 3oseen atributos que corres3onden a los cam3os en estas tablas La clase Acti+e1ecord automticamente obtiene la definici#n de los cam3os de las tablas 5 los con+ierte en atributos de la clase asociada A esto es lo que nos referamos con ma3eo obBeto relacional

Libro de Kumbia: Porque Programar debera ser ms fcil

(!

<iremos la tabla Album:


1. CREATE TABLE album ( 2. id INTEGER NOT NULL AUTO_INCREMENT, 3. nombre VARCHAR(100) NOT NULL, 4. fecha DATE NOT NULL, 5. valor DECIMAL(12,2) NOT NULL, 6. artista_id INTEGER NOT NULL, 7. estado CHAR(1), 8. PRIMARY KEY(id) 9. ) 1. <?php 2. 3. class Album extends ActiveRecord { 4. 5. } 6. 7. 1. 2. 3. 4. $Album = new Album(); $Album->id = 2; $Album->nombre = Going Under; $Album->save();

Podemos crear un Acti+e1ecord que ma3ee esta tabla:

4na instancia de esta clase ser un obBeto con los atributos de la tabla album:

23.3 Lla+es Primarias 5 el 4so de ">s


&n los eBem3los mostrados de Kumbia siem3re se trabaBa una columna llamada id como lla+e 3rimaria de nuestras tablas Jal+/2C esto no siem3re es 3rctico a su 3arecerC de 3ronto al crear la tabla clientes la columna de n[mero de identificaci#n sera una e?celente elecci#nC 3ero en caso de cambiar este +alor 3or otro tendra 3roblemas con el dato que este re3licado en otras relaciones FeBem3lo facturasGC adems de esto tendra que +alidar otras cosas relacionadas con su naturale2a Kumbia 3ro3one el uso de ids como lla+es 3rimarias con esto se automati2a muc0as tareas de consulta 5 3ro3orciona una forma de referirse un+ocamente a un registro en es3ecial sin de3ender de la naturale2a de un atributo es3ecfico 4suarios de 1ails se sentirn familiari2ados con esta caracterstica &sta 3articularidad tambi/n 3ermite a Kumbia entender el modelo entidad relaci#n le5endo los nombres de los atributos de las tablas Por eBem3lo en la tabla lbum del eBem3lo anterior la con+enci#n nos dice que id es la lla+e 3rimaria de esta tabla 3ero adems nos dice que 0a5 una lla+e fornea a la tabla artista en su cam3o id

23.( ;14>: ;reate F;rearGC FActuali2arGC >elete FDorrarG

1ead

FLeerGC

43date

Acti+e1ecord im3lementa automticamente las cuatro o3eraciones bsicas sobre una tabla: ;rearC LeerC Actuali2ar 5 Dorrar

Libro de Kumbia: Porque Programar debera ser ms fcil

($

23.(.1 ;reando 1egistros


<anteniendo la idea del 8bBeto=1elacional 3odemos 3ensar que crear registros es lo

mismo que crear obBetosC entonces 3odramos estar en lo cierto Asignar a un obBeto +alores 5 eBecutar el m/todo create o sa+e es todo lo que tenemos que 0acer
1. 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.));

Jambi/n 3odemos crear un *ue+o registro a 3artir de los +alores de HE1&.4&%J


1. $Album = new Album(); 2. $Album->create_from_request();

23.(.2

;onsultando 1egistros

Para consultar en una base de datos tenemos que tener claro qu/ +amos a buscarC es decir definir un criterio de b[squeda &ste criterio le 3ermite a Active/ecord de+ol+er el conBunto de obBetos que coincidan con este 5 as 3oder trabaBar esa informaci#n &l camino ms sencillo 3ara encontrar determinado registro en una tabla es es3ecificar su lla+e 3rimaria &n Kumbia los modelos so3ortan el m/todo 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,>?

Libro de Kumbia: Porque Programar debera ser ms fcil

((

"gualmente necesitamos 0acer consultas a 3artir de otros atributos del modelo no solamente a 3artir de su lla+e 3rimaria Acti+e1ecord 3ro3orciona una serie de 3armetros 3ara crear consultas es3eciali2adas que nos 3ermitan acceder a los registros que necesitamos Para ilustrar esto +eamos:
1. # Buscar los Productos en estado = C y cuyo valor sea menor a 15000 2. foreach($Productos->find(estado=C and valor<15000) as $producto){ 3. print $producto&'nombre! 4. } 5. 6. #Buscar el primer producto en estado = C ordenado por fecha 7. foreach($Productos->find_first(conditions: estado=C, 8. order: fecha desc) as $producto){ 9. print $producto&'nombre! 10.} 11. 12.#Buscar el primer producto en estado = $estado ordenado por fecha 13.$producto = $Productos->find_first(conditions: estado=$estado, 14. order: fecha desc); 15.print $producto&'nombre!

;abe destacar que el uso de V indC irstW de+uel+e el 3rimer registro que coincida con la b[squeda 5 V indW todos los registros

23.(.3 &l 3oderoso Find


Aunque a3arentemente Acti+e1ecord elimina el uso del %.L en un gran 3orcentaBeC realmente no lo esC sim3lemente crea una ca3a de abstracci#n su3erior que 3uede llegar a limitarse en determinados momentos cuando las b[squedas se em3ie2an a +ol+er com3leBas Kumbia 3ermite el uso del lenguaBe %.L 5a sea utili2ando una instancia de Acti+e1ecord o accediendo a la ca3a de abstracci#n de datos como [ltimo recurso Flo cual no es recomendadoG &l lenguaBe %.L es una 3oderosa 0erramienta que no 3odemos deBar de usar 5 que debemos tener a la mano en uno de esos casos e?tremos en lo dems Acti+e1ecord se encargar de facilitarnos la +ida en gran medida %in 3armetros e?tra Acti+e1ecord con+ierte una consulta en un select from estndar 3ero 3odemos agregar otras o3ciones 3ara es3eciali2ar la b[squeda 5 obtener ms detalladamente lo que buscamos &l 3armetro conditions: 3ermite es3ecificar un conBunto de condiciones que +an a actuar como el gw0ereh de nuestra consulta "gualmente Acti+e1ecord no garanti2a que los registros sean de+ueltos en el orden requerido as que 3odemos utili2ar order: 3ara reali2ar el ordenamiento &l 3armetro limit: nos 3ermite es3ecificar el n[mero m?imo de registros a ser de+ueltos
1. #Buscar los productos en estado = $estado ordenado por fecha y valor 2. foreach($Productos->find_first(conditions: estado=$estado, 3. order: fecha Desc, valor, 4. limit: 30) as $prod){ 5. print $prod&'nombre! 6. }

Libro de Kumbia: Porque Programar debera ser ms fcil

('

Advertencia: &n 8racle la funcionalidad limit 3odra no funcionar como se es3era 4tilice la condici#n rownum c numeroEfilas 3ara 0acer esto.

23.(.( PromedioC ;ontandoC %umandoC <nimo 5 <?imo


4na de las tareas ms comunes es el uso de contadores 5 sumadores de registros en

consultasC as como el uso de otras funciones de agru3aci#n &l m/todo de conteo de registros se llama count 5 3uede recibir como 3armetros condiciones de /ste
1. #Cuantos productos hay? 2. print 1roductos&'count)*! 3. 4. #Cuantos productos hay con estado = 'A'? 5. print 1roductos&'count)"estado,@A@%*!

Las funciones de agru3aci#n sumaC mnimoC 3romedio 5 m?imoC son utili2adas de esta forma:
1. #Cuantos suma el valor de todos los productos? 2. print 1roductos&'sum)"valor%*! 3. 4. #Cuantos suma el valor de los productos activos? 5. print 1roductos&'sum)"valor%, "conditions: estado,@A@%*! 6. 7. #Promedio del valor de los productos activos? 8. print 1roductos&'averaAe)"valor%, "conditions: estado,@A@%*! 9. 10.#El valor mnimo de los productos activos? 11. print 1roductos&'minumum)"valor%, "conditions: estado,@A@%*! 12. 13.#El valor mximo de los productos activos? 14. print 1roductos&'maBimum)"valor%, "conditions: estado,@A@%*!

23.(.5 Actuali2ando 1egistros e?istentes


1ealmente no 0a5 muc0o que decir acerca de c#mo actuali2ar registros %i tienes un obBeto Acti+e1ecord F3or eBem3lo un 3roducto de la base de datosGC 3uedes actuali2ar llamando su m/todo sa+eFG %i este obBeto 0a sido ledo de la base de datos 3uedes actuali2ar el registro corres3ondiente mediante sa+eC en caso de que no e?ista se insertar el un registro nue+o
1. $producto = $Productos->find(123); 2. $producto->nombre = "Televisor"; 3. $producto->save();

Libro de Kumbia: Porque Programar debera ser ms fcil

(-

8tra forma de actuali2ar registros es utili2ar el m/todo u3dateFG de esta forma:


1. $producto = $Productos->find(456); 2. $producto->update(nombre: Televisor, cantidad: 2); 3. $producto->save();

23.(.4 Dorrando 1egistros


1ealmente no 0a5 muc0o que decir acerca de c#mo eliminar registros %i tienes un obBeto Acti+e1ecord F3or eBem3lo un 3roducto de la base de datosGC 3uedes eliminarlo llamando a su m/todo deleteFG
1. $Productos->delete(123);

23.(.6 2ro#iedades ;o#ortadas


2ro#iedad Hfields Hcount H3rimar5Eke5 HnonE3rimar5 HnotEnull HattributesEnames HisE+iew Kescri#cin Listado de ;am3os de la tabla que 0an sido ma3eados ;onteo del [ltimo 1esultado de un %elect Listado de columnas que conforman la lla+e 3rimaria Listado de columnas que no son lla+e 3rimaria Listado de cam3os que son notEnull *ombres de todos los cam3os que 0an sido ma3eados %o3orte 3ara las Aista

23.5 Aonvenciones en Active/ecord


Acti+e1ecord 3osee una serie de con+enciones que le sir+en 3ara asumir distintas cualidades 5 relacionar un modelo de datos Las con+enciones son las siguientes:

23.5.1 ;on+enciones Menerales


23.5.2 "d
%i Acti+e1ecord encuentra un cam3o llamado 5dC Acti+e1ecord asumir que se trata de la lla+e 3rimara de la entidad 5 que es autonum/rica

23.5.3 cam3oEid
Los cam3os terminados en Cid indican relaciones forneas a otras tablasC de esta forma se 3uede definir fcilmente las relaciones entre las entidades del modelo: 4n cam3o llamado clientesEid en una tabla indica que e?iste otra tabla llamada clientes 5 esta contiene un cam3o id que es fornea a este

Libro de Kumbia: Porque Programar debera ser ms fcil

(6

23.5.( cam3oEat
Los cam3os terminados en Cat indican que son fec0as 5 3osee la funcionalidad e?tra que obtienen el +alor de fec0a actual en una insercin
1. created_at es un campo fecha

23.5.5 cam3oEin
Los cam3os terminados en Cin indican que son fec0as 5 3osee la funcionalidad e?tra que obtienen el +alor de fec0a actual en una actuali0acin
1. modified_in es un campo fecha

23.4 ;on+enciones 3ara 1>D<s


23.4.1 ;on+enciones &s3eciales 3ara Postgre%.L
Los cam3os autonum/ricos en Postgre%.L deben ser definidos con una columna de ti3o serial

23.4.2 ;on+enciones &s3eciales 3ara 8racle


Los cam3os autonum/ricos en 8racle no e?isten 5 las inserciones deben ser reali2adas utili2ando una isequenciai au?iliar que debe ser creada utili2ando la con+enci#n tabla_sequence

Libro de Kumbia: Porque Programar debera ser ms fcil

(7

2( Acti+e 1ecord AP"


A continuaci#n +eremos una referencia de los m/todos que 3osee la clase Acti+e1ecord 5 su funcionalidad res3ecti+a fstos se encuentran organi2ados alfab/ticamente:

2(.1 ;onsulta
</todos 3ara 0acer consulta de 1egistros:

2(.1.1 distinct
1 distinct([string $atributo_entidad], [conditions: ], [order: ], [limit: ], [column: ])

&ste m/todo eBecuta una consulta de distinci#n [nica en la entidadC funciona igual que un Pselect uni"ue cam#oR +i/ndolo desde la 3ers3ecti+a del %.L &l obBeti+o es de+ol+er un arra5 con los +alores [nicos del cam3o es3ecificado como 3armetro
1. $unicos = $this->Usuarios->distinct(estado) 2. # array(A, I, N)

Los 3armetros conditionsC order 5 limit funcionan id/nticamente que en la funci#n find 5 3ermiten modificar la forma o los mismos +alores de retorno de+ueltos 3or /sta

2(.1.1 indCallCb'Cs"l Lstrin! Ss"l9


&ste m/todo nos 3ermite 0acer una consulta 3or medio de un %.L 5 el resultado de+uelto es un arra5 de obBetos de la misma clase con los +alores de los registros en estos La idea es que el uso de este m/todo no debera ser com[n en nuestras a3licaciones 5a que Acti+e1ecord se encarga de eliminar el uso del %.L en gran 3orcentaBeC 3ero 0a5 momentos en que es necesario que seamos ms es3ecficos 5 tengamos que recurrir al uso de este &Bem3lo:
1. foreach($Usuarios->find_all_by_sql("select * from usuarios 2. where codigo not in (select codigo 3. from ingreso)") as $usuario){ 4. print $9suario&'nombre! 5. }

&ste eBem3lo consultamos todos los usuarios con una sentencia %,ere es#ecial e im3rimimos sus nombres La idea es que los usuarios consultados no 3ueden estar en la entidad ingreso

2(.1.2 indCb'Cs"l Lstrin! Ss"l9


&ste m/todo nos 3ermite 0acer una consulta 3or medio de un %.L 5 el resultado de+uelto es un obBeto que re3resenta el resultado encontrado La idea es que el uso de este m/todo no debera ser com[n en nuestras a3licaciones 5a que Acti+e1ecord se encarga Libro de Kumbia: Porque Programar debera ser ms fcil (9

de eliminar el uso del %.L en gran 3orcentaBeC 3ero 0a5 momentos en que es necesario que seamos ms es3ecficos 5 tengamos que recurrir al uso de este &Bem3lo:
1. $usuario = $Usuarios->find_by_sql("select * from usuarios 2. where codigo not in (select codigo 3. from ingreso) limit 1"); 4. print $9suario&'nombre!

&ste eBem3lo consultamos todos los usuarios con una sentencia %,ere es#ecial e im3rimimos sus nombres La idea es que el usuario consultado no 3uede estar en la entidad ingreso

2(.1.3 indC irst


findEfirstFQinteger HidRC QOconditions: jPRC QOorder: jPRC QOlimit: jRC QOcolumns: jPRG &l m/todo OfindEfirstP de+uel+e el 3rimer registro de una entidad o la 3rimera ocurrencia de acuerdo a unos criterios de b[squeda u ordenamiento Los 3armetros son todos o3cionales 5 su orden no es rele+anteC cuando se in+oca sin 3armetros de+uel+e el 3rimer registro insertado en la entidad &ste m/todo es mu5 fle?ible 5 3uede ser usado de muc0as formas: &Bem3lo:
1. $this->Usuarios->find_first(conditions: estado=A ,order: fecha desc);

&n este eBem3lo buscamos el 3rimer registro cu5o estado sea igual a OAP 5 ordenado descendentementeC el resultado de /steC se carga a la +ariable H4suarios e igualmente de+uel+e una instancia del mismo obBeto Acti+e1ecord en caso de /?ito o false en caso contrario ;on el m/todo findEfirst 3odemos buscar un registro en 3articular a 3artir de su id de esta forma:
1. $this->Usuarios->find_first(123);

As obtenemos el registro 1!$ e igualmente de+uel+e una instancia del mismo obBeto Acti+e1ecord en caso de /?ito o false en caso contrario Kumbia genera una ad+ertencia cuando los criterios de b[squeda 3ara findEfirst de+uel+en ms de un registroC 3ara esto 3odemos for2ar que se de+uel+a solamente unoC mediante el 3armetro limitC de esta forma:
1. $this->Usuarios->find_first(conditions: estado=A ,limit: 1);

;uando queremos consultar s#lo algunos de los atributos de la entidad 3odemos utili2ar el 3armetro columns as:
1. $this->Usuarios->find_first(columns: nombre, estado);

;uando es3ecificamos el 3rimer 3armetro de ti3o stringC Acti+e1ecord asumir que son las condiciones de b[squeda 3ara findEfirstC as:

Libro de Kumbia: Porque Programar debera ser ms fcil

':

1. $Usuarios->find_first(estado=A);

>e esta forma 3odemos tambi/n deducir que estas ! sentencias arroBaran el mismo resultado:
1. $this->Usuarios->find_first(id=123); 2. $this->Usuarios->find_first(123);

2(.1.( ind
2 find([integer $id], [conditions: ], [order: ], [limit: ], [columns: ])

&l m/todo 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);

Libro de Kumbia: Porque Programar debera ser ms fcil

'1

%e 3uede utili2ar la 3ro3iedad count 3ara saber cuntos registros fueron de+ueltos en la b[squeda

2(.1.5 selectConeLstrin! SselectC"uer'9


&ste m/todo nos 3ermite 0acer ciertas consultas como eBecutar funciones en el motor de base de datos sabiendo que /stas de+uel+en un solo registro 1 Ht0is=I4suarios=IselectEoneFOcurrentEtimePG &n el eBem3lo queremos saber la 0ora actual del ser+idor de+uelta desde <5%.L as que 3odemos usar este m/todo 3ara esto

2(.1.4 selectConeLstrin! SselectC"uer'9 Lstatic9


&ste m/todo nos 3ermite 0acer ciertas consultas como eBecutar funciones en el motor de base de datosC sabiendo que /stas de+uel+en un solo registro &ste m/todo se 3uede llamar de forma estticaC esto significa que no es necesario que 0a5a una instancia de Acti+e1ecord 3ara 0acer el llamado
1. ActiveRecord::select_one(current_time)

&n el eBem3lo queremos saber la 0ora actual del ser+idor de+uelta desde <5%.L as que 3odemos usar este m/todo 3ara esto

2(.1.6 eDists
&ste m/todo nos 3ermite +erificar si el registro e?iste o no en la base de datos mediante su id o una condici#n
1. 2. 3. 4. 5. 6. $Usuarios->id = 3; if($Usuarios->exists()){
print CDa eBiste el id , >C!

}//fin del if $Usuarios->exists(nombre='Juan Perez') $Usuarios->exists(2); // Un Usuario con id->2?

2(.1.7 indCallCb'
&ste m/todo nos 3ermite reali2ar una b[squeda 3or alg[n cam3o
1. $resultados = $Productos->find_all_by(categoria, Insumos);

2(.1.8 indCb'CXcam#oX
&ste m/todo nos 3ermite reali2ar una b[squeda 3or alg[n cam3o usando el nombre del m/todo como nombre de /ste >e+uel+e un solo registro
1. $resultado = $Productos->find_by_categoria(Insumos);

2(.1.10 indCallCb'CXcam#oX
&ste m/todo nos 3ermite reali2ar una b[squeda 3or alg[n cam3o usando el nombre del m/todo como nombre de /ste >e+uel+e todos los registros que coincidan con la

Libro de Kumbia: Porque Programar debera ser ms fcil

'!

b[squeda
1. $resultados = $Productos->find_all_by_categoria(Insumos);

2(.2 Aonteos ' ;umatorias


2(.2.1 count
1eali2a un conteo sobre los registros de la entidad con o sin alguna condici#n adicional &mula la funci#n de agru3amiento count
1. $numero_registros = $Clientes->count(); $numero_registros = $Clientes->count(ciudad = 'BOGOTA');

2(.2.2 sum
1eali2a una sumatoria sobre los +alores num/ricos de el atributo de alguna entidadC emula la funci#n de agru3amiento sum en el lenguaBe %.L
1. $suma = $Productos->sum(precio); 2. $suma = $Productos->sum(precio, conditions: estado = 'A');

2(.2.3 countCb'Cs"l
1eali2a una sumatoria utili2ando lenguaBe %.L
1. $numero = $Productos->count_by_sql(select count(precio) from productos, facturas where factura.codigo = 1124 and factura.codigo_producto = productos.codigo_producto)

2(.3 2romedios, E:Dimos ' Ein?mos


2(.3.1 avera!e
Dusca el +alor 3romedio 3ara un atributo de alguna entidadC emula la funci#n de agru3amiento a+erage en el lenguaBe %.L
1. $promedio = $Productos->average(precio); 2. $promedio = $Productos->average(precio, conditions: estado = 'A');

2(.3.2 maDimum
Dusca el +alor m?imo 3ara un atributo de alguna entidadC emula la funci#n de agru3amiento ma? en el lenguaBe %.L
1. $maximo = $Productos->maximum(precio); 2. $maximo = $Productos->maximum(precio, conditions: estado = 'A');

2(.3.3 minumum
Dusca el +alor mnimo 3ara un atributo de alguna entidadC emula la funci#n de agru3amiento min en el lenguaBe %.L
1. $minimo = $Productos->minimum(precio); 2. $minimo = $Productos->mininum(precio, conditions: estado = 'A');

Libro de Kumbia: Porque Programar debera ser ms fcil

'$

2(.( AreacinBActuali0acinBQorrado de /e!istros


2(.(.1 create
;rea un registro a 3artir de los +alores de los atributos del obBeto Acti+e1ecord
1. $Album = new Album(); 2. $Album->nombre = Take Off Your Pants and Jacket; 3. $Album->valor = 40000; 4. $Album->create(); 5. 6. $Album = new Album(); 7. $Album->create( 8. nombre: Take Off Your Pants and Jacket, 9. valor: 40000 10.); 11. 12.$Album = new Album(); 13.$Album->create(array( 14. nombre => Take Off Your Pants and Jacket, 15. valor => 40000 16.));

2(.(.2 u#date
Actuali2a un registro a 3artir de los +alores de los atributos del obBeto Acti+e1ecord
1. 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(.(.5 createC romCre"uest


;rea un registro a 3artir de los +alores que +ienen de SC/E*1E;T que tengan el mismo Libro de Kumbia: Porque Programar debera ser ms fcil '(

nombre de los atributos del obBeto Acti+e1ecord


1. $Album = new Album(); 2. $Album->create_from_request();

2(.(.4 saveC romCre"uest


;rea@Actuali2a un registro a 3artir de los +alores que +ienen de SC/E*1E;T que tengan el mismo nombre de los atributos del obBeto Acti+e1ecord
1. $Album = new Album(); 2. $Album->save_from_request();

2(.(.6 delete
&limina registros de la tabla o el registro actual a 3artir de su id 1 HProductos=IdeleteF1!$G

2(.(.7 deleteCall
&limina todos los datos de una relaci#n mediante el obBeto Acti+e1ecord
1. $Productos->delete_all()

2(.5 Oalidaciones
2(.5.1 validatesC#resenceCo
;uando este m/todo es llamado desde el constructor de una clase Acti+e1ecordC obliga a que se +alide la 3resencia de los cam3os definidos en la lista Los cam3os marcados como notEnull en la tabla son automticamente +alidados
1. <?php 2. class Clientes extends ActiveRecord { 3. public function __construct(){ 4. $this->validates_presence_of("cedula"); 5. } 6. } 7. ?>

2(.5.2 validatesClen!t,Co
;uando este m/todo es llamado desde el constructor de una clase Acti+e1ecordC obliga a que se +alide la longitud de los cam3os definidos en la lista &l 3armetro minimum indica que se debe +alidar que el +alor a insertar o actuali2ar no sea menor de ese tama\o &l 3armetro ma?imum indica que el +alor a insertar@actuali2ar no 3uede ser ma5or al indicado &l 3armetro tooEs0ort indica el mensaBe 3ersonali2ado que Acti+e1ecord mostrar en caso de que falle la +alidaci#n cuando es menor 5 tooElong cuando es mu5 largo

Libro de Kumbia: Porque Programar debera ser ms fcil

''

1. class Clientes extends ActiveRecord { 2. 3. public function __construct(){ 4. $this->validates_length_of("nombre", "minumum: 15", "too_short: El nombre debe tener al menos 15 caracteres"); 5. $this->validates_length_of("nombre", "maximum: 40", "too_long: El nombre debe tener maximo 40 caracteres"); 6. $this->validates_length_of("nombre", "in: 15:40", 7. "too_short: El nombre debe tener al menos 15 caracteres", 8. "too_long: El nombre debe tener maximo 40 caracteres" 9. ); 10. } 11. 12. }

2(.5.3 validatesCnumericalit'Co
Aalida que ciertos atributos tengan un +alor num/rico antes de insertar # actuali2ar
1. <?php 2. 3. class Productos extends ActiveRecord { 4. 5. public function __construct(){ 6. $this->validates_numericality_of("precio"); 7. } 8. 9. } 10.?>

2(.5.( validatesCemailCin
Aalida que ciertos atributos tengan un formato de e=mail correcto antes de insertar o actuali2ar
1. <?php 2. class Clientes extends ActiveRecord { 3. 4. public function __construct(){ 5. $this->validates_email_in("correo"); 6. } 7. 8. } 9. ?>

2(.5.5 validatesCuni"uenessCo
Aalida que ciertos atributos tengan un +alor [nico antes de insertar o actuali2ar
1. <?php 2. class Clientes extends ActiveRecord { 3. public function __construct(){ 4. $this->validates_uniqueness_of("cedula"); 5. } 6. } 7. ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

'-

2(.5.4 validatesCdateCin
Aalida que ciertos atributos tengan un formato de fec0a acorde al indicado en config@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(.5.6 validatesC ormatCo


Aalida que el cam3o tenga determinado formato seg[n una e?3resi#n regular antes de insertar o actuali2ar
1. <?php 2. class Clientes extends ActiveRecord { 3. 4. public function __construct(){ 5. $this->validates_format_of("email", "^(+)@((?:[?a?z0?9]+\.)+[a?z]{2,}) $"); 6. } 7. 8. } 9. ?>

2(.4

Jransaccionalidad

4na transacci#n en una base de datos es una serie de cambios que deben ser a3licados al mismo tiem3o de tal manera que se eBecuten bien cada uno de ellos 5 sin faltar ninguno %i el motor de base de datos utili2ado 3or Acti+e 1ecord so3orta transaccionesC 3uedes em3e2arC finali2ar 5 cancelarlas mediante los m/todos beginC commitC rollback

2(.4.1 commitL9
&ste m/todo nos 3ermite confirmar una transacci#n iniciada 3or el m/todo begin en el motor de base de datosC si /ste lo 3ermite >e+uel+e true en caso de /?ito 5 false en caso contrario
1. $Usuarios->commit()

2(.4.2 be!inL9
&ste m/todo nos 3ermite crear una transacci#n en el motor de base de datosC si este lo 3ermite >e+uel+e true en caso de /?ito 5 false en caso contrario
1. $Usuarios->begin()

Libro de Kumbia: Porque Programar debera ser ms fcil

'6

2(.4.3 rollbackL9
&ste m/todo nos 3ermite anular una transacci#n iniciada 3or el m/todo begin en el motor de base de datosC s /ste lo 3ermite >e+uel+e true en caso de /?ito 5 false en caso contrario
1. $Usuarios->rollback()

2(.6 Otros Eetodos


</todos de funcionalidad e?tra de Acti+e1ecord

2(.6.1 s"lLstrin! Ss"l9


&sta funci#n nos 3ermite eBecutar sentencias %.L directamente en el motor de base de datos La idea es que el uso de este m/todo no debera ser com[n en nuestras a3licaciones 5a que Acti+e1ecord se encarga de eliminar el uso del %.L en gran 3orcentaBeC 3ero 0a5 momentos en que es necesario que seamos ms es3ecficos 5 tengamos que recurrir al uso de /ste

2(.7 Aallbacks en Active/ecord


&l Acti+e1ecord controla el ciclo de +ida de los obBetos creados 5 ledosC su3er+isando cuando se modificanC se almacenan o se borran 4sando callbacks Lo eventos9C el Acti+e1ecord nos 3ermite inter+enir en esta su3er+isi#n Podemos escribir el c#digo que 3ueda ser in+ocado en cualquier e+ento significati+o en la +ida de un obBeto ;on los callbacks 3odemos reali2ar +alidaci#n com3leBaC re+isar los +alores que +ienen desde 5 0acia la base de datosC e incluso e+itar que ciertas o3eraciones finalicen 4n eBem3lo de estos callbacks 3uede ser una +alidaci#n en 3roductos que e+ita que 3roductos VactivosW sean borrados
1. class User extends ActiveRecord { 2. 3. public before_delete = no_borrar_activos; 4. 5. public function no_borrar_activos(){ 6. if($this->estado==A){ 7. Flash::error(No se puede borrar Productos Activos); 8. return cancel; 9. } 10. } 11. 12. public function after_delete(){ 13. Flash::success("Se borro el usuario $this->nombre"); 14. } 15. 16. }

A continuaci#n otros callbacks que 3odemos encontrar en Acti+e1ecord &l orden en el que son 3resentados es en el que se llaman si estn definidos:

Libro de Kumbia: Porque Programar debera ser ms fcil

'7

2(.7.1 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

Libro de Kumbia: Porque Programar debera ser ms fcil

'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

Libro de Kumbia: Porque Programar debera ser ms fcil

-:

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

Libro de Kumbia: Porque Programar debera ser ms fcil

-1

2(.10 Tra0a ' Kebu! en Active/ecord


Acti+e1ecord 3ermite 0acer una tra2a de todas las transacciones %.L generadas internamente en el <odelo &sta tra2a nos 3ermite buscar errores 5@o 0acer seguimiento de las acciones reali2adas en un determinado obBeto Para 0abilitar la tra2a a un arc0i+o definimos la 3ro3iedad Slo!!er en el modelo de esta forma:
1. <?php 2. 3. class Clientes extends ActiveRecord { 4. public $logger = true; 5. }//fin de la clase 6. 7. ?>

>e esta forma Acti+e1ecord mediante la clase Logger crea un arc0i+o en lo!sB con un nombre como logYYYY-MM-DD.txt con las transacciones %.L generadas internamente Jambi/n 3odemos 0acerlo de esta forma 3ara acti+arlo 3ara un obBeto en 3articular:
1. $this->Clientes->logger = true; 2. ... 3. ... 4. $this->Clientes->logger = false;

"ncluso 3odemos cambiar el nombre del arc0i+o generado asignndolo a la +ariable Slo!!er asi:
1. <?php 2. class Clientes extends ActiveRecord { 3. public $logger = "archivo.txt"; 4. }//fin de la clase 5. ?>

2(.11 Jra2a en Pantalla


Para 0abilitar la tra2a 3or 3antalla definimos la 3ro3iedad Sdebu! en el modelo de esta forma:
1. <?php 2. class Clientes extends ActiveRecord { 3. 4. public $debug = true; 5. 6. } //fin de la clase 7. ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

-!

2(.12 Eostrar Errores en Ob&etos Active/ecord


Para mostrar todos los errores que de+uel+a el motor de base de datos en caso de una acci#n indebida o error de sinta?isC etcC debemos asignar a la 3ro3iedad Hdis3la5Eerrors S trueC en el modelo as:
1. <?php 2. class Clientes extends ActiveRecord { 3. 4. public $display_errors = true; 5. 6. } //fin de la clase

2(.13 Asociaciones
<uc0as a3licaciones trabaBan con m[lti3les tablas en una base de datos 5 normalmente 0a5 relaciones entre esas tablas Por eBem3loC una ciudad 3uede ser el 0ogar de muc0os clientes 3ero un cliente solo tiene una ciudad &n un esquema de base de datosC estas relaciones son enla2adas mediante el uso de lla+es 3rimarias 5 forneas ;omo Acti+e1ecord trabaBa con la con+enci#n: La lla+e fornea tiene el nombre de la tabla 5 termina en idC as: ciudadCidC esto es una relaci#n a la tabla ciudad a su lla+e 3rimaria id As queC sabiendo estoC quisi/ramos que en +e2 de decir:
1. $ciudad_id = $cliente->ciudad_id; 2. $ciudad = $Ciudad->find($ciudad_id); 3. print $ciudad&'nombre!

meBor fuera:
1. print $cliente->getCiudad()->nombre;

Mran 3arte de la magia que tiene Acti+e1ecord es estoC 5a que con+ierte las lla+es forneas en sentencias de alto ni+elC fciles de com3render 5 de trabaBar

Libro de Kumbia: Porque Programar debera ser ms fcil

-$

);omo usar Asociaciones,


&?isten cuatro ti3os de relaciones im3lementadas en Acti+e1ecord

2(.13.1 2ertenece a
&ste ti3o de relaci#n se efect[a con el m/todo ObelongsEtoPC en esta la lla+e fornea se encuentra en la tabla del modelo de donde se in+oca el m/todo ;orres3onde a una relaci#n uno a uno en el modelo entidad relaci#n belongsEtoFHrelationG Srelation Lstrin!9: nombre de la relaci#n Parmetros con nombre: model: *ombre del ti3o de modelo que debe retornar la consulta de la relaci#n Por defecto se considera un modelo que corres3onda al nombre de la relaci#n &Bem3lo: %i HrelationSTautoE+oladorTC entonces modelSAutoAolador k: nombre de la lla+e fornea mediante la cual se relaciona Por defecto se considera el nombre de la relaci#n con el sufiBo OEidP &Bem3lo: %i HrelationSTautoE+oladorTC entonces fkSautoE+oladorEid &Bem3los de uso:
1. $this->belongs_to('persona'); 2. $this->belongs_to('vendedor', 'model: Persona') 3. $this->belongs_to('funcionario', 'model: Persona', 'fk: personal_id')

&n el modelo Libro:

1. class Libro extends ActiveRecord { 2. public function initialize() { 3. $this->belongs_to('persona'); 4. } 5. }

Libro de Kumbia: Porque Programar debera ser ms fcil

-(

2(.13.2 Tienes un
&ste ti3o de relaci#n se efect[a con el m/todo O0asEonePC en esta la lla+e fornea se encuentra en la tabla del modelo con el que se quiere asociar ;orres3onde a una relaci#n uno a uno en el modelo entidad relaci#n 0asEoneFHrelationG Srelation Lstrin!9: nombre de la relaci#n Parmetros con nombre: model: *ombre del ti3o de modelo que debe retornar la consulta de la relaci#n Por defecto se considera un modelo que corres3onda al nombre de la relaci#n &Bem3lo: %i HrelationSTautoE+oladorTC entonces modelSAutoAolador k: nombre de la lla+e fornea mediante la cual se relaciona Por defecto se considera el nombre de la relaci#n con el sufiBo OEidP &Bem3lo: %i HrelationSTautoE+oladorTC entonces fkSautoE+oladorEid &Bem3los de uso:
1. $this->has_one('persona'); 2. $this->has_one('vendedor', 'model: Persona') 3. $this->has_one('funcionario', 'model: Persona', 'fk: personal_id')

&n el modelo Persona:


1. class Persona extends ActiveRecord { 2. public function initialize() { 3. $this->has_one('datos_personales'); 4. } 5. }

Libro de Kumbia: Porque Programar debera ser ms fcil

-'

2(.13.3 Tiene muc,os


&ste ti3o de relaci#n se efect[a con el m/todo O0asEman5PC en esta la lla+e fornea se encuentra en la tabla del modelo con el que se quiere asociar ;orres3onde a una relaci#n uno a muc0os en el modelo entidad relaci#n 0asEman5FHrelationG Srelation Lstrin!9: nombre de la relaci#n Parmetros con nombre: model: *ombre del ti3o de modelo que debe retornar la consulta de la relaci#n Por defecto se considera un modelo que corres3onda al nombre de la relaci#n &Bem3lo: %i HrelationSTautoE+oladorTC entonces modelSAutoAolador k: nombre de la lla+e fornea mediante la cual se relaciona Por defecto se considera el nombre de la relaci#n con el sufiBo OEidP &Bem3lo: %i HrelationSTautoE+oladorTC entonces fkSautoE+oladorEid &Bem3los de uso:
1. $this->has_many('persona'); 2. $this->has_many('vendedor', 'model: Persona') 3. $this->has_many('funcionario', 'model: Persona', 'fk: personal_id')

&n el modelo Persona:


1. class Persona extends ActiveRecord { 2. public function initialize() { 3. $this->has_many('libro'); 4. } 5. }

Libro de Kumbia: Porque Programar debera ser ms fcil

--

2(.13.( Tiene ' #ertenece a muc,os


&ste ti3o de relaci#n se efect[a con el m/todo O0asEandEbelongsEtoEman5PC esta se efect[a a tra+/s de una tabla que se encarga de enla2ar los dos modelos ;orres3onde a una relaci#n muc0os a muc0os en el modelo entidad relaci#n &ste ti3o de relaci#n tiene la des+entaBa de que no es so3ortada en el mbito de m[lti3les cone?iones de Acti+e1ecordC 3ara lograr que funcione con multi3les cone?ionesC se 3uede emular a tra+/s de dos relaciones 0asEman5 al modelo de la tabla que relaciona 0asEandEbelongsEtoEman5FHrelationG Srelation Lstrin!9: nombre de la relaci#n Parmetros con nombre: model: *ombre del ti3o de modelo que debe retornar la consulta de la relaci#n Por defecto se considera un modelo que corres3onda al nombre de la relaci#n &Bem3lo: %i HrelationSTautoE+oladorTC entonces modelSAutoAolador k: nombre de la lla+e fornea mediante la cual se relaciona Por defecto se considera el nombre de la relaci#n con el sufiBo OEidP &Bem3lo: %i HrelationSTautoE+oladorTC entonces fkSautoE+oladorEid ke': nombre del cam3o que contendr el +alor de la lla+e 3rimaria en la tabla intermedia que contendr los cam3os de la relaci#n Por defecto corres3onde al nombre del modelo con que se +a a relacionar con el sufiBo OEidP t,rou!,: tabla a tra+/s de la cual se establece la relaci#n muc0os a muc0os Por defecto se forma 3or el nombre de la tabla del modelo que tiene el nombre de tabla mas largo 5 como 3refiBo un OEP 5 el nombre de la tabla del otro modelo &Bem3los de uso:
1. $this->has_and_belongs_to_many('persona'); 2. $this->has_and_belongs_to_many('cargos', 'model: Cargo', 'fk: id_cargo', 'key: id_persona', 'through: cargo_persona');

Libro de Kumbia: Porque Programar debera ser ms fcil

-6

&n el modelo Persona:


1. class Persona extends ActiveRecord { 2. public function initialize() { 3. $this->has_and_belongs_to_many('cargo'); 4. } 5. }

2(.1( Eulti#les coneDiones en Active/ecord


"magina 3oder utili2ar di+ersas bases de datosC aloBadas en ser+idores diferentes 5 de manera trans3arenteC tan solo con Acti+e1ecordC si es +erdadC a0ora Kumbia lo 0ace 3or ti ;on este fin se encuentra el m/todo OsetEmodeP &l [nico incon+eniente es que la relaci#n O0asEandEbelongsEtoEman5P no 3uede utili2arce en este conte?to a menos que los modelos que se quieran relacionar 5 la tabla a tra+/s de la cual se relacionan 3ertene2can al mismo OmodePC en cualquier otro caso 3uede obtenerse un resultado similar utili2ando O0asEman5P 5 ObelongsEtoP setEmodeFHmodeG Smode: modo el cual determina la cone?i#n a utili2arC se refiere a los que se encuentran en en+ironment ini &Bem3lo:
class Persona{ public function initialize() { $this->set_mode('production'); } }

Libro de Kumbia: Porque Programar debera ser ms fcil

-7

2(.15 2a!inadores
Para la 3aginaci#n e?isten dos funciones encargadas de esto: #a!inate &ste es ca3a2 de 3aginar arra5s o modelosC recibe los siguientes 3armetros: Para arra5: Hs : arra5 a 3aginar 3age: numero de 3gina 3erE3age: cantidad de elementos 3or 3gina &Bem3lo:
$page = paginate($a, 'per_page: 5', 'page: 1');

Para modelo: Hs: string con nombre de modelo o obBeto Acti+e1ecord 3age: numero de 3gina 3erE3age: cantidad de elementos 3or 3gina Asimismo recibe todos los 3armetros que 3ueden utili2arse en el m/todo OfindP de Acti+e1ecord &Bem3los:
$page = paginate('usuario', 'NOT login=admin', 'order: login ASC', 'per_page: 5', 'page: 1'); $page = paginate($this->Usuario, 'NOT login=admin', 'order: login ASC', 'per_page: 5', 'page: 1');

#a!inateCb'Cs"l &fect[a 3aginaci#n a tra+/s de una consulta sql 1ecibe los siguientes 3armetros: Hmodel: string nombre de modelo o obBeto Acti+e1ecord Hsql: string consulta sql &Bem3lo:
$page = paginate_by_sql('usuario', 'SELECT * FROM usuario WHERE nombre LIKE %emilio% ', 'per_page: 5', 'page: 1');

Ambos ti3os de 3aginadores retornan un obBeto O3agePC este obBeto O3ageP es creado a 3artir de std;lassC contiene los siguientes atributos: ne?t: n[mero de 3gina siguienteC si no 0a5 3agina siguiente +ale OfalseP 3re+: n[mero de 3gina anteriorC si no 0a5 3agina anterior +ale OfalseP current: n[mero de 3gina actual total: n[mero de 3aginas totales items: arra5 de elementos 3aginados

Libro de Kumbia: Porque Programar debera ser ms fcil

-9

2(.14 2a!inando en Active/ecord


Acti+e1ecord 5a trae integrado los m/todos 3aginate 5 3aginateEb5EsqlC se com3ortan igual que 3aginate 5 3aginateEb5EsqlC sin embargo no es necesario 3asar el modelo a 3aginar 5a que 3or defecto toman el modelo que in+oca &Bem3lo:
$page = $this->Usuario->paginate('per_page: 5', 'page: 1');

&Bem3lo com3leto de uso del 3aginador: Jenemos una tabla usuario con su corres3ondiente modelo 4suarioC entonces creemos un controlador el cual 3agine una lista de usuarios 5 asimismo 3ermita buscar 3or nombreC a3ro+ec0aremos la 3ersistencia de datos del controlador 3ara 0acer una 3aginaci#n inmune a in5ecci#n sql &n el controlador:

class UsuarioController extends ApplicationController { private $_per_page = 7; /** * Formulario de busqueda **/ public function buscar() { $this->nullify('page', 'conditions'); } /** * Paginador **/ public function lista($page='') { /** * Cuando se efectua la busqueda por primera vez **/ if($this->has_post('usuario')) { $usuario = $this->post('usuario', 'trim', 'addslashes'); if($usuario['nombre']) { $this->conditions = nombre LIKE '%{$usuario['nombre']}%' ; } /** * Paginador con condiciones o sin condiciones **/ if(isset($this->conditions) && $this->conditions) { $this->page = $this->Usuario->paginate($this->conditions, per_page: $this->_per_page, 'page: 1'); } else { $this->page = $this->Usuario->paginate(per_page: $this->_per_page, 'page: 1'); } } elseif($page='next' && isset($this->page) && $this->page->next) { /** * Paginador de pagina siguiente **/ if(isset($this->conditions) && $this->conditions) { $this->page = $this->Usuario->paginate($this->conditions, per_page: $this->_per_page, page: {$this->page->next}); } else { $this->page = $this->Usuario->paginate(per_page: $this->_per_page, page: {$this->page->next}); }

Libro de Kumbia: Porque Programar debera ser ms fcil

6:

} elseif($page='prev' && isset($this->page) && $this->page->prev) { /** * Paginador de pagina anterior **/ if(isset($this->conditions) && $this->conditions) { $this->page = $this->Usuario->paginate($this->conditions, per_page: $this->_per_page, page: {$this->page->prev}); } else { $this->page = $this->Usuario->paginate(per_page: $this->_per_page, page: {$this->page->prev}); } } } }

&n la +ista buscar 3t0ml

<?php echo form_tag('usuario/lista') ?> <?php echo text_field_tag('usuario.nombre') ?> <?php echo submit_tag('Consultar') ?> <?php echo end_form_tag() ?>

&n la +ista lista 30tml


<table> <tr> <th>id</th> <th>nombre</th> </tr> <?php foreach($page->items as $p): ?> <tr> <td><?php echo $p->id ?></td> <td><?php echo h($p->nombre) ?></td> </tr> <?php endforeach; ?> </table> <br> <?php if($page->prev) echo link_to('usuario/lista/prev', 'Anterior') ?> <?php if($page->next) echo ' | ' . link_to('usuario/lista/next', 'Siguiente') ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

61

2(.16 Active/ecord ' los Aam#os con Oalores #or Ke ecto


%i quieres tener un +alor 3or defecto en un cam3o de tu tablaC 3uedes establecer ese +alor directamente en la bdC 3ero 3ara que Acti+e1ecord no inter+enga sobre este +alor es necesario colocarlo como un cam3o *4LLC de esta manera al deBar el cam3o +acio al momento de reali2ar la inserci#nC Acti+e1ecord no incluira en la +alidaci#n de cam3os nulos dic0o cam3oC de tal manera que se tomara el +alor 3or defecto en la bd &n Acti+e1ecord 3ara definir un cam3o nulo se tienen la dos formas equi+alentes siguientes:
$usuario->direccion = null; $usuario->direccion = '';

Asimismo se 3ueden definir +alores 3or defecto 3ara los cam3os en el mismo Acti+e1ecordC solamente se debe asignar el +alor en los cam3os en los m/todos Oinitiali2ePC ObeforeEcreatePC ObeforeEu3dateP o ObeforeEsa+eP 3ara obtener ese com3ortamiento

Libro de Kumbia: Porque Programar debera ser ms fcil

6!

25 Meneraci#n >e Formularios


Los generadores de formularios son 0erramientas [tiles 3ara agili2ar el 3roceso de ca3tura@3resentaci#n de la informaci#n del modelo de datos enfati2ndose en la +elocidad 5 aumento de la 3roducti+idad Algo im3ortante a tener en cuenta es que no 0a5 generaci#n de c#digoC Kumbia inter3reta e+entualmente las caractersticas de los modelos 5 genera los formularios a 3artir de estos 4na im3ortante +entaBa de esto es que cualquier cambio en el modelo se +e inmediatamente refleBado en nuestras a3licaciones Las 3rinci3ales caractersticas de los generadores son:

Meneraci#n de Formularios 3rcticosC configurables 5 [tiles en la ma5or 3arte de casos Meneraci#n "nmediata de Formularios ;14> F;reateC 1eadC 43dateC>eleteG sobre entidades de la base de datos Aalidaci#n Automtica de Ji3os de >atos F*um/ricosC Je?toC Fec0asC&=<ails 5 Jiem3oG Aalidaci#n de "ntegridad 1elacional FLla+es enicasC Lla+es Forneas 5 Aalores de >ominioG Meneraci#n de 1e3ortes P>F 5 HJ<L basados en la informaci#n del modelo "ntegraci#n con AUAV 5 %er+icios Web

&n esta secci#n se e?3lica c#mo generar r3idamente un formulario A/1K LAreate, /ead, 1#date, Kelete9 basados en entidades de la base de datosC meBorando la eficiencia 5 ele+ando la 3roducti+idad

25.1 Ji3os de Formularios


%tandardForm: &s el formulario tradicional con los botones 3ara acti+ar los cam3os del formulario 5 efectuar las o3eraciones de AdicionarC <odificarC ;onsultarC DorrarC Aisuali2ar 5 1e3orte NOTA: este com#onente se #iensa reescribir de manera de ,acerlo mas leDible ' estandard

25.2 AentaBas Meneradores de Formularios

Hacen la ma5or 3arte del trabaBo Meneraci#n de la "nterfa2 Aalidaciones de >atos e "ntegridad FluBo de &ntrada de >atos Presentaci#n de "nformaci#n %e 3ueden ada3tar fcilmente a necesidades es3ecificas %e 3roducen resultados ms r3idoC sin efectos sobre la calidad ni en trabaBo 3ara el 3rogramador

Libro de Kumbia: Porque Programar debera ser ms fcil

6$

25.3 >es+entaBas Meneradores de Formularios


*o 0acen todo el JrabaBo *o se 3uede de3ender com3letamente de ellos La l#gica est enca3sulada 5 0ace difcil modificar ciertos com3ortamientos de los formularios

Libro de Kumbia: Porque Programar debera ser ms fcil

6(

24 %tandardForm
%tandardForm es una clase que 3ro3orciona Kumbia 3ara la generaci#n r3ida de formularios que tengan como obBeti+o el mantenimiento de la informaci#n de tablas 5 ca3tura de datos

24.1 5ntroduccin
%#lo 0a5 que 3reocu3arse 3or el dise\o de la base de datosC es3ecificar sus atributos 5 seguir unas sim3les con+enciones en los nombres de las columnas ms unas lneas e?tras de c#digoC 3ara obtener un formulario mu5 [til en menos de lo que es3erabas >ise\aremos algunas tablas eBem3lo:
1. CREATE TABLE `album` ( 2. `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 3. `nombre` VARCHAR(45) NOT NULL, 4. `genero_id` MEDIUMINT(8) UNSIGNED NOT NULL, 5. `artista_id` INT(10) UNSIGNED NOT NULL, 6. `valor` DECIMAL(10,0) NOT NULL, 7. `fecha_creado` DATE NOT NULL, 8. `cantidad` DECIMAL(10,0) UNSIGNED NOT NULL, 9. `estado` VARCHAR(1) NOT NULL, 10. `portada` VARCHAR(45), 11. PRIMARY KEY (`id`), 12. KEY `artista_id` (`artista_id`) 13.); 14. 15.CREATE TABLE `genero` ( 16. `id` INT(11) NOT NULL AUTO_INCREMENT, 17. `nombre` VARCHAR(50) NOT NULL, 18. PRIMARY KEY (`id`) 19.); 20. 21.CREATE TABLE `artista` ( 22. `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 23. `nombre` VARCHAR(50) NOT NULL, 24. PRIMARY KEY (`id`) 25.);

24.2 Arear un controlador #ara el -ormulario Album


1 Para estoC crearemos un fic0ero en el directorio controllersC con el nombre albumEcontroller 303 F%iem3re siguiendo esta con+enci#n: nombre de la tabla des3u/s gui#n baBo controllerG el controlador es una clase que 0ereda de %tandardFormC con el nombre Album;ontrollerC 5 la 3ro3iedad scaffold a true F0ace que KumbiaC lea la informaci#n de la tabla de la base de datos 5 cree un formulario ti3o %tandardFormG

Libro de Kumbia: Porque Programar debera ser ms fcil

6'

3 <?php 4 class AlbumController extends StandardForm{ 5 public $scaffold = true; 6 } 7 ?>

;on estas lneas de c#digo tenemos un formulario ;14> listo 3ara su utili2aci#n &l formulario resultante reali2a +alidaci#n automtica de los ti3os de datos F*um/ricosC Je?toC Fec0asC &=mailC Jiem3ojGC seg[n el ti3o definido en la estructura de en la base de datos se com3ortar en el formulario ! &s necesario crear los modelos que +an a ser utili2ados 3ara 0acer las o3eraciones La clase %tandardForm est integrada con Acti+e1ecord esto significa que de3ende de ella 3ara 0acer todas las o3eraciones de base de datos Para 0acer el m#dulo que utili2ar Album;ontroller creamos un arc0i+o en models llamado album 303:
1. <?php 2. class Album extends ActiveRecord { 3. } 4. ?>

24.3 Aonvenciones de los Nombres de las Aolumnas


Las con+enciones de Kumbia 3ermiten agili2ar el 3roceso de desarrollo de formularios 5 agili2an tareas comunes en este ti3o de formularios A continuaci#n se nombran las 3rinci3ales con+encionesC algunas de /stas no a3lican 3ara los generadores de formularios] 3ero a3lican siem3re en los modelos Acti+e1ecord:

24.3.1 id
4na columna con este nombre indica que es de naturale2a auto=num/ricaC es decir que lle+ar un consecuti+o 3or cada registro insertado &s mu5 im3ortante que sea usado tambi/n como lla+e 3rimaria de la entidad 5a que Kumbia asume en muc0as situaciones que as lo es F%i lo llamamos diferente de "dC nos crear un num/rico normal 5 no le asignara el n[mero corres3ondienteG

24.3.2 tablaCid
&s3ecificar una columna con esta con+enci#n le indicar a Kumbia que este cam3o es una relaci#n fornea a otra entidad del modelo de datos Por eBem3lo generoEid indica un cam3o forneo a la tabla genero en su cam3o id &s im3ortante aunque no obligatorio que los cam3os en ambas 3artes sean del mismo ti3o de dato esto a5uda a meBorar la +elocidad en la que se reali2an las consultas 5 e+ita com3ortamientos indeseados

24.3.3 cam#oCat
Los cam3os con nombre terminados en Eat son de naturale2a fec0a=tiem3o que son actuali2ados automticamente al reali2ar una modificaci#n del registro Libro de Kumbia: Porque Programar debera ser ms fcil 6-

24.3.( cam#oCin
Los atributos terminados en Ein toman la fec0a=tiem3o actual en el momento de ser insertados

24.3.5 email
Los cam3os con nombre email son ca3turados de forma es3ecial 3ara este ti3o de dato &?tra a estoC las columnas que en la base de datos definidas como *8J *4LLC sern +alidadas automticamente 3ara e+itar que no se +iole esta restricci#n Los cam3os de ti3o fec0a automticamente tienen una a5uda de calendario 5 +alidaci#n de dasC mesesC a\os 5 bisiestos

24.( Aom#ortamiento de un -ormulario ;tandard


Los formularios generados mediante esta clase tienen 3or defecto - funcionalidades bsicas: AdicionarC ;onsultarC <odificarC DorrarC Aisuali2ar 5 1e3orte

Los cam3os son +alidados automticamente de acuerdo a su ti3o Los cam3os 5 botones del formulario son 0abilitados@in0abilitados de3endiendo de cada acci#n e+itando a los usuarios 0acer o3eraciones indebidas &l Formulario genera automticamente un re3orte con la 3osibilidad de sacarlo en formato 2K-, EYAE<, ZO/K, FTE< 5 la 3osibilidad de ordenarlo seg[n cualquier cam3o acti+o &l Formulario 3osee una +ista 3ara na+egar 3or los registros ms fcilmente Permite el uso de 0el3ers 3ara a5udar a los usuarios a la ca3tura de datos

24.5 2ro#iedades de un -ormulario ;tandard


24.5.1 Ssca old LTrue o -alse9
Hace que KumbiaC lea la informaci#n de la tabla de la base de datos 5 cree un formulario ti3o %tandardForm

24.5.2 Ssource
&s el nombre de la tabla de la base de datos que utili2ar 3ara generar el Formulario %tandard Por defectoC el nombre de Hsource coge el +alor del nombre del controlador &Bem3lo : %i el nombre de el controlador es Album;ontrollerC entonces el nombre de la tabla la cual buscar los datos ser album &Bem3lo
1. <?php 2. class AlbumController extends StandardForm{ 3. public $scaffold = true; 4. public $source = "nombre_tabla"; 5. 6. }

Libro de Kumbia: Porque Programar debera ser ms fcil

66

24.5.3 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 </todos de la ;lase %tandardForm


&stos m/todos son llamados en el constructor de la clase 5 sir+en 3ara modificar ciertos com3ortamientos del formulario
1. <?php 2. class AlbumController extends StandardForm { 3. function __construct(){ 4. # Ignora el campo portada 5. $this->ignore('portada'); 6. } 7. } 8. ?>

24.4.1 setC ormCca#tionLStitle9


;ambia el ttulo del formulario 3or uno 3ersonali2ado

24.4.2 useC,el#erLScam#o9
Permite que un Hcam3o forneo tenga la facilidad de un formulario de a5uda e?tra 3ara insertar alg[n dato que no se encuentre al momento de insertar &Bem3lo >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. );

Libro de Kumbia: Porque Programar debera ser ms fcil

67

;#digo:
1. create table ciudad ( 2. id inteAer not null primar$ Ee$, 3. nombre varchar(50) not null, 4. primar$ Ee$)id* 5. );

&l cam3o ciudadEid 0ace la relaci#nC Kumbia busca un cam3o llamado: nombre, descri#cion o detalle en la tabla ciudad A0ora en el controlador: ;#digo:
1. <?php 2. 3. class ClientesController extends StandardForm{ 4. 5. public $scaffold = true; 6. public function __construct(){ 7. $this->use_helper("ciudad"); 8. } 9. 10.?>

24.4.3 setCt'#eCtimeLScam#o9
"ndica que un cam3o es de ti3o time Ftiem3oG as 3odemos 0acer una ca3tura utili2ando un com3onente es3ecial 3ara /stas

24.4.( setCt'#eCteDtareaLScam#o9
"ndica que un cam3o es de ti3o te?tareaC es3ecial 3ara te?tos largos como comentarios 5 descri3ciones

24.4.5 setCt'#eCima!eLScam#o9
Hace que un Hcam3o 3ermita almacenar direcciones a imgenesC subirlas al ser+idor 5 gestionarlas

24.4.4 setCt'#eCnumericLScam#o9
For2a que un Hcam3o adquiera el ti3o num/ricoC en este caso Kumbia +alida que la entrada de un cam3o 3or teclado 3ermita solamente teclas num/ricas

24.4.6 setCt'#eCdateLScam#o9
For2a que un Hcam3o sea de ti3o fec0aC mostrando una a5uda de calendario 5 un selector de fec0as 3or dasC meses 5 a\os

24.4.7 setCt'#eCemailLScam#o9
For2a que un Hcam3o sea de ti3o emailC mostrando un com3onente es3ecial 3ara Libro de Kumbia: Porque Programar debera ser ms fcil 69

ca3turar correos electr#nicos

24.4.8 setCt'#eC#ass%ordLScam#o9
&s3ecifica que un Hcam3o sea de ti3o 3asswordC ocultando la entrada con asteriscos 5 obligando la reconfirmaci#n del dato Los ti3o 3assword no a3arecen en +isuali2ar 3or moti+os de seguridad 1so de Encri#tacin en -ormularios ;tandard-orm Podemos usar el com3onente Password de %tandarForm 3ara encri3tarC 3ero ocurre un 3roblema Por eBem3lo si usamos un algoritmo como el s0a1 # md'C que es de una sola +aC no 3odremos desencri3tar nue+amente el +alor la 3r#?ima +e2 que el usuario lo +a5a a editar 3or esto se recomienda usar algoritmos como el A&% con el cual si 3odemos a3licar desencri3taci#n 5 que esta dis3onible en <5%.L Los cam3os ti3o 3assword deben ser encri3tados en el beforeEinsert 5 descri3tados en el afterEfetc0 3ara que todo funcione bien
1. function before_insert(){ 2. $this->Usuarios->password = "% aes_encrypt($this>post('fl_password'),'semilla')"; 3. } 4. 5. function after_fetch(){ 6. $this->Usuarios->password = "% aes_decrypt($this->Usuarios>password,'semilla')"; 7. }

24.4.10 setCteDtCu##erLScam#o9
Hace que los +alores de un cam3o 3ermane2can siem3re en ma5[sculas

24.4.11 setCcomboCstaticLScamo, arra' Svalores9


;rea un combo esttico que 0ace una +alidaci#n de dominio en un Hcam3o con los H+alores es3ecificados

24.4.12 setCcomboCd'namicLScam#o, Stabla, Scam#oKetalle, PcolumnCrelation: Scam#oR9


;rea un combo con los datos de la tabla FHtablaGC asociando la cla+e fornea FHcam3oGC 5 llenando el combo con los +alores FHcam3o>etalleG %i el cam3o en la tabla detalle no tiene el mismo nombre del de la tabla relaci#n entonces se debe usar columnErelation 3ara indicar el nombre de este ;on esta funci#n 3odremos crear dinmicamente Fsin seguir la con+enci#n cam3oEid del %tandardFormG lo mismo que useE0el3erFHcam3oG

Libro de Kumbia: Porque Programar debera ser ms fcil

7:

&Bem3lo: >ebes tener ! tablas: 1G 4na tabla maestra con alguna relaci#n 3or eBem3lo clientes: ;#digo:
1. CREATE TABLE `grupos_usuarios` ( 2. `id` smallint(6) NOT NULL auto_increment, 3. `nombre` char(15) NOT NULL, 4. `notas` tinytext, 5. PRIMARY KEY (`id`), 6. UNIQUE KEY `nombre` (`nombre`) 7. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

;#digo:
1. CREATE TABLE `usuarios` ( 2. `id` smallint(6) NOT NULL auto_increment, 3. `nombre` varchar(100) NOT NULL, 4. `login` char(8) NOT NULL, 5. `password` char(8) NOT NULL, 6. `grupos_usuarios_id` smallint(6) NOT NULL, 7. `notas` tinytext, 8. PRIMARY KEY (`id`), 9. UNIQUE KEY `nombre` (`nombre`), 10. UNIQUE KEY `login` (`login`), 11. KEY `grupos_usuarios_id` (`grupos_usuarios_id`), 12. CONSTRAINT `usuarios_ibfk_1` FOREIGN KEY (`grupos_usuarios_id`) REFERENCES `grupos_usuarios` (`id`) ON UPDATE CASCADE 13.) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

A0ora en el controlador a33s@default@controllers@usuariosEcontroller 303:


<?php class UsuariosController extends StandardForm { public $scaffold = true; public function __construct(){ $this->set_type_password('password'); $this->set_combo_dynamic('grupos_usuarios_id', 'grupos_usuarios', 'nombre'); } F

24.4.13 i!noreLScam#o9
Hace que un cam3o no sea +isuali2ado en el formularioC ni tenido en cuenta en las o3eraciones del ;14>

24.4.1( setCsi0eLScam#o, Ssi0e9


;oloca el tama\o de un cam3o te?to en Hsi2e

Libro de Kumbia: Porque Programar debera ser ms fcil

71

24.4.15 setCmaDlen!t,LScam#o, Slen!t,9


;oloca el tama\o m?imo de un cam3o de te?to en Hlengt0

24.4.14 notCbro%seLScam#o, [Scam#o2, ...\9


Hace un cam3o no a3are2ca en la +ista de Aisuali2aci#n &ste cam3o 3uede recibir una lista de cam3os

24.4.16 notCre#ortLScam#o9
Hace un cam3o no a3are2ca en el re3orte >esa3arece el bot#n de <odificar

24.4.17 setCtitleCima!eLSim9
*ombre de imagen que a3arecer antes del titulo del formulario en forma decorati+a >ebe estar en el directorio 3ublic@img@

24.4.18 ieldsC#erCro%LSnumber9
8rgani2a los cam3os del formulario colocando Hnumber cam3os en cada fila Por defecto es 1

24.4.20 unableCinsert
"m3ide que se inserte en el formulario >esa3arece el bot#n de Adicionar

24.4.21 unableCdelete
"m3ide que se borren datos usando el formulario >esa3arece el bot#n de Dorrar
1. <?php 2. 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

Libro de Kumbia: Porque Programar debera ser ms fcil

7!

24.4.2( unableCbro%se
"m3ide +isuali2ar la +ista de Aisuali2aci#n >esa3arece el bot#n de Aisuali2ar
1. <?php 2. 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

24.4.28 setCca#tionLScam#o, Sca#tion9


;ambia el Label 3or defecto de un cam3o 3or otro

24.4.30 setCactionCca#tionLSaction, Sca#tion9


;ambia el Je?to de los DotonesC de los formularios %tandard
1. <?php 2. 3. 4. 5. 6. 7. 8. 9. 10. ?> class eCuentasController extends StandardForm{ public $scaffold = true; public function __construct(){ $this->set_action_caption("insert", "Agregar"); $this->set_action_caption("report", "Listado"); } }

Libro de Kumbia: Porque Programar debera ser ms fcil

7$

24.4.31 setCeventLSaction, Sca#tion9


&sta Funci#n introducida F+ersi#n : ( ' beta6GC nos facilita la introducci#n de funciones en los e+entos a ni+el de cam3o FAalidaci#n 3or cam3oG &sto es un &Bem3loC cuando salimos del cam3o nombreC le 3onemos automticamente el +alor al cam3o ra2on%ocial
1. <?php 2. class ClientesController extends StandardForm{ 3. public $scaffold = true; 4. function __construct(){ 5. 6. $this->set_event('nombre','onblur','$C(razonsocial").value = $C("nombre").value'); 7. 8. } 9. } 10.?>

24.4.32 setCattributeLS ield, Sattribute,Svalue9


Asigna un atributo a un cam3o del formulario &Bem3lo: Por &Bem3lo en un cam3o >escri3cionFte?tareaG le queremos reducirC el n[mero de lneas 5 la longitud:
///n el constructor de la clase: .unction ((construct)* G $this&'set(attribute)C4escripcionC, CrowsC, >*! $this&'set(attribute)C4escripcionC, Ccols%, >H*! F

24.4.33 s,o%CnotCnullsL9
Hace que a3are2ca un asterisco al lado de los cam3os del formulario que sean obligatorios

24.4.3( setCmessa!eCnotCnullLSmessa!e9
<uestra un mensaBe 3ersonali2ado 3ara los cam3os del formulario que sean obligatorios.

Libro de Kumbia: Porque Programar debera ser ms fcil

7(

24.6 Eventos del lado del Aliente LAallbacks9


%tandardForm 3osee una serie de e+entos FcallbacksG del lado del cliente usando tecnologa Ua+ascri3tC 3ara esto debemos crear un arc0i+o Ba+ascri3t con el nombre del controlador en el directorio 3ublic@Ba+ascri3t@C 3or eBem3lo 3roductos Bs La lista de e+entos es la siguiente:

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

Libro de Kumbia: Porque Programar debera ser ms fcil

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

Libro de Kumbia: Porque Programar debera ser ms fcil

7-

24.7 Eventos del lado del ;ervidor LAallbacks9


&n ocasiones queremos eBecutar ciertos 3rocesos antes de reali2ar una inserci#nC modificaci#n o borrado con el fin de reali2ar +alidacionesC 0acer mo+imientos en otras entidadesC etc Para esto los formularios %tandardForm 3oseen una serie de e+entos que llaman a m/todos de la clase 3ara eBecutar estas o3eraciones antes de 5 des3u/s de 4n e+ento se 3uede definir mediante un nombre a un m/todo en las 3ro3iedades de la clase as:
1. <?php 2. 3. class AlbumController extends StandardForm { 4. 5. private $after_insert = "mover_kardex"; 6. 7. private function mover_kardex(){ 8. /* ... */ 9. } 10. } 11. ?>

o directamente con el nombre del m/todo:


1. <?php 2. 3. class AlbumController extends StandardForm { 4. 5. private function after_insert(){ 6. /* ... */ 7. } 8. } 9. ?>

&?isten ! ti3os de e+entos los beforeE Fantes deG 5 los afterE Fdes3u/s deG Los m/todos beforeE se eBecutan antes de una determinada o3eraci#n 5 cuando de+uel+en false cancelan la o3eraci#n que se est trabaBando Por eBem3lo un return false desde beforeEu3date cancelara la actuali2aci#n

Los e+entos before son e?celentes 3ara +alidaciones 3re=o3eraci#n Los e+entos after funcionan meBor 3ara eBecutar 3rocesos com3lementarios a la o3eraci#n actual

Los e+entos de %tandardForm son com3lementarios a los e+entos de Acti+e1ecord A continuaci#n una lista de e+entos:

24.7.1 be oreCinsert
%e eBecuta antes de la o3eraci#n insert %i de+uel+e false cancela la inserci#n

Libro de Kumbia: Porque Programar debera ser ms fcil

76

24.7.2 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

24.7.7 be oreC etc,


%e eBecuta antes de reali2ar la o3eraci#n de mostrar un registro en la consulta

24.7.8 a terC etc,


%e eBecuta des3u/s de reali2ar la o3eraci#n de mostrar un registro en la consultaC 3ero antes de mostrar el formulario Para acceder a los +alores que se +an a insertar@actuali2ar@borrar se 3uede 0acer de esta forma: Libro de Kumbia: Porque Programar debera ser ms fcil 77

>e la misma forma a los +alores que fueron insertados@modificados

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. ?>

24.8 Traba&ando con 5m:!enes


Los formularios %tandardForm 3ermiten 3ersonali2ar algunos atributos 3ara que 3ermitan a los usuarios de nuestras a3licaciones subir imgenes al ser+idor 5 asociarlas a un registro determinado &n nuestro eBem3lo el cam3o 3ortada re3resenta la imagen 3ortada de un lbum 5 tiene el com3ortamiento 3resentado anteriormente 4tili2ando el m/todo 0eredado de %tandarForm llamado set_type_image 3odemos indicarle a kumbia que debe tratar al cam3o 3ortada como una imagen
1. <?php 2. class AlbumController extends StandardForm { 3. public $scaffold = true; 4. function AlbumController(){ 5. $this->set_type_image('portada'); 6. } 7. } 8. ?>

Al momento de eBecutarC /ste a3arece como un com3onente 0tml de ti3o file que le 3ermite al usuario seleccionar la imagen de su colecci#n 3ara que sea subida al ser+idor

24.10 Oalidaciones LA nivel de Aam#o9


Jenemos la 3osibilidad de +alidar a ni+el de cam3oC 3or eBem3lo al salir de un cam3oC eBecute una funci#n
1. $this->set_event(nombre, blur, 'alert("Sali de Nombre")');

&Bem3lo: Al salir del cam3o nombreC nos 3one el mismo +alor en el cam3o ra2onsocialC como se +e el c#digo Ba+ascri3t insertado en el onblur
1. <?php 2. class ClientesController extends StandardForm{ 3. 4. public $scaffold = true; 5. public $template = "menu"; 6. 7. function __construct(){

Libro de Kumbia: Porque Programar debera ser ms fcil

79

8.

$this- >set_event(razonsocial, blur, '$C(razonsocial").value = $C(nombre").value'); 9. } 10. function ClientesController(){ 11. $this->set_action_caption("insert","Agregar"); 12. $this->set_action_caption("report","Listado"); 13. $this->set_form_caption("Gestin de Clientes"); 14. $this->set_title_image("logo.jpg"); 15. $this->use_helper('codpostal'); 16. } 17.} 18.?>

24.11 Aombos Est:ticos


Kumbia 3ermite el uso de combos estticos 3ara +alidar integridad de dominio Por eBem3lo el cam3o estado s#lo 3uede tener +alores FActi+o e "nacti+oG 3or lo tanto 3odemos a3licar el m/todo setEcomboEstatic 3ara definir los +alores que 3uede tomar este cam3o 5 facilitar la ca3tura de datos 3or 3arte de los usuarios
1. <?php 2. class AlbumController extends StandardForm{ 3. public $scaffold = true; 4. function AlbumController(){ 5. $this&'set(combo(static)@estado@,arra$) 6. arra$)@A@,@A75;I8@*, 7. arra$)@;@,@;:A75;I8@* 8. )); 9. } 10. } 11. ?>

24.12 Aambiando el as#ecto de -ormularios ;tandard-orm


Ha5 ciertas formas de cambiar el as3ecto en cuanto a colores 5 estilos en formularios de este ti3o &sto lo 0acemos 3ara ada3tar meBor estos formularios a nuestra a3licaci#n &stos cambios deben ser reali2ados en 3ublic@css@st5le css o en cualquier css que sea im3ortado antes de renderi2ar F+isuali2arG la a3licaci#n Aambiar estilo de los botones como Adicionar, Ace#tar, etc: %e 3uede definir un estilo general 3ara las etiquetas in3utC selectC te?tareaC etc o definir la clase css controlDutton que es ms es3ecifica 3ara estos botonesC as:

1. input, select { 2. font-family: Verdana; 3. font-size: 14px; 4. } 5. 6. .controlButton { 7. color: red;

Libro de Kumbia: Porque Programar debera ser ms fcil

9:

8. 9. 10.}

background: white; border: 1px solid green;

Aambiar estilo de las ca&as de teDto ' com#onentes: %e 3uede definir un estilo general 3ara las etiquetas in3utC selectC te?tareaC etc o definir la clase css con un selector 3ara el id del obBeto que es ms es3ecfica 3ara estos com3onentesC as:
1. input, select { 2. font-family: Verdana; 3. font-size: 14px; 4. } 5. 6. #flid_nombre, #flid_ciudad_id { 7. color: red; 8. background: white; 9. border: 1px solid green; 10.}

Aambiar los colores de la vista visuali0ar: ;ambiamos los colores intercalados usando las siguientes clases donde 3rimar5 se refiere a uno de esos colores 5 a secundar5 al otro La clase terminada en acti+e es la utili2ada cuando el usuario coloca el mouse encima de alguna fila
1. .browse_primary { 2. background: #AEB9FF; 3. } 4. 5. .browse_primary_active { 6. background: #AEB9FF; 7. } 8. 9. .browse_secondary { 10. background: #FFFFFF; 11.} 12. 13..browse_secondary_active { 14. background: #F2F2F2; 15.}

Aambiar los valores #ara un ormulario en es#ecial: Para esto ante3ondremos el nombre del controlador como clase antes de la clase o del selector en cuesti#n as:
1. .productos input, select { 2. font-family: Verdana; 3. font-size: 14px; 4. } 5. 6. .productos #flid_nombre, #flid_ciudad_id { 7. color: red;

Libro de Kumbia: Porque Programar debera ser ms fcil

91

8. 9. 10.}

background: white; border: 1px solid green;

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

26.2 Areacin de un Aontrolador


Los controladores en Kumbia deben ser creados en el directorio controllers 5 lle+ar la siguientes con+enciones 5 caractersticas:

&l arc0i+o debe tener el nombre del controlador 5 la terminaci#n *controller.php &l arc0i+o debe estar ubicado s#lo en el directorio controllers &l arc0i+o debe tener al menos una clase 5 una de ellas debe ser el controlador 9$

Libro de Kumbia: Porque Programar debera ser ms fcil

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. ?>

class ProductosController extends ApplicationController { }

27 A33lication;ontroller
&s la clase 3rinci3al utili2ada 3ara crear controladoresC que son la 3rimera 3arte del modelo <A; ;ontiene m/todos im3ortantes 3ara facilitar la interacci#n entre /stosC los modelos 5 la 3resentaci#n ;aractersticas:

Libro de Kumbia: Porque Programar debera ser ms fcil

9(

Los +alores de los atributos de las sub=clases son 3ersistentesC es decir que no se 3ierden cuando termina la eBecuci#n de un scri3t Automati2a la interacci#n entre la l#gica 5 la 3resentaci#n &s sencilla de usar

27.1 E+todos de la Alase A##licationAontroller


La clase 3osee una serie de m/todos que son [tiles 3ara el trabaBo con controladores

27.1.1 renderLSvie%9
Aisuali2a una +ista que 3ertenece al mismo controlador &Bem3lo:
1. <?php 2. 3. class ProductosController extends ApplicationController { 4. 5. function index(){ 6. $this->render('consultar'); 7. } 8. 9. } //fin de la clase 10. 11.?>

&n este caso se +isuali2ara la +ista views+productos+consultar.phtml

27.1.2 redirectLSurl, SsecondsG0.59


1edirecciona la eBecuci#n a otro controlador en un tiem3o de eBecuci#n determinado
1. <?php 2. 3. class ProductosController extends ApplicationController { 4. 5. function index(){ 6. $this->redirect('facturas/nueva', 2); 7. } 8. 9. } 10. 11.?>

&n el eBem3lo +a a facturas@nue+a des3u/s de ! segundos

27.1.3 #ostLSvalue9
8btiene acceso orientado a obBetos a los +alores de SC2O;TC Svalue es el ndice 3ara 3asar al arra5 asociati+o

Libro de Kumbia: Porque Programar debera ser ms fcil

9'

27.1.( !etLSvalue9
8btiene acceso orientado a obBetos a los +alores de SC]ETC Svalue es el ndice 3ara 3asar al arra5 asociati+o

27.1.5 re"uestLSvalue9
8btiene acceso orientado a obBetos a los +alores de HE1&.4&%JC H+alue es el ndice 3ara 3asar al arra5 asociati+o

27.1.4 renderC#artialLSname9
Aisuali2a una +ista 3arcial F3artialG que 3ertenece al mismo controlador &Bem3lo:
1. <?php 2. 3. class ProductosController extends ApplicationController { 4. 5. function index(){ 6. $this->render_partial('mostrar_menu'); 7. }//fin del metodo 8. 9. }//fin de la clase 10. 11.?>

&n este caso se +isuali2ara la +ista 3arcial views+productos+*mostrar*menu.phtml

27.1.6 routeCtoL[#arams: valor\9


Hace el enrutamiento desde un controlador a otroC o desde una acci#n a otra 1ecibe los 3armetros con nombre:

controller: A qu/ controlador se +a a redireccionar action: A que acci#n se +a a redireccionar id: "d de la redirecci#n

&Bem3lo:
1. return $this->route_to("controller: clientes", "action: consultar", "id: 1");

&l ti3o de enrutamiento que reali2a es internoC es decir que lo usuarios no notan cuando estn siendo redireccionados en la a3licaci#n

27.1.7 redirectLSurlCcontrolador9
1eali2a un redireccionamiento a otro controlador@accion mediante HJJP &s [til cuando queremos 0acer una real redirecci#n que incluso cambie la 41L que a3arece en el e?3lorador &Bem3lo:

Libro de Kumbia: Porque Programar debera ser ms fcil

9-

1. $this->redirect(/productos/query);

27.1.8 cac,eCla'outLSminutes9
;ac0/ de la +ista views+la out+ corres3ondiente al controlador durante Hminutes

27.1.10 notC oundLScontroller, Saction9


Puedes definir el m/todo notEfound en cualquier controladorC en caso de estar definido se llamar cuando no encuentre definida alguna acci#n as es ms fcil controlar este ti3o de errores:
1. <?php 2. class PruebaController extends ApplicationController { 3. 4. function index(){ 5. $this->render_text("Este es el index"); 6. } 7. 8. function not_found($controller, $action){ 9. Flash::error("No esta definida la accion $action, redireccionando a index..."); 10. return $this->route_to('action: index'); 11. } 12. } 13.?>

NOTA: A,ora en la versin 0.5 se inclu'e un vista views+not*found.phtml& esto ,ace "ue no se ,a!a necesario la im#lementacion del metodo 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.

Libro de Kumbia: Porque Programar debera ser ms fcil

96

4. 5. 6. 7. 8. 9. 10. 11. 12. } 13.?>

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');

Libro de Kumbia: Porque Programar debera ser ms fcil

97

27.1.1( isCnumericLSvalor9
&+al[a si un cam3o es num/rico o no &s [til 3ara +alidar la entrada de datos al recibirlos 3or 3arte de usuarios
1. <?php 2. class PruebaController extends ApplicationController { 3. 4. function adicionar(){ 5. $precio = $this->request(precio); 6. if($this->is_numeric($precio)==false){ 7. Flash::error(Entrada invalida para precio); 8. return; 9. } 10. /* ..*/ 11. } 12. } 13.?>

Libro de Kumbia: Porque Programar debera ser ms fcil

99

28 8btener +alores desde una de Kumbia


Las 41Ls de Kumbia estn caracteri2adas 3or tener +arias 3artes cada una de ellas con una funci#n conocida Para obtener desde un controlador los +alores que +ienen en la 41L 3odemos usar algunas 3ro3iedades [tiles en el controlador: &Bem3lo1: 0tt3:@@www kumbia303 com@a3licacion@3roductos@buscar@1! &l sitio es: kumbia org La a3licaci#n es: a3licacion &l controlador es: 3roductos La acci#n es: buscar &l +alor 3ara id es: 1! *uestro controlador a3licaci#n@3roductosEcontroller 303 luce as:
1. <?php 2. 3. class ProductosController extends ApplicactionController { 4. 5. public function buscar($id){ 6. /* */ 7. } 8. } 9. 10.?>

>entro del m/todo buscar 3odemos obtener el +alor de id osea 1! en nuestro eBem3lo colocando un 3armetro al controlador Hid 3odemos recoger este +alor 5 utili2arlo internamente 8tras formas de 0acer esto es utili2ar los m/todos 3ostC get o request as:
1. public function buscar(){ 2. $id = $this->request(id); 3. // o tambin 4. $id = $this->id; 5. }

)Amo saber el nombre del controlador actual.

1. public function buscar(){ 2. $controlador = $this->controller_name; 3. }

)Amo saber el nombre de la accin actual.


1. public function buscar(){ 2. $controlador = $this->action_name; 3. }

Libro de Kumbia: Porque Programar debera ser ms fcil

1::

A0ora +eamos el siguiente eBem3lo: 0tt3:@@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. }

Libro de Kumbia: Porque Programar debera ser ms fcil

1:1

Por [ltimo 3odemos +er todos los 3armetros que +ienen en una url de Kumbia usando la 3ro3iedad del controlador Ht0is=IallE3arameters 4na salida de esta +ariable en el eBem3lo anterior con 3rintEr muestra:
1. Array 2. ( 3. [0] 4. [1] 5. [2] 6. [3] 7. [4] 8. )

=> => => => =>

registro buscar_fecha 2006 12 01

Libro de Kumbia: Porque Programar debera ser ms fcil

1:!

30 Persistencia en ;ontroladores
A33lication;ontroller 3osee una funcionalidad mu5 [til que es la 3ersistencia de los +alores de los atributos del frameworkC +eamos un eBem3lo:
1. <?php 2. 3. 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');

Libro de Kumbia: Porque Programar debera ser ms fcil

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 *!

$this->render_partial('carrito'); } }//fin de la clase

;omo +emos el atributo Scarro es un arra5 que contiene los items que se +an agregando al carro de com3rasC los +alores de esta +ariable se mantienen en cada llamada sin utili2ar llamadas e?trasC ni com3licaciones

Libro de Kumbia: Porque Programar debera ser ms fcil

1:(

31 Filtros en ;ontroladores
Los controladores en Kumbia 3oseen unos m/todos [tiles que 3ermiten reali2ar ciertas acciones antes 5 des3u/s de atender las 3eticiones en los controladoresC estos m/todos son los siguientes:

31.1 be oreC ilterLScontroller, Saction, Sid9


&ste m/todo es eBecutado Busto antes de llamar a la acci#n en el controlador 1ecibe como 3armetros el nombre del controladorC el nombre de la acci#n 5 el id o3cional que com3onen la 3etici#n al controlador actual &ste m/todo es [til 3ara +alidar si un determinado usuario o rol tiene acceso a una acci#n en es3ecial "gualmente lo 3odemos usar 3ara 3roteger nuestro controlador de informaci#n inadecuada que sea en+iada a ellos 5 utili2arlo 3ara +alidar los datos de entrada
1. <?php 2. 3. class EmpresasController extends ApplicationController { 4. 5. public function before_filter($controlador, $accion, $id){ 6. if($accion=='insertar'&&Session::get_data(usuario_autenticado )==false){ 7. Flash::error(El usuario debe estar autenticado para usar este modulo); 8. return false; 9. } 10. } 11. 12. public function insertar(){ 13. /* ... */ 14. } 15. 16. } 17.?>

&n el eBem3lo se solicita a33licacion@em3resas@insertarC el m/todo beforeEfilter es llamado automticamente antes del m/todo insertarC en /steC +alidamos si la acci#n es insertar 5 si el usuario est autenticado seg[n nuestra +ariable de sesi#n usuarioEautenticado

31.2 a terC ilterLScontroller, Saction, Sid9


&ste m/todo es eBecutado Busto des3u/s de llamar a la acci#n en el controlador 1ecibe como 3armetros el nombre del controladorC el nombre de la acci#n 5 el id o3cional que com3onen la 3etici#n al controlador actual &s [til 3ara liberar recursos que 0an sido usados en las acciones de los controladores o reali2ar redirecciones usando routeEto

Libro de Kumbia: Porque Programar debera ser ms fcil

1:'

31.3 notC oundLScontroller, Saction, Sid9


&ste m/todo es llamado siem3re 5 cuando est/ definido 5 3ermite reali2ar una acci#n de usuario en caso de que se 0aga una 3etici#n de una acci#n que no e?ista en un controlador
1. <?php 2. class PruebaController extends ApplicationController { 3. 4. function index(){ 5. $this->render_text("Este es el index"); 6. } 7. 8. function not_found($controller, $action){ 9. Flash::error("No esta definida la accion $action, redireccionando a index..."); 10. return $this->route_to('action: index'); 11. } 12. } 13.?>

Libro de Kumbia: Porque Programar debera ser ms fcil

1:-

32 A33lication;ontrollerDase
&s una clase definida en el arc0i+o controllers+application.phpC de esta forma:
1. <?php 2. 3. class ControllerBase 4. 5. 6. }//fin de la clase 7. 8. ?> {

La clase tiene como obBeti+o 3ermitir que se com3artan ciertos m/todos 5 atributos que deben estar dis3onibles 3ara todos los controladores de la a3licaci#n
1. <?php 2. 3. class ControllerBase { 4. 5. protected function seguridad(){ 6. /* ... */ 7. } 8. 9. }//fin de la clase 10. 11.?>

5 3or eBem3lo en el controlador 3roductos 3odramos usar este m/todo as:


1. <?php 2. 3. class Productos extends ApplicationController 4. 5. public function adicionar(){ 6. 7. if($this->seguridad()){ 8. /* .... */ 9. } 10. 11. } 12. 13. }//fin de la clase 14. 15. ?>

&l m/todo seguridad a0ora se encuentra dis3onible 3ara cualquier controlador

Libro de Kumbia: Porque Programar debera ser ms fcil

1:6

33 &nrutamiento 5 1edirecciones
Kumbia 3ro3orciona un 3oderoso sistema de redireccionamiento que 3ermite cambiar el fluBo de la eBecuci#n de una a3licaci#n entre los controladores <A; Kumbia 3ermite el re=direccionamiento de ! formas: esttico 5 dinmico

33.1 )2or "u+ re@direccionamiento.


*ecesitamos cambiar el fluBo de la eBecuci#n entre controladoresC bsicamente E&em#lo: &l usuario trata de acceder a una acci#n que no e?iste 5 queremos en+iarla a una +lida E&em#lo: &l usuario de la a3licaci#n no tiene 3ri+ilegios 3ara continuar eBecutando determinada acci#n 5 debemos en+iarlo a otra

33.2 Est:tico
&l direccionamiento esttico ocurre en el arc0i+o forms+config+routes.ini en donde le decimos al framework cundo debe redireccionar de acuerdo a los controladores 5@o acciones solicitadas &l arc0i+o config+routes.ini se +e as:
1. ; Usa este archivo para definir el enrutamiento esttico entre 2. ; controladores y sus acciones 3. ; 4. ; Un controlador se puede enrutar a otro controlador utilizando '*' como 5. ; comodn as: 6. ; controlador1/accion1/valor_id1 = controlador2/accion2/valor_id2 7. ; 8. ; Ej: 9. ; Enrutar cualquier peticin a posts/adicionar a posts/insertar/* 10.; posts/adicionar/* = posts/insertar/* 11.; 12.; Enrutar cualquier peticin a cualquier controlador en la accin 13.; adicionar a posts/adicionar/* 14.; */adicionar/* = posts/insertar/* 15. 16.[routes] 17.prueba/ruta1/* = prueba/ruta2/* 18.prueba/ruta2/* = prueba/ruta3/*

;ualquier 3oltica definida direccionamiento dinmico

en

este

arc0i+o

tiene

menos

rele+ancia

sobre

un

Libro de Kumbia: Porque Programar debera ser ms fcil

1:7

33.3 Kin:mico
8curre cuando en eBecuci#n necesitamos cambiar el fluBo normal 5 3asar a otro controlador o a otra acci#n &l 3rinci3al m/todo 3ara 0acer esto es usar el m/todo route*to: 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. return $this->route_to("controller: clientes", "action: consultar", "id: 1");

*o todos los 3armetros son obligatorios s#lo el que sea necesario

Libro de Kumbia: Porque Programar debera ser ms fcil

1:9

3( Filter
Para la Oersin 0.5 se incor3ora el com3onente -ilter el cual 3ro3orciona un conBunto de filtros que sern a3licados a datos que lo requieran

3(.1 *ue es un -iltro.


4n filtro es utili2ado 0abitualmente 3ara eliminar 3orciones no deseadas de una entrada de datosC 5 la 3orci#n deseada de la entrada 3asa a tra+/s de la 3roducci#n como filtro F3or eBem3loC caf/G &n estos escenariosC un filtro es un o3erador que 3roduce un subconBunto de la entrada &ste ti3o de filtro es [til 3ara a3licaciones web = la su3resi#n de entrada ilegalC innecesario el recorte de los es3acios en blancoC etc &sta definici#n bsica de un filtro 3uede ser am3liado 3ara incluir a las transformaciones generali2adas de entrada 4na transformaci#n que se debe a3licar a las a3licaciones web es el esca3ar de las entidades HJ<L Por eBem3loC si un cam3o de formulario es automticamente 3oco fiable de entradaC este +alor debe ser libre de las entidades HJ<LC a fin de e+itar las +ulnerabilidades de seguridad Para cum3lir con este requisitoC las entidades HJ<L que a3arecen en la entrada debe ser eliminado o que se 0a5an esca3ado Por su3uestoC enfoque que es ms a3ro3iado de3ende de la situaci#n 4n filtro que elimina las entidades HJ<L o3era dentro del mbito de a3licaci#n de la 3rimera definici#n de filtro = un o3erador que 3roduce un subconBunto de la entrada

3(.2 1tili0acin Q:sica


&n este eBem3lo se le 3asa 3or el constructor de class Filter dosFu33erC 0tmls3ecialc0arsG filtros que sern a3licados a la cadena
$filter = new Filter('upper', 'htmlspecialchars'); $var = '<b>Hola</b>'; print(r)$.ilter&'appl$)$var**! //K<'#86AK/<'

A continuaci#n se a3lica el filtro de manera dinmica


$filter = new Filter(); $var = '<b>Hola</b>'; print(r) $.ilter&'appl$(.ilter)$var, @upper@, @htmlspecialchars@** //K<'#86AK/<'

8tra forma de a3licar filtros


$var = '<b>Hola</b>'; $filter = new Filter('upper', 'htmlspecialchars'); print(r )$.ilter&'.ilter(value)$var**!

Adicionalmente los filtros so3ortan como 3armetros a filtrar arra5


$var = array('<b>Hola</b>'); $filter = new Filter('upper', 'htmlspecialchars'); print(r) $.ilter&'appl$)$var**!//K<'#86AK/<'

Libro de Kumbia: Porque Programar debera ser ms fcil

11:

3(.3 E+todos de la clase -ilter


A continuaci#n se listan los m/todos dis3onibles en la clase filterC el constructor de la clase filter 3uede recibir los filtros a ser a3licados

3(.3.1 addC ilterLS ilter9


Agregar un filtro a la cola de filtros

3(.3.2 a##l'LSvar, [ ilters\9 ' a##l'C ilterLSvar, [ ilters\9


A3lica un filtros o un gru3o de filtros a la +ariable H+ar

3(.3.3 !etCinstanceL9
8btiene una instancia singlenton

3(.( -iltros Kis#onibles


Actualmente se cuenta con una serie de filtros que 3ueden utili2ados

3(.(.1 addslas,es
Filtra una cadena 0aciendo addslas0es

3(.(.2 alnun
Filtra una cadena 3ara que contenga solo al30a=numeic

3(.(.3 al#,a
Filtra una cadena 3ara que contenga solo alfab/tico

3(.(.( date
Filtra una cadena 3ara que contenga el formato fec0aC debe cum3lir con un 3atr#n

3(.(.5 di!it
Filtra una cadena 3ara que contenga solo >gitosC sigue siendo un string lo que retorna el m/todo

3(.(.4 ,tmlentities
Filtra una cadena 5 0ace que todos los caracteres que tengan una entidad equi+alente en HJ<L sern cambiados a esas entidades

3(.(.6 ,tmls#ecialc,ars
Filtra una cadena 0tmls3acialc0ars

Libro de Kumbia: Porque Programar debera ser ms fcil

111

3(.(.7 u##er
Filtra una cadena 3ara que contenga solo <a5usculas

3(.(.8 trim
Filtra una cadena 0aciendo trim

3(.(.10 stri#ta!s
Filtra una cadena 3ara eliminar etiquetas

3(.(.11 stri#s#ace
Filtra una cadena 3ara eliminar es3acios

3(.(.12 stri#slac,es
Filtra una cadena 0aciendo stri3slas0es

3(.(.13 numeric
Filtra una cadena 3ara que contenga solo numerico

3(.(.1( nl2br
Filtra una cadena con+irtiendo caracteres de nue+a linea en cbrI

3(.(.15 md5
Filtra una cadena encri3tando a md'

3(.(.14 lo%er
Filtra una cadena 3ara que contenga solo minuscula

3(.(.16 i#v(
Filtra una cadena 3ara que sea de ti3o i3+(C debe cum3lir con el 3atr#n

3(.(.17 int
Filtra una cadena 3ara que sea de ti3o enteroC retorna un integer m/todo

Libro de Kumbia: Porque Programar debera ser ms fcil

11!

35 Aistas
Kumbia 3osee un sistema de 3resentaci#n basado en +istas F+iewsG que +iene siendo el tercer com3onente del sistema <A; F<odel Aiew ;ontrollerG &l framework a3lica un 3atr#n de dise\o llamado Jem3lateAiew que 3ermite utili2ar un sistema de 3lantillas 5 +istas que son reutili2ables 3ara no re3etir c#digo 5 darle ms 3oder a nuestra 3resentaci#n Las +istas deberan contener una cantidad mnima de c#digo en PHP 3ara que fuese suficientemente entendible 3or un dise\ador Web 5 ademsC 3ara deBar a las +istas s#lo las tareas de +isuali2ar los resultados generados 3or los controladores 5 3resentar las ca3turas de datos 3ara usuarios Jambi/n 3ro3orciona unas a5udas FAistas Hel3ersG que generan cierto c#digo mu5 com[n en a3licaciones Web aumentando la 3roducti+idad

Aisuali2ar informaci#n de los modelosC mensaBes de los controladores e interfa2 de usuario >eben gestionar cualquier salida de la A3licaci#n Permiten reutili2ar c#digo utili2ado 3ara 3resentaci#n en forma de 3lantillas Permiten cac0ear las +istas 3ara acelerar el rendimiento Permiten el uso de %mart5 como motor de Plantillas

35.1 2or"ue usar Oistas.


Las a3licaciones Web 5 %itios generalmente tienen una estructura en la cual se 3uede identificar una cabeceraC unas barras de na+egaci#n 5 un 3ie de 3agina Y si tu+i/ramos muc0as 3ginas entonces tendramos que re3etir el c#digo de los encabe2ados 5 del dise\o inicial tantas +eces como 3ginas tu+i/ramos Las +istas son una soluci#n a esto

&n la figura 3odemos obser+ar la estructura de un sitio o a3licaci#n Web ;ada bloque re3resenta en nuestro caso una +ista que debe ser abstrada 3ara que no sea re3etida en cada +isuali2aci#n Libro de Kumbia: Porque Programar debera ser ms fcil 11$

;omo lateralC 3ie de 3gina 5 cabecera se re3iten siem3reC entonces 3odramos ubicarlos a ni+el de la5out en donde serian com[n a cualquier acci#n del controlador al cual 3ertene2ca el la5out 8tra alternati+a es crear un 3artial 3ara estos $ bloques 5 reutili2arlos en otros la5outs Los 3artials re3resentan 3eque\as unidades de +istas 5 son utili2ados 3are re3resentar 3eque\os fragmentos de c#digo La +ista 3rinci3al +iews@inde? 30tml re3resenta la +ista su3erior donde cualquier cambio a esta +ista afecta las ca3as inferiores La estructura del sistema de +istas es el siguiente:

35.2 1so de Oistas


Jal 5 como se +io en Primera A3licaci#n en KumbiaC las +istas son automticamente +isuali2adas si se sigue la con+enci#n de nombrarlas con el mismo nombre de la acci#n dentro de un directorio con el nombre del controlador en +iews <as vistas, la'outs, tem#lates ' #artiales tienen la e?tensi#n .#,tml que indica que es #,# con ,tml E&em#lo: %i tu+i/ramos un controlador ;lientes 5 queremos mostrar una +ista 3ara su acci#n adicionar entonces 0acemos lo siguiente:
1. <?php 2. class ClientesController extends ApplicationController { 3. 4. function adicionar(){ 5. 6. } 7. } 8. ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

11(

5 la +ista sera el arc0i+o views+clientes+adicionar.phtml:


1. <h2>Hola desde Accin Adicionar</h2>

*o es necesario definir una +ista 3ara cada acci#n en un controladorC esto debe 0acerse s#lo 3ara aqu/llas que requieran 3resentar informaci#n al usuario Las +istas que sean 3resentadas mediante AUAV deben reali2ar un llamado a Ht0is= IsetEres3onseFT+iewTG en su res3ecti+o m/todo del controlador As lograremos una salida o3timi2ada 3ara AUAV

35.3 1so de <a'outs


Kumbia tambi/n 3ermite o3cionalmente el uso de una 3lantilla su3erior a ni+el de controlador que se encuentra en el directorio views+la outs . Para nuestro eBem3lo anterior tenemos el arc0i+o views+la outs+clientes.phtml::
1. <h1>Este es el Controlador Clientes<h1> 2. <? content() ?>

&l llamado a contentL9 0ace que el contenido de la +ista 3ara acci#n se muestre en esa 3arte del la5out 4n llamado a clientes+adicionar nos +isuali2ara:

Este es el Controlador Clientes


Hola desde Acci#n Adicionar *o es obligatorio definir un la5out 3ara todos los controladoresC si este no e?iste KumbiaC +a a simularlo

35.( 1so de Tem#lates


&l sistema de +istas tambi/n 3ermite el uso de Jem3latesC esto sim3lemente 3ermite utili2ar el la5out de otro controlador en el controlador actualC as no re3etimos c#digo 5 3odemos usar el mismo la5out en +arios controladores
1. <?php 2. 3. class ClientesController extends ApplicationController { 4. 5. public $template = "administracion"; 6. 7. function adicionar(){ 8. /* ... */ 9. } 10. 11. } 12. 13.?>

Libro de Kumbia: Porque Programar debera ser ms fcil

11'

>e esta forma 0acemos que ;lientes utilice el la5out views+la outs+administracion.phtml

35.5 1so de 2artials


Los 3artials F3arcialesG son 3eque\as +istas que 3ueden incluirse dentro de otra +ista 5 que e+itan re3etir c#digo 4n 3artial se reconoce 3orque em3ie2a con * FunderscoreG antes del nombre de la +ista %e 3uede 0acer el llamado a +isuali2ar un partial usando la funci#n render*partial de esta forma:
1. <?php echo render_partial('menu') ?>

>e esta forma estaramos mostrando el arc0i+o _menu.phtml del directorio del controlador actual

35.4 1so de A;; en 3umbia


Kumbia todo su entorno se eBecuta en la car3eta a #ublicB a 3esar que cuando nos encontramos desarrollando las +istas de nuestra a3licaci#n la +amos deBando en el directorio a##sBde aultBvie%sB &sto significa que cuando se le indica alguna ruta de alguna imagen 3or decir algo a tus A;; estas deberan estar res3ecto a #ublicB. 4n eBem3lo sencilloC imaginemos que deseas incluir una imagen como back!round 5 nuestra imagen se encuentra en la car3eta #ublicBim!B. *uestra +ista esta en a##sBde aultBvie%sBindeD.#,tml Festa en la +ista 3rinci3al de todo el frameworkG A0ora editamos el #ublicBcssBst'le.css arc0i+o que contiene los estilos en este caso sera

body { background-image: url("/nombre_mi_aplicacion/img/error.gif"); }

>onde nombreCmiCa#licacion es el nombre de tu car3eta donde esta el frameworkC esta es una utili2aci#n bsica %in embargo kumbia maneBa unas +ariables 3ara e+itar cambios grandes a ni+el de los arc0i+os ;%%C un escenario 3osible es si cambiamos el nombre de la car3eta rai2 del framework 3orque, sencillo si cmbianos el nombre de la a3licaci#n Fen este caso el nombre de la car3eta ra2GC esto conlle+a a cambiar estas rutas a en todos los ;%% &n la +ersi#n : ' de Kumbia 0emos encontrado una soluci#n a este 3roblema la cual cuando inclu5es los arc0i+os css que contengan alguna ruta de arc0i+o como fue en el eBem3lo anterior una imagenC lo ideal seria incluir este arc0i+o ;%% como se muestra abaBo
<?php echo stylesheet_link_tag('style', 'use_variables: true')?>

Libro de Kumbia: Porque Programar debera ser ms fcil

11-

8bser+en el 3armetro useCvariablesC con este 3armetro 3odemos 0acer en el algo como se muestra a continuaci#n en los arc0i+os ;%% 5 nos basamos en el mismo eBem3lo anterior
background-image: url("@path/img/error.gif");

^#at, contiene el nombre de la car3eta ra2 del framework ^im!C#at, contiene la ruta 0asta la car3eta #ublicBim!, es decir que el mismo eBem3lo anterior tendra un funcionamiento igual de la siguiente manera
background-image: url("@img_path/error.gif");

^cssC#at, contiene la ruta 0asta la car3eta #ublicBcss, esto tiene una utilidad si en nuestro arc0i+o ;%% se 0iciera una inclusi#n de otro arc0i+o ;%%
@import url("@css_path/otro_css.css");

35.6 1so de contentL9


&sta funci#n tiene como obBeti+o indicar al sistema de 3lantillas en que 3arte de la +ista se +a a +isuali2ar el siguiente ni+el de +ista %i 3or eBem3lo se 3retende +isuali2ar una +ista 5 el llamado a contentFG no esta 3resente en el la5outC entonces la +ista no se +a a +isuali2ar

Libro de Kumbia: Porque Programar debera ser ms fcil

116

35.7 Fel#ers
Kumbia 3osee una serie de m/todos que facilitan 5 agili2an la escritura de c#digo HJ<L al escribir una +ista &l obBeti+o de los 0el3ers es el de enca3sular grandes cantidades de c#digo HJ<L o Ua+ascri3t minimi2ndolo en una sola funci#n A continuaci#n la referencia de estos:

35.7.1 linkCtoLSaccion, SteDto, [S#arametros\9


Permite 0acer un enlace a una acci#n controlador &sta funci#n 3uede recibir n 3armetros que corres3onden a atributos 0tml corres3ondientes a la etiqueta TaT
1. <?php echo link_to('compras/buscar/2', 'Buscar el Producto #2') ?>

35.7.2 linkCtoLSaccion, SteDto, [S#arametros\9


Permite 0acer un enlace a una acci#n en el controlador actual &sta funci#n 3uede recibir n 3armetros que corres3onden a atributos 0tml corres3ondientes a la etiqueta TaT
<?php echo link_to('buscar/2', 'Buscar el Producto #2', 'class: enlace_producto) ? >

35.7.3 linkCtoCremoteLSaccion, SteDto, Sob&etoCaCactuali0ar, [S#arametros\9


Permite 0acer un enlace que al 0acer clic sobre el reali2a una 3etici#n AUAV que actuali2a un contenedor Fdi+C s3anC tdC etcG del documento actual denominado 3or HobBetoEaEactuali2ar Je?to es el te?to del enlace
1. <?php echo link_to_remote(Cargar algo con AJAX, update: midiv, action: saludo/hola) ?> 2. 3. <div id=midiv>Este texto ser actualizado</div>;

Jambi/n 3uede recibir los 3armetros beforeC success 5 oncom3lete que tienen c#digo Ba+ascri3t que ser eBecutado antesC des3u/s 5 al com3letar la transacci#n AUAV res3ecti+amente
1. <?php echo link_to_remote("cata/y", "texto", "update: midiv", "success: new Effect.Appear('midiv')") ?> 2. <div id='midiv' style='display:none'></div>

Adicionalmente se 3uede usar el 3armetro confirm 3ara indicar que se debe reali2ar una confirmaci#n antes de 0acer la 3etici#n AUAV:
1. <?php echo link_to_remote(Borrar Producto, update: midiv, action: productos/borrar/11, confirm: Esta seguro desea borrar el producto?) ?> 2. 3. <div id=midiv>Este texto ser actualizado</div>;

Libro de Kumbia: Porque Programar debera ser ms fcil

117

linkEtoEremote 3uede recibir n 3armetros adicionales que corres3onden a atributos 0tml corres3ondientes a la etiqueta TaT

35.7.( buttonCtoCremoteCactionLSaccion, SteDto, Sob&etoCaCactuali0ar, [S#arametros\9


1eali2a la misma tarea que linkEtoEremote sino que crea un bot#n en +e2 de un enlace

35.7.5 &avascri#tCincludeCta!LSarc,ivoC&s9
"nclu5e un arc0i+o Ba+ascri3t que esta ubicado en 3ublic@Ba+ascri3t *o es necesario indicar la e?tensi#n Bs
1. <?php echo javascript_include_tag(funciones) ?> 2. // <script type='text/javascript' 3. src='/aplicacion/public/funciones.js'></script>

35.7.4 &avascri#tClibrar'Cta!LSarc,ivoC&s9
"nclu5e un arc0i+o Ba+ascri3t que 3ertenece a kumbia en 3ublic@Ba+ascri3t@kumbia *o es necesario indicar la e?tensi#n Bs
<?php echo javascript_ilibrary_tag(validations) ?> <script type='text/javascript'src='/aplicacion/public/kumbia/validations.js'> </script>

35.7.6 st'les,eetClinkCta!LSarc,ivoCcss, , [useCvariables: true\9


"nclu5e un arc0i+o css que est ubicado en 3ublic@css e?tensi#n css *o es necesario indicar la

<?php echo stylesheet_link_tag(estilos) ?> //<link rel='stylesheet' type='text/css' href='/contab/public/css/estilos .css'/> <?php echo stylesheet_link_tag(carpeta/estilos) ?> //<link rel='stylesheet' type='text/css' href='/contab/public/carpeta/estilos .css'/>

&l 3armetro OuseCvariables: trueR nos 3ermite 0acer uso de las +ariables ^#at,C ^im!C#at, 5 ^ccsC#at,C estas +ariables nos facilitan la 3rogramaci#n 5a que nos ol+idamos de las rutas del frameworkC 3orque internamente este las constru5e 3or nosotros tal como se e?3lico arriba

35.7.7 im!Cta!LSsrc9
Menera una etiqueta imgC el 3rimer 3armetro corres3onde al nombre del arc0i+o de imagen que se encuentra en 3ublic@img Puede recibir TnT 3armetros adicionales de la etiqueta 0tml TimgT 3ara cambiar los atributos de /sta
<?php echo img_tag(carro.gif, width: 100, border: 0) ?> <?php echo img_tag(subdir_en_img/foto.jpg, width: 100, border: 0) ?>

Jambi/n 3uede indicarse el 3armetro drag: true 3ara indicar que la imagen se 3uede arrastrar

Libro de Kumbia: Porque Programar debera ser ms fcil

119

35.7.8 ormCremoteCta!LSaction, Sob&etoC"ueCactuali0a9


Permite crear un formulario que al ser en+iadoC genera una 3etici#n AUAV 5 no una 3etici#n normal &l 3armetro Haction indica que acci#n se est solicitando 5 el segundo 3armetro el contenedor 0tml donde se +a a colocar el resultado de la 3etici#n Jodos los elementos del formularios son seriali2ados 5 en+iados remotamente 3or m/todo M&J 3or defecto al o3rimirse cualquier bot#n de submit o de image dentro del formulario Jambi/n 3uede recibir los 3armetros beforeC success 5 oncom3lete que tienen c#digo Ba+ascri3t que sera eBecutado antesC des3u/s 5 al com3letar la transacci#n AUAV res3ecti+amente Adicionalmente se 3uede usar el 3armetro confirm 3ara indicar que se debe reali2ar una confirmaci#n antes de 0acer la 3etici#n AUAV
1. 2. 3. 4. 5. <?php echo form_remote_tag(saludo/hola, update: midiv) ?> Tu Nombre?: <?php echo text_field_tag(nombre) ?> <?php echo submit_tag("Envio") ?> <?php echo end_form_tag() ?> <div id=midiv>Este texto ser actualizado</div>

Puede recibir TnT 3armetros adicionales de la etiqueta 0tml TformT 3ara cambiar los atributos de esta %e debe cerrar el formulario usando la funcion endEformEtag Jambi/n se 3ueden agregar e+entos Ba+ascri3t tales como successC before 5 oncom3lete:
1. <?php echo form_remote_tag(saludo/hola, update: midiv, before: alert('Se ha enviado el Formulario')) ?> 2. Tu Nombre?: <?php echo text_field_tag(nombre) ?> 3. <?php echo submit_tag("Envio") ?> 4. <?php echo end_form_tag() ?> 5. <div id=midiv>Este texto ser actualizado</div>

35.7.10 ormCta!LSaction9
Permite escribir r3idamente el inicio de un formulario 0tml Puede recibir TnT 3armetros adicionales de la etiqueta 0tml TformT 3ara cambiar los atributos de /ste %e debe cerrar el formulario usando la funci#n endEformEtag 1. c,303 ec0o formEremoteEtagFOsaludo@0olaPG ,I 2. Ju *ombre,: c,303 ec0o te?tEfieldEtagFOnombrePG ,I 3. c,303 ec0o submitEtagFi&n+ioiG ,I (. c,303 ec0o endEformEtagFG ,I

35.7.11 endC ormCta!L9


Permite 0acer el cierre 0tml de un formulario creado con formEremoteEtag o formEtag

35.7.12 comillasLSteDto9
Menera un te?to entre comillas &s [til 3ara e+itar conflictos de comillas al en+iar 3armetros a los 0el3ers
1. <?php echo comillas(Texto) ?> // Texto

Libro de Kumbia: Porque Programar debera ser ms fcil

1!:

35.7.13 submitCta!LSca#tion9
Permite crear un bot#n de submit donde Hca3tion es el te?to del bot#n Puede recibir TnT 3armetros adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo submit_tag("Enviar Formulario") ?>

35.7.1( submitCima!eCta!LSca#tion, Ssrc9


Permite crear un bot#n de submit con imagen donde Hca3tion es el te?to del bot#n 5 Hsrc el nombre del arc0i+o de imagen que se encuentra en 3ublic@img Puede recibir TnT 3armetros adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo submit_tag("Enviar Formulario") ?>

35.7.15 buttonCta!LSca#tion9
Permite crear un bot#nC donde Hca3tion es el te?to del bot#n Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo button_tag("Adicionar") ?>

35.7.14 teDtC ieldCta!LSnombre9


Permite crear una caBa de te?to con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo text_field_tag("nombre", size: 40, maxlength: 45) ?>

35.7.16 c,eckboDC ieldCta!LSnombre9


Permite crear una c0eck bo? con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo checkbox_field_tag("acepta_contrato", value: S, checked: true) ?>

35.7.17 numericC ieldCta!LSnombre9


Permite crear una caBa de te?to con +alidaci#n num/rica automtica &l com3onente es creado con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo numeric_field_tag("precio", size: 10) ?>

35.7.18 teDtu##erC ieldCta!LSnombre9


Permite crear una caBa de te?to con entrada de te?to en ma5[sculas [nicamente &l com3onente es creado con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo textupper_field_tag("nombre", size: 40, maxlength: 45) ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

1!1

35.7.20 dateC ieldCta!LSnombre9


;rea un com3onente 3ara ca3turar fec0as que tiene a\oC mes 5 da
1. <?php echo date_field_tag("fecha") ?>

35.7.21 ileC ieldCta!LSnombre9


Permite crear una caBa de te?to 3ara subir arc0i+os con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de esta
1. <?php echo file_field_tag("archivo") ?>

35.7.22 radioC ieldCta!LSnombre, Slista9


Permite generar una lista de selecci#n [nica con m[lti3le res3uesta utili2ando in3uts ti3o radio Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de esta &l atributo T+alueT indica el +alor 3or defecto
1. <?php echo radio_field_tag(sexo, array( 2. M =>Masculino, 3. F =>Femenino, 4. ), value: M) ?>

35.7.23 teDtareaCta!LSnombre9
Permite generar un com3onente de te?tarea Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tte?tareaT 3ara cambiar los atributos de esta
1. <?php echo textarea_tag("descripcion", cols: 40, rows: 10) ?>

35.7.2( #ass%ordC ieldCta!LSnombre9


Permite crear una caBa de te?to 3ara ca3turar contrase\as con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo password_field_tag("archivo") ?>

35.7.25 ,iddenC ieldCta!LSname9


Permite crear un in3ut oculto con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de /sta
1. <?php echo hidden_field_tag("archivo") ?>

35.7.24 selectCta!LSname, Slista9


Permite crear una etiqueta 0tml select con atributo name Hnombre e id id/ntico Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml TselectT 3ara cambiar los atributos de esta &l 3armetro lista es o3cional 5 3ermite crear la lista de o3tions 3ara el select
1. <?php echo select_tag("ciudad", array( 2. 1 => Bogot,

Libro de Kumbia: Porque Programar debera ser ms fcil

1!!

3. 2 => Cali, 4. 3 => Medellin 5. )) ?>

35.7.26 o#tionCta!LSvalor, SteDto9


Permite crear una etiqueta 8PJ"8* con +alor H+alor 5 te?to Hte?to Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml To3tionT 3ara cambiar los atributos de /sta
1. 2. 3. 4. 5. 6. <?php echo select_tag("ciudad") ?> <?php echo option_tag(0, Seleccione una..., selected: true ?> <? foreach($Ciudades->find() as $ciudad): ?> <?php echo option_tag($ciudad->id, $ciudad->nombre) ?> <? enforeach: ?> </select>

35.7.27 u#loadCima!eCta!LSnombre9
Permite crear un com3onente que lista las imgenes del directorio 3ublic@img@u3load 5 3ermite subir una imagen a este directorio
1. <?php echo upload_image_tag("archivo") ?>

35.7.28 setCdro##ableLSnombre, Saccion9


"ndica que un obBeto del documento identificado con id Hnombre recibir obBetos arrastrables Al colocar un obBeto arrastrable sobre /steC se llamara a la 0andle de la funci#n Ba+ascri3t Haccion
1. <?php echo set_dropable(carrito, agregar_al_carrito) ?>

Aer >ro3abbles en 1eferencia scri3t aculo us 3ara ms informaci#n

35.7.30 redirectCtoLSurl, Sse!undos9


Permite reali2ar una redirecci#n a Hurl al cabo de Hsegundos
1. <?php echo redirect_to(/accion/otra/, 3) ?>

35.7.31 renderC#artialLSvistaC#artial, SvalorGUU9


Permite incluir un 3artial del controlador actual en la +ista actual Los 3artials em3ie2an 3or E 3ero H+istaE3artial no debe lle+ar el underscore inicial &l +alor H+alor es 3asado al 3artial 5 3uede ser usado en el en una +ariable con el nombre del 3artial de forma global
<?php echo render_partial(menu) ?>

35.7.32 brCbreakLSnumero9
La funci#n cuenta Hnumero +eces que es llamada 5 luego im3rime un cbrI &s [til 3ara se3arar en +arias lineas contenidos que est/n siendo im3resos dentro de un ciclo 5 necesiten ser se3arados 3ara ordenarlos &n el eBem3lo se im3rimen $ ciudades 5 el resto +an a la otra linea 5 as sucesi+amente
1. <? foreach($Ciudades->find() as $ciudad): ?> 2. <?php echo $ciudad->nombre ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

1!$

3. <?php echo br_break(3) ?> 4. <? enforeach: ?>

35.7.33 trCbreakLSnumero9
La funci#n cuenta Hnumero +eces que es llamada 5 luego im3rime un c@trIctrI &s [til 3ara se3arar en +arias filas contenidos que est/n siendo im3resos dentro de un ciclo 5 necesiten ser se3arados 3ara ordenarlos en una tabla &n el eBem3lo se im3rimen ( ciudades 5 el resto +an a la otra fila 5 as sucesi+amente
1. 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.3( trCcolorLScolor1, Scolor2, [Scolorn...\9


La funci#n 0ace una im3resi#n de tr con el atributo bgcolor que es intercalado entre los colores definidos en la lista de 3armetros &sto genera filas de colores que son fciles de leer en tablas
1. 2. 3. 4. 5. 6. <table> <? foreach($Ciudades->find() as $ciudad): ?> <td><?php echo $ciudad->nombre ?></td> <?php echo tr_color('#CCDEFF', '#FFFFFF') ?> <? 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>

35.7.34 teDtC ieldC%it,Cautocom#leteLSnombre9


Permite crear una caBa de te?to que 3ermite autocom3letar su +alor mediante una lista generada dinmicamente usando AUAV Puede recibir TnT 3armetros con nombre adicionales de la etiqueta 0tml Tin3utT 3ara cambiar los atributos de esta &Bem3lo: vie%sBclientesBindeD.#,tml:

Libro de Kumbia: Porque Programar debera ser ms fcil

1!(

1. <script type='text/javascript'> 2. function mostrar_codigo_ciudad(caja_texto, opcion_lista){ 3. alert(El codigo de la ciudad seleccionada es +opcion_lista.id) 4. } 5. </script> 6. <?php echo text_field_with_autocomplete(ciudad, after_update: mostrar_codigo_ciudad, action: clientes/buscar_por_nombre) ?>

controllersBclientesCcontroller.#,#:
1. <?php 2. class ClientesController extends ApplicationController { 3. // Usamos set_response('view') porque el controlador va 4. // a generar una salida tipo AJAX 5. function buscar_por_nombre(){ 6. $nombre = $this->request('nombre'); 7. $this->set_response('view'); 8. $this->clientes = $this->Clientes->find(nombre like '% $nombre%'); 9. } 10. } 11.?>

vie%sBclientesBbuscarC#orCnombre.#,tml:
1. 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

35.7.36 truncateLSteDto, SnumeroG09


%i no esta definido numero o es : elimina es3acios 5 caracteres de retorno a la derec0a de la cadena Hte?oC en caso contrario de+uel+e los 3rimeros Hnumero caracteres de i2quierda a derec0a
1. <?php echo truncate(Kumbia Web Framework Framework 2. <?php echo truncate(Kumbia Web Framework ); // Kumbia Web Kumbia

, 6); //

35.7.37 ,i!,li!,tLSteDto, SteDtoCaCresaltar9


Hace un resaltado de un te?to dentro de de otro usando la clase ;%% 0ig0lig0t que est definida en 3ublic@css@st5le css
1. <?php echo highlight(Texto a Resaltar, Resaltar) ?>

35.7.38 mone'LSvalor9
"m3rime un +alor con formato num/rico con H 5 decimales

Libro de Kumbia: Porque Programar debera ser ms fcil

1!'

1. <?php echo money(10000); // $ 10,000.00 ?>

35.7.(0 dateC ieldCta!LSname9


<uestra un calendarioC es un com3onente nue+o que fue integrado
1. <?php echo date_field_tag('fecha') ?>

35.7.(1 selectCta!L9
;rea una lista %&L&;J
1 c,303 ec0o selectEtagFTmarcaEidTC T<arcaTC Tconditions: ti3oSi!iTC To3tion: nombreTG ,I ! c,303 ec0o selectEtagFTmarcaEidTC T<arcaTC T%&L&;J N F18< marca WH&1& ti3oSi!iTC To3tion: nombreT G ,I $ c,303 ec0o selectEtagFTse?oTC arra5FT<T SI T<asculinoTC TFT SI TFemeninoTGC TincludeEblank: %eleccione uno TG I,

Libro de Kumbia: Porque Programar debera ser ms fcil

1!-

35.8 Oeri icar env?o de datos al controlador


&sto re3resenta otro a+ance en la +ersi#n : ' el controlador dis3one de tres m/todos 3ara +erificar datos en+iados a el

35.8.1 ,asC#ostLSname9
Aerifica que el cam3o llamado Sname 0alla sido en+iado 3or m/todo P8%J al controlador %o3orta argumento +ariable 3ermitiendo +erificar el en+o de datos de manera simultanea

35.8.2 ,asC!etLSname9
Aerifica que el cam3o llamado Sname 0alla sido en+iado 3or m/todo M&J al controlador %o3orta argumento +ariable 3ermitiendo +erificar el en+o de datos de manera simultanea

35.8.3 ,asCre"uestLSname9
Aerifica que el cam3o llamado Sname 0alla sido en+iado 3or m/todo M&J o P8%J al controlador %o3orta argumento +ariable 3ermitiendo +erificar el en+io de datos de manera simultanea &Bem3lo
1. class UsuarioController extends ApplicationController { 2. public function guardar() { 3. if ($this->has_post('nombre', 'cedula')) { 4. $usuario = new Usuario(); 5. $usuario-> nombre = $this->post('nombre'); 6. $usuario-> cedula = $this->post('cedula'); 7. } 8. } 9. }

&n la linea $ se 3uede a3reciar como se +erifica de manera simultanea que 0allan sido en+iados mediante el m/todo P8%J los argumentos nombre 5 cedula

Libro de Kumbia: Porque Programar debera ser ms fcil

1!6

35.10 Fel#ers de usuario en 3umbia


4na biblioteca de 0el3ersC 3ermite organi2ar los 0el3ers 3ara ser utili2ados dentro la a3licaci#nC Kumbia organi2a los 0el3ers de usuario en el directorio O a##sB,el#ersP 5 estos son cargados en la a3licaci#n mediante la funci#n OuseE0el3erP Por defecto los 0el3ers ubicados en main.#,# son cargados automticamente 5 estn dis3onibles en toda la a3licaci#n
1. class UsuarioController extends ApplicationController { 2. public function buscador_potencial() { 3. use_helper('buscador'); 4. $this->render_text('Helper cargado'); 5. } 6. }

&n este eBem3loC Kumbia Obuscador.#,#P 5 lo carga

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

Libro de Kumbia: Porque Programar debera ser ms fcil

1!7

35.11 -ormularios no intrusivos


Kumbia dis3one de di+ersos 0el3ers 3ara crear elementos de entrada en los formulariosC a0ora se 3ueden construir los formularios de manera no intrusi+aC consideremos el 0el3er OteDtC ieldCta!PC el nombre del cam3o se 3uede indicar tal que:
1. <?php echo text_field_tag('form.field') ?>

Menera el siguiente c#digo 0tml


1. <input type=text id=form_field name=form[field]>

&s decir el 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')

Y 3uedes obtener el arra5 de la siguiente manera


1. $this->post('form')

&sto 3uede ser de +erdadera utilidad utili2ndose en conBunto a -ilter

Libro de Kumbia: Porque Programar debera ser ms fcil

1!9

35.12 Autocar!a de Ob&etos


A la 0ora de crear el cam3oC el 0el3er internamente +erificar si se 0a 3asado al controlador alg[n atributo cu5o nombre corres3onda con el nombre del formulario indicado en el 0el3er 3ara cam3o de entrada Fte?tEfieldEtagC selectEtagC c0eckEfieldEtagC etcGC si el atributo en el controlador es un obBetoC el 0el3er cargar el atributo de ese obBetoC que corres3onda al nombre del cam3o como +alor 3or defecto &Bem3lo &n la +ista: nuevo.phtml
1. 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() ?>

&n el controlador: usuarioCcontroller.#,#


1. class UsuarioController extends ApplicationController { 2. public function nuevo() { 3. $this->usuario = object_from_params('cedula: 15234543'); 4. } 5. 6. }

A0ora un eBem3lo mas com3leto el cual a3ro+ec0a las caractersticas de FilterC los Formularios no "ntrusi+os 5 la Autocarga de 8bBetos &Bem3lo &n la +ista: nuevo.#,tml
1. 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() ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

1$:

&n el controlador: usuarioCcontroller.#,#


1. class UsuarioController extends ApplicationController { 2. public function nuevo() { 3. $this->nullify('usuario'); 4. } 5. 6. public function crear() { 7. if($this->has_post('usuario')) { 8. $usuario = new Usuario($this->post('usuario', 'trim', 'upper')); 9. if ($usuario->save()) { 10. Flash::success('Operacin exitosa'); 11. } else { 12. $this->usuario = $usuario; 13. } 14. } 15. $this->render('nuevo'); 16. } 17.}

Libro de Kumbia: Porque Programar debera ser ms fcil

1$1

35.13 2a!inador
Para 3aginar Acti+e1ecord dis3one de los m/todo 3aginate 5 3aginateEb5Esql Jodos los 3aginadores retornan un obBeto std;lassC el cual contiene los siguientes atributos: items: un arra5 de items que corres3onde a los elementos de la 3gina neDt: n[mero de 3gina siguienteC si no e?isteC es false #rev: n[mero de 3gina 3re+iaC si no e?isteC es false current: n[mero de 3gina actual total: total de 3ginas e?istentes

3(.7.1 #a!inateL9
Parmetros con nombre: #a!e: n[mero de 3gina F3or defecto 1G #erC#a!e: cantidad de items 3or 3gina F3or defecto 1:G Ace3ta todos los 3armetros con nombre del m/todo indL9 &Bem3lo: &n el controlador usuarioCcontroller.#,#
1. class UsuarioController extends ApplicationController { 2. public function page_femenino($page=1) { 3. if(!is_numeric($page)) { 4. $page = 1; 5. } 6. $this->page = $Usuario->paginate(sexo='F', 'columns: nombres, apellidos', page: $page, 'per_page: 7'); 7. } 8. }

&n la +ista #a!eC emenino.#,tml


1. <?php 2. 3. 4. <?php 5. 6. <?php 7. 8. <?php 9. <?php 10.<?php 11. > 12.<?php foreach($page->items as $item): ?> <?php echo $item->nombres.' '.$item->apellidos ?> <br> endforeach; ?> if($page->prev): ?> <?php echo link_to(usuario/page_femenino/$page->prev, 'Anterior') ?> endif; ?> echo $page->current ?> if($page->next): ?> <?php echo link_to(usuario/page_femenino/$page->next, 'Siguiente') ? endif; ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

1$!

35.1( #a!inateCb'Cs"lL9
Parmetros con nombre: #a!e: n[mero de 3gina F3or defecto 1G #erC#a!e: cantidad de items 3or 3gina F3or defecto 1:G &Bem3lo: &n el controlador usuarioCcontroller.#,#
1. class UsuarioController extends ApplicationController { 2. public function page_femenino($page=1) { 3. if(!is_numeric($page)) { 4. $page = 1; 5. } 6. $this->page = $Usuario->paginate_by_sql(SELECT nombres, apellidos FROM usuario WHERE sexo='F', page: $page, 'per_page: 7'); 7. } 8. }

&n la +ista #a!eC emenino.#,tml


1. <?php 2. 3. 4. <?php 5. 6. <?php 7. 8. <?php 9. <?php 10.<?php 11. > 12.<?php foreach($page->items as $item): ?> <?php echo $item->nombres.' '.$item->apellidos ?> <br> endforeach; ?> if($page->prev): ?> <?php echo link_to(usuario/page_femenino/$page->prev, 'Anterior') ?> endif; ?> echo $page->current ?> if($page->next): ?> <?php echo link_to(usuario/page_femenino/$page->next, 'Siguiente') ? endif; ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

1$$

34 Denc0mark
Denc0mark es un com3onente que nos 3ermite 0acer 3rofiler de un scri3t de nuestras a3licacionesC de manera que 3odemos contralar los cuellos de botellas que se formen en la im3lementacion de alguna funcionalidadC esta t/cnica es am3liamente utili2ada 3or los desarrollos con+encionales mu5 a menudo 3ara medir el tiem3o de eBecucion que 3uede tardar una 3gina en generarseC util 3ara la o3timi2acion en cuanto a tiem3o de nuestra a3licaci#n

3(.5 E+todos Qenc,mark


;on estos metodos se 3uede reali2ar tareas antes mencionadas

3(.5.1 startCclockLSname9
"nicia el reloB de eBecucion recibe un nombre esto 3ara e+itar colisiones 5 3oder reali2ar +arios Denc0mark en la misma eBecucion
1. Benckmark::start_clock('INICIO');

3(.5.2 timeCeDecutionLSname9
8btiene el tiem3o de eBecucion de un Denc0mark recibe el nombre Hname con que inicialmente se creo el benc0mark
1. Benchmark::time_execution('INICIO');

3(.5.3 memor'Cusa!eLSname9
8btiene la meoria usuada 3or un scri3tC recibe el nombre Hname con que inicialmente se creo el benc0mark
1. Benchmark::memori_usage('INICIO');

Libro de Kumbia: Porque Programar debera ser ms fcil

1$(

36 A;L
La Lista de ;ontrol de Acceso o A;Ls Fdel ingl/sC Access ;ontrol ListG es un conce3to de seguridad informtica usado 3ara fomentar la se3araci#n de 3ri+ilegios &s una forma de determinar los 3ermisos de acceso a3ro3iados a un determinado obBetoC de3endiendo de ciertos as3ectos del 3roceso que 0ace el 3edido ;ada lista A;L contiene una lista de 1olesC unos resources 5 unas acciones de accesoC +eamos esto mediate un eBem3lo sencillo
1. <?php 2. 3. class 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 E+todos de la Alase AA<


36.1.1 addCroleLAcl/ole SroleOb&ect, SaccessCin,eritsGUU9
Agrega un 1ol a la Lista A;L
1. $acl->add_role(new Acl_Role('administrador'), 'consultor');

36.1.2 addCin,eritLSrole, SroleCtoCin,erit9


Hace que un rol 0erede los accesos de otro 1ol

36.1.3 isCroleLSroleCname9
Aerifica si un rol e?iste en la lista o no

36.1.( isCresourceLSresourceCname9
Aerifica si un resource e?iste en la lista o no

36.1.5 addCresourceLAcl/esource Sresource9


Agrega un 1esource a la Lista A;L
1. 2. 3. 4. //Agregar un resource a la lista: $acl->add_resource(new AclResource('clientes'), 'consulta'); //Agregar Varios resources a la lista: $acl->add_resource(new AclResource('clientes'), 'consulta', 'buscar', 'insertar');

36.1.4 addCresourceCaccessLSresource, SaccessClist9


Agrega accesos a un 1esource

36.1.6 dro#CresourceCaccessLSresource, SaccessClist9


&limina un acceso del resorce

36.1.7 allo%LSrole, Sresource, Saccess9


Agrega un acceso de la lista de resources a un rol Libro de Kumbia: Porque Programar debera ser ms fcil 1$-

1. //Acceso para invitados a consultar en clientes 2. $acl->allow('invitados', 'clientes', 'consulta'); 3. 4. //Acceso para invitados a consultar e insertar en clientes 5. $acl->allow('invitados', 'clientes', array('consulta', 'insertar')); 6. 7. //Acceso para cualquiera a visualizar en productos 8. $acl->allow('*', 'productos', 'visualiza'); 9. 10.//Acceso para cualquiera a visualizar en cualquier resource 11.$acl->allow('*', '*', 'visualiza');

36.1.8 den'LSrole, Sresource, Saccess9


>enegar un acceso de la lista de resources a un rol
1. //Denega acceso para invitados a consultar en clientes 2. $acl->deny('invitados', 'clientes', 'consulta'); 3. 4. //Denega acceso para invitados a consultar e insertar en clientes 5. $acl->deny('invitados', 'clientes', array('consulta', 'insertar')); 6. 7. //Denega acceso para cualquiera a visualizar en productos 8. $acl->deny('*', 'productos', 'visualiza'); 9. 10.//Denega acceso para cualquiera a visualizar en cualquier resource 11.$acl->deny('*', '*', 'visualiza');

36.1.10 isCallo%edLSrole, Sresource, SaccessClist9


>e+uel+e true si un HroleC tiene acceso en un resource
1. 2. 3. 4. 5. 6. 7. //Andres tiene acceso a insertar en el resource productos $acl->is_allowed('andres', 'productos', 'insertar'); //Invitado tiene acceso a editar en cualquier resource? $acl->is_allowed('invitado', '*', 'editar'); //Invitado tiene acceso a editar en cualquier resource? $acl->is_allowed('invitado', '*', 'editar');

Libro de Kumbia: Porque Programar debera ser ms fcil

1$6

37 Aut0
Kumbia en su +ersi#n : ' incor3ora un nue+o com3onente 3ara el maneBo de autenticaci#n de usuario 3or di+ersos m/todosC esto nace con la idea de seguir facilitando el desarrollo de a3licaciones en base al framework
1. public function autenticar () 2. { 3. $pwd = md5($this->request('clave')); 4. $auth = new Auth("model", "class: Usuario", "nombre: {$this>request('login')}", "clave: $pwd"); 5. if ($auth->authenticate()) { 6. Flash::success(Correcto); 7. } else { 8. Flash::error(Fall); 9. } 10.}

&l uso de este com3onente es sencilloC 3ero mu5 3otente 0agamos una descri3ci#n sobre lo que 0ace el c#digo que se muestra arribaC imaginemos que tenemos un formulario donde se le solicita el OloginP 5 O3asswordP al usuario 5 este formulario se en+a a una acci#n de nuestro controlador que la llamamos OautenticarP 3ara ilustrar el eBem3loC en 3rinci3io debemos tener en cuenta que tenemos guardada el O3asswordP del usuario en un Has0 <>'C 5a 0emos mencionado que el m/todo .this/0request1.inde23C e?trae un inde? del arreglo HE1&.4&%JC en la l?nea 3 obtenemos el +alor del in#ut cla+e que definimos en el formulario 5 le a3licamos el algoritmo <>' este +alor ser almacenado en el atributo S#%d. &n la l?nea ( creamos una instancia de la clase Aut0 5 3or el constructor de la clase le 3asamos los 3armetros necesario 3ara entienda cual sera el m/todo de autenticaci#n PmodelRC en segundo lugar le decimos cual es el nombre del modelo P1suarioRC de aqu en adelante los dems 3armetros que le 3asemos sern tomados como condicionesC en este eBem3lo le 3asamos el nombre de usuario 5 la cla+eC 5a con esto la clase Aut,C reali2a el 3roceso de conectarse a la D> 5 +erificar las condiciones que le 3asamos 3or el constructor Pero con esto no basta a0ora debemos +erificar si ese usuario e?isteC es 3or esto que en la l?nea 5 +erificamos si se reali2o correctamente el 3roceso de autenticaci#n de usuario el m/todo aut,enticateL9 retorna una arra5 con el resultado de la autenticaci#nC es decir con los datos del usuario Ya con este 3roceso tenemos nuestro usuario Flos datosG dis3onible en toda la eBecuci#n de la a3licaci#n La forma de acceder a esos datos es 3or medio del m/todo Aut,::!etCactiveCidentit'L9I obser+emos que es un m/todo esttico 3or lo que no es necesario crear una instancia de la claseC este m/todo nos retorna una arra5 con los datos del usuario com3uesto 3or los cam3os que est/n en la tabla 4suario ;omo eBercicio obser+en lo que se almacena
1. print_r (Auth::get_active_identity());

Libro de Kumbia: Porque Programar debera ser ms fcil

1$7

38 Programaci#n <odular
Kumbia en la versi(n 0.4 incor3ora una nue+a forma de 3rogramar que 0ace nuestras a3licaciones mas 3rofesionales 5 mantenibles en el tiem3o 5 es que a0ora 3uedes agru3ar controladores 3or m#dulos con la intenci#n de minimi2ar los ni+eles de entro3a que se 3uede generar al momento de desarrollar nuestros sistemas &ntendamos esta nue+a forma de 3rogramar en el kumbia mediante un eBem3lo sencilloC 3or lo general todos los sistemas cuentan con un modulo de usuario, donde este se debe encargar de reali2ar las tareas relacionado con el usuario 3odemos nombrar algunas de estas tareas: Autenticar 4suarios 1egistrar 4suarios Listar 4suarios &liminar 4suarios &tc &stas 3ueden ser las funcionalidades mas basicas que 3ueden e?istirC de la forma como se +enia 0aciendo 3or lo general se creaba un controller a##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

Libro de Kumbia: Porque Programar debera ser ms fcil

1$9

(0 1so de -las,
Flas0 es una clase mu5 [til en Kumbia que 3ermite 0acer la salida de mensaBes de errorC ad+ertenciaC informati+os 5 /?ito de forma estndar

(0.1 -las,::error
Permite en+iar un mensaBe de error al usuario Por defecto es un mensaBe de letras color roBo 5 fondo color rosa 3ero estos 3ueden ser alterados en la clase css en 3ublic @css@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);

Libro de Kumbia: Porque Programar debera ser ms fcil

1(:

(1 "ntegrar F<A;G en Kumbia


%iguiendo la arquitectura <A;C +amos a +er un eBem3lo de como integrar controladoresC 0acer consultas 5 en+iar salida desde un controlador a las +istas

(1.1 E&em#lo ;encillo


Jenemos el controlador controllers+inventario*controller.php:
1. <?php 2. 3. class InventarioController extends ApplicationController { 4. 5. function consultar(){ 6. 7. $this->productos = $this->Productos->find(); 8. 9. }//fin del metodo 10. 11. }//fin de la clase 12. 13.?>

Jenemos el modelo models+productos.php:


1. <?php 2. 3. class Productos extends ActiveRecord { 4. 5. 6. } 7. 8. ?>

Jenemos la +ista views+inventario+consultar.phtml:


1. <?php 2. 3. foreach($productos as $producto){ 4. #rint iH3roducto=Inombrei] 5. } 6. 7. ?>

Haremos una 3etici#n a inventario+consultar 3or eBem3lo 0tt3:@@local0ost@demo@in+entario@consultarC el 3roceso es el siguiente: 1. Kumbia busca el controlador in+entario en el directorio controllers con el nombre in+entario 5 su terminaci#n Ccontroller.#,# como est con+enido 2. Kumbia a0ora busca un m/todo en esta clase que corres3onda a la acci#n consultar 5 la eBecuta Libro de Kumbia: Porque Programar debera ser ms fcil 1(1

3. &n este m/todo reali2amos una b[squeda de los 3roductos actuales mediante el modelo Acti+e1ecord 5roductosC todos los modelos de la a3licaci#n 3ueden ser accedidos desde la a3licaci#n mediante .this/0C como en el eBem3lo (. &l resultado de la b[squeda es almacenado en St,is@T#roductos 5. Al finali2ar la eBecuci#n del m/todo consultarC el framework locali2a la +ista vie%sBinventarioBconsultar.#,tml 5 si e?iste la +isuali2a 4. Las 3ro3iedades del controlador en este caso St,is@T#roductos se con+ierten en +ariables del mismo nombre en la +istaC las cuales uso 3ara mostrar los 3roductos en 3antallaF+ariable de instanciaG

Libro de Kumbia: Porque Programar debera ser ms fcil

1(!

(2 4so de Paquetes F*ames3acesG


PHP' no so3orta el uso de 3aquetesC lo cual es una gran des+entaBa 5a que no 3odemos a3o5arnos en estos 3ara agru3ar clases buscando cierto ti3o de inde3endencia 3ara administrarlas a ni+el l#gico Kumbia 3ermite emular el conce3to de 3aquetes Fa ni+el fsicoG mu5 conocido en Ua+a e integrarlo a nuestras a3licaciones

Los 3aquetes son gru3os relacionados de clases e interfaces 5 3ro3orcionan un mecanismo con+eniente 3ara maneBar un gran Buego de clases e interfaces 5 e+itar los conflictos de nombres Los 3aquetes 3ermiten 0acer una organi2aci#n de clases mediante directorios &n el siguiente eBem3lo tenemos una serie de arc0i+os con clases 5 que contienen cierta funcionalidad en la cual no +amos a 3rofundi2ar 5 llamaremos clases de usuario &ste directorio est ubicado en la ra2 del framework 5 contiene subdirectorios con clases que deben integrarse a nuestra a3licaci#n Kumbia 3ro3orciona un m/todo 3ara incluir los arc0i+os en forma de 3aquetes de esta forma:
1. kumbia::import('app.lib.*');

As incluiramos todos los arc0i+os 303 que estn en app+li% La funci#n tambi/n 3uede 0acer una im3ortaci#n recursi+a Por eBem3lo:
1. kumbia::import('app.com.*');

"m3ortara el contenido de com 5 sus sub=directorios


1. kumbia::import('app.com.os.*');

5 as solo los de a##BcomBosB

Libro de Kumbia: Porque Programar debera ser ms fcil

1($

(3 4sando AUAV
(3.1 5ntroduccin
AUAV Fabre+iatura de As5nc0ronous Ua+a%cri3t and V<LG es una t/cnica que e?tiende el modelo tradicional Web 5 3ermite reali2ar 3eticiones en %egundo 3lano a un sitio Web sin recargar el documento actual *os 3ermite 0acer todo ti3o de cosas como las que 3uedes +er en M<ailC Moogle <a3s o Moogle %uggest Podramos llegar a decir que AUAV acerca un 3oco las a3licaciones Web a a3licaciones de escritorio *ormalmente el modelo tradicional funciona de la siguiente manera:

&l usuario origina una 3etici#nC 3uede ser en+iando informaci#n desde un formulario o solicitando alg[n documentoC &l ser+idor Web atiende la 3etici#n busca el documento relacionado 5 de+uel+e com3letamente una 3agina nue+a al usuario

;omo se 3uede +er el ser+idor Web 5 el e?3lorador de "nternet se encuentran en un 3roceso continuo de 3arar@andar] esto e?ige al usuario estar siem3re es3erando a que el ser+idor atienda su 3etici#n 5 luego +ol+er a trabaBar 5 as sucesi+amente Dueno 3uesC AUAV 3ermite solucionar esto 5 adems ofrecernos funcionalidad e?tra que 3odemos a3ro+ec0ar de muc0as formas Podemos 0acer 3eticiones en segundo 3lano Fel usuario no se da cuenta que 0a5 una 3etici#n en 3rocesoC t/cnicamente )no,GC de esta forma 3odemos solicitar informaci#n al ser+idor 5 reem3la2ar 3artes actuales del documento sin que 0a5a esas molestas es3eras en todo momento &l ser+idor Web 3uede de+ol+er c#digo HJ<LC Ua+a%cri3tC V<L 5 3odemos utili2arlo 3ara todo ti3o de cosasC desde cambiar la a3arienciaC contenido 5 com3ortamiento del documento actual en un abrir 5 cerrar de oBos ;on AUAV tambi/n obtenemos algo de rendimiento e?tra 5a que estamos solicitando al ser+idor s#lo la 3arte que necesitamos 5 no todo el documento cada +e2

(3.2 YE<Ftt#/e"uest
AUAV utili2a una caracterstica im3lementada en el "nternet &?3lorer 5 que r3idamente lleg# a otros e?3loradores basados en Mecko como el Firefo? 5 otros Fcomo el 83era 5 el %afariG &sta caracterstica es un obBeto Ua+a%cri3t llamado V<LHtt31equest que 3ermite reali2ar 3eticiones a un ser+idor Web desde el e?3lorador 5 mani3ular la res3uesta del ser+idor des3u/s de /stas *#tese que este obBeto tambi/n so3orta otros ti3os de res3uestas a3arte de V<L Las 3eticiones de AUAV son 3rinci3almente asincr#nicas es decir que no bloquean los e+entos en el e?3lorador 0asta que esta termine Flo contrario de las sincr#nicasG &sto es una gran +entaBa 5a que 3odemos reali2ar m[lti3les 3eticiones sin que una interfiera con la otra 5 mani3ulndolas de acuerdo a e+entos 5 estados de cone?i#n Aunque se escuc0a un 3oco com3leBo en realidad es ms fcil de lo que 3arece adicional a esto Libro de Kumbia: Porque Programar debera ser ms fcil 1((

aumenta la fle?ibilidad de nuestras a3licaciones Anteriormente 3ara reali2ar este ti3o de cosas se usaba muc0os obBetos "F1A<& 3ero la calidadC lim3ie2a 5 3oder de AUAV frente a "F1A<& es indiscutible

(3.3 )Aomo usar A_AY en 3umbia.


Kumbia 3osee so3orte 3ara funciones AUAV con el framework Protot53e 5 tambi/n sin /l 1ecordemos que 3rotot53e F0tt3:@@3rotot53e conio netG est incluida 3or defecto al igual que las funciones drag=and=dro3 Farrastrar 5 soltarGC effects FefectosG 5 controls FcontrolesG de %cri3t aculo us &l so3orte 3ara estas librerasC est 3or defecto en la lnea que dice: <? umbia_use_e!!ects"# ?$ en vie%sBindeD.#,tml esta funci#n inclu5e los documentos Ba+ascri3ts necesarios 3ara usarlas

(3.( linkCtoCremote
Permite 0acer un llamado sencillo mediante AUAV que solicita un fragmento HJ<L 5 lo

actuali2a en un contenedor Fdi+C s3anC tdC etcG del documento actual


1. <?php echo link_to_remote("Cargar algo con AJAX", "update: midiv", "action: saludo/hola") ?> 2. 3. <div id="midiv">Este texto ser actualizado</div>

La funci#n link*to*remote generalmente toma $ 3armetros: 1. &l Je?to del enlace 2. &l id del obBeto HJ<L que se +a a actuali2ar en este caso midi+ 3. La acci#n de la cual se obtendrn la informaci#n 3ara actuali2ar ;uando el usuario 0ace clic sobre el +inculo la acci#n 0ola en el controlador saludo ser in+ocada en segundo 3lano 5 cualquier informaci#n obtenida ser reem3la2ada en el di+ &l controlador VcontrollersBsaludoW tiene una acci#n llamada 0ola:
1. <?php 2. class SaludoController extends ApplicationController { 3. function hola(){ 4. #Indica que el resultado sera solo una parte de la vista actual 5. $this->set_response('view'); 6. }//fin del metodo 7. }//fin de la clase 8. ?>

La im3lementaci#n +aca del m/todo indica que no 0a5 l#gica 3ara esta acci#n sin embargo Kumbia carga automticamente la +ista con el nombre 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:

Libro de Kumbia: Porque Programar debera ser ms fcil

1(-

(3.5 ormCremoteCta!
&sta funci#n es mu5 [til 5a que con+ierte un formulario tradicional en un formulario AUAV %u funcionamiento 3ermite en+iar los +alores de los com3onentes del formulario 5 en+iarlos usando el V<LHtt31equest Los datos son recibidos normalmente en las acciones de los controladores como si 0ubiesen sido en+iados de la forma tradicional &n el siguiente eBem3lo crearemos un formulario AUAV que nos 3reguntar nuestro nombre 5 des3u/s remotamente una acci#n en un controlador nos en+iar un emoti+o saludo *uestra +ista de eBem3lo debe lucir as:
1. <?php echo form_remote_tag(ejemplo/hola, update: midiv) ?> 2. Tu Nombre?: <?php echo text_field_tag(nombre) ?> 3. <?php echo submit_tag("Envio") ?> 4. <?php echo end_form_tag() ?> 5. <div id=midiv>Este texto ser actualizado</div>

.ue se +e as:

A0ora +amos a modificar la +ista del eBem3lo 3asado 3ara que reciba nuestro nombre 5 nos salude As que views+ejemplo+hola.phtml se +e a0ora de esta manera:
1. <h2>Hola <?php echo $_REQUEST[nombre] ?>!</h2>

>e esta forma cuando demos clic en en+o se +isuali2ar esto:

Libro de Kumbia: Porque Programar debera ser ms fcil

1(6

(( Ua+a%cri3t 5 Kumbia
&ste lenguaBe no era mu5 querido 3or los 3rogramadores antes de que naciera AUAV 3ues era a +eces utili2ado 3ara crear molestos efectos o 3ara abrir +entanas intrusi+as 5 cosas 3or el estilo ;on AUAV el uso de Ua+ascri3t se increment# sustancialmente Kumbia 3osee una serie funciones 3ara trabaBar con AUAV que son inde3endientes de las definidas en 3rotot53e 5 que igualmente 3oseen una alta funcionalidad 3ara 0acer todo ti3o de cosas

((.1 El Ob&eto A_AY


&l obBeto AUAV enca3sula toda la funcionalidad 3ara utili2ar el obBeto YE<Ftt#/e"uest de forma ms fcil e intuiti+a *o +amos a enfocarnos en c#mo funciona este obBetoC esto deB/moslo de tarea :G

((.2 AUAV +iew1equest


&s la 3rinci3al funci#n detrs de las funciones link*to*remote 5 form*remote*tag 3ues es la encargada de 0acer una 3etici#n a un controlador 5 +isuali2arla en un contenedor Aeamos su sinta?is:
1. <script type=text/javascript> 2. new AJAX.viewRequest( 3. { 4. action: saludo/hola, 5. container: midiv 6. } 7. ) 8. </script>

La funci#n recibe un 0as0 con estos dos 3armetros mnimos que son la acci#n de la cual +a a traer la informaci#n 3ara mostrar 5 container donde la +a a mostrar &sta funci#n al igual que otras que +amos a +er ms adelante 3osee unos callbacks que son acciones que se eBecutan a medida que se 3roduce el 3roceso AUAV 4na a3licaci#n 3rctica de los callbacks es la de mostrar indicadores de 3rogreso cuando una acci#n toma un 3oco ms de tiem3o de lo que la 3aciencia de un usuario 3uede aguantar
1. <script type=text/javascript> 2. new AJAX.viewRequest( 3. { 4. action: saludo/hola, 5. container: midiv, 6. callbacks: { 7. before: $(spinner).show(), 8. success: $(spinner).hide(), 9. complete: new Effect.BlindDown(midiv) 10. } 11. } 12. ) 13.</script> 14. 15.<div id=midiv style=display:none></div> 16.<?php echo img_tag(spinner.gif, id: spinner, style: display:none); ?>

Libro de Kumbia: Porque Programar debera ser ms fcil

1(7

Analicemos un 3oco que 0ace esto Hemos agregado al 0as0 otro 0as0 llamado callbacks que tiene los nombres de unos e+entos que se +an eBecutando 3or todo el 3roceso de la acci#n AUAV La 3rimera que +emos se llama beforeC esta es eBecutada antes de em3e2ar la o3eraci#n AUAV 3uede ser tanto un string con Ba+ascri3t con un 0andle a una funci#n aBa? Fentendamos 0andle como el nombre la funci#n sin comillasG &n el string +emos el P. 16spinner73.show138C en este c#digo 3odemos +er que se esta +isuali2ando el obBeto s3inner %i no tiene e?3eriencia con la librera 3rotot53e le recomiendo ec0e un +ista2o a 0tt3:@@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>

Libro de Kumbia: Porque Programar debera ser ms fcil

1':

((.5 A_AY."uer'
&sta es una de las funciones ms [tiles que tiene Kumbia en cuanto a AUAV 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

).ue ms 3uedo e?3licar, %encillamente [til 5 3rctico

((.4 A&aD./e"uest ' A&aD.1#dater


&n Kumbia tambi/n 3uede utili2ar las funciones AUAV que 3ro3orciona la librera Protot53e &l m/todo 3rinci3al es ABa? 1equest que 0ace un 3a3el ms general 3ero ms fle?ible 3ara trabaBar transacciones AUAV &ncuentre ms informaci#n en: "ntroducci#n a ABa? de Protot53e &n el siguiente eBem3lo mostramos una com3araci#n entre AUAV +iew1equest C ABa? 1equest 5 ABa? 43dater
1. new ANaB.2e+uest)@/tienda/compras/datos@, G
method:@Aet@, on3uccess: .unction)transport*G $)@midiv@*.inner#506 , transport.response5eBt F

F *! 2. new AOAP.view2e+uest) 3. G 4. action: "compras/datos%, 5. container: "midiv%, 6. F

Libro de Kumbia: Porque Programar debera ser ms fcil

1'1

7. * 8. 9. new ANaB.9pdater)@midiv@, @/tienda/compras/datos@, G method: @Aet@ F*!

Los tres c#digos 0acen la misma tarea 0acer una 3etici#n 5 actuali2ar el obBeto midi+ >e3endiendo de la fle?ibilidad que necesitemos usaremos alguna de ellas

((.1 A&aD.2eriodical1#dater
;uando necesitamos que un obBeto sea actuali2ado frecuentemente de forma automtica 3odemos usar este m/todo que cum3le con esa funci#n
new ANaB.1eriodical9pdater)@products@, @/some(url@, G method: @Aet@, insertion: ;nsertion.5op, .re+uenc$: L, deca$: 2 F*!

Frecuencia es el n[mero de segundos que 3asa entre cada 3etici#nC deca5 es el n[mero de segundos de es3era que tiene antes de 0acer una nue+a 3etici#n cuando la anterior no 0a tenido /?ito o se 0a demorado

Libro de Kumbia: Porque Programar debera ser ms fcil

1'!

(5 %ession
La clase %ession 3ro3orciona un acceso orientado a obBetos a datos de sesi#n Los datos de sesi#n son usualmente utili2ados 3ara mantener +alores a tra+/s de toda la eBecuci#n de una sesi#n de a3licaci#n &l caso ms com[n es mantener alguna +ariable 3ara indicar si un usuario est logeado en el sistema o 3or eBem3lo mantener la direcci#n de la cual +iene un usuario antes de solicitarle autenticaci#n 5 3oderlo redireccionar des3u/s a ella de nue+o Kumbia seriali2a automticamente los datos de sesi#n &sto significa que 3uedes guardar con seguridad obBetos 5 en algunos casos +alores de recurso FresourceG como cone?iones a bases de datos

(5.1 </todos de la clase %ession


&sta clase 3ro3orciona m/todos estticos 3ara el acceso@asignaci#n de +alores de sesi#n

(5.1.1 ;ession::setCdataLSname, Svalor9


Asigna un +alor de sesi#n
1. Session::set_data('nombre_cliente', 'Guillermo Blanco');

(5.1.2 ;ession::!etCdataLSname, Svalor9


>e+uel+e un +alor de sesi#n
1. Session::get_data('nombre_cliente');

(5.1.3 ;ession::unsetCdataLSname9
&limina +alores de sesi#n:
1. Session::unset_data('nombre_cliente');

(5.1.( ;ession::issetCdataLSname9
&limina +alores de sesi#n:
1. Session::isset_data('nombre_cliente');

A 3artir de la +ersi#n : ( -1;( tambi/n se 3uede usar:

(5.1.5 ;ession::setLSname, Svalor9


Asigna un +alor de sesi#n
1. Session::set('nombre_cliente', 'Guillermo Blanco');

(5.1.4 ;ession::!etLSname, Svalor9


>e+uel+e un +alor de sesi#n
1. Session::get('nombre_cliente');

Libro de Kumbia: Porque Programar debera ser ms fcil

1'$

(4 Loggers
Los Loggers 3ermiten crear logs 3ara almacenar informaci#n que 3ueda ser utili2ada 3ara registrar transaccionesC re+isar mo+imientosC 0acer un debugC etc Para crear un log 3uede utili2ar la clase Logger de Kumbia:
1. //Empieza un log en logs/logDDMMY.txt 2. $myLog = new Logger(); 3. 4. $myLog->log("Loggear esto como un debug", Logger::DEBUG); 5. 6. //Esto se guarda al log inmediatamente 7. $myLog->log("Loggear esto como un error", Logger::ERROR); 8. 9. //Inicia una transaccin 10.$myLog->begin(); 11. 12.//Esto queda pendiente hasta que se llame a commit para guardar 13.// rollback para cancelar 14.$myLog->log("Esto es un log en la fila", Logger::WARNING) 15.$myLog->log("Esto es un otro log en la fila", Logger::WARNING)* 16. 17.//Se guarda al log 18.$myLog->commit(); 19. 20.//Cierra el Log 21.$myLog->close();

Libro de Kumbia: Porque Programar debera ser ms fcil

1'(

(4.1 E+todos de la Alase <o!!er


(4.1.1 constructor
&l constructor de la clase Logger recibe el nombre del arc0i+o donde se guardar el logC este log se almacena en el directorio logs+C si no se es3ecifica el nombre del arc0i+o creado es logYYYY<<>> t?t

(4.1.2 lo!LSmessa!e, St'#e9


Muarda un mensaBe en en log (type 3uede ser <o!!er::KEQ1]C <o!!er::E//O/C <o!!er::ZA/N5N]C <o!!er::A1;TOE
1. $myLog->log("Esto es un log en la fila", Logger::WARNING); 2. $myLog->log("Esto es un otro log en la fila", Logger::WARNING);

(4.1.3 be!inL9
Logger 3ermite crear transacciones 3ara e+itar la escritura a disco cada +e2 que se llame a log sino 0asta que se llame al m/todo commit o se cancele mediante rollback
1. //Inicia una transaccin 2. $myLog->begin();

(4.1.( commitL9
Logger 3ermite crear transacciones 3ara e+itar la escritura a disco cada +e2 que se llame a log sino 0asta que se llame al m/todo commit # se cancele mediante rollback ;ommit ace3ta la transacci#n 5 los +alores se escriben al arc0i+o
1. $myLog->begin(); 2. $myLog->log("Esto es un log en la fila", Logger::WARNING); 3. $myLog->log("Esto es un otro log en la fila", Logger::WARNING); 4. $myLog->commit();

(4.1.5 rollbackL9
Logger 3ermite crear transacciones 3ara e+itar la escritura a disco cada +e2 que se llame a log sino 0asta que se llame al m/todo commit o se cancele mediante rollback 1ollback cancela la transacci#n 5 los +alores no se escriben al arc0i+o
1. $myLog->begin(); 2. $myLog->log("Esto es un log en la fila", Logger::WARNING); 3. $myLog->log("Esto es un otro log en la fila", Logger::WARNING); 4. $myLog->rollback();

(4.1.4 close
;ierra el log 3ara que no se 3ueda escribir ms en /l
1. $myLog->close();

Libro de Kumbia: Porque Programar debera ser ms fcil

1''

(6 Protot53e en Kumbia
&stas son algunas funciones que a5udan al 3rogramador usando Ua+a%cri3t 5 la librera Protot53e en la +ersi#n e?tendida de Kumbia: Ha5 muc0as +entaBas 3ara usar las funciones Protot53e: Protot53e enca3sula muc0os detalles incom3atibles de los e?3loradores Web 5 los 0ace com3atibles con esto no debemos 3reocu3arnos 3or 3robar que funcione bien tanto en Firefo? 5 en "nternet &?3lorer 5 0asta en %afari *uestro c#digo Ua+a%cri3t se 0ace ms legible 5 3otente Protot53e elimina muc0os de los memor5 leaks Fconflictos de memoriaG mu5 comunes cuando usamos ABa? # &+entos Fe+ent 0andlersG en "nternet &?3lorer

Algunos 3untos a tener en cuenta: ;omo sabemosC la l#gica adicional enca3sulada en 3rotot53e consume ligeramente un 3oco ms de anc0o de banda Para esto e?isten +ersiones com3rimidas de 3rotot53e cuando esto sea un 3roblema &?isten mas des+entaBas,

Libro de Kumbia: Porque Programar debera ser ms fcil

1'-

(7 &fectos Aisuales 5 %cri3t Aculo 4s


Los efectos +isuales estn incluidos 3or defecto en la +ista 3rinci3al )ie's*index.phtml con la sentencia kum%ia$$javascript*use*drag13. Kumbia utili2a los efectos +isuales de la librera Ua+a%cri3t scri3t aculo usC dis3onible en 0tt3:@@scri3t aculo us Los efectos +isuales nos 3ermiten dar una e?3eriencia de usuario agradable e inno+adora que en ciertos casos 3uede a5udar a 0acer nuestra a3licaci#n ms llamati+a ;on esta librera se 3odemos a3ro+ec0ar el uso a+an2ado de efectos grficosC arrastrar 5 soltarC te?tos con autocom3letadores en aBa? 5 muc0as cosas usadas en las A3licaciones Web ! : de 0o5 Las animaciones usadas estn basadas en tiem3o 5 no en ca3asC de esta forma a3ro+ec0amos de una meBor forma los recursos del e?3lorador 5 adems nos aseguramos que funcione tanto en Firefo?C "nternet &?3lorerC %afari 5 otros como Konqueror A continuaci#n se encuentra la traducci#n com3leta e integraci#n de Kumbia con esta librera:

(7.1 E ectos Q:sicos


&?isten seis efectos bsicos que son la base 3ara los dems efectos ms a+an2ados &stos son &ffect 83acit5C &ffect %caleC &ffect <or30C &ffect <o+eC &ffect Hig0lig0t 5 &ffect Parallel La sinta?is bsica 3ara iniciar un efecto es:
new Effect.EffectName(elemento, parametros-requeridos, [optiones] );

4n elemento 3uede ser un string que contiene el id de un obBeto 0tml o el obBeto mismo en si Los 3armetros requeridos de3enden del efecto que est/ siendo llamado 5 la ma5ora de +eces no son necesarios &l 3armetro o3ciones es usado 3ara es3ecificar 3ersonali2aci#n adicional al efecto Ha5 o3ciones generales 5 es3ecificas AdicionalmenteC los 3armetros o3cionales 3ueden tener e+entos FcallbacksGC as se 3uede es3ecificar que cierta funci#n o 3rocedimiento Ba+ascri3t sea eBecutado mientras el efecto est corriendo Los callbacks son llamados con el obBeto del efecto que es en+iado A continuaci#n un eBem3lo de esto:
1. .unction callbacE)obN*G 2. .or)var i in obN.e..ects*G 3. alert)obN.e..ects[i [@element@ .id*! 4. F 5. F

Libro de Kumbia: Porque Programar debera ser ms fcil

1'6

Aallback before%tart before43date after43date afterFinis0

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

4n eBem3lo del uso de callbacks:


1. .unction mi7all<acE8nQinish)obN*G 2. alert)C/l id del obNeto al +ue le aplicamos el e.ecto es :C R obN.element.id*! 3. F 4. .unction mi7all<acE8n3tart)obN*G 5. alert)C/l elemento al cual aplicamos este e.ecto es :C R obN.element*! 6. F 7. new /..ect.#iAhliAht)m$8bNect, 8. G startcolor:@#......@, 9. endcolor:@#....cc@, 10. duration: H.S, 11. a.terQinish: mi7all<acE8nQinish, 12. be.ore3tart: mi7all<acE8n3tart 13. F 14.*!

(7.1.1 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'

Libro de Kumbia: Porque Programar debera ser ms fcil

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*!

Jambi/n 3uede usar HFgelementEidhG mor30Fkwidt0:h!::3?hlGC que es ms corto

>etalles

&ffect <or30 toma los estilos originales dados 3or reglas ;%% o atributos inline en consideraci#n cuando se calculan las transformaciones JrabaBa con todas las 3ro3iedades ;%% de tama\o 5 colorC inclu5endo margenesC 3addingsC bordesC o3acidad t colores de te?to 5 fondo

(7.1.( 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'});

Libro de Kumbia: Porque Programar debera ser ms fcil

1'9

&sto mo+er un obBeto $:3? arriba 5 !:3? a la derec0a Fel modo 3redeterminado es grelati+ehG:
1. new /..ect.0ove )obN,G B: 2H, $: &>H, mode: @relative@F*!

(7.2 E ectos Aombinados


Joda la combinaci#n de efectos est basada en cinco de los efectos bsicos ;ore &ffectsC 5 3ueden ser usados como base de eBem3lo si se desean crear efectos 3ersonali2ados

&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*!

Libro de Kumbia: Porque Programar debera ser ms fcil

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@*!

Libro de Kumbia: Porque Programar debera ser ms fcil

1-1

new /..ect.<lind9p)@id(o.(element@*! // #acer la transiciUn mWs larAa new /..ect.<lind4own)@id(o.(element@, Gduration:>F*!

JrabaBa bien con elementos ti3o bloqueFdi+sC 3C s3anC etcG 3ero no con tablas

((.1.3 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>

(7.3 E:s 5n ormacin


%cri3t Aculo 4s tiene muc0as cosas ms interesantes como %lidersC Listas 8rdenablesC Autocom3letadores AUAV 5 &dici#n "n=Place Para encontrar la referencia com3leta de estas funciones +isite:

>rag And >ro3: >raggablesC >ro33ablesC %ortablesC %lider Autocom3letion: Autocom3letado de cam3os ti3o AUAV "n Place &diting: ;am3os de Je?to editables AUAV

Libro de Kumbia: Porque Programar debera ser ms fcil

1-!

(8 Aentanas Protot53eWindows
Las Aentanas Protot53e son +entanas no intrusi+as que reem3la2an los 3o3=u3s 5 nos 3ermiten interactuar con los usuarios de las a3licaciones de forma ms estructuraC estili2ada 5 segura &stas +entanas fueron creadas 3or %ebastien Mru0ier F0tt3:@@?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

(8.1 1so de las Oentanas 2rotot'#e


1. &n el siguiente eBem3lo abrimos una +entana con las o3ciones mnimasC
1. <?php echo javascript_include_tag("scriptaculous/window") ?> 2. <?php echo stylesheet_link_tag("../themes/default") ?> 3. <?php echo stylesheet_link_tag("../themes/mac_os_x") ?> 4. 5. <div style='display:none' id='contenido'><h1>Hola a Todos</h1></div> 6. 7. <script type'text/javascript'> 8. new Event.observe(window, "load", function(){ 9. var unaVentana = new Window({ 10. className: "mac_os_x", 11. width: 300, 12. height: 200, 13. title: "Bienvenido a Kumbia" 14. }) 15. unaVentana.setHTMLContent($('contenido').innerHTML) 16. unaVentana.showCenter() 17. }) 18.</script>

Libro de Kumbia: Porque Programar debera ser ms fcil

1-$

&n el eBem3loC cargamos las libreras necesarias 3ara utili2ar las +entanas Protot53e inclu5endo el arc0i+o 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

Libro de Kumbia: Porque Programar debera ser ms fcil

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

83ciones 3ara el argumento o3tions:


Alave id class*ame title url 3arent to3 a bottom rig0t a left widt0 @ 0eig0t ma?Widt0 @ ma?Heig0t 2redeterminad o Menerado dialog *inguno *inguno bod5 to3:: left:: 1:: none Kescri#cin window >8< id >ebe ser [nico PrefiBo del nombre de la clase Jitulo de la +entana 41L del contenido de la +entana Fse usa un iframeG *odo 3adre de la +entanaC debe cambiar cuando queramos que la +entana 3ertene2ca a un determinado obBeto del >8< Posici#n su3erior FJo3G o inferior FDottomG de la +entana en 3i?eles Posici#n derec0a o i2quierda de la +entana en 3i?eles Anc0o 5 alto de la +entana <?imo anc0o 5 alto de la +entana <nimo anc0o 5 alto de la +entana &s3ecifica si se le 3uede cambiar el tama\o a la +entana o no &s3ecifica si la +entana 3uede ser cerrada o no &s3ecifica si la +entana 3uede ser minimi2ada o no &s3ecifica si la +entana 3uede ser ma?imi2ada o no &s3ecifica si la +entana 3uede ser mo+ida o no &fecto scri3t aculo us con el cual se muestra la +entana &l +alor 3or defecto de3ende si scri3t aculo us est dis3onible &fecto scri3t aculo us con el cual se oculta la +entana &l

minWidt0 @ minHeig0t 1::@!: resi2able closable minimi2able ma?imi2able draggable s0ow&ffect 0ide&ffect true true true true true &ffect A33ear # &lement s0ow &ffect Fade #

Libro de Kumbia: Porque Programar debera ser ms fcil

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

+alor 3or dis3onible

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

Libro de Kumbia: Porque Programar debera ser ms fcil

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

s0ow;enterFmodalC to3C leftG

minimi2eFG ma?imi2eFG is<inimi2edFG is<a?imi2edFG set83acit5Fo3acit5G setm"nde?F2inde?G

setJitleFtitleG getJitleFG set%tatusDarFG

Libro de Kumbia: Porque Programar debera ser ms fcil

1-6

(8.( E&em#los de 2rotot'#e Zindo%s


(8.(.1 Abriendo una Oentana ;encilla
&ste eBem3lo abre una sencilla +entana con algunos 3armetros como los efectos de mostrar 5 ocultar Jambi/n usa un wired frame al mo+erse o aBustar su tama\o
1. var win = new Window({ 2. className: "dialog", 3. width: 350, 4. height: 400, 5. zIndex: 100, 6. resizable: true, 7. title: "Sample window", 8. showEffect: Effect.BlindDown, 9. hideEffect: Effect.SwitchOff, 10. draggable:true, 11. wiredDrag: true 12.}) 13.win.getContent().innerHTML= "<div style='padding:10px'> Este es el contenido</div>" 14.win.setStatusBar("Status bar info"); 15.win.showCenter();

(8.(.2 Abrir una ventana usando una 1/<


&n este eBem3lo abrimos en una +entana el sitio de kumbia org *#tese que usa un iframe interno en la +entana creada
1. var win = new Window({ 2. className: "spread", 3. title: "Sitio de Kumbia", 4. top:70, 5. left:100, 6. width:300, 7. height:200, 8. url: "http://www.kumbia.org/", 9. showEffectOptions: { 10. duration:1.5 11. } 12.}) 13.win.show();

Libro de Kumbia: Porque Programar debera ser ms fcil

1-7

(8.(.3 Abre una ventana con un contenido eDistente


Abre un contenidoC usando un di+ e?istente &ste di+ tiene un id llamado testEcontent
1. contentWin = new Window({ 2. maximizable: false, 3. resizable: false, 4. hideEffect: Element.hide, 5. showEffect: Element.show, 6. minWidth: 10, 7. destroyOnClose: true 8. }) 9. contentWin.setContent('test_content', true, true) 10.contentWin.show();

Libro de Kumbia: Porque Programar debera ser ms fcil

1-9

(8.(.( Abriendo una cuadro de dialo!o usando A_AY


1. Dialog.alert({ 2. url: "info_panel.html", 3. options: { 4. method: 'get' 5. } 6. }, { 7. className: "alphacube", 8. width: 540, 9. okLabel: "Close" 10.});

(8.(.5 Abrir un cuadro de Kialo!o de Alerta


1 Dialog.alert("Prueba de un alert usando Dialog", { 2 width:300, 3 height:100, 4 okLabel: "cerrar", 5 ok: function(win) { 6 alert("validate alert panel"); 7 return true; 8 } 9 });

Libro de Kumbia: Porque Programar debera ser ms fcil

16:

50 Funciones de 1e3ortes
Para la +ersi#n : ' se encuentra la +ersi#n 1 - de esta librera

50.1 Eanual de /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

50.2 ).u/ es FP>F,


FP>F es una clase escrita en PHP que 3ermite generar documentos P>F directamente desde PHPC es decirC sin usar la biblioteca P>Flib La +entaBa es queC mientras P>Flib es de 3ago 3ara usos comercialesC la F de FP>F significa Free Fgratis 5 libreG: 3uede usted usarla 3ara cualquier 3ro3#sito 5 modificarla a su gusto 3ara satisfacer sus necesidades FP>F tiene otras +entaBas: funciones de alto ni+el &sta es una lista de sus 3rinci3ales caractersticas:

&lecci#n de la unidad de medidaC formato de 3gina 5 mrgenes Mesti#n de cabeceras 5 3ies de 3gina %alto de 3gina automtico %alto de lnea 5 Bustificaci#n del te?to automticos Admisi#n de imgenes FUP&M 5 P*MG ;olores &nlaces Admisi#n de fuentes JrueJ53eC J53e1 5 codificaci#n ;om3resi#n de 3gina FP>F no necesita de ninguna e?tensi#n 3ara PHP Fe?ce3to la biblioteca 2lib si se +a a acti+ar la o3ci#n de com3resi#nG 5 funciona con PHP( 5 PHP'

La [ltima +ersi#n del manual de FP>F se 3uede encontrar en: 0tt3:@@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

51.1 ).u/ es PHP<ailer,


PHP<ailer es una clase 303 3ara en+iar emails basada en el com3onente acti+e ser+er A%P<ail Permite de una forma sencilla tareas com3leBas como 3or eBem3lo:

&n+iar mensaBes de correo con fic0eros adBuntos Fattac0mentsG en+iar mensaBes de correo en formato HJ<L

;on PHP<ailer se 3ueden en+iar emails +a sendmailC PHP mailFGC o con %<JP Lo ms recomendable es usando smt3 3or dos ra2ones:

;on 303mailer se 3ueden usar +arios ser+idores %<JP &sto 3ermite re3artir la carga entre +arias com3utadorasC con lo que se 3odrn en+iar un ma5or n[mero de mensaBes en un tiem3o menor Adems los ser+idores %<JP 3ermiten mensaBes con m[lti3les toTs FdestinatariosGC ccTs FLas direcciones que a3are2can en este cam3o recibirn el mensaBe Jodos los destinatarios +ern las direcciones que a3arecen en la secci#n ;cGC bccTs FLas direcciones que a3are2can en el cam3o Dcc recibirn el mensaBe %in embargoC ninguno de los destinatarios 3odr +er las direcciones que fueron incluidas en la secci#n DccG 5 1e3l5=tos Fdirecciones de res3uestaG

<as sobre las caractersticas de PHP<ailer

51.2 )Por qu/ usar 303mailer,


&s 3osible en+iar email con la funci#n mailL9 de 303C 3ero dic0a funci#n no 3ermite algunas de las ms 3o3ulares caractersticas que 3ro3orcionan los clientes de correo usados actualmente &ntre estas caractersticas se encuentran el en+o de email con fic0eros adBuntos PHP<ailer 0ace fcil esta difcil tarea de en+iar correos con estas caractersticas 5 3uedes incluso utili2ar tu 3ro3io ser+idor smt3 aunque /ste requiera autenticaci#n Fun nombre de usuario 5 contrase\aGC con lo que se 3odr usar una cuenta gratuita de correo obtenida 3or eBem3lo en 0ot3o3

Libro de Kumbia: Porque Programar debera ser ms fcil

16!

51.3 2F2Eailer en Accin con ]mail


a##sBcontrollersBmailCcontroller.#,#
1. <?php 2. class MailController extends ApplicationController 3. { 4. /** 5. * Muestra el boton enviar 6. * 7. */ 8. public function index () 9. {} 10. /** 11. * Envia el Mail 12. * 13. */ 14. public function enviar () 15. { 16. $mail = new PHPMailer(); 17. $mail->IsSMTP(); 18. $body = "Hola,<br>This is the HTML BODY<br>"; 19. $mail->SMTPAuth = true; // enable SMTP authentication 20. $mail->SMTPSecure = "ssl"; // sets the prefix to the servier 21. $mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server 22. $mail->Port = 465; // set the SMTP port for the GMAIL server 23. $mail->Username = "username@gmail.com"; // GMAIL username 24. $mail->Password = "pass."; // GMAIL password 25. $mail->AddReplyTo("deivinsontejeda@kumbiaphp.com", "First Last"); 26. $mail->From = "deivinsontejeda@kumbiaphp.com"; 27. $mail->FromName = "Deivinson Tejeda"; 28. $mail->Subject = "PHPMailer Prueba con KUMBIA"; 29. $mail->Body = "Hi,<br>This is the HTML BODY<br>"; 30. $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; 31. $mail->WordWrap = 50; // set word wrap 32. $mail->MsgHTML($body); 33. $mail->AddAddress("deivinsontejeda@kumbiaphp.com", "Deivinson Tejeda"); 34. $mail->AddAttachment("images/phpmailer.gif"); // attachment 35. $mail->IsHTML(true); // send as HTML 36. if (! $mail->Send()) { 37. echo "Mailer Error: " . $mail->ErrorInfo; 38. } else { 39. echo "Message sent!"; 40. } 41. } 42.F

a##sBvie%sBmailBindeD.#,tml

1. <?php echo link_to('mail/enviar', 'Enviar Mail')?>

Libro de Kumbia: Porque Programar debera ser ms fcil

16$

52 "ntegraci#n con %mart5


52.1 ).u/ es %mart5,
%mart5 es un motor de 3lantillas 3ara PHP <s es3ecficamenteC esta 0erramienta facilita la manera de se3arar la a3licaci#n l#gica 5 el contenido en la 3resentaci#n La meBor descri3ci#n est en una situaci#n donde la a3licaci#n del 3rogramador 5 la 3lantilla del dise\ador Buegan diferentes rolesC o en la ma5ora de los casos no la misma 3ersona Por eBem3lo: >igamos que usted crea una 3agina webC es decirC des3liega el artculo de un diario &l encabe2ado del artculoC el rotuloC el autor 5 el cuer3o son elementos del contenidoC /stos no contienen informaci#n de c#mo quieren ser 3resentados fstos son 3asados 3or la a3licaci#n %mart5C donde el dise\ador edita la 3lantillaC 5 usa una combinaci#n de etiquetas HJ<L 5 etiquetas de 3lantilla 3ara formatear la 3resentaci#n de estos elementos FHJ<LC tablasC color de fondoC tama\o de letrasC 0oBas de estiloC etc G 4n da el 3rogramador necesita cambiar la manera de recu3erar el contenido del artculo Fun cambio en la a3licaci#n l#gica G &ste cambio no afectar al dise\ador de la 3lantillaC el contenido llegar a la 3lantilla e?actamente igual >e la misma maneraC si el dise\ador de la 3lantilla quiere redise\arla en su totalidadC estos cambios no afectarn la a3licaci#n l#gica Por lo tantoC el 3rogramador 3uede 0acer cambios en la a3licaci#n l#gica sin que sea necesario reestructurar la 3lantilla Y el dise\ador de la 3lantilla 3uede 0acer cambios sin que 0a5a rom3imiento con la a3licaci#n l#gica A0ora un 3eque\o resumen sobre que no 0ace %mart5 %mart5 no intenta se3arar com3letamente la l#gica de la 3lantilla *o 0a5 3roblema entre la l#gica 5 su 3lantilla baBo la condici#n que esta l#gica sea estrictamente 3ara 3resentaci#n 4n conseBo: mantener la a3licaci#n l#gica fuera de la 3lantillaC 5 la 3resentaci#n fuera de la a3licaci#n l#gica &sto tiene como finalidad tener un obBeto mas mani3ulable 5 escalable 3ara un futuro 3r#?imo 4n [nico as3ecto acerca de %mart5 es la com3ilaci#n de la 3lantilla >e esta manera %mart5 lee la 3lantilla 5 crea los scri3ts de PHP 4na +e2 creadosC son eBecutados sobre /l Por consiguiente no e?iste ning[n costo 3or anali2ar gramaticalmente cada arc0i+o de tem3late 3or cada requisici#nC 5 cada tem3late 3uede lle+ar toda la +entaBa del com3ilador de cac0e de PHP tal como mend Accelerator F0tt3:@@www 2end com@G o PHP Accelerator F0tt3:@@www 303=accelerator co ukG Algunas de las caractersticas de %mart5: &s e?tremamente r3ido &s eficiente 5a que 3uede inter3retar el trabaBo mas sucio *o anali2a gramaticalmente desde arriba el tem3lateC solo com3ila una +e2 &l esta atento 3ara solo recom3ilar los arc0i+os de 3lantilla que fueron cambiados 4sted 3uede crear funciones 0abituales 5 modificadores de +ariables customi2adosC de modo que el lenguaBe de la 3latilla es altamente e?tensible %inta?is de etiquetas delimitadoras 3ara configuraci#n de la 3lantillaC as lo 3uede usar klC kkllC C etc Los construtoress if@elseif@else@endif son 3asados 3or el inter3retador de PHPC as la sinta?is de la e?3resi#n kif l 3uede ser com3leBa o sim3le de la forma que usted quiera Permite un anidamiento ilimitado de sectionsC ifsC etc

Libro de Kumbia: Porque Programar debera ser ms fcil

16(

&s 3osible incrustar directamente codigo PHP en los arc0i+os de 3lantillaC aunque esto 3uede no ser necesarioFno recomendadoG dado que la 0erramienta se 3uede aBustar %o3orte de cac0ing incrustado Fuentes de Plantilla absoluto Funciones 0abituales de mani3ulaci#n de cac0e Arquitectura de Plugin

52.2 ;omo se integra %mart5 a Kumbia


&s mu5 sencillo integrar %mart5 a KumbiaC 3ara la muestra un bot#n: Jenemos un controlador controllers+saludo*controller.php:
1. <?php 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.?>

class SaludoController extends ApplicationController { function hola(){ $this->name = "Andrs Felipe";


$this&'.echa , date)CD&m&d #:iC*!

} }

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!

Libro de Kumbia: Porque Programar debera ser ms fcil

16'

53 ;oders
;omo dice el lema del framework OPorque 3rogramar debera ser ms fcilPC los ;oders son esto 5 muc0o ms Los coders es una iniciati+a 3or 3arte del gru3o de desarrollo 3ara im3lementar una caracterstica en Kumbia que 3ermita que el framework identifique determinadas situaciones en las cuales 3ueda crear arc0i+osC codificar o configurar com3onentes de la a3licaci#n sin que el 3rogramador deba 0acerlo Los coders son una soluci#n inno+adora a un 3roblema general de los frameworks de e?igir al desarrollador reali2ar O?P # O5P 3asos que son ob+ios u obligatorios 3ara 3oder obtener un resultado ms inmediato %i sumsemos todos estos 3asos 3odramos darnos cuenta c#mo em3e2amos a 3erder tiem3o 5 deBamos de ser tan 3roducti+os &sta metodologa re3resenta una ma5or interacci#n entre el desarrollador 5 su framework con la meta de lograr de con+ertir a Kumbia en una 0erramienta que trabaBe en sincrona con los obBeti+os de quien lo use

53.1 Acti+ar los ;oders


Los coders estn des0abilitados 3or seguridad al iniciar un 3ro5ecto usando Kumbia Por esto deben ser acti+ados en config+config.ini acti+ando la lnea que dice:
1. Interactive = On

&sto debe ser reali2ado en el a3artado QdefaultR

53.2 Probar los coders


Los coders son una caracterstica que se encuentra en >esarrolloC 3or esto se 3resentan eBem3los 3ara algunos de ellos Para 3robar los coders es necesario Ocometer erroresP o ol+idarnos de 0acer un determinado 3aso );#mo es esto, ;uando cometemos un error 3uede ser 3or ! situacionesC ol+idamos reali2ar algo o realmente estamos cometiendo algo indebido Los coders de Kumbia trabaBan sobre las situaciones en las cuales ol+idamos reali2ar un determinado 3aso 3ara e+itar 3roducir la e?ce3ci#n o el error que se est generando

53.3 1n e&em#lo #r:ctico


Pasos 3re+ios 3ara +er el eBem3lo:

;rear una base de datos 5 una tabla clientes con algunos cam3os de 3rueba ;onfigurar la cone?i#n a la base de datos en Kumbia en el arc0i+o config@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

Al abrir el e?3lorador encontramos un mensaBe como este:

Libro de Kumbia: Porque Programar debera ser ms fcil

16-

Al reali2ar la 3etici#n de este controlador Kumbia 0a generado una e?ce3ci#n que se 3uede +isuali2ar en roBo 5 fondo rosa que indica el nombre de la e?ce3ci#n 5 su ti3oC con esto fcilmente 3odemos +er que 0emos ol+idado o toda+a no 0emos trabaBado en la codificaci#n de un formulario que trabaBe con la tabla clientes %in embargo 3ara nuestra fortuna Kumbia 0a identificado que 3uede reali2ar esta tarea 3or nosotros mostrndonos el cuadro de dilogo en la 3arte su3erior con fondo lila Adicional a esto Kumbia 0a identificado que el nombre del controlador coincide con el nombre de una tabla en la base de datos 5 nos ofrece la o3ci#n de crear un formulario de ti3o %tandardForm como o3ci#n 3redeterminada &scogemos esta o3ci#n 5 damos clic en Ace3tar Paso siguiente un 80L:

Libro de Kumbia: Porque Programar debera ser ms fcil

166

Kumbia 0a generado un formulario con base en la tabla %tandarForm creando los arc0i+os controllers@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.?>

Libro de Kumbia: Porque Programar debera ser ms fcil

167

5 adicional a estoC 0a creado el modelo corres3ondiente en el directorio models con el nombre de 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

Libro de Kumbia: Porque Programar debera ser ms fcil

169

5( Meneraci#n de Mrficas
&sto es otras de las meBoras que incor3ora Kumbia en su versi(n 0.4 a0ora tenemos un m#dulo 3ara la generaci#n de Mrficas esto se logra mediante <ibc,art ,i%chart son unas libreras 3ara la generaci#n de re3ortes grficos a modo estadsticosC la im3lementaci#n de estas libreras es mu5 sencillas &ntre los grficos que son generados se encuentran: Mrficos de Darra FHori2ontal 5 AerticalG Mrficos de Lineales Jortas NOTA: #ara "ue las librer?as <ibc,art 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

Libro de Kumbia: Porque Programar debera ser ms fcil

17:

52.1 <ibc,art en Accin


Aeamos un eBem3lo donde se 3odr a3reciar una forma sencilla de utili2ar las Libreras Libc0art en nuestras a3licaciones Lo 3rimero que 0aremos es crear un controller a##sBcontrollersBlibc,artCcontroller.#,#
1. <?php 2. class LibchartController extends ApplicationController 3. { 4. /** 5. * Muestra un enlace 6. * 7. */ 8. public function index () 9. {} 10. /** 11. * Genera una grafica 12. */ 13. public function grafica () 14. { 15. $chart = new HorizontalBarChart(600, 170); 16. $dataSet = new XYDataSet(); 17. $dataSet->addPoint(new Point("Versin 0.5", 60)); 18. $dataSet->addPoint(new Point("Versin 0.4", 40)); 19. $dataSet->addPoint(new Point("Versin 0.3", 20)); 20. $chart->setDataSet($dataSet); 21. $chart->getPlot()->setGraphPadding(new Padding(5, 30, 20, 140)); 22. $chart->setTitle("Crecimiento de Kumbia"); 23. //le damos la ruta y el nombre del archivo 24. $chart->render("public/img/demo.png"); 25. } 26.F 6a vista views/libchart/index.phtml 1. <?php echo link_to('libchart/grafica', 'Generar Grfica')?> 6a vista views/libchart/grafica.phtml esta vista es la +ue muestra la imaAen +ue en un principio .ue Aenerada por nuestro controlador con su acciUn grafica. 1. <?php echo img_tag('demo.png') ?>

Algo im3ortante de notar en este eBem3lo cuando generamos la grfica le dimos un directorio F3ublic@img@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

Libro de Kumbia: Porque Programar debera ser ms fcil

171

55 Pasos de Daile en Kumbia


%i nos encontrramos con un letrero en la calle que diceC TPasos de Daile en KumbiaT 3robablemente 3ensaras que se trata de 3asarla bien 5 de disfrutarC 5 la +erdad estamos de acuerdo Los 3asos de baile deben usarse de acuerdo a cada ocasi#n: si la m[sica es mu5 r3ida debers mo+erte ms r3ido 3ero si es ms 3ausada entonces debers 0acerlo un 3oco ms lento <uc0as +eces nos 3reguntamos si usamos el 3aso indicado de3endiendo de la situaci#nC s#lo con la e?3eriencia sabrs cundo es ms con+eniente &ste ca3tulo del libro de Kumbia 3retende reunir muc0as de las situaciones ms comunes que se 3uedan 3resentar en una a3licaci#n 5 detallarla 3ara que lo 3uedas a3licar en un caso ms concreto Los TPasos de DaileT 3ro3uestos en esta secci#n cubren al 3[blico que 5a tiene algo de e?3eriencia usando el framework o que al menos 0an ledo con disci3lina 0asta esta secci#n del libro &n cualquier caso 3uedes ec0arle una oBeada e ir a otra 3arte del libro 3ara recordar o resol+er dudas Para 3robar los eBem3los de esta secci#n debes usar la [ltima +ersi#n de Kumbia 3referiblementeC o alguna +ersi#n reciente <uc0as de las caractersticas que se 3resentan son e?3licaciones a nue+as funcionalidades del framework que merecen alguna e?3licaci#n ms 3recisa

54 ;reando tus 3ro3ios arc0i+os de configuraci#n ini


Arc0i+os "*" son los estndar de Kumbia 3ara definir 3armetros de configuraci#n Puedes crear tus 3ro3ios arc0i+os 5 definir +ariables 3ersonali2adas de tu a3licaci#n 4n eBem3lo: config+mi*configuracion.ini
1. [mi_config] 2. variable1 = "Esto es una Variable" 3. variable2 = true

A0ora la cargamos desde cualquier 3arte de nuestra a3licaci#n as:


1. $configuracion = Config::read('mi_configuracion.ini'); 2. # Imprime el valor de la variable1 3. print $con.iAuracion&'mi(con.iA&'variableL!

54.1 <eer la con i!uracin Actual


&l obBeti+o de este eBem3lo es leer la configuraci#n actual de forms@config@config ini 5 mostrar alguna informaci#n adems de saber en qu/ entorno estamos trabaBando

Libro de Kumbia: Porque Programar debera ser ms fcil

17!

1. <?php 2. 3. class EjemploController extends ApplicationController { 4. 5. function index(){ 6. 7. $config = Config::read("config.ini"); 8. 9. Flash::notice("Trabajando en el Host de MySQL : {$config>database->host}"); 10. 11. if($config->mode=="production"){ 12. Flash::notice("Trabajando en modo Producci&oacute;n"); 13. } 14. if($config->mode=="development"){ 15. Flash::notice("Trabajando en modo Desarrollo"); 16. } 17. 18. } 19. 20. } 21. 22.?>

Libro de Kumbia: Porque Programar debera ser ms fcil

17$

54.2 <eer Arc,ivos EDcel con 3umbia


&sta clase 3ermite leer arc0i+os &?cel Fcon &?tension ?lsG &ncuentra ms informaci#n en:
http://ustrem.or /en/articles/readin -!ls-with-php-en/ http://sourcefor e.net/pro"ect/showfiles.php# roup$id%&&'() 1. <?php 2. 3. include_once "lib/excel/main.php"; 4. 5. class ExcelController extends ApplicationController{ 6. 7. public function index(){ 8. //creamos la Clase , 9. $reader=new Spreadsheet_Excel_Reader(); 10. //Encoding 11. //windows-1251 for example: 12. //$reader->setOutputEncoding('CP-1251'); 13. $reader->setUTFEncoder('iconv'); 14. $reader->setOutputEncoding('UTF-8'); 15. $reader->read("public/img/upload/Libro1.xls"); 16. $data = $reader->sheets[0]; 17. foreach($data['cells'] as $row){ 18. foreach($row as $cell){ 19. $this->render_text("$cell"); 20. } 21. } 22. } 23. } 24.?>

Nota: Para usar encoding debes tener instalada la e?tension icon+C cualquier otra salida en unicode <s &Bem3los: &n esta +ista de K4<D"AC Leo de un fic0ero ?lsC 5 creo una tabla con filas 5 columnasC 5 miro si est re3etido escribo una fila con los +alores de los cam3os:
1. <?php 2. 3. include_once "lib/excel/main.php"; 4. 5. $reader = new Spreadsheet_Excel_Reader(); 6. $reader->setUTFEncoder("iconv"); 7. $reader->setOutputEncoding('UTF-8'); 8. $reader->read("public/img/upload/Libro1.xls"); 9. $data = $reader->sheets[0];?> 10.<table cellspacing='0' cellpadding='2' border='1' style='border: 1px solid #CFCFCF'> 11. <tr class="date"> 12. <h1><b>Correo</b></h1> 13. </tr>

Libro de Kumbia: Porque Programar debera ser ms fcil

17(

14. <?$db=DbBase::raw_connect()();?> 15. <? for ($i = 1; $i <= $reader->sheets[0]['numRows']; $i++) { 16. $db->query("select * from ecuentas where baja<>'1' and email='{$reader>sheets[0]['cells'][$i][2]}'"); 17. if ($db->num_rows()>0){ 18. echo)CKtr'C*! 19. while ($fila=$db->fetch_array()){ 20. $t = 0; 21. while ($t <= 26){ 22. echo )CKtd id,@repe@'C*! 23. echo $.ila[$db&'.ield(name)$t* ! 24. echo )CK/td'C*! 25. $t++; 26. } 27. } 28. echo)CK/tr'C*! 29. } 30. echo )CKtr'C*! 31. for ($j = 1; $j <= $reader->sheets[0]['numCols']; $j++) 32. { 33. if ($db->num_rows()>0){ 34. echo )CKtd id,@repe@'C*! 35. }else{ 36. echo )CKtd id,@norepe@'C*! 37. } 38. echo $reader&'sheets[H [@cells@ [$i [$N ! 39. echo )CK/td'C*! 40. } 41. echo CK/tr'C! 42. } 43. $db->close(); 44.?> 45.</table>

Algunas otras cosas:


1. <?php 2. include_once "lib/excel/main.php"; 3. 4. $data = new Spreadsheet_Excel_Reader(); 5. // Tipo de Salida 6. $data->setOutputEncoding('CP1251'); 7. /*** 8. * Si deseas cambiar 'iconv' por mb_convert_encoding: 9. * $data->setUTFEncoder('mb'); 10. * 11. **/ 12. /*** 13. * Por defecto los indices de filas y columnas empiezan con 1 14. * Para cambiar el indice inicial usa: 15. * $data->setRowColOffset(0); 16. * 17. **/ 18. /***

Libro de Kumbia: Porque Programar debera ser ms fcil

17'

19. * Some function for formatting output. 20. * $data->setDefaultFormat('%.2f'); 21. * setDefaultFormat - set format for columns with unknown formatting 22. * 23. * $data->setColumnFormat(4, '%.3f'); 24. * setColumnFormat - set format for column (apply only to number fields) 25. * 26. **/ 27. $data->read('jxlrwtest.xls'); 28. /* 29. $data->sheets[0]['numRows'] - count rows 30. $data->sheets[0]['numCols'] - count columns 31. $data->sheets[0]['cells'][$i][$j] - data from $i-row $j-column 32. $data->sheets[0]['cellsInfo'][$i][$j] - extended info about cell 33. $data->sheets[0]['cellsInfo'][$i][$j]['type'] = "date" | "number" | "unknown" 34. if 'type' == "unknown" - use 'raw' value, because cell contain value with format '0.00'; 35. $data->sheets[0]['cellsInfo'][$i][$j]['raw'] = value if cell without format 36. $data->sheets[0]['cellsInfo'][$i][$j]['colspan'] 37. $data->sheets[0]['cellsInfo'][$i][$j]['rowspan'] 38. */ 39. error(reportinA)/(A66 X /(:85;7/*! 40. for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) { 41. for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) { 42. echo C\CC.$data&'sheets[H [@cells@ [$i [$N .C\C,C! 43. } 44. echo C\nC! 45. } 46. //print_r($data); 47. //print_r($data->formatRecords); 48. ?>

54.3 1tili0ando la consola 5nteractiva i2F2


iPHP es una consola interacti+a de PHP 5 Kumbia escrita 3ara facilitar las tareas de >ebug de nuestras a3licaciones 5 0acer 3ruebas de benc0mark FeficienciaG 5 de unidad Fcon 3034nit o cualquier otroG iPHP es un scri3t que es 3arte del n[cleo de Kumbia PHP Framework 5 que cum3le una tarea im3ortante al facilitar las tareas de 3ruebasC debug 5 soluci#n de 3roblemas al crear una a3licaci#n en PHP iPHP 0ace un acercamiento a otras tecnologas de consola interacti+a que 3oseen lenguaBes inter3retados como 1ub5 o P5t0on >ebido a que e+ita el uso inmediato de un ser+idor Web 3ara 3robar funciones es3ecificas de usuarioC reali2ar 3rocesos de debugC crear controladores 5 modelosC 0acer o3eraciones en 303 5 en general eBecutar cualquier c#digo que 303 sin crear un arc0i+o o usar un ser+idor Web

Libro de Kumbia: Porque Programar debera ser ms fcil

17-

54.3.1 createCstandard ormLSnombre9


Permite crear una clase %tandardForm automticamente

54.3.2 createCmodelLSnombre9
Permite crear una clase Acti+e1ecord automticamente

54.3.3 createCcontrollerLSnombre9
Permite crear una clase A33lication automticamente

Libro de Kumbia: Porque Programar debera ser ms fcil

176

54.( Oalidar un 1suario


Las +alidaciones de login de usuarios son mu5 comunes en cualquier a3licaci#n Web o sitio &n el 3resente eBem3lo reali2amos una 3eque\a +alidaci#n donde tomamos los +alores recibidos de una +ista 5 contra un modelo +erificamos si el 3assword 5 el nombre de usuario son correctos &m3e2amos creando un controlador que se llamar login en controllers@loginEcontroller 303 &n controlador se +er as con su acci#n 3or defecto inde?:
1. <?php 2. 3. class LoginController extends ApplicationController { 4. 5. function index(){ 6. 7. } 8. 9. } 10. 11.?>

;reamos el formulario en la +ista corres3ondiente a su acci#n en +iews@login@inde? 30tml as:


1. <? content() ?> 2. <?php echo form_tag("login/validar") ?> 3. <div style='text-align:center; width: 200px'> 4. <div> 5. <div style='float:left; font-weight: bold'>Usuario:</div> 6. <div style='float:left'><?php echo text_field_tag("usuario") ? ></div> 7. </div> 8. <div> 9. <div style='float:left; font-weight: bold'>Password:</div> 10. <div style='float:left'><?php echo password_field_tag("password") ?></div> 11. </div> 12. <div> 13. <div style='float:left'><?php echo submit_tag("Ingresar") ? ></div> 14. </div> 15.</div> 16.<?php echo end_form_tag() ?>

>e momento nuestro formulario se debe +er as:

Libro de Kumbia: Porque Programar debera ser ms fcil

177

;omo 3odemos +er en la +ista al reali2ar el submit sobre el formulario se eBecutar la acci#n +alidar en el controlador loginC as que +amos a codificarlo:
1. <?php 2. 3. class LoginController extends ApplicationController { 4. 5. function index(){ 6. 7. } 8. 9. function validar(){ 10. 11. $nombre_usuario = $this->request("usuario"); 12. $password = $this->request("password"); 13. 14. if($nombre_usuario=="felipe"&&$password=="mipassword"){ 15. Flash::success("Bienvenido Felipe"); 16. } else { 17. Flash::error("Usuario/Password incorrectos"); 18. $this->route_to("action: index"); 19. } 20. } 21. 22. } 23. 24.?>

Libro de Kumbia: Porque Programar debera ser ms fcil

179

Lo que 0acemos es recibir los +alores de usuario 5 3assword que +ienen de la +ista 5 cargarlos en ! +ariables locales A continuaci#n 0emos reali2ado una +alidaci#n sencilla con +alores de usuario 5 3assword fiBos &n caso de /?ito mostrar un mensaBe de bien+enidaC en caso contrario lo enrutar de nue+o al formulario de ingreso 5 mostrar un mensaBe de error en la forma Busto donde est el llamado a contentFG

;omo se 3udo +erC el eBem3lo muestra una +alidaci#n que aunque [til como eBem3lo no muestra el caso 0abitual que resulta al +alidar contra una tabla de usuarios en la base de datos Aamos a crear una tabla en <5%.L llamada usuarios con la siguiente estructura: ^==========^==============^======^=====^=========^================^ a Field a J53e a *ull a Ke5 a >efault a &?tra a ^==========^==============^======^=====^=========^================^ a id a intF11G a *8 a P1" a *4LL a autoEincrement a a nombre a +arc0arF1::G a *8 a a a a a login a +arc0arF$!G a *8 a a a a a 3assword a +arc0arF(:G a *8 a a a a ^==========^==============^======^=====^=========^================^ 4na caracterstica es3ecial de esta tabla es el cam3o 3assword que tiene un ti3o de dato c0arF(:GC esto debido a que en este cam3o se +an a guardar +alores encri3tado con s0a1 que genera una cadena de (: caracteres Para 3oder interactuar entre la tabla 5 nuestro controlador loginC +amos a necesitar de un modeloC 3ara esto creamos el arc0i+o models*usuarios.php:

Libro de Kumbia: Porque Programar debera ser ms fcil

19:

1. <?php 2. 3. class Usuarios extends ActiveRecord { 4. 5. } 6. 7. ?>

A0ora 3odemos reali2ar la +alidaci#n seg[n los registros guardados en la base de datos ;ambiamos la acci#n +alidar 3ara que +erifique usando el modelo reci/n creado as:
1. <?php 2. 3. class LoginController extends ApplicationController { 4. 5. function index(){ 6. 7. } 8. 9. function validar(){ 10. 11. $nombre_usuario = $this->request("usuario"); 12. $password = $this->request("password"); 13. 14. if($this->Usuarios->find_first("login = '$nombre_usuario' and password = sha1('$password')")){ 15. Flash::success("Bienvenido {$this->Usuarios>nombre}"); 16. } else { 17. Flash::error("Usuario/Clave incorrectos"); 18. return $this->route_to("action: index"); 19. } 20. 21. } 22. 23. } 24. 25.?>

54.5 Arear un /e#orte usando -2K&n el 3resente eBem3lo se +a a crear un re3orte usando en formato P>F usando FP>F %e trata de reali2ar un +olcado de la tabla 5 reali2ar la salida a este conocido formato Primero que todo debemos 0abilitar la e?tensi#n FP>F 3ara que se cargue 3or defecto al iniciar la a3licaci#n &sto lo 0acemos en con i!Bboot.ini QmodulesR e?tensions S f3df f3df

Libro de Kumbia: Porque Programar debera ser ms fcil

191

A0ora +amos a crear un controlador controllers+pdf*controller.php$

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'

Libro de Kumbia: Porque Programar debera ser ms fcil

19!

54.4 Aombos Actuali0ables con A_AY


Los combos actuali2ables son una caracterstica mu5 no+edosa de las a3licaciones Web actuales &l eBem3lo ms claro de esto lo encontramos algunas +eces en los formularios de registro cuando escogemos nuestro 3as 5 los de3artamentos o 3ro+incias se cargan automticamente seg[n corres3onda &l 3resente eBem3lo reali2a esta tarea utili2ando la forma ms sencilla aunque generalmente esta tarea se reali2a consultando una salida V<L 5 cambiando las o3ciones del combo a 3artir de estoC aunque esto es ms com3licado &m3e2amos con un controlador controllers+ejemplo*controller.php$ eBem3lo 5 una acci#n inde? en

1. <?php 2. 3. class EjemploController extends ApplicationController { 4. 5. function index(){ 6. 7. } 8. 9. } 10. 11.?>

A0ora +amos a crear dos tablas en <5%.L: 3ais 5 ciudad con la siguiente estructura:
mysql> create table pais ( -> id integer not null auto_increment, -> nombre varchar(50), -> primary key(id) -> ); mysql> create table ciudad ( -> id integer not null auto_increment, -> pais_id integer not null, -> nombre varchar(50), -> primary key(id) -> );

"ngresamos algunos datos de 3rueba:


mysql> select * from pais; +----+-----------+ | id | nombre | +----+-----------+ | 1 | Colombia | | 2 | Venezuela | | 3 | Mexico | | 4 | Argentina | +----+-----------+ 4 rows in set (0.20 sec)

Libro de Kumbia: Porque Programar debera ser ms fcil

19$

mysql> select * from ciudad; +----+---------+--------------+ | id | pais_id | nombre | +----+---------+--------------+ | 1 | 1 | Bogot | | 2 | 1 | Cali | | 3 | 1 | Medellin | | 4 | 2 | Maracaibo | | 5 | 2 | Caracas | | 6 | 3 | Mexico DF | | 7 | 3 | Monterrey | | 8 | 4 | Buenos Aires | +----+---------+--------------+ 8 rows in set (0.04 sec)

Para que 3odamos interactuar con las tablas debemos crear los modelos 3ais 5 ciudad en models:
1. <?php 2. 3. class Ciudad extends ActiveRecord { 4. 5. function __construct(){ 6. $this->belongs_to("pais"); 7. } 8. 9. } 10. 11.?> 1. <?php 2. 3. class Pais extends ActiveRecord { 4. 5. function __construct(){ 6. $this->has_many("ciudad"); 7. } 8. 9. } 10. 11.?>

Libro de Kumbia: Porque Programar debera ser ms fcil

19(

A0ora +amos a crear la +ista donde mostramos ambos combos en views+ejemplo+inde2.phtml:


1. <h2>Combos Actualizables con Kumbia</h2> 2. <div> 3. <select id='pais_id'> 4. <option>Seleccione una...</option> 5. <? foreach($Pais->find() as $pais): ?> 6. <option value='<?php echo $pais->id ?>'><?php echo $pais>nombre ?></option> 7. <? endforeach; ?> 8. </select> 9. </div> 10.<div id='div_ciudad'> 11. <select id='ciudad_id'> 12. <option>Seleccione una...</option> 13. </select> 14.</div>

*uestro eBem3lo en el e?3lorador se +e as de momento:

Libro de Kumbia: Porque Programar debera ser ms fcil

19'

A0ora en la +ista +amos a agregar un e+ento a el 3rimer combo que eBecute una acci#n aBa? que actualice los +alores del combo corres3ondiente:
1. <h2>Combos Actualizables con Kumbia</h2> 2. <div> 3. <select id='pais_id'> 4. <option>Seleccione una...</option> 5. <? foreach($Pais->find() as $pais): ?> 6. <option value='<?php echo $pais->id ?>'><?php echo $pais>nombre ?></option> 7. <? endforeach; ?> 8. </select> 9. </div> 10.<div id='div_ciudad'> 11. <select id='ciudad_id'> 12. <option>Seleccione una...</option> 13. </select> 14.</div> 15. 16.<script type="text/javascript"> 17. new Event.observe("pais_id", "change", function(){ 18. new AJAX.viewRequest({ 19. action: "ejemplo/obtener_ciudades/"+$F("pais_id"), 20. container: "div_ciudad" 21. }) 22. }) 23.</script>

&l e+ento se llama al reali2ar el cambio de la o3ci#n seleccionada en 3aisEidC en +e2 de reali2ar un t3ico 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)-

Libro de Kumbia: Porque Programar debera ser ms fcil

19-

>getCiudad(); 15. 16. 17. '$pais_id'"); 18. 19. 20. 21. 22. } 23. 24. } 25. 26.?>

//Usando find //$this->ciudades = $this->Ciudad->find("pais_id = //Usando find_by $this->ciudades = $this->Ciudad->find_by_pais_id($pais_id);

;omo +emos la consulta 3uede reali2arse de +arias formas aunque 0a5 algunas otras msC se 3uede consultar en Ht0is=Iciudades las ciudades que corres3ondan al 3as seleccionado &n la +ista )ie's*e3emplo*obtener_ciudades.phtml +ol+emos a generar el combo 3ero con los +alores de ciudad corres3ondientes:
1. <select id='ciudad_id'> 2. <option>Seleccione una...</option> 3. <? foreach($ciudades as $ciudad): ?> 4. <option value='<?php echo $ciudad->id ?>'><?php echo $ciudad>nombre ?></option> 5. <? endforeach; ?> 6. </select>

;on eso terminamos nuestro eBem3lo el cual 3odemos +isuali2ar a0ora en el e?3lorador:

Libro de Kumbia: Porque Programar debera ser ms fcil

196

Libro de Kumbia: Porque Programar debera ser ms fcil

197

54.6 Aambiando el Aontrolador #or Ke ecto


4no de los 3asos que generalmente siem3re 0acemos al iniciar un 3ro5ecto en Kumbia es cambiar el controlador 3or defecto &sto lo cambiamos en el arc0i+o controllers@a33lication 303:
1. <?php 2. /** 3. * Todas las controladores heredan de esta clase en un nivel superior 4. * por lo tanto los metodos aqui definidos estan disponibles para 5. * cualquier controlador. 6. * 7. * @category Kumbia 8. * @package Controller 9. **/ 10.class ControllerBase 11.{ 12. public function init () 13. { 14. Kumbia::route_to("controller: index"); 15. } 16.}

54.7 Kevolviendo una salida YE<


&l 3resente eBem3lo 3resenta una 3ers3ecti+a general 3ara generar salidas V<L desde las acciones de nuestros controladores Las salidas V<L son mu5 utili2adas Bunto con AUAV de a0 la V en su nombre Jambi/n 3uedes usarlas 3ara generar salidas estructuradas 3ara intercambiar informaci#n entre diferentes a3licaciones &l eBem3lo +a a crear una 3eque\a salida V<L que ser mostrada luego a 3artir de una 3etici#n AUAV ;reamos un controlador eBem3lo en controllersBe&em#loCcontroller.#,#:
1. <?php 2. 3. class EjemploController extends ApplicationController { 4. 5. function index(){ 6. 7. } 8. 9. function obtener_xml(){ 10. 11. //Indicamos que es una salida xml 12. $this->set_response("xml"); 13. 14. //Creamos un manejados XML de Kumbia 15. //Tambien se puede usar SimpleXML, SAX o DOM 16. $xml = new simpleXMLResponse();

Libro de Kumbia: Porque Programar debera ser ms fcil

199

17. 18. //Agregamos algunos nodos a la salida 19. $xml->addNode(array("valor" => "salida xml 1", "texto" => "esto es otro nodo")); 20. $xml->addNode(array("valor" => "salida xml 2", "texto" => "otro nodo mas")); 21. 22. //Generamos la salida 23. $xml->outResponse(); 24. 25. } 26. 27. } 28. 29.?>

&l m/todo obtenerE?ml reali2a la salida V<L tal 5 como est comentado A0ora +eamos la +ista +iews@eBem3lo@inde? 30tml donde reali2amos la 3etici#n AUAV:
1. <script type="text/javascript"> 2. new Event.observe(window, "load", function(){ 3. new AJAX.xmlRequest({ 4. action: "ejemplo/obtener_xml", 5. callbacks: { 6. oncomplete: function(transport){ 7. xml = transport.responseXML 8. rows = xml.getElementsByTagName("row"); 9. for(i=0;i<=rows.length-1;i++){ 10. alert(rows[i].getAttribute("valor")) 11. } 12. } 13. } 14. }) 15. }) 16.</script>

Al final +isuali2amos unos mensaBes de Je?to con la salida que fue consultada en obtener_xml as:

Libro de Kumbia: Porque Programar debera ser ms fcil

!::

54.8 1sar Aom#onentes Edicin 5n@2lace


&n momentos tu a3licaci#n 3uede tener com3onentes que 3ueden ser editados 3or los usuarios de /sta &l obBeti+o de este eBem3lo es dotar estas 3artes de una forma fcil 5 r3ida de editarlas sin tener que ir a un nue+o formularioC abrir una +entana nue+a o recargar la 3gina Para esto +amos a a3ro+ec0ar el com3onente "nPlace&ditor de scri3t aculo us que facilita la tarea 3ara nuestro beneficio Para nuestro eBem3lo +amos a codificar la +ista F+iews@eBem3lo@inde? 30tmlG de la acci#n inde? en eBem3lo que tiene una im3lementaci#n +acaC con lo siguiente:
1. <div style='float:left'><b>Tu Nombre: </b></div> 2. 3. <div id='nombre' style='float:left'>Andres Felipe</div> 4. 5. <script type='text/javascript'> 6. new Ajax.InPlaceEditor("nombre", "/demo/ejemplo/guardar_nombre", { 7. cancelText: "Cancelar", 8. clickToEditText: "Click para editar" 9. }) 10.</script>

Para crear un editor "n=Place sim3lemente creamos un di+ o un s3an 5 le agregamos un id en nuestro caso con el id nombre %eguido a esto creamos un nue+o ABa? "nPlace&ditor que se refiere a nombreC seguido a esto una url que en+a el +alor del com3onente des3u/s de editarlo 5 unas o3ciones adicionales 3ara traducir algunos te?tos al es3a\ol *uestro formulario debera +erse as al dar clic sobre el di+ nombre:

;omo +emos un bot#n de 8K 5 uno de cancelar a3arecen 5 el te?to se 0a 0ec0o editable Libro de Kumbia: Porque Programar debera ser ms fcil !:1

al dar clic sobre el di+ Al o3rimir guardar el te?to es en+iado a la acci#n AUAV indicada con un 3armetro +alue con el +alor del com3onente Para nuestro eBem3lo 0emos definido el m/todo guardarEnombre de esta forma:
1. <?php 2. 3. class EjemploController extends ApplicationController { 4. 5. function index(){ 6. 7. } 8. 9. function guardar_nombre(){ 10. 11. $this->set_response(view); 12. 13. $nombre = $this->request("value"); 14. 15. $this->render_text("Se guard&oacute; $nombre"); 16. 17. } 18. 19. } 20. 21.?>

As al guardar a3arecer el te?to T%e guard#T 5 el nombre que fue en+iado desde el formulario

54.10 Areando un <ive ;earc,


Li+e %earc0 es la no+edad en b[squedas en "nternet 5 tambi/n las de re3roductores como iJunes en donde em3ie2as a escribir 5 automticamente la a3licaci#n em3ie2a a filtrar resultados 0asta cuando terminas de escribir 5a tienes lo que estabas buscando 4na a3licaci#n mu5 conocida de esto la encuentras en los clientes de correo como Mmail donde escribes alguna 3arte de la direcci#n a donde deseas en+iar el mensaBe e inmediatamente em3ie2as a +er los contactos que coinciden con lo 3oco que 0as escrito ;omo 3arte de scri3t aculo us tenemos el com3onente Auto;om3letion que 3ermite reali2ar 3eticiones AUAV mientras escribimos en una caBa de Je?to A3licando esto tendremos un sistema de b[squeda mu5 llamati+o en 3ocas lineas Para nuestro eBem3lo crearemos un cam3o donde el usuario +a a escribir un nombre 3ero le a5udaremos con algunas sugerencias de datos ingresados anteriormente "niciamos el eBem3lo creando el controlador controllers*e3emplo_controller.php con la acci#n inde? de esta forma: eBem3lo en

Libro de Kumbia: Porque Programar debera ser ms fcil

!:!

1. <?php 2. 3. class EjemploController extends ApplicationController { 4. 5. function index(){ 6. 7. } 8. 9. } 10. 11.?>

&n la corres3ondiente +ista de la acci#n inde? F en +iews@eBem3lo@inde? 30tmlG lo siguiente:


1. <div style='text-align:center'> 2. 3. <b>B&uacute;squeda:</b> <?php echo text_field_with_autocomplete("nombre", "action: ejemplo/ver_sugerencias") ?> 4. 5. </div>

&l te?to se +a a llenar con los +alores que de+uel+a la acci#n eBem3lo@+erEsugerencias que codificamos as:
1. <?php 2. 3. class EjemploController extends ApplicationController { 4. 5. function index(){ 6. 7. } 8. 9. function ver_sugerencias(){ 10. 11. $this->set_response("view"); 12. 13. $nombre = $this->request("nombre"); 14. 15. $this->clientes = $this->Clientes->find("nombre like '% $nombre%'"); 16. 17. } 18. 19. } 20. 21.?>

&n la +ista +iews@eBem3lo@+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:

Libro de Kumbia: Porque Programar debera ser ms fcil

!:$

1. <ul> 2. <? foreach($clientes as $cliente): ?> 3. <li id='<?php echo $cliente->id ?>'><?php echo $cliente->nombre ? ></li> 4. <? endforeach ?> 5. </ul> 6.

Libro de Kumbia: Porque Programar debera ser ms fcil

!:(

56 Mlosario de ;once3tos
56.1 AUAV
&n las a3licaciones Web tradicionales los usuarios interact[an mediante formulariosC que al en+iarseC reali2an una 3etici#n al ser+idor Web &l ser+idor se com3orta seg[n lo en+iado en el formulario 5 contesta en+iando una nue+a 3gina Web %e des3erdicia muc0o anc0o de bandaC 5a que gran 3arte del HJ<L en+iado en la segunda 3gina WebC 5a estaba 3resente en la 3rimera AdemsC de esta manera no es 3osible crear a3licaciones con un grado de interacci#n similar al de las a3licaciones 0abituales &n a3licaciones AUAV se 3ueden en+iar 3eticiones al ser+idor Web 3ara obtener 5o [nicamente la informaci#n necesariaC em3leando %8AP o alg[n otro lenguaBe 3ara ser+icios Web basado en V<LC 5 usando Ua+a%cri3t en el cliente 3ara 3rocesar la res3uesta del ser+idor Web &sto redunda en una ma5or interacci#n gracias a la reducci#n de informaci#n intercambiada entre ser+idor 5 cliente 5a que 3arte del 3roceso de la informaci#n lo 0ace el 3ro3io clienteC liberando al ser+idor de ese trabaBo La contra3artida es que la descarga inicial de la 3gina es ms lenta al tenerse que baBar todo el c#digo Ua+a%cri3t

56.2 Eodelo Oista Aontrolador LEOA9


&s un 3atr#n de dise\o de software que se3ara los datos de una a3licaci#nC la interfa2 de usuarioC 5 la l#gica de control en tres com3onentes distintos &l 3atr#n <A; se +e frecuentemente en a3licaciones WebC donde la +ista es la 3gina HJ<L 5 el c#digo que 3ro+ee de datos dinmicos a la 3gina Eodelo: &sta es la re3resentaci#n es3ecfica del dominio de la informaci#n sobre la cual funciona la a3licaci#n &l modelo es otra forma de llamar a la ca3a de dominio La l#gica de dominio a\ade significado a los datos] 3or eBem3loC calculando si 0o5 es el cum3lea\os del usuario o los totalesC im3uestos o 3ortes en un carrito de la com3ra Oista: &ste 3resenta el modelo en un formato adecuado 3ara interactuarC usualmente un elemento de la interfa2 de usuario &Bem3lo un Formulario Aontrolador: &ste res3onde a e+entosC usualmente acciones del usuario e in+oca cambios en el modelo 5 3robablemente en la +ista <uc0as a3licaciones utili2an un mecanismo de almacenamiento 3ersistente Fcomo 3uede ser una base de datosG 3ara almacenar los datos <A; no menciona es3ecficamente esta ca3a de acceso a datos &s com[n 3ensar que una a3licaci#n tiene tres ca3as 3rinci3ales: 3resentaci#n F"4GC dominioC 5 acceso a datos &n <A;C la ca3a de 3resentaci#n est 3artida en controlador 5 +ista La 3rinci3al se3araci#n es entre 3resentaci#n 5 dominio] la se3araci#n entre A; es menos clara Aunque se 3ueden encontrar diferentes im3lementaciones de <A;C el fluBo que sigue el control generalmente es el siguiente: 1. &l usuario interact[a con la interfa2 de usuario de alguna forma F3or eBem3loC el usuario 3ulsa un bot#nC enlaceG Libro de Kumbia: Porque Programar debera ser ms fcil !:'

2. &l controlador recibe F3or 3arte de los obBetos de la interfa2=+istaG la notificaci#n de la acci#n solicitada 3or el usuario &l controlador gestiona el e+ento que llegaC frecuentemente a tra+/s de un gestor de e+entos F0andlerG o callback 3. &l controlador accede al modeloC actuali2ndoloC 3osiblemente modificndolo de forma adecuada a la acci#n solicitada 3or el usuario F3or eBem3loC el controlador actuali2a el carro de la com3ra del usuarioG Los controladores com3leBos estn a menudo estructurados usando un 3atr#n de comando que enca3sula las acciones 5 sim3lifica su e?tensi#n (. &l controlador delega a los obBetos de la +ista la tarea de des3legar la interfa2 de usuario La +ista obtiene sus datos del modelo 3ara generar la interfa2 a3ro3iada 3ara el usuario donde se refleBa los cambios en el modelo F3or eBem3loC 3roduce un listado del contenido del carro de la com3raG &l modelo no debe tener conocimiento directo sobre la +ista %in embargoC el 3atr#n de obser+ador 3uede ser utili2ado 3ara 3ro+eer cierta indirecci#n entre el modelo 5 la +istaC 3ermitiendo al modelo notificar a los interesados de cualquier cambio 4n obBeto +ista 3uede registrarse con el modelo 5 es3erar a los cambiosC 3ero aun as el modelo en s mismo sigue sin saber nada de la +ista &l controlador no 3asa obBetos de dominio Fel modeloG a la +ista aunque 3uede dar la orden a la +ista 3ara que se actualice *ota: &n algunas im3lementaciones la +ista no tiene acceso directo al modeloC deBando que el controlador en+e los datos del modelo a la +ista 5. La interfa2 de usuario es3era nue+as interacciones del usuarioC comen2ando el ciclo nue+amente

56.3 Framework
&n el desarrollo de softwareC un framework es una estructura de so3orte definida en la cual otro 3ro5ecto de software 3uede ser organi2ado 5 desarrollado J3icamenteC un framework 3uede incluir so3orte de 3rogramasC libreras 5 un lenguaBe de scri3ting entre otros software 3ara a5udar a desarrollar 5 unir los diferentes com3onentes de un 3ro5ecto 4n framework re3resenta una arquitectura de software que modela las relaciones generales de las entidades del dominio Pro+ee una estructura 5 una metodologa de trabaBo la cual e?tiende o utili2a las a3licaciones del dominio

56.( Acti+e1ecord
&s un 3atr#n de software utili2ado en a3licaciones robustasC que 3ermite trabaBar los registros de una tabla en una base de datos como instancias de una claseC 3or eBem3lo ;lientes # Productos en los cuales 3odemos a3licar m/todos DuscarC Muardar 5 Dorrar sin necesidad de utili2ar sentencias %.L

56.5 ;ca old LAndamia&e9


&l %caffold es un 3atr#n de desarrollo que 3ermite crear ca3turas de formularios 5 +istas de forma dinmica seg[n los atributos de una entidad en el modelo de datos

56.4 2ro!ramacin Orientada a Ob&etos


&s un 3aradigma de 3rogramaci#n que define los 3rogramas en t/rminos de iclases de obBetosiC obBetos que son entidades que combinan estado Fes decirC datosGC com3ortamiento Festo esC 3rocedimientos o m/todosG e identidad F3ro3iedad del obBeto que lo diferencia del restoG La 3rogramaci#n orientada a obBetos e?3resa un 3rograma Libro de Kumbia: Porque Programar debera ser ms fcil !:-

como un conBunto de estos obBetosC que colaboran entre ellos 3ara reali2ar tareas &sto 3ermite 0acer los 3rogramas 5 m#dulos ms fciles de escribirC mantener 5 reutili2ar

56.6 ;a3a de Abstracci#n de >atos


&s una ca3a estndar 3ara el acceso a datosC la im3lementaci#n de /staC reduce un 3oco el rendimiento 3ero aumenta en forma im3ortante la escalabilidad de las a3licaciones 4n eBem3lo de esto es 8>D; F83en >ataDase ;onnecti+it5GC en donde 3odemos acceder a cualquier base de datos sin necesidad de cambiar funciones nati+as del lenguaBe

56.7 PHP
&l fcil uso 5 la similaridad con los lenguaBes ms comunes de 3rogramaci#n estructuradaC como ; 5 PerlC 3ermiten a la ma5ora de los 3rogramadores e?3erimentados crear a3licaciones com3leBas con una cur+a de a3rendi2aBe mu5 sua+e Jambi/n les 3ermite in+olucrarse con a3licaciones de contenido dinmico sin tener que a3render todo un nue+o gru3o de funciones 5 3rcticas La 3rinci3al +entaBa se basa en ser un lenguaBe multi3lataforma ;a3acidad de cone?i#n con la ma5ora de los maneBadores de base de datos que se utili2an en la actualidad Leer 5 mani3ular datos desde di+ersas fuentesC inclu5endo datos que 3ueden ingresar los usuarios desde formularios HJ<L ;a3acidad de e?3andir su 3otencial utili2ando la enorme cantidad de m#dulos Fllamados e?tTs o e?tensionesG Posee una mu5 buena documentaci#n en su 3gina oficial &s LibreC 3or lo que se 3resenta como una alternati+a de fcil acceso 3ara todos Permite las t/cnicas de Programaci#n 8rientada a 8bBetos

56.8 )Por qu/ Patrones,


Los 3atrones son soluciones abstradas del 3roblemas del da a da de muc0os desarrolladores alrededor del mundo &?isten muc0os 5 mu5 +ariados 5 cada uno tiene su ra2#n de e?istir 5 sus casos ideales de a3licaci#n Algunos de ellos son el <A; F<odeloCAistaC;ontroladorG cu5a funci#n es se3arar la l#gica de la 3resentaci#nC tambi/n esta el 81<F<a3eo 8bBeto=1elacionalG cu5a funci#n es 3ermitirnos trabaBar tablas como clases 5 registros como obBetosC as es ms natural 3ara nosotros 5 buenoC entre otras +entaBas *o todos los 3atrones solucionan todo ti3o de 3roblemasC cada uno tiene su 3ro3ia funcionalidadC es nuestro deber 0acer de estos una soluci#n fcil de reutili2arC e?tender o mantener 3ara beneficio de nuestro 3ro5ecto Familiari2arse con ciertos 3atrones 3uede resultar un tanto com3licado si lle+amos trabaBando muc0o tiem3o con determinada metodologa que 3uede estar 3atentada o ser una creada 3or nosotros mismos PeroC )Podras e+aluar que tan eficiente es trabaBar con estos 3atrones a0ora, <s adelante entraremos en detalle sobre el uso de estos 3atronesC sus +entaBas 5 a3licaci#n

Patrones de >ise\o: 0tt3:@@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

Libro de Kumbia: Porque Programar debera ser ms fcil

57 J0e M*4 Meneral Public License FMPLG


Aersion !C Uune 1991 ;o35rig0t F;G 1979C 1991 Free %oftware FoundationC "nc '9 Jem3le PlaceC %uite $$:C DostonC <A :!111=1$:6 4%A
&+er5one is 3ermitted to co35 and distribute +erbatim co3ies of t0is license documentC but c0anging it is not allowed Preamble J0e licenses for most software are designed to take awa5 5our freedom to s0are and c0ange it D5 contrastC t0e M*4 Meneral Public License is intended to guarantee 5our freedom to s0are and c0ange free software==to make sure t0e software is free for all its users J0is Meneral Public License a33lies to most of t0e Free %oftware FoundationTs software and to an5 ot0er 3rogram w0ose aut0ors commit to using it F%ome ot0er Free %oftware Foundation software is co+ered b5 t0e M*4 Librar5 Meneral Public License instead G You can a33l5 it to 5our 3rogramsC too W0en we s3eak of free softwareC we are referring to freedomC not 3rice 8ur Meneral Public Licenses are designed to make sure t0at 5ou 0a+e t0e freedom to distribute co3ies of free software Fand c0arge for t0is ser+ice if 5ou wis0GC t0at 5ou recei+e source code or can get it if 5ou want itC t0at 5ou can c0ange t0e software or use 3ieces of it in new free 3rograms] and t0at 5ou know 5ou can do t0ese t0ings Jo 3rotect 5our rig0tsC we need to make restrictions t0at forbid an5one to den5 5ou t0ese rig0ts or to ask 5ou to surrender t0e rig0ts J0ese restrictions translate to certain res3onsibilities for 5ou if 5ou distribute co3ies of t0e softwareC or if 5ou modif5 it For e?am3leC if 5ou distribute co3ies of suc0 a 3rogramC w0et0er gratis or for a feeC 5ou must gi+e t0e reci3ients all t0e rig0ts t0at 5ou 0a+e You must make sure t0at t0e5C tooC recei+e or can get t0e source code And 5ou must s0ow t0em t0ese terms so t0e5 know t0eir rig0ts We 3rotect 5our rig0ts wit0 two ste3s: F1G co35rig0t t0e softwareC and F!G offer 5ou t0is license w0ic0 gi+es 5ou legal 3ermission to co35C distribute and@or modif5 t0e software AlsoC for eac0 aut0orTs 3rotection and oursC we want to make certain t0at e+er5one understands t0at t0ere is no warrant5 for t0is free software "f t0e software is modified b5 someone else and 3assed onC we want its reci3ients to know t0at w0at t0e5 0a+e is not t0e originalC so t0at an5 3roblems introduced b5 ot0ers will not reflect on t0e original aut0orsT re3utations Finall5C an5 free 3rogram is t0reatened constantl5 b5 software 3atents We wis0 to a+oid t0e danger t0at redistributors of a free 3rogram will indi+iduall5 obtain 3atent licensesC in effect making t0e 3rogram 3ro3rietar5 Jo 3re+ent t0isC we 0a+e made it clear t0at an5 3atent must be licensed for e+er5oneTs free use or not licensed at all J0e 3recise terms and conditions for co35ingC distribution and modification follow J&1<% A*> ;8*>"J"8*% F81 ;8PY"*MC >"%J1"D4J"8* A*> <8>"F";AJ"8* : J0is License a33lies to an5 3rogram or ot0er work w0ic0 contains a notice 3laced b5 t0e co35rig0t 0older sa5ing it ma5 be distributed under t0e terms of t0is Meneral Public License J0e iProgramiC belowC refers to an5 suc0 3rogram or workC and a iwork based on t0e Programi means eit0er t0e Program or an5 deri+ati+e work under co35rig0t law: t0at is to sa5C a work containing t0e Program or a 3ortion of itC eit0er +erbatim or wit0 modifications and@or translated into anot0er language FHereinafterC translation is included wit0out limitation in t0e term imodificationi G &ac0 licensee is addressed as i5oui Acti+ities ot0er t0an co35ingC distribution and modification are not co+ered b5 t0is License] t0e5 are outside its sco3e J0e act of running t0e Program is not restrictedC and t0e out3ut from t0e Program is co+ered onl5 if its contents constitute a work based on t0e Program Finde3endent of 0a+ing been made b5 running t0e ProgramG W0et0er t0at is true de3ends on w0at t0e Program does

Libro de Kumbia: Porque Programar debera ser ms fcil

!:7

1 You ma5 co35 and distribute +erbatim co3ies of t0e ProgramTs source code as 5ou recei+e itC in an5 mediumC 3ro+ided t0at 5ou cons3icuousl5 and a33ro3riatel5 3ublis0 on eac0 co35 an a33ro3riate co35rig0t notice and disclaimer of warrant5] kee3 intact all t0e notices t0at refer to t0is License and to t0e absence of an5 warrant5] and gi+e an5 ot0er reci3ients of t0e Program a co35 of t0is License along wit0 t0e Program You ma5 c0arge a fee for t0e 305sical act of transferring a co35C and 5ou ma5 at 5our o3tion offer warrant5 3rotection in e?c0ange for a fee ! You ma5 modif5 5our co35 or co3ies of t0e Program or an5 3ortion of itC t0us forming a work based on t0e ProgramC and co35 and distribute suc0 modifications or work under t0e terms of %ection 1 abo+eC 3ro+ided t0at 5ou also meet all of t0ese conditions: aG You must cause t0e modified files to carr5 3rominent notices stating t0at 5ou c0anged t0e files and t0e date of an5 c0ange bG You must cause an5 work t0at 5ou distribute or 3ublis0C t0at in w0ole or in 3art contains or is deri+ed from t0e Program or an5 3art t0ereofC to be licensed as a w0ole at no c0arge to all t0ird 3arties under t0e terms of t0is License cG "f t0e modified 3rogram normall5 reads commands interacti+el5 w0en runC 5ou must cause itC w0en started running for suc0 interacti+e use in t0e most ordinar5 wa5C to 3rint or dis3la5 an announcement including an a33ro3riate co35rig0t notice and a notice t0at t0ere is no warrant5 For elseC sa5ing t0at 5ou 3ro+ide a warrant5G and t0at users ma5 redistribute t0e 3rogram under t0ese conditionsC and telling t0e user 0ow to +iew a co35 of t0is License F&?ce3tion: if t0e Program itself is interacti+e but does not normall5 3rint suc0 an announcementC 5our work based on t0e Program is not required to 3rint an 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

Libro de Kumbia: Porque Programar debera ser ms fcil

!:9

e?ecutable "f distribution of e?ecutable or obBect code is made b5 offering access to co35 from a designated 3laceC t0en offering equi+alent access to co35 t0e source code from t0e same 3lace counts as distribution of t0e source codeC e+en t0oug0 t0ird 3arties are not com3elled to co35 t0e source along wit0 t0e obBect code ( You ma5 not co35C modif5C sublicenseC or distribute t0e Program e?ce3t as e?3ressl5 3ro+ided under t0is License An5 attem3t ot0erwise to co35C modif5C sublicense or distribute t0e Program is +oidC and will automaticall5 terminate 5our rig0ts under t0is License Howe+erC 3arties w0o 0a+e recei+ed co3iesC or rig0tsC from 5ou under t0is License will not 0a+e t0eir licenses terminated so long as suc0 3arties remain in full com3liance ' You are not required to acce3t t0is LicenseC since 5ou 0a+e not signed it Howe+erC not0ing else grants 5ou 3ermission to modif5 or distribute t0e Program or its deri+ati+e works J0ese actions are 3ro0ibited b5 law if 5ou do not acce3t t0is License J0ereforeC b5 modif5ing or distributing t0e Program For an5 work based on t0e ProgramGC 5ou indicate 5our acce3tance of t0is License to do soC and all its terms and conditions for co35ingC distributing or modif5ing t0e Program or works based on it - &ac0 time 5ou redistribute t0e Program For an5 work based on t0e ProgramGC t0e reci3ient automaticall5 recei+es a license from t0e original licensor to co35C distribute or modif5 t0e Program subBect to t0ese terms and conditions You ma5 not im3ose an5 furt0er restrictions on t0e reci3ientsT e?ercise of t0e rig0ts granted 0erein You are not res3onsible for enforcing com3liance b5 t0ird 3arties to t0is License 6 "fC as a consequence of a court Budgment or allegation of 3atent infringement or for an5 ot0er reason Fnot limited to 3atent issuesGC conditions are im3osed on 5ou Fw0et0er b5 court orderC agreement or ot0erwiseG t0at contradict t0e conditions of t0is LicenseC t0e5 do not e?cuse 5ou from t0e conditions of t0is License "f 5ou cannot distribute so as to satisf5 simultaneousl5 5our obligations under t0is License and an5 ot0er 3ertinent obligationsC t0en as a consequence 5ou ma5 not distribute t0e Program at all For e?am3leC if a 3atent license would not 3ermit ro5alt5=free redistribution of t0e Program b5 all t0ose w0o recei+e co3ies directl5 or indirectl5 t0roug0 5ouC t0en t0e onl5 wa5 5ou could satisf5 bot0 it and t0is License would be to refrain entirel5 from distribution of t0e Program "f an5 3ortion of t0is section is 0eld in+alid or unenforceable under an5 3articular circumstanceC t0e balance of t0e section is intended to a33l5 and t0e section as a w0ole is intended to a33l5 in ot0er circumstances "t is not t0e 3ur3ose of t0is section to induce 5ou to infringe an5 3atents or ot0er 3ro3ert5 rig0t claims or to contest +alidit5 of an5 suc0 claims] t0is section 0as t0e sole 3ur3ose of 3rotecting t0e integrit5 of t0e free software distribution s5stemC w0ic0 is im3lemented b5 3ublic license 3ractices <an5 3eo3le 0a+e made generous contributions to t0e wide range of software distributed t0roug0 t0at s5stem in reliance on consistent a33lication of t0at s5stem] it is u3 to t0e aut0or@donor to decide if 0e or s0e is willing to distribute software t0roug0 an5 ot0er s5stem and a licensee cannot im3ose t0at c0oice J0is section is intended to make t0oroug0l5 clear w0at is belie+ed to be a consequence of t0e rest of t0is License 7 "f t0e distribution and@or use of t0e Program is restricted in certain countries eit0er b5 3atents or b5 co35rig0ted interfacesC t0e original co35rig0t 0older w0o 3laces t0e Program under t0is License ma5 add an e?3licit geogra30ical distribution limitation e?cluding t0ose countriesC so t0at distribution is 3ermitted onl5 in or among countries not t0us e?cluded "n suc0 caseC t0is License incor3orates t0e limitation as if written in t0e bod5 of t0is License 9 J0e Free %oftware Foundation ma5 3ublis0 re+ised and@or new +ersions of t0e Meneral Public License from time to time %uc0 new +ersions will be similar in s3irit to t0e 3resent +ersionC but ma5 differ in detail to address new 3roblems or concerns &ac0 +ersion is gi+en a distinguis0ing +ersion number "f t0e Program s3ecifies a +ersion number of t0is License w0ic0 a33lies to it and ian5 later +ersioniC 5ou 0a+e t0e o3tion of following t0e terms and conditions eit0er of t0at +ersion or of an5 later +ersion 3ublis0ed b5 t0e Free %oftware Foundation "f t0e Program does not s3ecif5 a +ersion number of t0is LicenseC 5ou ma5 c0oose an5 +ersion e+er 3ublis0ed b5 t0e Free %oftware Foundation 1: "f 5ou wis0 to incor3orate 3arts of t0e Program into ot0er free 3rograms w0ose distribution conditions are differentC write to t0e aut0or to ask for 3ermission For software w0ic0 is co35rig0ted b5 t0e Free %oftware FoundationC write to t0e Free %oftware Foundation] we sometimes make e?ce3tions for t0is

Libro de Kumbia: Porque Programar debera ser ms fcil

!1:

8ur decision will be guided b5 t0e two goals of 3reser+ing t0e free status of all deri+ati+es of our free software and of 3romoting t0e s0aring and reuse of software generall5 *8 WA11A*JY 11 D&;A4%& JH& P18M1A< "% L";&*%&> F1&& 8F ;HA1M&C JH&1& "% *8 WA11A*JY F81 JH& P18M1A<C J8 JH& &VJ&*J P&1<"JJ&> DY APPL";ADL& LAW &V;&PJ WH&* 8JH&1W"%& %JAJ&> "* W1"J"*M JH& ;8PY1"MHJ H8L>&1% A*>@81 8JH&1 PA1J"&% P18A">& JH& P18M1A< iA% "%i W"JH84J WA11A*JY 8F A*Y K"*>C &"JH&1 &VP1&%%&> 81 "<PL"&>C "*;L4>"*MC D4J *8J L"<"J&> J8C JH& "<PL"&> WA11A*J"&% 8F <&1;HA*JAD"L"JY A*> F"J*&%% F81 A PA1J";4LA1 P41P8%& JH& &*J"1& 1"%K A% J8 JH& .4AL"JY A*> P&1F81<A*;& 8F JH& P18M1A< "% W"JH Y84 %H84L> JH& P18M1A< P18A& >&F&;J"A&C Y84 A%%4<& JH& ;8%J 8F ALL *&;&%%A1Y %&1A";"*MC 1&PA"1 81 ;811&;J"8* 1! "* *8 &A&*J 4*L&%% 1&.4"1&> DY APPL";ADL& LAW 81 AM1&&> J8 "* W1"J"*M W"LL A*Y ;8PY1"MHJ H8L>&1C 81 A*Y 8JH&1 PA1JY WH8 <AY <8>"FY A*>@81 1&>"%J1"D4J& JH& P18M1A< A% P&1<"JJ&> AD8A&C D& L"ADL& J8 Y84 F81 >A<AM&%C "*;L4>"*M A*Y M&*&1ALC %P&;"ALC "*;">&*JAL 81 ;8*%&.4&*J"AL >A<AM&% A1"%"*M 84J 8F JH& 4%& 81 "*AD"L"JY J8 4%& JH& P18M1A< F"*;L4>"*M D4J *8J L"<"J&> J8 L8%% 8F >AJA 81 >AJA D&"*M 1&*>&1&> "*A;;41AJ& 81 L8%%&% %4%JA"*&> DY Y84 81 JH"1> PA1J"&% 81 A FA"L41& 8F JH& P18M1A< J8 8P&1AJ& W"JH A*Y 8JH&1 P18M1A<%GC &A&* "F %4;H H8L>&1 81 8JH&1 PA1JY HA% D&&* A>A"%&> 8F JH& P8%%"D"L"JY 8F %4;H >A<AM&% &*> 8F J&1<% A*> ;8*>"J"8*%

Libro de Kumbia: Porque Programar debera ser ms fcil

!11

Anda mungkin juga menyukai