Kumbia Enteprise Framework 1.0.17.pdf

March 20, 2018 | Author: Jesús Cárdenas | Category: Software Development, Software Engineering, Computing, Technology, Computing And Information Technology


Comments



Description

Kumbia Enteipiise Fiamewoik0n Fiamewoik paia el PBP Empiesaiial LouueiTechnology Abiil ue 2uu9 veision uel Piouucto: 1.u.17uA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2 1ab|a de Conten|do 1 Þrefac|o .................................................................................................................. 14 1.1 Antes ue Leei este Bocumento.................................................................................................................. 14 1.2 Como esta oiganizauo este Bocumento................................................................................................. 14 1.S Convenciones Tipogiáficas.......................................................................................................................... 1S 1.4 A Quien está 0iientauo este Texto........................................................................................................... 16 1.S Infoimacion sobie maicas y piouuctos iefeienciauos ................................................................... 16 1.6 Refeiencias a sitios web ue teiceios....................................................................................................... 16 1.7 Sus comentaiios están bienveniuos ........................................................................................................ 17 2 Introducc|ón ........................................................................................................... 18 2.1 Bifeiencias con la veision Comunitaiia................................................................................................. 18 2.2 Licencia ................................................................................................................................................................ 19 3 Insta|ac|ón.............................................................................................................. 20 S.1 Intiouuccion ...................................................................................................................................................... 2u S.2 Configuiacion con Apache Web Seivei 2.x........................................................................................... 2u S.S Configuiacion con Niciosoft ISS e ISAPI Rewiite.............................................................................. 22 S.4 Configuiacion ue PBP.................................................................................................................................... 2S S.S Configuiacion con Zenu Application Seivei ........................................................................................ 2S S.6 Cieai una Instancia ue Kumbia Enteipiise.......................................................................................... 24 S.7 Solucion a pioblemas ue instalacion....................................................................................................... 24 4 jÇuó es kumb|a Lnterpr|se Iramework?................................................................. 27 4.1 Sobie Aplicaciones Web ............................................................................................................................... 27 4.2 Sobie PBP y la Web ........................................................................................................................................ 27 4.S Intiouuccion ...................................................................................................................................................... 27 4.4 Caiacteiisticas uel Fiamewoik.................................................................................................................. 28 4.S PBP en entoinos ciiticos.............................................................................................................................. 29 S Arqu|tectura ........................................................................................................... 30 S.1 Intiouuccion ...................................................................................................................................................... Su S.2 Capas en una Aplicacion............................................................................................................................... Su S.S 0sanuo Nouelo-vista-Contiolauoi.......................................................................................................... S1 S.4 ventajas ue usai NvC .................................................................................................................................... S2 S.S Loose Coupling¡Tight Coupling ................................................................................................................ SS 6 Caso de Uso: Ap||cac|ón de Ca[ero 8ancar|o............................................................ 34 6.1 Intiouuccion ...................................................................................................................................................... S4 6.2 Análisis ue los Requeiimientos ................................................................................................................. S4 6.S Esqueleto ue la Aplicacion........................................................................................................................... S8 6.4 Configuiai la conexion a la base ue uatos............................................................................................. S8 6.S Cieai los mouelos ue Base ue Batos........................................................................................................ S9 6.6 Cieai el Inicio ue Sesion ............................................................................................................................... 42 6.7 Autenticanuo al Cliente................................................................................................................................. 4S 6.8 0n Nenú paia la Aplicacion ........................................................................................................................ 47 6.9 visualizacion uel saluo uel cliente............................................................................................................ 48 6.1u Cieai el TiansactionActivity.................................................................................................................... S1 7 Ap||cac|ones en kumb|a Lnterpr|se ......................................................................... SS 7.1 Intiouuccion ...................................................................................................................................................... SS 7.2 Instancias uel fiamewoik ............................................................................................................................ SS LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S 7.S Estiuctuia ue uiiectoiios ue una Instancia.......................................................................................... SS 7.4 Publicai conteniuo estático......................................................................................................................... S7 7.S Bootstiap............................................................................................................................................................. S8 7.6 Cieai la accion poi uefecto en una Aplicacion.................................................................................... S9 7.7 Cieai un pioceuimiento ue inicializacion ue la aplicacion............................................................ S9 7.8 Betectai un cambio en la ejecucion ue una instancia a otia......................................................... 6u 8 Componente Contro||er .......................................................................................... 61 8.1 Intiouuccion ...................................................................................................................................................... 61 8.2 Como funciona el componente Contiollei........................................................................................... 61 8.S Cieai un Contiolauoi..................................................................................................................................... 6S 8.4 Seivicios uel Componente Routei............................................................................................................ 64 8.S Seivicios piopoicionauos poi Bispatchei ............................................................................................ 66 8.6 Excepciones ueneiauas en el Bispatchei.............................................................................................. 67 8.7 Peticiones BTTP a Contiolauoies............................................................................................................. 69 8.7.1 AJministror orcbivos oJjuntos en uno petición.............................................................................. 70 8.7.2 APl Je ControllerRequest........................................................................................................................... 70 8.8 Respuestas BTTP ue Contiolauoies........................................................................................................ 74 8.8.1 Fstoblecer el tipo Je soliJo Je lo Petición.......................................................................................... 7S 8.8.2 APl Je ControllerResponse........................................................................................................................ 76 8.9 Contiolai acciones no encontiauas ......................................................................................................... 77 8.1u Filtios en contiolauoies............................................................................................................................. 78 8.11 Eniutamiento en contiolauoies ............................................................................................................. 79 8.11.1 Ciclo Je enrutomiento.............................................................................................................................. 79 8.11.2 Fnrutor usonJo Router::routeTo......................................................................................................... 79 8.11.S Fnrutor usonJo Router::routeTo0Rl{) ............................................................................................. 80 8.12 Inicializacion ue Contiolauoies.............................................................................................................. 81 8.1S Estauo ue peisistencia ue Contiolauoies........................................................................................... 82 8.1S.1 ventojos Jel FstoJo Je Persistencio................................................................................................... 8S 8.1S.2 ConsiJerociones Jel estoJo Je Persistencio.................................................................................... 8S 8.1S.S Tronsocciones y Concurrencio Jel FstoJo Je Persistencio ...................................................... 8S 8.1S.4 Fventos Jel estoJo Je Persistencio..................................................................................................... 84 8.14 La Clase ContiolleiBase ............................................................................................................................. 8S 8.1S La Clase Contiollei ....................................................................................................................................... 8S 8.16 Contiolauoies usanuo ApplicationContiollei .................................................................................. 8S 8.16.1 ControloJores usonJo HultiTbreoJController.............................................................................. 8S 8.17 Seivicios Web usanuo WebSeiviceContiollei.................................................................................. 86 8.17.1 µué es un Web Service?............................................................................................................................ 86 8.17.2 Poro que son necesorios los Web Services....................................................................................... 87 8.17.S Arquitecturo 0rientoJo o Servicios {S0A) ...................................................................................... 87 8.17.4 Creor un Web Service ............................................................................................................................... 88 8.17.S WebServiceClient........................................................................................................................................ 90 8.17.6 0btenienJo el WSBl Je un Servicio Web......................................................................................... 91 8.17.7 0rquestoción Je servicios ....................................................................................................................... 92 8.17.8 Corocteristicos Je Servicios Web en Kumbio Fnterprise.......................................................... 94 8.18 Contiolauoies StanuaiuFoim................................................................................................................. 94 8.18.1 Corocteristicos Je StonJorJIorm....................................................................................................... 9S 8.18.2 limitontes Je StonJorJIorm................................................................................................................ 9S 8.19 Plugins ue Contiolauoies .......................................................................................................................... 9S 8.19.1 Creor un Pluqin Je ControloJor........................................................................................................... 9S 9 Componente UDDI .................................................................................................. 97 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4 9.1 Intiouuccion ...................................................................................................................................................... 97 9.2 Requeiimientos................................................................................................................................................ 97 10 Componente 8us|nessÞrocess............................................................................... 98 1u.1 Intiouuccion.................................................................................................................................................... 98 1u.2 }ob Executoi .................................................................................................................................................... 98 1u.S Cieai un Pioceso ue Negocio................................................................................................................... 98 11 Componente I||ter ................................................................................................ 99 11.1 Intiouuccion.................................................................................................................................................... 99 11.2 Estiuctuia uel Componente ..................................................................................................................... 99 11.S 0sai filtios en foima uiiecta..................................................................................................................1u1 11.4 Cieai chains ue Filtios..............................................................................................................................1u2 11.S 0sai filtios en Contiolauoies ................................................................................................................1u2 11.6 Filtiai la entiaua ue usuaiio..................................................................................................................1uS 11.7 Cieai un filtio ue usuaiio........................................................................................................................1u4 11.7.1 Requerimientos Je un filtro Je usuorio..........................................................................................10S 12 Act|onne|pers ..................................................................................................... 107 12.1 Intiouuccion..................................................................................................................................................1u7 12.2 Nensajes usanuo Flash.............................................................................................................................1u7 12.2.1 6eneror mensojes contextuoles..........................................................................................................107 12.2.2 Combior el estilo por Jefecto Je los mensojes .............................................................................107 12.2.S Combior el estilo en formo Jinómico...............................................................................................108 12.2.4 Fnvior multiples mensojes Jel mismo tipo en formo simultoneo........................................108 12.2.S Hostror mensojes por su tipo..............................................................................................................109 12.2.6 Cocbeor mensojes poro mostrorlos en lo próximo petición..................................................109 12.S Conuiciones SQL con FoimCiiteiia.....................................................................................................11u 12.S.1 Criterios Je Ronqos..................................................................................................................................112 12.S.2 0nir vorios conJiciones .........................................................................................................................11S 12.4 Infoimacion uel Navegauoi con Biowsei ........................................................................................114 12.4.1 APl Je Browser ..........................................................................................................................................114 12.S Autocompletai con Sciiptaculous........................................................................................................116 13 Componente Va||dator........................................................................................ 118 1S.1 Intiouuccion..................................................................................................................................................118 14 Segur|dad con kumb|a Lnterpr|se........................................................................ 119 14.1 Intiouuccion..................................................................................................................................................119 14.2 Caiacteiisticas ue Seguiiuau..................................................................................................................119 14.S Necanismos ue Seguiiuau.......................................................................................................................12u 14.4 Seguiiuau a nivel ue Capa ue Aplicacion ..........................................................................................12u 14.S Seguiiuau a nivel ue Capa ue Tianspoite.........................................................................................121 14.6 Implementai Seguiiuau Beclaiativa ..................................................................................................122 14.7 Implementai Seguiiuau Piogiamacional .........................................................................................124 14.8 Befinii Realms, 0suaiios y uiupos paia Autenticacion.............................................................124 14.8.1 Reolms...........................................................................................................................................................124 14.8.2 0suorios........................................................................................................................................................12S 14.8.S 6rupos ...........................................................................................................................................................12S 1S Componente ACL (L|sta de Contro| de Acceso) .................................................... 126 1S.1 Intiouuccion..................................................................................................................................................126 1S.2 Estiuctuia uel Componente ...................................................................................................................126 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S 1S.S ¿Que es un Recuiso. ..................................................................................................................................127 1S.4 ¿Que es un Rol. ............................................................................................................................................127 1S.S ¿Que es un Acceso......................................................................................................................................127 1S.6 Tipos ue Reglas ............................................................................................................................................127 1S.7 ACL en Accion...............................................................................................................................................127 1S.8 Beiencia ue Roles .......................................................................................................................................129 1S.9 Auaptauoies ue ACL ..................................................................................................................................129 1S.9.1 AclHoJel .......................................................................................................................................................1S0 1S.9.2 AclHemory...................................................................................................................................................1S0 1S.9.S AclXHl ..........................................................................................................................................................1S0 1S.1u API ue un Auaptauoi...............................................................................................................................1S2 1S.11 API ue AclResouice..................................................................................................................................1SS 1S.12 API ue AclRole ...........................................................................................................................................1SS 16 Componente Auth............................................................................................... 134 16.1 Intiouuccion..................................................................................................................................................1S4 16.2 Auaptauoies ue Auth.................................................................................................................................1S4 16.S Auministiacion ue Iuentiuau.................................................................................................................1SS 16.4 Expiiacion ue Sesion .................................................................................................................................1SS 16.S Contiol ue Autenticacion concuiiente ..............................................................................................1SS 16.6 Autenticacion con Nouelos.....................................................................................................................1S6 16.7 Autenticacion con Keibeiosv................................................................................................................1S7 16.8 Autenticacion con Rauius........................................................................................................................1S8 16.9 Autenticacion con Bigest .........................................................................................................................1S9 16.1u Autenticacion con LBAP........................................................................................................................14u 17 Componente Aud|tLogger ................................................................................... 142 17.1 Intiouuccion..................................................................................................................................................142 17.2 Cieai un componente ue contiol .........................................................................................................14S 18 Componente Secur|ty.......................................................................................... 143 18.1 Intiouuccion..................................................................................................................................................14S 18.2 Subcomponente SecuiityFiiewall........................................................................................................144 18.2.1 lntroJucción...............................................................................................................................................144 18.2.2 Como se evoluon los reqlos ..................................................................................................................144 18.2.S Tipos Je Atributos Je uno Reqlo........................................................................................................14S 19 Þers|stenc|a, 1ransacc|ones y Concurrenc|a......................................................... 146 19.1 Intiouuccion..................................................................................................................................................146 20 Componente Db.................................................................................................. 147 2u.1 Intiouuccion..................................................................................................................................................147 2u.2 Capas ue acceso ...........................................................................................................................................147 2u.S Auaptauoies uel componente Bb.........................................................................................................148 2u.4 ueneiacion ue SQL......................................................................................................................................149 2u.S Conexiones a gestoies ielacionales poi uefecto............................................................................1Su 20.S.1 ConsiJerociones poro 0rocle...............................................................................................................1S1 20.S.2 ConsiJerociones poro Hicrosoft Sµl Server.................................................................................1S4 20.S.S ConsiJerociones poro HySµl..............................................................................................................160 20.S.4 ConsiJerociones poro lBH lnformix.................................................................................................16S 20.S.S ConsiJerociones con Sµlite.................................................................................................................167 2u.6 Pool ue Conexiones ....................................................................................................................................167 20.6.1 Conexiones Je Bojo Nivel ......................................................................................................................168 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 6 20.6.2 Trozor Conexiones ...................................................................................................................................169 2u.7 ueneiai Piofiles ue ejecucion ue SQL................................................................................................169 2u.8 Nanejai Excepciones ue Bb....................................................................................................................17u 20.8.1 Tipos Je Fxcepciones lonzoJos por el componente Bb............................................................170 20.8.2 lnformoción extenJiJo Je excepciones qeneroJos por Bb.....................................................171 2u.9 Tipos ue Resultauo al 0btenei ue Registios ...................................................................................174 2u.1u Leei iegistios.............................................................................................................................................174 2u.11 Nanipulai Registios................................................................................................................................178 2u.12 Auministiai Tiansacciones..................................................................................................................18u 2u.1S Cieai, Ceiiai y obtenei infoimacion ue conexiones.................................................................182 2u.14 Infoimacion ue Eiioies .........................................................................................................................18S 2u.1S 0btenei el valoi ue la columna iuentiuau .....................................................................................18S 2u.16 0btenei infoimacion ue Tablas .........................................................................................................184 2u.17 Cieai y Eliminai Tablas.........................................................................................................................184 2u.18 Fecha uel gestoi ielacional ..................................................................................................................186 2u.19 Bebug, Seguimiento y Tiaza................................................................................................................187 21 Componente Act|ve kecord - CkM...................................................................... 188 21.1 Intiouuccion..................................................................................................................................................188 21.2 Cuanuo usai ActiveRecoiu......................................................................................................................189 21.S Entiuaues........................................................................................................................................................189 21.S.1 Requerimientos Je los Closes Je FntiJoJes...................................................................................189 21.S.2 Atributos Je los FntiJoJes....................................................................................................................190 21.4 Atiibutos y Campos peisistentes.........................................................................................................19u 21.S Llaves Piimaiias..........................................................................................................................................191 21.6 Convenciones en llaves piimaiias.......................................................................................................192 21.7 Fechas Auto-Asignables ...........................................................................................................................192 21.8 Nultipliciuau en Relaciones ue Entiuaues .......................................................................................192 21.8.1 Convenciones en Relociones.................................................................................................................19S 21.8.2 Relociones 0niJireccionoles ................................................................................................................19S 21.8.S Relociones BiJireccionoles...................................................................................................................19S 21.8.4 Hucbos o uno .............................................................................................................................................19S 21.8.S 0no o Hucbos.............................................................................................................................................19S 21.8.6 0no o 0no ....................................................................................................................................................19S 21.8.7 Hucbos o Hucbos .....................................................................................................................................19S 21.9 API ue ActiveRecoiu..................................................................................................................................19S 21.9.1 0riqen Je Botos.........................................................................................................................................19S 21.9.2 volcoJo Je Heto-Botos..........................................................................................................................196 21.9.S Bebuq y Sequimiento..............................................................................................................................196 21.9.4 Tronsocciones ............................................................................................................................................197 21.9.S Consultor reqistros ..................................................................................................................................197 21.9.6 Contor reqistros ........................................................................................................................................200 21.9.7 PromeJior reqistros ................................................................................................................................200 21.9.8 Reolizor sumotorios................................................................................................................................201 21.9.9 0btener el volor móximo Je un otributo........................................................................................201 21.9.10 0btener el volor minimo Je un otributo......................................................................................202 21.9.11 Asiqnor volores o instoncios .............................................................................................................202 21.9.12 voliJoción.................................................................................................................................................202 21.9.1S lnformoción Je otributos ...................................................................................................................202 21.9.14 Creoción y octuolizoción Je reqistros...........................................................................................20S 21.9.1S Fliminoción Je reqistros.....................................................................................................................204 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 7 21.9.16 0perociones en Botcb ..........................................................................................................................204 21.9.17 lecturo,escrituro Je Atributos .......................................................................................................20S 21.9.18 voliJoción.................................................................................................................................................20S 21.9.19 HultipliciJoJ Je relociones ...............................................................................................................20S 21.9.20 Eerencio.....................................................................................................................................................207 21.9.21 Fxcepciones ..............................................................................................................................................207 21.1u Iuentifieis ....................................................................................................................................................2u7 21.10.1 Fstoblecer el 6eneroJor......................................................................................................................208 21.10.2 Alqoritmo Ei,lo.....................................................................................................................................208 21.10.S Alqoritmo 00lB......................................................................................................................................209 21.10.4 6eneroJor 0niqlJ..................................................................................................................................209 21.10.S 6eneroJor Notive...................................................................................................................................210 21.10.6 Columnos lJentiJoJ y Secuencios ..................................................................................................210 21.11 Convenciones en Iuentificauoies ......................................................................................................211 21.12 Los Neta-uatos en ActiveRecoiuNetauata ...................................................................................212 21.12.1 Tipos Je Heto-Botos AlmocenoJos................................................................................................212 21.12.2 Heto-Botos en etopos Je Besorrollo.............................................................................................212 21.12.S APl Je ActiveRecorJHetoBoto.........................................................................................................21S 21.1S Cuisoies y Resulsets ue Consultas ...................................................................................................214 21.1S.1 0tilizor el cursor como tipo IorworJ-0nly ................................................................................21S 21.1S.2 0tilizor el cursor como Scrolloble..................................................................................................21S 21.1S.S APl Je ActiveRecorJResulset ............................................................................................................21S 21.14 Nensajes ue ActiveRecoiu ...................................................................................................................217 21.14.1 APl Je ActiveRecorJHessoqe............................................................................................................217 21.1S Tiansacciones en ActiveRecoiu.........................................................................................................218 21.1S.1 AJministrocion Je Tronsocciones ..................................................................................................219 21.1S.2 Sincronizoción Je Recursos con Tronsocciones .......................................................................221 21.1S.S ConsiJerociones Je Sincronizoción................................................................................................222 21.1S.4 APl Je TronsoctionBefinition...........................................................................................................22S 21.1S.S APl Je ActiveRecorJTronsoction....................................................................................................22S 21.1S.6 Timeouts en Tronsocciones...............................................................................................................226 21.16 valiuauoies ue Integiiuau ue Batos.................................................................................................227 21.16.1 voliJoJores poro otributos No-Nulos...........................................................................................229 21.16.2 Trotor el resultoJo Je un proceso Je voliJoción.....................................................................229 21.16.S voliJoJores Je 0suorio.......................................................................................................................2S0 21.16.4 Fventos en lo voliJoción.....................................................................................................................2S2 21.16.S lmplementor un evento Je voliJoción..........................................................................................2SS 21.16.6 Betener,Concelor uno operoción...................................................................................................2S6 21.16.7 Fstoblecer un evento con un nombre no estónJor..................................................................2S6 21.16.8 Fvento cuonJo el proceso Je voliJoción Jetiene lo operoción..........................................2S7 21.16.9 Besbobilitor eventos Je voliJoción................................................................................................2S8 21.17 Llaves Foiáneas viituales.....................................................................................................................2S8 21.17.1 Creor uno llove foróneo virtuol .......................................................................................................2S9 21.17.2 0pciones Je los lloves foróneos .......................................................................................................240 21.18 Entiuaues Tempoiales ...........................................................................................................................241 21.18.1 Creor un TempororyActiveRecorJ .................................................................................................242 21.18.2 Comportomiento Je un TempororyActiveRecorJ....................................................................242 21.18.S Tronsocciones con FntiJoJes Temporoles .................................................................................24S 21.18.4 0sor un TempororyActiveRecorJ...................................................................................................24S 21.19 ActiveRecoiu}oin......................................................................................................................................24S 21.19.1 Aqrupomientos con ActiveRecorJ}oin..........................................................................................248 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 8 21.19.2 Porómetros Je ActiveRecorJ}oin....................................................................................................248 21.2u ActiveRecoiu0nion .................................................................................................................................249 21.21 SessionRecoiu ...........................................................................................................................................249 21.22 PiopeityAccessois y Nutatois...........................................................................................................2Su 21.2S Bynamic0puate y BynamicInseit .....................................................................................................2Su 21.24 Nanejo ue Excepciones..........................................................................................................................2S1 21.24.1 Copturor excepciones Jentro Je moJelos ...................................................................................2S2 21.24.2 lnformoción Je Fxcepciones .............................................................................................................2S2 21.2S Plugins ue Nouelos..................................................................................................................................2SS 21.2S.1 Creor un Pluqin Je ActiveRecorJ....................................................................................................2SS 21.26 0iganizacion ue Nouelos......................................................................................................................2SS 21.27 Auto-inicializacion ue Nouelos..........................................................................................................2S4 21.27.1 Activor iniciolizoción Jinómico.......................................................................................................2SS 22 Componente Lnt|tyManager ............................................................................... 2S6 22.1 Intiouuccion..................................................................................................................................................2S6 22.2 0btenei una nueva instancia ue un Nouelo....................................................................................2S6 22.S API uel Componente EntityNanagei ..................................................................................................2S7 22.S.1 HétoJos poro iniciolizor moJelos y obtener instoncios Je ellos .........................................2S7 22.S.2 HétoJos poro oJministror relociones Je multipliciJoJ..........................................................2S8 22.S.S HétoJos oJminitror poro FntiJoJes Temporoles......................................................................2S9 22.S.4 0riqenes Je Jotos .....................................................................................................................................260 22.S.S AJministror qeneroJores Je entiJoJes ..........................................................................................260 22.S.6 lloves foróneos virtuoles.....................................................................................................................260 23 Componente 1ransact|onManager ...................................................................... 262 2S.1 Intiouuccion..................................................................................................................................................262 2S.2 Contexto ue Scope Peisistente..............................................................................................................262 2S.S Event Listeneis ............................................................................................................................................262 2S.4 Estauos ue las entiuaues..........................................................................................................................26S 2S.S Asignai el objeto al estauo auministiauo.........................................................................................26S 2S.6 API ue TiansactionNanagei...................................................................................................................264 24 Þresentac|ón....................................................................................................... 26S 24.1 Intiouuccion..................................................................................................................................................26S 2S Componente V|ew .............................................................................................. 266 2S.1 Intiouuccion..................................................................................................................................................266 2S.2 }eiaiquia ue vistas en la piesentacion...............................................................................................266 2S.2.1 visto Principol ...........................................................................................................................................267 2S.2.2 Requerimientos Je lo visto Principol ..............................................................................................268 2S.2.S Requerimientos vistos o nivel Je ControloJor ............................................................................268 2S.2.4 Requerimientos Je loyouts Je ControloJores.............................................................................269 2S.2.S Requerimientos Je vistos Porcioles en ControloJores.............................................................269 2S.2.6 Requerimientos Je vistos Porcioles 6eneroles............................................................................269 2S.2.7 Requerimientos Je Plontillos ó Templotes....................................................................................270 2S.S Inseicion automática y manual ue vistas .........................................................................................27u 2S.4 Implementai los tipos ue vistas............................................................................................................271 2S.S Tiansfeiii valoies uel contiolauoi a la vista ..................................................................................274 2S.S.1 Tronsferir meJionte otributos publicos .........................................................................................274 2S.S.2 Tronsferir meJionte setPoromToview...........................................................................................27S 2S.6 Contiolai Niveles ue Renueiizacion...................................................................................................276 2S.7 0tilizai mouelos en la piesentacion...................................................................................................277 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 9 2S.8 Plugins ue view............................................................................................................................................277 2S.8.1 Creor un Pluqin Je view........................................................................................................................277 2S.9 API uel Componente view.......................................................................................................................278 2S.9.1 }erorquio Je renJerizoción..................................................................................................................278 2S.9.2 AJministror presentoción.....................................................................................................................278 2S.9.S visuolizor vistos proqromocionolmente........................................................................................279 2S.1u Cieai un componente ue Piesentacion peisonalizauo............................................................28u 2S.11 Cieai un componente ue piesentacion ue Excepciones no captuiauas...........................281 2S.12 Integiai otios Engines ue piesentacion.........................................................................................282 2S.12.1 Comportomiento Je lo inteqroción................................................................................................282 2S.12.2 Componentes SoportoJos...................................................................................................................28S 26 Componente 1ag................................................................................................. 28S 26.1 Intiouuccion..................................................................................................................................................28S 26.2 Establecei el valoi ue helpeis cieauos con Tag.............................................................................28S 26.S Compoitamiento ue helpeis ..................................................................................................................286 26.4 API uel Componente Tag .........................................................................................................................286 26.4.1 Creor enloces..............................................................................................................................................286 26.4.2 Componentes Je interfoz Je usuorio ...............................................................................................289 26.4.S Componentes Je listos,combos..........................................................................................................290 26.4.4 Trotomiento Je etiquetos HFTA .......................................................................................................296 26.4.S Trotomiento e lnclusión Je orcbivos CSS.......................................................................................296 26.4.6 Componentes poro fecbos.....................................................................................................................297 26.4.7 lncluir recursos }ovoscript ...................................................................................................................298 26.4.8 lnterocción con lo presentoción ........................................................................................................299 27 ne|pers IavaScr|pt............................................................................................... 301 27.1 Intiouuccion..................................................................................................................................................Su1 27.2 Clase Foimat .................................................................................................................................................Su1 27.2.1 lnstoncionJo lo close ..............................................................................................................................S01 27.2.2 Iunciones Je Iormot ..............................................................................................................................S0S 27.S Clase valiuatoi .............................................................................................................................................Su4 27.S.1 lnstoncionJo lo close ..............................................................................................................................S04 28 Componente ÞDIDocument................................................................................ 306 28.1 Intiouuccion..................................................................................................................................................Su6 28.2 Cieai un uocumento PBF ........................................................................................................................Su6 28.S Agiegai una tabla al uocumento..........................................................................................................Su6 28.4 Tipos ue Papel Sopoitauos .....................................................................................................................Su8 28.S API ue PufBocument..................................................................................................................................Su8 29 Componente keport ........................................................................................... 31S 29.1 Intiouuccion..................................................................................................................................................S1S 29.2 Alcance uel componente..........................................................................................................................S1S 29.S Auaptauoies ue Repoit ............................................................................................................................S1S 29.4 Paginacion en iepoites.............................................................................................................................S17 29.S Ejemplo ue un listauo usanuo Repoit................................................................................................S17 29.6 Nouo vista Pievia.......................................................................................................................................S18 29.7 API ue Repoit................................................................................................................................................S19 30 Componente Ieed............................................................................................... 320 Su.1 Intiouuccion..................................................................................................................................................S2u Su.2 Leei¡Impoitai uocumentos RSS..........................................................................................................S2u LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1u Su.S Cieai uocumentos RSS .............................................................................................................................S2u Su.4 API ue Feeu....................................................................................................................................................S21 31 Componente Core............................................................................................... 322 S1.1 Intiouuccion..................................................................................................................................................S22 S1.2 }eiaiquia ue Clases.....................................................................................................................................S22 S1.2.1 Close 0bject.................................................................................................................................................S22 S1.2.2 CoreConfiq...................................................................................................................................................S22 S1.2.S Corelocole...................................................................................................................................................S22 S1.2.4 CoreClossPotb............................................................................................................................................S22 S1.S Seivicios uel Componente Coie............................................................................................................S22 S1.S.1 0btener el lnstonce Nome ....................................................................................................................S22 S1.S.2 Zono Eororio Je los Aplicociones......................................................................................................S22 S1.S.S Combior el Cborset Je lo oplicoción.................................................................................................S2S S1.S.4 Combior lo locolizoción por Jefecto ................................................................................................S24 S1.S.S 0btener lo versión Jel Iromework...................................................................................................S24 S1.4 Subcomponente CoieConfig...................................................................................................................S24 S1.4.1 APl Jel subcomponente CoreConfiq .................................................................................................S2S S1.S Subcomponente CoieClassPath............................................................................................................S2S S1.S.1 Reemplozor un componente Jel Iromework...............................................................................S26 S1.S.2 APl Je CoreClossPotb..............................................................................................................................S26 S1.6 Subcomponente CoieType......................................................................................................................S26 S1.6.1 APl Je CoreType........................................................................................................................................S27 S1.7 Cieai Plugins ue Aplicacion....................................................................................................................S27 S1.7.1 Creor un Pluqin Je Aplicoción ............................................................................................................S27 32 Componente Þ|ug|nManager .............................................................................. 329 S2.1 Intiouuccion..................................................................................................................................................S29 S2.2 Aiquitectuia ue Plug-Ins .........................................................................................................................S29 S2.S API ue PluginNanagei ..............................................................................................................................S29 33 Internac|ona||zac|ón y Loca||zac|ón...................................................................... 332 SS.1 Intiouuccion..................................................................................................................................................SS2 34 Componente Loca|e ............................................................................................ 333 S4.1 Intiouuccion..................................................................................................................................................SSS S4.2 Befinii la localizacion en una sesion ue 0suaiio...........................................................................SSS S4.2.1 0btener lo locolizoción oJecuoJo.....................................................................................................SSS S4.S Establecei la localizacion poi uefecto................................................................................................SS4 S4.4 0btenei tiauucciones localizauas........................................................................................................SS4 S4.S API uel Componente Locale....................................................................................................................SSS S4.6 Subcomponente LocaleNath..................................................................................................................SSS 3S Componente 1ras|ate.......................................................................................... 336 SS.1 Intiouuccion..................................................................................................................................................SS6 SS.2 Auaptauoies sopoitauos poi Tiaslate...............................................................................................SS6 SS.S Como funciona la tiauuccion.................................................................................................................SS6 SS.4 0tilizai tiauucciones .................................................................................................................................SS7 SS.4.1 ConsiJerociones poro el oJoptoJor Arroy....................................................................................SS8 SS.4.2 ConsiJerociones poro el oJoptoJor Csv .........................................................................................SS8 SS.4.S ConsiJerociones poro el oJoptoJor lni...........................................................................................SS8 SS.4.4 ConsiJerociones poro el oJoptoJor Botobose ............................................................................SS8 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 11 36 Componente Date............................................................................................... 339 S6.1 Intiouuccion..................................................................................................................................................SS9 S6.2 Poique uebe usai este componente ...................................................................................................SS9 S6.S Timestamps ilimitauos.............................................................................................................................SS9 S6.4 Establecei el Timezone ............................................................................................................................S4u S6.S 0btenei paites o fiagmentos ue fechas ............................................................................................S4u S6.6 Posicion en el Tiempo...............................................................................................................................S41 S6.7 Infoimacion ue Fechas .............................................................................................................................S42 S6.8 Cambiai fiagmentos ue la fecha...........................................................................................................S4S S6.9 0peiaciones con fechas............................................................................................................................S44 S6.1u Localizacion ue Fechas...........................................................................................................................S4S S6.11 Establecei el foimato ue la fecha ......................................................................................................S46 S6.12 0btenei la fecha y hoia munuial .......................................................................................................S48 37 Componente Currency ........................................................................................ 349 S7.1 Intiouuccion..................................................................................................................................................S49 S7.2 Cantiuaues usanuo el foimato auecuauo..........................................................................................S49 S7.S Simbolo y nombie ue la moneua utilizaua.......................................................................................S49 S7.4 veisiones esciitas ue cantiuaues.........................................................................................................SSu S7.S API uel Componente Cuiiency..............................................................................................................SS1 38 Componente App||cat|onMon|tor ....................................................................... 3S2 S8.1 Intiouuccion..................................................................................................................................................SS2 S8.2 Infiaestiuctuia ue Eventos comunes.................................................................................................SS2 S8.S Componentes ue la Infiaestiuctuia ue Eventos ............................................................................SSS S8.S.1 CommonBoseFvent..................................................................................................................................SSS S8.S.2 Fmmiter........................................................................................................................................................SSS S8.S.S Fvent Service ..............................................................................................................................................SSS S8.4 ¿Poique usai monitoiizacion. ..............................................................................................................SSS S8.4.1 Beterminoción Je problemos..............................................................................................................SSS S8.4.2 Sintonizoción Jel RenJimiento...........................................................................................................SSS S8.4.S ConfiobilJoJ Je lo 0peroción..............................................................................................................SS4 S8.S ¿Qué se pueue monitoieai.....................................................................................................................SS4 39 Componente CommonLvent ............................................................................... 3SS S9.1 Intiouuccion..................................................................................................................................................SSS 40 Componentes de Þropós|to Genera|.................................................................... 3S6 4u.1 Intiouuccion..................................................................................................................................................SS6 41 Componente Conf|g ............................................................................................ 3S7 41.1 Intiouuccion..................................................................................................................................................SS7 42 Componente Lxtens|ons ..................................................................................... 3S8 42.1 Intiouuccion..................................................................................................................................................SS8 42.2 Caigai una extension uinámicamente...............................................................................................SS8 42.S Caigai una extension estáticamente..................................................................................................SS8 42.S.1 Corqor componentes Je ZenJ Iromework....................................................................................SS9 42.4 0btenei infoimacion ue extensiones caigauas..............................................................................SS9 42.S Inyeccion ue componentes .....................................................................................................................SS9 43 Componente Logger............................................................................................ 360 4S.1 Intiouuccion..................................................................................................................................................S6u 4S.2 Auaptauoies ue Loggei ............................................................................................................................S6u LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 12 4S.S Tipos ue Eventos en Logs........................................................................................................................S6S 4S.4 Loggei Facilities ..........................................................................................................................................S64 4S.S Tiansacciones con Logs ...........................................................................................................................S6S 4S.6 API ue FileLoggei........................................................................................................................................S66 4S.7 0so ue NailLoggei......................................................................................................................................S67 4S.8 0so ue BatabaseLoggei............................................................................................................................S68 4S.9 0so ue CompiesseuLoggei .....................................................................................................................S68 4S.1u 0so ue SANLoggei...................................................................................................................................S69 4S.11 0so ue StieamLoggei..............................................................................................................................S7u 4S.12 0so ue SocketLoggei...............................................................................................................................S71 44 Componente Ut||s ............................................................................................... 372 44.1 Intiouuccion..................................................................................................................................................S72 44.2 API ue 0tils ....................................................................................................................................................S72 4S kend|m|ento y Cpt|m|zac|ón............................................................................... 374 4S.1 Intiouuccion..................................................................................................................................................S74 4S.2 Consiueiaciones ue Renuimiento........................................................................................................S74 4S.2.1 0tilizoción Je porómetros por nombre ..........................................................................................S74 4S.2.2 lnstolor un Cocbe Je 0pCoJe ..............................................................................................................S74 4S.2.S Sintonizoción Jel ServiJor Web.........................................................................................................S7S 4S.2.4 Sintonizoción Je PEP..............................................................................................................................S76 46 Componente Cache............................................................................................. 377 46.1 Intiouuccion..................................................................................................................................................S77 47 Componente Comp||er ........................................................................................ 378 47.1 Intiouuccion..................................................................................................................................................S78 47.2 Teoiia ue optimizacion avanzaua........................................................................................................S79 47.2.1 0ptimizoción Je ciclos............................................................................................................................S79 47.2.2 0ptimizoción por evoluoción Je terminos estóticos.................................................................S79 47.S Compoitamiento ue Compilei...............................................................................................................S79 47.S.1 0ptimizociones bósicos Je lo compiloción....................................................................................S79 47.S.2 0ptimizociones ovonzoJos Je lo compiloción.............................................................................S80 47.4 ueneiai una Compilacion........................................................................................................................S81 47.S Limitaciones ue Compilei........................................................................................................................S81 48 Componente GarbageCo||ector ........................................................................... 382 48.1 Intiouuccion..................................................................................................................................................S82 48.2 ¿Poique usai este componente............................................................................................................S82 48.S Como funciona el uaibageCollectoi....................................................................................................S82 48.S.1 Iose Je Compresión.................................................................................................................................S82 48.S.2 Iose Je Fliminoción.................................................................................................................................S82 48.4 Activai el uaibageCollectoi....................................................................................................................S8S 48.4.1 Activoción Je monero proqromocionol..........................................................................................S8S 48.4.2 Activoción Je monero Jeclorotivo....................................................................................................S8S 48.S Paiámetios uel Collectoi.........................................................................................................................S8S 49 Componente Sess|on........................................................................................... 38S 49.1 Intiouuccion..................................................................................................................................................S8S 49.2 Auaptauoies ue Sesion.............................................................................................................................S86 49.2.1 AJoptoJor Je Sesión Hemcocbe........................................................................................................S87 49.2.2 AJoptoJor Je Sesión Botobose...........................................................................................................S87 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S 49.2.S AJoptoJor Je sesión Iiles .....................................................................................................................S87 49.2.4 AJoptoJor Je sesión louJer Cocbe ..................................................................................................S88 49.S Compoitamiento ue Sesiones................................................................................................................S88 49.4 Consiueiaciones ue Seguiiuau..............................................................................................................S88 49.S vaiiables ue sesion.....................................................................................................................................S89 49.S.1 APl Jel Componente Session................................................................................................................S89 49.6 SessionNamespace.....................................................................................................................................S9u 49.6.1 APl Je SessionNomeSpoce....................................................................................................................S91 S0 nerram|entas de| Desarro||ador .......................................................................... 393 Su.1 Intiouuccion..................................................................................................................................................S9S S1 Lrrores y Lxcepc|ones.......................................................................................... 393 S1.1 Intiouuccion..................................................................................................................................................S9S S1.2 Nouo S0PER_STRICT................................................................................................................................S94 S1.S Captuiai excepciones ue giaveuau leve ...........................................................................................S94 S2 Componente Debug ............................................................................................ 396 S2.1 Intiouuccion..................................................................................................................................................S96 S2.2 Seguimiento al estauo ue vaiiables.....................................................................................................S96 S2.S visualizai la tiaza uel seguimiento ue un valoi.............................................................................S97 S2.4 Betenei un pioceso meuiante Aseiciones .......................................................................................S98 S2.S Establecei una accion a ejecutai al finalizai el pioceso ue uebug ........................................S99 S3 1est de Un|dad.................................................................................................... 400 SS.1 Intiouuccion..................................................................................................................................................4uu SS.2 Tests paia Componentes .........................................................................................................................4uu S4 Componente Scr|pt ............................................................................................. 401 S4.1 Intiouuccion..................................................................................................................................................4u1 SS Apend|ces ........................................................................................................... 402 SS.1 Estánuaies ue Couificacion.....................................................................................................................4u2 SS.1.1 0bjetivos.......................................................................................................................................................402 SS.1.2 Iormoto Je Arcbivos PEP.....................................................................................................................402 SS.1.S Closes .............................................................................................................................................................402 SS.1.4 lnterfoces .....................................................................................................................................................402 SS.1.S HétoJos.........................................................................................................................................................402 SS.1.6 voriobles ......................................................................................................................................................40S SS.1.7 Constontes ...................................................................................................................................................40S SS.1.8 Boleonos y volores nulos .......................................................................................................................40S SS.1.9 literoles Je CoJenos Je Corocteres..................................................................................................40S SS.1.10 Substituciones Je voriobles ...............................................................................................................40S SS.2 Licencia ue este Bocumento...................................................................................................................4uS SS.2.1 Creotive Commons Attribution S.0...................................................................................................40S LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 14 1 Prefacio El piesente uocumento es uocumento touo-en-uno ue guia ue iefeiencia, API y tutoiial paia el uesaiiollo ue aplicaciones usanuo Kumbio Fnterprise Iromework. El piefacio contiene infoimacion sobie las convenciones utilizauas paia uesaiiollai este texto. 1.1 Antes de Leer este Documento Antes ue leei este texto usteu uebe tenei un buen conocimiento ue lenguaje PBP, piogiamacion oiientaua a objetos, tecnologias paia uesaiiollo Web como BTNL, CSS, }avaSciipt y otias como XNL, A}AX, SQL, asi como conocimientos en bases ue uatos y sistemas opeiativos. 1.2 Como esta organizado este Documento Kumbio Fnterprise es un fiamewoik iobusto paia el uesaiiollo ue aplicaciones empiesaiiales usanuo tecnologia abieita paia ambientes con altos iequeiimientos ue estabiliuau, ienuimiento y escalabiliuau. Toua su iobustez esta plasmaua en este extenso uocumento y espeia ofiecei toua la infoimacion posible paia el entenuimiento y apiovechamiento ue esta platafoima. El uocumento ofiece una iefeiencia ue caua componente, junto con ejemplos y la API ue caua uno. Se busca que ielacione la aiquitectuia ue los componentes y como se integian unos con otios en foima ue seivicios. La piimeia paite explica paia que y uonue pueue utilizai Kumbio Fnteprise Iromework caiacteiisticas, su instalacion y la aiquitectuia ue las aplicaciones como intiouuccion al contexto ue uesaiiollo e implementacion. El capitulo ue Tutoiial iealiza la cieacion ue una aplicacion completa paso a paso como caso ue estuuio, integianuo los uifeientes componentes y aplicanuo la mayoi paite uel Fiamewoik como base ilustiativa uel mismo. La segunua paite uetalla la capa ue logica ue uominio explicanuo touo lo ielacionauo con la oiquestacion ue contiolauoies y seivicios Web. La teiceia paite explica caua componente y caiacteiisticas ue seguiiuau en el fiamewoik. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S La cuaita paite habla ue la logica ue uatos y uetalla téiminos ue peisistencia, concuiiencia y tiansacciones. La quinta paite explica las caiacteiisticas y componentes ue inteinacionalizacion y localizacion que peimiten auaptai aplicaciones a conuiciones especificas geogiáficas, politicas, cultuiales o iegionales. La sexta paite piesenta los componentes ue la capa ue piesentacion y las heiiamientas ue inteiaccion con el usuaiio final hacia la aplicacion. La séptima paite explica componentes ue monitoiizacion y componentes ue pioposito geneial paia el uesaiiollo ue aplicaciones Web. La octava paite explica los componentes que ayuuan a mejoiai el ienuimiento y optimizacion ue aplicaciones. La novena paite uetalla el componente ue auministiacion, contexto y peisistencia ue sesiones ue usuaiio. La uécima paite son las heiiamientas uel uesaiiollauoi como test ue uniuau, uebug ue piocesos y uatos, geneiacion ue couigo etc. 1.3 Convenciones Tipográficas La siguiente tabla uesciibe las conuiciones tipogiáficas usauas en este texto: !"#$%# '()$(*(+,-. /0#123. AoBbCJBeIf Bace iefeiencia a extianjeiismos uel lenguaje castellano que hacen iefeiencia a componentes, piouuctos, maicas, nombies ue métouos o mouulos. El seiviuoi ue uiiectoiios lBAP AaBbCdDeFf Bace iefeiencia a couigo fuente o sentencias SQL. <?php $filter = new Filter(); AaBbCdDeFf Bace iefeiencia a Pseuuocouigo paia valor := LLamarFuncion(); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 16 iepiesentai fiagmentos ue couigo o pioceuimientos en lenguaje humano. 1.4 A Quien está Orientado este Texto Este uocumento está oiientauo a peisonas que ueseen apienuei en foima piofunua las capaciuaues ue Kumbio Fnterprise Iromework paia el uesaiiollo ue aplicaciones, sopoite a softwaie existente y¡o extenuei el mismo. 1.5 Información sobre marcas y productos referenciados Las siguientes son maicas ue piouuctos iefeienciauos que peitenecen a otias compañias y son mencionauas en este uocumento: Fxcel !, Winuows, SQL Seivei y Woiu son maicas iegistiauas ue Hicrosoft Corporotion en estauos uniuos y otios paises. 0rocle ! es una maica iegistiaua ue 0rocle Corporotion en estauos uniuos y otios paises. lnformix ! es una maica iegistiaua ue IBN en estauos uniuos y otios paises. BB2 ! es una maica iegistiaua ue IBN en estauos uniuos y otios paises. AJobe Acrobot ! es una maica iegistiaua ue AJobe Corporotion en estauos uniuos y otios paises. Winuows !es una maica iegistiaua ue Niciosoft Coipoiation en estauos uniuos y otios paises. Nac 0S X !es una maica iegistiaua ue Apple en estauos uniuos y otios paises. 1.6 Referencias a sitios web de terceros Algunas 0RLs son iefeienciauas en este uocumento y piopoicionan infoimacion asociaua a estas. 4.%,5 LouueiTechnology no se hace iesponsable poi la uisponibiliuau ue sitios web ue teiceios mencionauos en este uocumento. LouueiTechnology no se hace iesponsable poi el conteniuo, publiciuau, piouuctos o otios mateiiales que estén uisponibles en estos sitios. LouueiTechnology no se hace iesponsable poi uaños o peiuiuas causauas bajo o sin conexion con el conteniuo en esos sitios y iecuisos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 17 1.7 Sus comentarios están bienvenidos En LouueiTechnology estamos inteiesauos en el mejoiamiento la uocumentacion ue nuestios y sus piouuctos y pioyectos, poi esto sus comentaiios están siempie bienveniuos. La iefeiencia ue este uocumento es KEF-11u8. Esciiba a suppoitÇlouueitechnology.com LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 18 Capitulo Intiouuccion 2 Introducción Kumbio Fnterprise es un fiamewoik PBP cuyo piincipal objetivo es la piacticiuau y faciliuau ue uso, sin uejai ue uaile impoitancia al ienuimiento, iobustez, piofesionalismo y caliuau ue una aplicacion oiientaua a la Web. Esta implementauo usanuo la veision S.2 ue PBP y está completamente oiientauo a 0bjetos. Los componentes están integiauos y optimizauos lo cual aumenta el ienuimiento inteino uel fiamewoik y ue las aplicaciones uesaiiollauas con él. El fiamewoik auicionalmente peimite usai componentes inuepenuientes y libieiias ue teiceios e integiailas a las aplicaciones uesaiiollauas. Kumbio Fnterprise Iromework es una veision mouificaua uel Kumbio Iromework Comunitaiio veision u.S, el cuál ha siuo estabilizauo y iefactoiizauo paia aumentai su iobustez y velociuau. La veision comunitaiia es punto funuamental ue innovacion y uesaiiollo paia la constante integiacion a la veision cieaua poi louJerTecbnoloqy. El objetivo ue este fiamewoik es foitalecei el uesaiiollo ue aplicaciones ue negocios oiientauas a una piesentacion Web que funcionen tanto en Intianets como en Inteinet. La cieacion ue sitios Web usanuo Kumbio Fnterprise es posible, aunque pueua encontiai otias heiiamientas más inuicauas y ligeias paia esta taiea. El piesente uocumento explica en foima uetallaua caua componente uel fiamewoik. 2.1 Diferencias con la versión Comunitaria La veision mouificaua que uesaiiollamos en louJer Tecbnoloqy ha pasauo poi un iiguioso pioceso ue estabilizacion y caliuau que exigen entoinos ue piouuccion paia aplicaciones ue alta uisponibiliuau. Beneficios clave al usai Kumbio Fnterprise: • Reuuccion ue costos opeiacionales cuanuo se implementan gianues sistemas • Capaciuau ue escalamiento mejoiaua (clusteiizacion, cache uistiibuiuo) • La posibiliuau ue obtenei sopoite en uifeientes niveles que mitigue el iiesgo y ayuue a eliminai el lock-in ue pioveeuoies ue heiiamientas ue uesaiiollo ue softwaie. • Integiai las aplicaciones con couigo PBPS existente incluyenuo otios fiamewoiks LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 19 como Zenu Fiamewoik. • Faciliuaues en la integiacion iequeiiua paia implementai aiquitectuias oiientauas a seivicios (S0A). 0tias mejoias esta veision: • Sopoite paia múltiples aplicaciones ceitificauo • Estiuctuia ue aichivos optimizaua paia múltiples aplicaciones • Sopoite paia Tiansacciones ue Alto y Bajo nivel • Auaptauoies ue conexion a gestoies ielacionales ceitificauos • Requeiimientos ue haiuwaie ieuuciuos en un 4u% • Auaptauoies ue Nanejauoies ue Sesion escalables • Politicas ue Seguiiuau con auaptauoies paia gestoies ielacionales, lBAP, KerberosS y otios 2.2 Licencia Los mouelo ue negocios open-souice está uiseñauo paia peimiile tanto a usteu como a sus socios expanuiise uesue pequeñas instalaciones hasta las más gianues sin geneiaile sobiecostos auicionales. Kumbio Fnterprise Iromework es un pioyecto ue softwaie abieito con una licencia apta paia negocios apiovaua poi la 0SI (http:///www.opensource.org) llamaua New BSB y que se entiega con la uistiibucion uel fiamewoik. Sopoite comeicial paia uesaiiollo, piouuccion y entienamiento están uisponibles atiavéz ue louJerTecbnoloqy. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2u 3 Instalación 3.1 Introducción Kumbio Fnterprise Iromework iequieie ue PBP veision S.2.u o supeiioi paia un funcionamiento optimo. El fiamewoik iequieie uel Apocbe Web Server piefeiiblemente en su veision 2.u o 2.2 y uel mouulo mou_iewiite instalauo paia su coiiecto funcionamiento. Kumbio Fnterprise Iromework sopoita auicionalmente Hicrosoft lnternet lnformotion Services {llS) uesue la veision 6.u utilizanuo el mouulo uel seiviuoi ISAPI_Rewiite. Al uescaigai el paquete ue Kumbio Fnterprise Iromework este uebe sei uescompiimiuo y ubicauo en la iaiz ue uocumentos uel seiviuoi Web o en un subuiiectoiio ue este, este pueue vaiiai ue acueiuo a la platafoima o uistiibucion utilizaua. 3.2 Configuración con Apache Web Server 2.x Kumbio Fnterprise Iromework implementa sopoite paia Smait 0RLs lo cual las hace más familiaies y humanas paia los usuaiios finales. Paia esto es necesaiio instalai el mouulo ue Apache llamauo mou_iewiite que iealiza la ieesciituia ue las 0RLs a una convencion inteina en el fiamewoik, esto es vital paia la coiiecta implementacion uel pation aiquitectacional Nouel-view-Contiollei. Apache piopoiciona el comanuo o2enmoJ en la mayoiia ue uistiibuciones Linux, meuiante este comanuo se pueue habilitai fácilmente el mouulo, uespués solo es necesaiio ieiniciai el seiviuoi Web. Con el usuaiio auministiauoi ioot utilizamos el comanuo asi: # a2enmod rewrite # /etc/init.d/apache2 restart En algunos sistemas como ReuBat¡Feuoia el comanuo paia ieiniciai el seiviuoi es: # service httpd restart Paia Niciosoft Winuows es necesaiio habilitai el mouulo uiiectamente en el aichivo ue configuiacion ue Apache. Paia esto se quita el comentaiio uejanuo que el mouulo ue Apache Web Seivei sea caigauo: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 21 LoadModule rewrite_module modules/mod_rewrite.so Las ieglas ue ieesciituia uel fiamewoik ueben sei leiuas poi Apache y ejecutauas en caua peticion a la aplicacion. Paia esto es necesaiio habilitai la lectuia ue los aichivos .btoccess o agiegai las ieglas al aichivo ue configuiacion ue Apache. La ubicacion uel aichivo httpu.conf o uefault-seivei.conf pueue vaiiai ue acueiuo a la uistiibucion Linux o el sistema opeiativo. 6(7%8(9"+(:$ ;9(+,+(:$ 6(8#+%.8(. <,=> ?#9 ReuBat Enteipiise 4¡S ¡etc¡httpu¡conf¡httpu.conf ¡vai¡www¡html 0penSuSE 1u.1¡1u.2¡1u.S¡11 ¡etc¡apache2¡uefault- seivei.conf ¡siv¡www¡htuocs¡ 0buntu¡Bebian ¡etc¡apache2¡sites- available¡uefault ¡vai¡www Nac0S X (Leopaiu 1u.S) usanuo NANP ¡Applications¡NANP¡conf¡ apache¡httpu.conf ¡Applications¡NANP¡htuocs¡ Winuows XP¡2uuS usanuo XANPP c:\Aichivos ue Piogiama\xampp\apache\c onf\httpu.conf c:\Aichivos ue Piogiama\xampp\apache\htuocs\ Las ieglas ue ieesciituia ue mou_iewiite pueuen ii en los aichivos .htaccess incluiuos en el fiamewoik o en los aichivos ue configuiacion ue Apocbe Web Server. Las siguientes ieglas ueben peitenecei al aichivo .htaccess o al uiiectoiio iaiz uonue esta el fiamewoik: <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule> Las segunuas ieglas ue configuiacion ueben ii en el aichivo .htaccess ubicauo en el uiiectoiio public¡ asi: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 22 Cuanuo utilizamos aichivos .btoccess es necesaiio habilitai las opciones Allow0verriJe All y 0ptions All paia el uiiectoiio iaiz uel Web Seivei en el aichivo ue configuiacion ue Apache. Cuanuo agiegamos la configuiacion uiiectamente a los aichivos ue Apache Web Seivei uebemos usai la uiiectiva Biiectoiy asi: <Directory "/srv/www/htdocs/application"> <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] /IfModule> </Directory> <Directory "/srv/www/htdocs/application/public"> <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule> </Directory> Si no iequeiimos ue la utilizacion ue aichivos .htaccess es iecomenuable uesabilitailos meuiante Allow0verriJe None, ue esta foima evitamos que el seiviuoi Web busque este aichivo en caua uiiectoiio en caua peticion Web aumentanuo consiueiablemente el ienuimiento ue las aplicaciones. También es impoitante ievisai que el aichivo inuex.php sea el piimeio en la uiiectiva BiiectoiyInuex, asi Apache Web Seivei le uaiá más piioiiuau antes ue otias extensiones: DirectoryIndex index.php index.html Bespués ue iealizai la configuiacion es necesaiio ieiniciai el seiviuoi Web. 3.3 Configuración con Microsoft ISS e ISAPI Rewrite Paia esto uebemos agiegai al aichivo httpu.ini uel uiiectoiio iaiz uel paquete Kumbia lo siguiente: [ISAPI_Rewrite] RewriteCond URL (?!/javascript/|/img/|/files/|/css/|/temp/).* RewriteRule (.*?\.php)(\?[^/]*)?/([^/]*)/(.*) $1(?2$2&:\?url=/$3/$4) RewriteCond URL (?!/javascript/|/img/|/files/|/css/|/temp/).* RewriteRule ^/(.*) /public/index.php?url=/$1 [L] RewriteCond URL (?!/javascript/|/img/|/files/|/css/|/temp/).* RewriteRule /(.*) /public/$1 /$3,+#7 <#3,+(.$,-.7 • Configuración de Apache en RedHat Enterprise • PHP sobre Microsoft IIS • PHP sobre Apache 2.x sobre Windows LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S • PHP sobre Apache 2.x sobre Unix/Linux • Instalando ISAPI Rewrite en Microsoft IIS 3.4 Configuración de PHP La siguiente configuiacion es opcional paia Aplicaciones Web con Kumbia. A continuacion se listan los paiámetios ue configuiacion uel php.ini: 4.198# 6#7+8(2+(:$ shoit_open_tag Peimite usai las etiquetas especiales ue php <.= y <. No se iecomienua si va a ieuistiibuii sus aplicaciones en seiviuoies ue teiceios. No es un estánuai piofesional ue PBP el uso ue estas etiquetas. uisplay_eiiois Peimite que al geneiaise un eiioi se muestien las iutas y aichivos uonue se geneian eiioies PBP, es útil en entoinos uevelopment peio no en mouo piouuction. memoiy_limit En entoinos ue piouuccion 64N es un númeio auecuauo paia este paiámetio poi sciipt. Bebe sei ajustaua ue acueiuo a las ciicustancias. eiioi_iepoiting Kumbia Enteipiise Fiamewoik esta uesaiiollauo bajo nivel ue iepoite E_ALL | E_N0TICE | E_STRICT lo que aseguia la caliuau uel couigo y cumplimiento ue estánuaies básicos ue uesaiiollo 00P en PBPS iegistei_globals Peimite que el conteniuo ue las supeiglobales se convieita en vaiiables locales. En geneial se uebe uejai ueshabilitauo ya que no es seguio ue muchas foimas. magic_quotes_gpc Al estai en 0n pouiia ayuuai a evitai ataques ue inyeccion ue SQL, al mismo tiempo hace que el ienuimiento uel seiviuoi sea algo menoi. session.use_only_coo kies Cuanuo tiene valoi 1 ayuua a evitai consiueiablemente ataques ue inyeccion ue SQL y XSS. 3.5 Configuración con Zend Application Server ZenJ Applicotion Server es un seiviuoi paia aplicaciones PBP basauo en Apocbe Web Server poi lo tanto su configuiacion es similai. Pueue seguii los pasos ue configuiacion ue Apocbe y iepiouuciilos en ZenJ Server. El mouulo LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 24 iewiite ya está activauo poi uefecto lo que los pasos ue configuiacion ueben sei minimos. 3.6 Crear una Instancia de Kumbia Enterprise El fiamewoik se uistiibuye en un aichivo compiimiuo multi-platafoima que contiene la estiuctuia ue aichivos uel fiamewoik y iecuisos necesaiios paia el uesaiiollo, piueba e implementacion ue aplicaciones en Kumbia Enteipiise. El nombie uel aichivo tiene la siguiente estiuctuia kumbio-ef-version-moJurez-extension. 3.7 Solución a problemas de instalación Las siguientes situaciones se pueuen piesentai al iealizai la instalacion ue una instancia uel fiamewoik: '(%",+(:$5 4. %(#$# @.-A<#?8(%# -# B2,+C# ($7%,3,-. El seiviuoi web no tiene el mouulo iewiite instalauo, consulte la seccion "Configuiacion con Apache Web Seivei 2.x" en el capitulo ue instalacion. '(%",+(:$5 /$ 3, 2,$%,33, 7# 28#7#$%, #3 1#$7,0# D4. 7# 2"-. "%(3(>,8 8##7+8(%"8, -# ;<E7F Se uebe veiificai lo siguiente: ! Si se usa Apocbe Web Server el aichivo '.htaccess' uebe estai piesente en la iaiz uel uiiectoiio uonue está la instancia uel fiamewoik o las ieglas en este ueben estai activas en la configuiacion uel seiviuoi web. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S ! Apocbe Web Server sopoita aichivos ue sobieesciituia ue configuiacion '.htaccess'. ! La opcion ue configuiacion ue Apache 'Allow0veiiiue All' no está piesente paia las opciones ue configuiacion uel BocumentRoot uel seiviuoi web. '(%",+(:$5 B3 ($)8#7,8 , 3, ,23(+,+(:$ 2.8 -#*#+%. 7# 28#7#$%, "$, 2,$%,33, 93,$+, 7($ $($)G$ 1#$7,0# La uiiectiva uel seiviuoi Web ue aichivos poi uefecto le está uanuo piioiiuau al aichivo inuex.html y no al inuex.php. En el caso ue Apocbe Web Server esto se soluciona meuiante la opcion ue configuiacion BirectorylnJex. '(%",+(:$5 B3 ($)8#7,8 , 3, ,23(+,+(:$ 7# )#$#8, 3, #H+#2+(:$ DI.8#/H+#2%(.$5 /3 -(8#+%.8(. 2"93(+J%#12 $. %(#$# 2#81(7.7 -# #7+8(%"8,F Esta excepcion se geneia cuanuo el uiiectoiio public¡temp es un uiiectoiio ue solo lectuia o no tiene peimisos ue esciituia paia el usuaiio con el que se ejecuta el pioceso uel seiviuoi web. '(%",+(:$5 B3 ($)8#7,8 , 3, ,23(+,+(:$ 7# )#$#8, 3, #H+#2+(:$ DI.8#/H+#2%(.$5 6#9# %#$#8 ($7%,3,-. KLK M#87(.$ NOPQ : 7"2#8(.8 2,8, "%(3(>,8 #7%# *8,1#R.8SF La veision ue PBP que tiene instalaua es igual o supeiioi a la veision S.u peio es infeiioi a la S.2.u. La veision S.2.u en auelante coiiige eiioies impoitantes ue seguiiuau en en núcleo ue PBP y tiene un mejoi ienuimiento. '(%",+(:$5 B3 ($)8#7,8 , 3, ,23(+,+(:$ 7# )#$#8, 3, #H+#2+(:$ DI.8#/H+#2%(.$5 T(1#>.$# ($MU3(-.F Ba uefiniuo una zona hoiaiia en el aichivo config¡config.ini inváliuo poi lo que muchas opciones uel fiamewoik geneiaián infoimacion eiionea. '(%",+(:$5 B3 ($)8#7,8 , 3, ,23(+,+(:$ 7# )#$#8, 3, #H+#2+(:$ D<."%#8/H+#2%(.$5 4. 7# C, ($-(+,-. 3, ,23(+,+(:$ 2.8 -#*#+%. #$ +.$*()J+.$*()O($( V-#*,"3%B22WF La opcion uefaultApp en el aichivo ue configuiacion ue la instancia no existe o uefine una aplicacion que no existe en la instancia uel fiamewoik. '(%",+(:$5 B3 ($)8#7,8 , 3, ,23(+,+(:$ 7# )#$#8, 3, #H+#2+(:$5 DI.8#I.$*()/H+#2%(.$5 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 26 6#9# ($-(+,8 #3 $.198# -# 3, ,23(+,+(:$ -#$-# #7%U #3 ,8+C(M. X+.$*()O($(XF La opcion uefaultApp en el aichivo ue configuiacion ue la instancia no existe o uefine una aplicacion que no existe en la instancia uel fiamewoik. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 27 4 ¿Qué es Kumbia Enterprise Framework? 4.1 Sobre Aplicaciones Web Cuanuo la web se empezo a tomai más en seiio, no solo paia piesentai sitios Web con conteniuo estático o simplemente infoimativo y se uio paso a la piestacion ue seivicios con conteniuo uinámico, la estiuctuiacion y piofesionalizacion ue las aplicaciones Web se hace eviuente como una foima ue ofiecei caliuau y confiabiliuau a clientes, pioveeuoies, inveisionistas, empleauos y touo el entoino ue las empiesas y oiganizaciones en foima noveuosa y eficiente. La aceptacion geneial uel lenguaje PBP como heiiamienta especializaua en el entoino Web y su amplio uesenvolvimiento asi como sencillez ue uso, han apoitauo consiueiablemente al ciecimiento y capaciuau ue implementacion ue alta tecnologia en la Web. 4.2 Sobre PHP y la Web A tiavés ue los años PBP se ha conveitiuo en un estánuai ue facto paia la constiuccion ue softwaie paia Inteinet ue alta escalabiliuau y velociuau. Nuchos ue los sitios más populaies y concuiiiuos en la actualiuau incluyenuo Wikipeuia, Yahoo! y Facebook. 4.3 Introducción Kumbio Fnterprise Iromework es un conjunto ue tecnologias paia la piouuccion ue softwaie que integia una noveuosa platafoima ue miuulewaie piopoicionanuo seivicios ue peisistencia, tiansacciones, mensajes y clusteiing a aplicaciones basauas en PBP que esten oiientauas a la Web. Poi años la mauuiez uel uesaiiollo empiesaiial en PBP ha evolucionauo inciementalmente y hoy en uia se cuenta con piouuctos mauuios que pueuen piopoicionai alteinativas que ieuuzcan los costos ue tecnologias ue infoimacion y pueuan sei aplicauos a entoinos empiesaiiales uesue la meuiana y pequeña empiesa hasta gianues aplicaciones oiientauas al cliente final. Nuestia platafoima pietenue unificai la platafoima tecnologica ue backenu y fiontenu aceleianuo los piocesos ue uesaiiollo e implementacion ue softwaie usanuo miuulewaie multiplatafoima escalable con tecnologia open-souice. Paia logiai esto una ue nuestias fichas LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 28 claves es Kumbio Fnterprise Iromework. Kumbio Fnterprise es un fiamewoik especialmente oiientauo al entoino empiesaiial, que implementa las mejoias piácticas ue uesaiiollo ue softwaie y piácticas oiientauas a las Web ue la actualiuau e intenta fomentai piincipalmente la geneiacion ue aplicaciones piofesionales, potentes, seguias y mantenibles en el tiempo paia empiesas que ueseen auoptai softwaie abieito y tecnologia PBP. uiacias al apoyo ue uifeientes empiesas patiocinauoias y ue louJerTecbnoloqy ahoia es posible implementai aplicaciones con una base ue couigo más soliua, estable y funcional junto con un seivicio ue sopoite que aseguie que su uesaiiollo y mejoiamiento seiá continuo en el tiempo. 4.4 Características del Framework Sumauas a las ue su heimano comunitaiio, Kumbio Fnterprise Iromework posee las siguientes caiacteiisticas: • Aiquitectuia Nouelo-vista-Contiolauoi (Núltiples Aplicaciones extenuible con Plugins y Eventos) • Componente ue Cacheo Flexible • 0bject-Relational-Napping (0RN) potente y iobusto (Tiansacciones, valiuauoies, }oins, 0nions, ueneiauoies, Nultipliciuau ue Relaciones, Beiencia) • Business Piocess Nanagement (BPN) • Seivicios Web (Integiacion y 0iquestamiento) (Soap, SCA) • Componente ue Auministiauoi ue Sesion (Session EonJlinq) Flexible (Nemcacheu, Batabase, LouueiCache, Files) • Componente ue Autenticacion (LBAP, Nouel, Keibeiosv, Rauius) con sopoite paia Sesion Activa y Expiiacion ue Sesion • Componente ue Access List Contiol (ACL) Flexible (Nouel, Nemoiy, Xml) • Componente ue Auuitoiia ue Sistemas • Sistema ue Logging Flexible (File, Compiesseu, Nail, Batabase,Stieam,SCA) • Localizacion (Tiauuccion, Fechas, Noneuas) inuepenuiente ue la platafoima • Nonitoieo ue Aplicaciones (CommonEventInfiastiuctuie) • Componente paia geneiacion ue iepoites empiesaiiales en múltiples foimatos (Puf, LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 29 Excel, Btml) • Componente paia implementacion ue seivicios WebBAv • Componentes ue conexion a motoies ue base ue uatos ceitificauos (0iacle y NySQL) • Semi-Compilauoi paia el Fiamewoik y las aplicaciones • uaibageCollectoi ue Sesion • Plantillas iápiuas y flexibles • Filtios y valiuacion Integiaua • Tests ue 0niuau • Bebug, Tiaza y Piofiling avanzauo • Componente ue Configuiacion Flexible (Ini, Xml, PBP) • Bocumentos PBF con PufBocument • Integiacion con Louuei Clusteiing Technology • Integiacion con Louuei Cache • Integiacion con IBN WebSpheie sNash 4.5 PHP en entornos críticos El lenguaje PBP no ha teniuo una gian paiticipacion en entoinos ue aplicaciones ciiticas y en un muchos casos ha siuo ielegauo a la cieacion ue sitios Web y poitales. Algunas caiacteiisticas uel lenguaje PBP como la tipificacion uébil y su caiáctei inteipietauo pueuen y han hecho uesconfiai a oiganizaciones en su implementacion en softwaie gianue y complejo. Kumbio Fnterprise Iromework ha siuo uiseñauo paia mantenei estiictos contioles ue valiuacion ue tipos e integiiuau ue uatos, gaiantizanuo en gian meuiua que los piocesos, entiaua y saliua ue uatos, cumplan a satisfaccion con los iequeiimientos ue negocio sin peiuei la potencia y capaciuaues paia el uesaiiollo iápiuo que ofiece la tecnologia PBP. Pioyectos y piouuctos como APC (Alteinative PBP Cache), Zenu 0ptimizei, eAccelatoi, Zenu uuaiu y otios más, peimiten llevai aplicaciones en PBP a un caiáctei semi-inteipietauo y hasta piotegei la piopieuau intelectual uel couigo fuente uel softwaie. En iesumen se pueue uecii que existe actualmente entoinos y tecnologia que peimiten el uesaiiollo e implementacion satisfactoiia ue aplicaciones paia entoinos ciiticos basauos en el lenguaje PBP. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su 5 Arquitectura 5.1 Introducción Kumbio Fnterprise peimite el uesaiiollo ue aplicaciones en vaiias capas esto peimite iompei un sistema en subsistemas más pequeños ieuucienuo la complejiuau uel mismo y piopoicionanuo impoitantes beneficios. Cuanuo se tiabaja con un sistema multi-capa se entienue que existen capas ue alto nivel y otias ue menoi nivel, las ue mayoi nivel apiovechan la funcionaliuau implementaua en las capas infeiioies ocultanuo uetalles que no iequieien ue un entenuimiento inmeuiato aunque ieuucienuo la flexibiliuau en una u otia meuiua. Los piincipales beneficios ue implementai sistemas multi-capa son: • Es posible tiabajai sobie una capa supeiioi sin necesiuau ue conocei como funcionan las capas infeiioies. Cuanuo uesaiiolla con Kumbio Fnterprise utiliza una capa ue alto nivel que aumenta la piouuctiviuau sin iequeiii el entenuimiento en piofunuiuau ue compoitamientos o funcionaliuau ue bajo nivel. • 0na capa pueue sei sustituiua poi otia mantenienuo una inteiface consistente que se auapte a necesiuaues especificas sin mouificai la aplicacion poi completo. 5.2 Capas en una Aplicación 0na aplicacion Web uesaiiollaua en Kumbia se sepaia en S capas piincipales llamauas: Logica ue Bominio, Peisistencia y Piesentacion. La logica ue uominio o ue negocio es quien uicta las ieglas sobie como uebe tiabajai la aplicacion en si. Constituye touo lo que tiene que vei con cálculos ue entiaua ue uatos, valiuaciones, piocesos y como se piesentaian los uatos en la capa ue piesentacion. La peisistencia y¡o logica uel mouelo ue uatos tiata sobie como la logica ue uominio iequieie ue los uatos que le piopoicionan seivicios ue bases ue uatos, sistemas ue tiansacciones, mensajes, sistemas ue aichivos, etc. La piesentacion tiata ue touos aquellos elementos que peimiten la inteiaccion entie el LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S1 usuaiio final y la aplicacion. En una aplicacion Web se iefieie auemás a las tecnologias ue lauo uel cliente como CSS o }avaSciipt, los navegauoies, los lenguajes ue maicas y ue tiansfoimacion. Caua capa mencionaua anteiioimente ofiece seivicios y tiene iesponsabiliuaues uifeientes en una aplicacion empiesaiial, la claia sepaiacion ue estas capas es funuamental paia un uesaiiollo satisfactoiio. Los componentes paia la auministiacion y uso ue caua capa son piopoicionauos poi el fiamewoik asi como seivicios ue integiacion entie ellos también. 5.3 Usando Modelo-Vista-Controlador Las aplicaciones en Kumbia utilizan el pation aiquitectacional llamauo NvC. Con él las aplicaciones Web se pueuen sepaiai en S capas bien uefiniuas ayuuanuo a la mantenibiliuau ue la misma y exigienuo un oiuen y claiiuau que con el tiempo alaiga la viua útil ue las mismas. • @.-#3.75 Repiesentan la infoimacion sobie la cual la aplicacion opeia, las entiuaues y su logica ue negocio. Contienen touas las valiuaciones, constiaints y ieglas que hacen que la logica uel negocio se cumpla y haya integiiuau en los uatos. Coiiesponue a la capa ue peisistencia. • Y(7%,75 visualizan el mouelo usanuo inteifaces Web e inteiactuanuo con los usuaiios ue éstas. Coiiesponue a la capa ue Piesentacion. • I.$%8.3,-.8#75 Atienuen, iesponuen y eniutan las acciones solicitauas poi el usuaiio final e invocan cambios en las vistas o en los mouelos según sea necesaiio. Coiiesponue a la capa ue logica ue uominio. Los contiolauoies están sepaiauos en paites, llamauas front controller y en un conjunto ue acciones. Caua accion pueue inteiactuai ue foima uifeiente ue acueiuo al tipo ue peticion. Las vistas están sepaiauas en layouts, templates, vistas ue accion y paitials. El mouelo ofiece una capa ue abstiaccion ue la base ue uatos llamaua 0RN que auemás uan funcionaliuau agiegaua a uatos ue sesion y valiuacion ue integiiuau ielacional. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S2 Este mouelo ayuua a sepaiai el tiabajo ue la logica ue negocios (mouelos) y la piesentacion (vistas) El contiolauoi ayuua a ocultai los uetalles ue piotocolo utilizauos en la peticion (BTTP, mouo consola, etc.) paia el mouelo y la vista. Finalmente, el mouelo abstiae la logica ue uatos, que hace a los mouelos inuepenuientes ue las vistas. Kumbio Fnterprise Iromework agiega componentes y plugins que inteiactúan con la aiquitectuia ue la aplicacion. /$3,+#7 <#3,+(.$,-.7 • Modelo Vista Controlador 5.4 Ventajas de usar MVC Al implementai el pation aiquitectacional NvC es posible sepaiai claiamente la foima en la que se piesenta la infoimacion, ue la foima en la que se almacena, ue la foima en la que oiquesta la logica ue la aplicacion. Be esta foima es menos complicauo: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS • Betectai en que capa se esta geneianuo un pioblema ue la aplicacion. Poi ejemplo si un pioceso no se esta ejecutanuo coiiectamente es muy piobable que el pioblema este en el contiolauoi. • Si se agiega un nuevo constiaint (iestiiccion) al mouelo ue uatos este se aplica a touo el sistema inmeuiatamente. • Si los uiseñauoies iequieien tiabajai en la piesentacion esto es posible sin que se afecte la logica ue negocio o el mouelo ue uatos. • Befinitivamente la aplicacion se hace más mantenible y ieusable cieanuo uniuaues que inteiactúan entie si y están sepaiauas en foima logica ue maneia claia. 5.5 Loose Coupling/Tight Coupling 0no ue los objetivos ue uiseño ue Kumbio Fnterprise Iromework es buscai que el aiquitecto¡uesaiiollauoi no tenga que integiai ningún componente paia uefinii la estiuctuia ue su aplicacion poi esta iazon vaiios componentes son uepenuientes los unos ue los otios piopoicionanuo un entoino reoJy-to-use uonue sea posible uesaiiollai y ejecutai aplicaciones empiesaiiales favoiecienuo piincipios ue ieusabiliuau y ienuimiento ue cualquiei aplicacion. Los pationes ue uiseño virtuolProxy y BepenJecylnjection son utilizauos paia peimitiile al uesaiiollauoi ieemplazai¡integiai componentes esciitos poi teiceios a la aplicacion. Nuchos otios componentes están pensauos en sei uébilmente acoplauos o loose coupling ue tal foima que pueuan sei integiauos a otias aplicaciones esciitas en otios fiamewoiks. Kumbio Fnterprise Iromework ofiece avanzaua funcionaliuau cuyo nivel ue mauuiez es similai o supeiioi al ue otios fiamewoiks PBP actuales. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S4 Capitulo Tutoiial 6 Caso de Uso: Aplicación de Cajero Bancario 6.1 Introducción En el piesente capitulo uel manual ue iefeiencia se tiataiá ue ilustiai con un ejemplo ue aplicacion las piincipales caiacteiisticas uel Fiamewoik en un ejemplo piáctico. La iuea es cieai una aplicacion que siiva como un futuio cajeio electionico viitual paia un banco llamauo Cential Bank. Las ieglas uel negocio son las siguientes: • Los clientes uel banco pueuen entiai a la sucuisal viitual usanuo el númeio ue su iuentificacion peisonal y la clave ue alguna ue sus taijetas. • 0na vez autenticauos los clientes pueuen consultai sus extiactos, hacei tiansfeiencias a otias cuentas y ievisai su saluo. El uesaiiollo e implementacion ue aplicaciones bancaiias exige iequeiimientos altisimos ue seguiiuau, piestaciones, alta uisponibiliuau, infiaestiuctuia ue ieues y piobablemente la implementacion ue muchas ieglas financieias y bancaiias paia que el sistema sea funcional y usable. Sin embaigo, paia que nuestio ejemplo no sea eteino y no se salga ue contexto, vamos a cieai un sistema muy simplificauo peio que siiva paia entenuei los conceptos y entoino ue tiabajo con el Fiamewoik. Pueue que sea necesaiio entenuei los conceptos ue 0RN (ActiveRecoiu) y el funcionamiento uel componente Contiollei y view, paia una mayoi compiension uel piesente Tutoiial. 6.2 Análisis de los Requerimientos Bacienuo un análisis más piofunuo uel tema iuentificamos las siguientes entiuaues: • I3(#$%#7: Son el usuaiio final ue la aplicacion y se asume que habiá una entiuau uonue se mantenuiá la infoimacion asociaua a ellos. • I"#$%,7: Nanejan el saluo actual ue la cuenta, su saluo en canje y su ielacion a clientes. • @.M(1(#$%.: Almacena un log ue las opeiaciones iealizauas poi el cliente en sus LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS cuentas y seiá utilizauo paia geneiai los extiactos uel cliente. • Z$%#8#7#7: Son los inteieses ganauos poi el cliente caua uia que tiene su uineio en el banco. • '"+"87,3#7: Es la ubicacion en la que se iealiza la tiansaccion bancaiia. Paia uesaiiollai el ejemplo se utiliza una base ue uatos usanuo el RBBN NySQL S.u, esta base ue uatos es multiplatafoima y se instala fácilmente en la mayoi paite ue sistemas opeiativos. El nombie ue la base ue uatos seiá 'bankub'. Cieamos la base ue uatos asi: CREATE DATABASE nombre_bd CHARACTER SET utf8; La estiuctuia ue las tablas seiá la siguiente: T,93, I"7%.1#8: Auministia la infoimacion ue los clientes uel banco CREATE TABLE `customer` ( `id` int(11) NOT NULL auto_increment, `identification` varchar(20) NOT NULL, `sucursal_id` int(11) NOT NULL, `name` varchar(120) NOT NULL, `email` varchar(52) default NULL, `created_at` datetime default NULL, `status` char(1) default NULL, PRIMARY KEY (`id`), KEY `sucursal_id` (`sucursal_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Besciipcion ue los campos: I,12. 6#7+8(2+(:$ iu Es la llave piimaiia ue la tabla y es auto numéiica. iuentification Es el numeio ue iuentificacion ue la peisona. sucuisal_iu Es el couigo ue la sucuisal uonue se cieo la cuenta. name Es el nombie ue la peisona email Es el coiieo electionico uel cliente cieateu_at Es la fecha en la que se cieo el cliente en la base ue uatos status Es el estauo uel cliente en el banco. (A)ctivo o (I)nactivo T,93, B++."$%: Auministia la infoimacion ue las cuentas y sus saluos CREATE TABLE `account` ( `id` int(11) NOT NULL auto_increment, `number` int(22) NOT NULL, `password` varchar(40) NOT NULL, LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S6 `sucursal_id` int(11) NOT NULL, `customer_id` int(11) NOT NULL, `balance` decimal(30,6) NOT NULL, `swap_balance` decimal(30,6) NOT NULL, `type` char(1) NOT NULL, `created_at` datetime default NULL, `status` char(1) default NULL, PRIMARY KEY (`id`), KEY `clientes_id` (`customer_id`), KEY `sucursal_id` (`sucursal_id`), CONSTRAINT `account_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`), CONSTRAINT `account_ibfk_2` FOREIGN KEY (`sucursal_id`) REFERENCES `sucursal` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Besciipcion ue los campos: I,12. 6#7+8(2+(:$ iu Es la llave piimaiia ue la tabla y es auto numéiica. numbei Es el númeio ue la cuenta passwoiu Es el iesumen SBA1 ue la clave ue la cuenta sucuisal_iu Es la sucuisal en uonue se cieo la cuenta. customei_iu Es el cliente al que peitenece la cuenta balance Es el saluo que tiene la cuenta. swap_balance Es el saluo que tiene en canje. type Inuica si la cuenta es ue ahoiios o coiiiente. cieateu_at Es la fecha en la que se cieo la cuenta en la base ue uatos status Es el estauo uel cliente en el banco. (A)ctivo o (I)nactivo T,93, @.M#1#$%: Auministia la infoimacion ue los movimientos iealizauos en las cuentas CREATE TABLE `movement` ( `id` int(11) NOT NULL auto_increment, `account_id` int(11) NOT NULL, `ubication_id` int(11) NOT NULL, `cash` decimal(30,6) NOT NULL, `created_at` datetime default NULL, PRIMARY KEY (`id`), KEY `account_id` (`account_id`), KEY `ubication_id` (`ubication_id`), CONSTRAINT `movement_ibfk_2` FOREIGN KEY (`ubication_id`) REFERENCES `ubication` (`id`), CONSTRAINT `movement_ibfk_1` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Besciipcion ue los campos: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S7 I,12. 6#7+8(2+(:$ iu Es la llave piimaiia ue la tabla y es auto numéiica. account_iu Es la cuenta en la que se iealizo el movimiento ubication_iu Es la ubicacion en la que se geneio el movimiento cash Es el monto poi el que se iealizo el movimiento cieateu_at Es la fecha en la que se cieo la cuenta en la base ue uatos T,93, '"+"87,3: Auministia la infoimacion ue las sucuisales uel banco CREATE TABLE `sucursal` ( `id` int(11) NOT NULL auto_increment, `name` varchar(120) NOT NULL, `ubication_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `id` (`id`), KEY `ubication_id` (`ubication_id`), CONSTRAINT `sucursal_ibfk_1` FOREIGN KEY (`ubication_id`) REFERENCES `ubication` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Besciipcion ue los campos: I,12. 6#7+8(2+(:$ iu Es la llave piimaiia ue la tabla y es auto numéiica. name Nombie ue la sucuisal ubication_iu Es la ubicacion uonue se encuentia la sucuisal T,93, ;9(+,%(.$5 Auministia la infoimacion ue las ubicaciones uonue se pueuen iealizai opeiaciones bancaiias. CREATE TABLE `ubication` ( `id` int(11) NOT NULL auto_increment, `name` varchar(120) NOT NULL, PRIMARY KEY (`id`), KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Besciipcion ue los campos: I,12. 6#7+8(2+(:$ iu Es la llave piimaiia ue la tabla y es auto numéiica. name Nombie ue la 0bicacion LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S8 6.3 Esqueleto de la Aplicación 0na vez cieauo el mouelo ue uatos geneiamos el esqueleto ue aplicacion uonue iiá ubicauo los aichivos fuente ue la aiquitectuia NvC. Paia esto uebemos cieai un uiiectoiio llamauo 'bank' en apps y los subuiiectoiios contiolleis, config, mouels y views. 0na foima iapiua ue cieai el esqueleto ue la aplicacion es utilizai el sciipt cieate_application.php en mouo consola: Al ubicaise uentio uel uiiectoiio uonue esta la instancia uel Fiamewoik usamos el comanuo: php script/create_application.php –name bank El nombie uel uiiectoiio que tiene el Fiamewoik se llama 'example'. La siguiente estiuctuia ue aichivos se ha cieauo: example/ apps/ default/ bank/ controllers/ application.php config/ boot.ini config.ini environment.ini routes.ini logs/ models/ base/ modelBase.php views layouts/ index.phtml 0na vez uefiniua la estiuctuia ue uiiectoiios ue la aplicacion es posible empezai a uesaiiollai sobie ella. La aplicacion se encuentia en entoino ue uesaiiollo y touo lo ielacionauo con ello esta activauo poi uefecto. 6.4 Configurar la conexión a la base de datos Paia empezai a piobai los contiolauoies y la iteiacion con los mouelos es necesaiio configuiai la conexion a la base ue uatos que se va a utilizai en el entoino ue uesaiiollo. Paia esto se euita el aichivo ue configuiacion environment.ini cieauo en el uiiectoiio config: [development] database.host = localhost database.username = root database.password = 2fe0517 database.name = bankdb database.type = mysql LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S9 Estos paiámetios seián usauos en toua la aplicacion paia conectaise a la base ue uatos ue uesaiiollo. Kumbio Fnterprise Iromework peimite uefinii una aiquitectuia ue S capas en caso ue que se necesite utilizai la base ue uatos en un seiviuoi exteino al ue uesaiiollo. 6.5 Crear los modelos de Base de Datos 0n mouelo uebe ii ubicauo en el uiiectoiio moJels ue la aplicacion. Los nombies ue los aichivos ue mouelos "ueben" tenei el nombie ue la tabla a mapeai (esto es una convencion). En caua aichivo uebe existii una sola clase con el nombie uel mouelo usanuo notacion camelizaua. Las clases ue mouelos "ueben" heieuai ue la clase ActiveRecorJ. 0n ejemplo ue un mouelo ue la tabla ubication es el aichivo moJels,ubicotion.pbp que implementa la clase 0bicotion asi: <?php class Ubication extends ActiveRecord { } Al uefinii un mouelo con una implementacion ue atiibutos 'vacia' se inuica a ActiveRecorJ que uebe cieai los atiibutos ue la tabla en foima uinámica y poi lo tanto la visibiliuau ue esta seiá pública. En geneial esto no es una buena piactica ue uesaiiollo ya que se ueja al uescubieito la piivaciuau ue los valoies ue los campos sin que haya ningún contiol en su acceso. Paia solucionai esto e implementai un mouelo más seguio se hace asi: <?php class Ubication extends ActiveRecord { protected $id; protected $name; public function getId(){ return $this->id; } public function setId($id){ $this->id = $id; } public function getName(){ return $this->name; } public function setName($name){ $this->name = $name; } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4u Los getteis y setteis piopoicionan puntos unificauos paia obtenei¡establecei los valoies inteinos uel mouelo. En geneial, caua tabla que se utilice en la aplicacion uebe sei mapeaua poi un mouelo en la misma. El sciipt creote_oll_moJels.pbp peimite cieai touos los mouelos ue la base ue uatos actual implementanuo caua clase como se vio en el ejemplo anteiioi. El uso uel sciipt es el siguiente: php scripts/create_all_models.php –-application bank Auicional a los getteis¡setteis geneiauos, el sciipt agiega los PBPBocs a caua métouo y atiibuto con lo que se mejoia la uocumentacion uel sistema y si se utilizan IBEs como Zenu Stuuio o Eclipse estos comentaiios son leiuos ayuuanuo a autocompletai el couigo cuanuo sea posible. El mouelo paia la tabla customei geneiauo es: <?php class Customer extends ActiveRecord { /** * @var integer */ protected $id; /** * @var string */ protected $identification; /** * @var integer */ protected $sucursal_id; /** * @var string */ protected $name; /** * @var string */ protected $email; /** * @var Date */ protected $created_at; /** * @var string */ protected $status; /** * Metodo para establecer el valor del campo id LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 41 * @param integer $id */ public function setId($id){ $this->id = $id; } /** * Metodo para establecer el valor del campo identification * @param string $identification */ public function setIdentification($identification){ $this->identification = $identification; } /** * Metodo para establecer el valor del campo sucursal_id * @param integer $sucursal_id */ public function setSucursalId($sucursal_id){ $this->sucursal_id = $sucursal_id; } /** * Metodo para establecer el valor del campo name * @param string $name */ public function setName($name){ $this->name = $name; } /** * Metodo para establecer el valor del campo email * @param string $email */ public function setEmail($email){ $this->email = $email; } /** * Metodo para establecer el valor del campo created_at * @param Date $created_at */ public function setCreatedAt($created_at){ $this->created_at = $created_at; } /** * Metodo para establecer el valor del campo status * @param string $status */ public function setStatus($status){ $this->status = $status; } /** * Devuelve el valor del campo id * @return integer */ public function getId(){ return $this->id; } /** * Devuelve el valor del campo identification * @return string */ public function getIdentification(){ return $this->identification; } /** * Devuelve el valor del campo sucursal_id LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 42 * @return integer */ public function getSucursalId(){ return $this->sucursal_id; } /** * Devuelve el valor del campo name * @return string */ public function getName(){ return $this->name; } /** * Devuelve el valor del campo email * @return string */ public function getEmail(){ return $this->email; } /** * Devuelve el valor del campo created_at * @return Date */ public function getCreatedAt(){ return new Date($this->created_at); } /** * Devuelve el valor del campo status * @return string */ public function getStatus(){ return $this->status; } } 6.6 Crear el Inicio de Sesión El inicio ue sesion paia el usuaiio final ue la sucuisal viitual según los iequeiimientos ue la aplicacion, es una pantalla en uonue el cliente uebeiá ingiesai su uocumento peisonal junto con alguna ue las claves ue las cuentas asociauas a ese uocumento. Según la aiquitectuia NvC los contiolauoies son el punto ue entiaua a cualquiei accion que se iealice en la aplicacion, aunque ue momento el piimei iequeiimiento nos hace pensai en piesentacion antes ue 'logica uel negocio' empezaiemos cieanuo un contiolauoi que no implemente ningún tipo ue logica poi ahoia: El contiolauoi cieauo se llama login y el aichivo uonue se implementa la clase contiolauoia es el aichivo controllers,loqin_controller.pbp y ue momento contiene lo siguiente: <?php class LoginController extends ApplicationController { public function indexAction(){ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4S } } La implementacion 'vacia' ue la accion 'inuex' peimite que la piesentacion (la vista se visualice) en cuanto se invoca el contiolauoi. Ya que 'login' seiá el contiolauoi poi uefecto ue la aplicacion se implementa el métouo ControllerBose::init ue la siguiente foima: <?php class ControllerBase { public function init(){ //Enrutar al controlador login Router::routeTo("controller: login"); } } Según las convenciones en la aiquitectuia NvC uel Fiamewoik la vista paia la accion 'inuex' uel contiolauoi 'login' se ciea en el aichivo views,loqin,inJex.pbtml. La inteifaz piesenta una campo ue texto uonue es posible ingiesai el uocumento uel cliente y otia paia la clave numéiica ue 4 uigitos. <h1>Bienvenido a Central Bank</h1> <?php echo Tag::form("login/validateCredentials") ?> <table> <tr> <td align='right'><b>Documento Identificaci&oacute;n:</b></td> <td><?php echo Tag::textField("identification", "size: 20", "maxlength: 20") ?></td> </tr> <tr> <td align='right'><b>Contrase&ntilde;a:</b></td> <td><?php echo Tag::numericPasswordField("password", "size: 4", "maxlength: 4") ?></td> </tr> <tr> <td></td> <td><?php echo Tag::submitButton("Entrar") ?></td> </tr> </table> <?php echo Tag::endForm() ?> Ambos campos son iequeiiuos y poi lo tanto se valiuan como iequeiiuos en el contiolauoi. La valiuacion también se pueue hacei en }avaSciipt, sin embaigo estamos hacienuo un sistema confiable y no pouemos confiai en lo que ocuiia en el cliente. <?php LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 44 class LoginController extends ApplicationController { public function indexAction(){ } public function validateCredentialsAction(){ $rules = array( "identification" => array( "filter" => "alpha", "message" => "Por favor indique su documento de identificación" ), "password" => array( "filter" => "int", "message" => "Por favor indique su contraseña" ), ); if($this->validateRequired($rules)==true){ //Aquí viene la autenticación } else { $this->routeTo("action: index"); } } } La utilizacion uel métouo heieuauo valiuateRequiieu peimite valiuai el tipo ue uato y compiobai si el usuaiio ha ingiesauo algún valoi en estos campos. Los valoies ue los campos son filtiauos usanuo el componente Iilter antes ue valiuai si están piesentes en la entiaua ue usuaiio. Si la valiuacion falla el flujo ue ejecucion se eniuta nuevamente a la accion inuex. Ahoia se mouifica la vista paia mostiai al usuaiio los mensajes geneiauos en la valiuacion. <h1>Bienvenido a Central Bank</h1> <?php foreach(View::getValidationMessages() as $message){ Flash::error($message->getMessage()); } ?> <?php echo Tag::form("login/validateCredentials") ?> <table> <tr> <td align='right'><b>Documento Identificaci&oacute;n:</b></td> <td><?php echo Tag::textField("identification", "size: 20", "maxlength: 20") ?></td> </tr> <tr> <td align='right'><b>Contrase&ntilde;a:</b></td> <td><?php echo Tag::numericPasswordField("password", "size: 4", "maxlength: 4") ?></td> </tr> <tr> <td></td> <td><?php echo Tag::submitButton("Entrar") ?></td> </tr> </table> <?php echo Tag::endForm() ?> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4S El métouo estático view::qetvoliJotionHessoqes{) peimite obtenei los mensajes obteniuos en la valiuacion. Cuanuo el pioceso ue valiuacion es satisfactoiio se pueue continuai con el pioceso ue autenticacion. 6.7 Autenticando al Cliente El iequeiimiento uel banco exige que la implementacion ue la autenticacion se haga ue la siguiente foima: • valiuai que exista un cliente con el uocumento ingiesauo • valiuai que la clave piopoicionaua coiiesponua al menos a una cuenta uel cliente Los mouelos Customer y Account contienen los uatos iequeiiuos paia efectuai esta opeiacion. La accion mouificaua voliJoteCreJentiols queua asi: public function validateCredentialsAction(){ $rules = array( "identification" => array( "filter" => "alpha", "message" => "Porfavor indique su documento de identificación" ), "password" => array( "filter" => "int", "message" => "Porfavor indique su contraseña" ), ); if($this->validateRequired($rules)){ $identification = $this->getPostParam("identification", "alpha"); $password = sha1($this->getPostParam("password", "int")); $customer = $this->Customer- >findFirst("identification='$identification' AND status=’A’"); if($customer!==false){ $successAuth = false; $accounts = $this->Account->find("customer_id = '{$customer- >getId()}' AND status=’A’"); foreach($accounts as $account){ if($password==$account->getPassword()){ $successAuth = true; break; } } if($successAuth==false){ $this->addValidationMessage("Documento/Password Incorrectos"); $this->routeTo("action: index"); } else { Session::set(“existsValidUser”, true); $userData = SessionNamespace::add('UserData'); $userData->setCustomer($customer->getId()); $userData->setLogInTime(time()); $this->routeTo("controller: menu"); } } else { $this->addValidationMessage("Documento/Password LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 46 Incorrectos"); $this->routeTo("action: index"); } } else { $this->routeTo("action: index"); } } En el anteiioi pioceuimiento se ilustian vaiios aspectos ue un pioceuimiento usanuo el Fiamewoik: • Paia iecupeiai los valoies que vienen uel foimulaiio se utiliza el métouo qetPost. Como piimei paiámetio se pasa el nombie uel campo usauo en el foimulaiio. Auicionalmente se pueue aplicai un filtio paia aseguiai que la entiaua si es seguia y coiiesponue al tipo ue uato espeiauo. • Paia acceuei a cualquiei mouelo basta con invocailo usanuo $this uentio ue cualquiei accion uel Iromework. El nombie ue la vaiiable coiiesponue al nombie ue la clase que utiliza el mouelo. • El métouo uel mouelo finJIirst busca un iegistio o como su tiauuccion uice "buscai el Piimeio". La conuicion peimite obtenei el iegistio ueseauo. Este métouo uevuelve false cuanuo no encuentia iegistios con las conuiciones inuicauas. • El métouo finu iealiza una búsqueua ue vaiios iegistios, la conuicion peimite filtiai solo los iegistios ue las cuentas asociauas al cliente. Cuanuo no encuentia iegistios uevuelve un vectoi vacio, en caso contiaiio el iesultauo ue finu es un 0bjeto ue la clase ActiveRecorJResulset que implementa el pation RecorJset, es uecii una iepiesentacion en memoiia uel iesultauo uevuelto poi la base ue uatos. • La vaiiable $successAutb siive como vaiiable banueia paia iuentificai si se ha encontiauo una cuenta con la contiaseña piopoicionaua. • Paia obtenei los valoies ue los campos uel mouelo es necesaiio usai los getteis en el caso ue customei se uso qetlJ{) paia obtenei el iu uel iegistio que se consulto. • Las claves en la tabla Account son iesúmenes usanuo el algoiitmo sha1. • Paia agiegai un mensaje ue valiuacion peisonalizauo se pueue usai el métouo oJJvoliJotionHessoqe el cual también es usauo inteinamente poi voliJoteRequireJ. • Cuanuo falla algún iequisito uel pioceso se muestia el mensaje y se eniuta a la accion inuex lo que le peimitiiá al usuaiio final ieingiesai la infoimacion. • Cuanuo el uocumento ue iuentificacion y la clave son coiiectos se ciea una vaiiable ue sesion meuiante Session::set, esta es llamaua existsvoliJ0ser y se le asigna valoi "tiue". Esta vaiiable inuica a lo laigo ue la aplicacion que existe un usuaiio valiuo LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 47 autenticauo. 6.8 Un Menú para la Aplicación Paia oiganizai las opciones que utiliza el usuaiio final se ciea un menú y se implementa ue tal foima que siempie sea visible poi el usuaiio final uuiante touo el tiempo que ejecute la aplicacion. Como se vio en el pioceuimiento ue autenticacion, cuanuo esta es satisfactoiia el flujo ue ejecucion es ieuiieccionauo al contiolauoi "menu". La implementacion ue este contiolauoi caiece ue logica ue negocio alguna y muestia la vista que peimite al cliente escogei la opcion que uesea: El sciipt ue ayuua uel Fiamewoik llamauo cieate_contiollei peimite la cieacion uel contiolauoi: php scripts/create_controller.php --application bank –-name menu Como iesultauo se obtiene el couigo geneiauo: <?php class MenuController extends ApplicationController { public function indexAction(){ } } La jeiaiquia ue vistas implementaua en el componente view peimite que la piesentacion coiiesponuiente a un contiolauoi sea compaitiua poi otios, poi esto se ha cieauo el menú enlazanuo caua opcion en el layout uel contiolauoi. El aichivo views,loyouts,menu.pbtml queua asi: <h1>Cajero Virtual</h1> <b>Men&uacute; Principal:</b> <ul> <li><?php echo Tag::linkTo("banking/checkBalance", "Ver Saldo") ?></li> <li><?php echo Tag::linkTo("banking/showTransactionActivity", "Ver Extractos Bancarios") ?></li> <li><?php echo Tag::linkTo("transfer", "Transferencias") ?></li> <li><?php echo Tag::linkTo("logout", "Salir del Banco") ?></li> </ul> El uso uel helpei Toq::linkTo peimite cieai un enlace al contiolauoi iequeiiuo y utilizai un label paia inuicai el texto asociauo a él. La ventaja ue utilizai este tipo ue helpeis es que LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 48 mantiene actualizauos los path absolutos a la aplicacion y si se llegase a movei a otio 0RI automáticamente estos mantenuiian las iutas coiiectas. 6.9 Visualización del saldo del cliente La piimeia opcion que piesenta el menú al cliente le peimite consultai el saluo ue las cuentas bancaiias que tenga en el banco. Paia implementai la consulta se ciea el contiolauoi 'bonkinq' que consulta el saluo ue caua cuenta y lo piesenta en una vista. El contiolauoi 'BonkinqController' queua asi: <?php class BankingController extends ApplicationController { public function indexAction(){ } public function checkBalanceAction(){ $userData = SessionNamespace::get('UserData'); $customerId = $userData->getCustomer(); $accounts = $this->Account->find("customer_id='$customerId' AND status = 'A'"); $this->setParamToView("accounts", $accounts); } } Se toman los uatos ue sesion que se cieaion cuanuo el cliente inicio sesion uesue el SessionNomespoce. El mouelo 'Account' es inyectauo paia iealizai la consulta, el iesultauo ue esta se pasa a la vista usanuo el paiámetio "occounts". En la piesentacion la iuea es piesentai una tabla con los saluos en caua cuenta junto con una sumatoiia uel saluo total poi cuenta y ue touas las cuentas. La tabla a piesentai contiene las siguientes columnas: Númeio ue la Cuenta, Saluo, Saluo en Canje y Total (que suma el saluo más el saluo en canje). Pouemos uefinii el total como una columna calculaua, obtenienuola como una iegla uel negocio implementanuo el métouo qetBolonceTotol{) en el mouelo Account: <?php class Account extends ActiveRecord { /* getters y setters */ /** * Devuelve el saldo total de la cuenta * * @return double */ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 49 public function getBalanceTotal(){ return $this->balance+$this->swap_balance; } } Al uefinii este métouo se extienue el mouelo y se cumple con la iegla uel negocio. qetBolonceTotol{) está uisponible en caua instancia ue Account en toua la aplicacion. Se ciea la vista ue esta accion en el aichivo opps,bonk,views,bonkinq,cbeckBolonce.pbtml. Notese que bonkinq coiiesponue a el nombie uel contiolauoi y cbeckBolonce al nombie ue la accion: <?php print "<table border='1'> <thead> <tr> <th>N&uacute;mero</th> <th>Saldo</th> <th>Saldo en Canje</th> <th>Total</th> </tr> </thead> <tbody>"; foreach($accounts as $account){ print "<tr> <td>".$account->getNumber()."</td> <td align='right'>".number_format($account->getBalance(), 2)."</td> <td align='right'>".number_format($account->getSwapBalance(), 2)."</td> <td align='right'>".number_format($account->getBalanceTotal(), 2)."</td> </tr>"; } print "</tbody></table>"; ?> El iesultauo uevuelto poi el métouo finu ue Account es un objeto ActiveRecorJResulset que pueue sei iecoiiiuo poi foieach paia constiuii la tabla ue cuentas. Algun cliente pueue tenei vaiias cuentas o tenei ninguna, en este ultimo caso, la aplicacion le infoimaiá al cliente. Ya que los objetos ActiveRecorJResultset implementan la inteiface Countoble es posible sabei cuantos iegistios uevolvio la consulta usanuo la funcion count{): <?php if(count($accounts)>0){ print "<table border='1' align='center'> <thead> <tr> <th>Número</th> <th>Saldo</th> <th>Saldo en Canje</th> <th>Total</th> </tr> </thead> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su <tbody>"; $total = 0; $totalBalance = 0; $totalSwapBalance = 0; foreach($accounts as $account){ print "<tr> <td>".$account->getNumber()."</td> <td align='right'>".number_format($account->getBalance(), 2)."</td> <td align='right'>".number_format($account->getSwapBalance(), 2)."</td> <td align='right'>".number_format($account- >getBalanceTotal(), 2)."</td> </tr>"; $totalBalance+=$account->getBalance(); $totalSwapBalance+=$account->getSwapBalance(); $total+=$account->getBalanceTotal(); } print "<tr> <td align='right'>TOTALES</td> <td align='right'>".number_format($totalBalance, 2)."</td> <td align='right'>".number_format($totalSwapBalance, 2)."</td> <td align='right'>".number_format($total, 2)."</td> </tr>"; print "</tbody></table>"; } else { Flash::notice("No tiene cuentas activas en nuestro banco"); } En este momento al visualizai los saluos se pueue vei que el menú no apaiece al lauo izquieiuo, esto se uebe a que el layout uel menú que se uefinio anteiioimente solo esta activo paia el contiolauoi uel mismo nombie. Paia uefinii el layout 'menu' como el uel contiolauoi 'bonkinq' se usa el métouo setTemploteAfter{) en el inicializauoi uel contiolauoi. <?php class BankingController extends ApplicationController { protected function initialize(){ $this->setTemplateAfter("menu"); } public function indexAction(){ } public function checkBalanceAction(){ $userData = SessionNamespace::get('UserData'); $customerId = $userData->getCustomer(); $accounts = $this->Account->find("customer_id='$customerId' AND status = 'A'"); $this->setParamToView("accounts", $accounts); } } El layout menú es mouificauo paia que muestie tanto el menu ue la aplicacion como el conteniuo ue las vistas que lo utilicen: <h1>Cajero Virtual</h1> <table width="100%"> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S1 <tr> <td valign="top" width="25%"> <b>Men&uacute; Principal:</b> <ul> <li><?php echo Tag::linkTo("banking/checkBalance", "Ver Saldo") ?></li> <li><?php echo Tag::linkTo("banking/showTransactionActivity", "Ver Extractos Bancarios") ?></li> <li><?php echo Tag::linkTo("transfer", "Transferencias") ?></li> <li><?php echo Tag::linkTo("logout", "Salir del Banco") ?></li> </ul> </td> <td> <?php View::getContent() ?> </td> </tr> </table> El llamauo a view::qetContent{) inuica uonue se uebe auto-incluii el conteniuo ue la vista asociaua al layout, en este caso es cbeckBolonce.pbtml. Según la configuiacion actual, cualquiei peticion a los contiolauoies 'menu' y 'bonkinq' mostiaiian el mismo layout uel ´menu piincipal', con esto logiamos que los clientes pueuan ii ue una opcion a otia sin pioblemas y la aplicacion obtiene un menu que se pueue mantenei fácilmente ya que esta en un solo aichivo, peio aplica a vaiios estauos ue la aplicacion. 6.10 Crear el TransactionActivity La segunua accion que se uebe implementai en el contiolauoi banking es 'sbowTronsoctionActivity' cuyo objetivo es mostiai los extiactos bancaiios uel cliente en caua una ue sus cuentas. Paia empezai, se uebe peimitii al cliente que seleccione las cuentas en las que uesea vei sus extiactos y luego mostiailos paginanuo los iesultauos y uai la opcion ue impiimiilos. La implementacion ue la accion sbowTronsoctionActivity consulta las cuentas uel cliente y las visualiza en la piesentacion ue ella. Ya que el pioceuimiento paia obtenei las cuentas activas uel cliente se habia implementauo en la accion cbeckBolonce, se uefine el métouo piivauo _qetActiveAcounts{) paia hacei ieusable el pioceuimiento mencionauo y usailo en sbowTronsoctionActivity. El contiolauoi queua entonces asi: <?php class BankingController extends ApplicationController { protected function initialize(){ $this->setTemplateAfter("menu"); } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S2 public function indexAction(){ } private function _getActiveAccounts(){ $userData = SessionNamespace::get('UserData'); $customerId = $userData->getCustomer(); return $this->Account->find("customer_id='$customerId' AND status = 'A'"); } public function checkBalanceAction(){ $this->setParamToView("accounts", $this->_getActiveAccounts()); } public function showTransactionActivityAction(){ $this->setParamToView("accounts", $this->_getActiveAccounts()); } } La vista en el aichivo opps,bonk,views,bonkinq,sbowTronsoctionActivity.pbtml contiene un foimulaiio uonue el usuaiio selecciona las cuentas y un boton ue 'vei extiactos': <?php if(count($accounts)>0){ print "<p>Por favor seleccione las cuentas a consultar:</p>"; print Tag::form("banking/getSelectedActivity"); print "<table align='center' border='1'> <thead> <tr> <th></th> <th>N&uacute;mero Cuenta</th> <th>Oficina</th> </tr> </thead> <tbody>"; foreach($accounts as $account){ print "<tr> <td>".Tag::checkboxField("cuenta[]", "value: {$account- >getId()}", “checked: checked”)."</td> <td align='center'>{$account->getNumber()}</td> <td align='center'>{$account->getSucursalId()}</td> </tr>"; } print "</tbody></table><p align='center'>"; print Tag::submitButton("Consultar"); print "</p>"; print Tag::endForm(); } else { Flash::notice("No tiene cuentas activas en nuestro banco"); } ?> La uesciipcion ue la vista anteiioi es la siguiente: • Se contiola que haya cuentas activas contanuo los iegistios uevueltos y piesentanuo un mensaje infoimativo en su uefecto. • El helpei Toq::form{strinq $oction) peimite la cieacion ue una etiqueta ue foimulaiio LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS cuya accion es ,bonkinq,qetSelecteJActivity. • Se iecoiien las cuentas activas y poi caua una se geneia una fila con un checkbox que poi uefecto esta seleccionauo. • El helpei Toq::submitButton{strinq $coption) peimite cieai el boton ue 'Consultai', al hacei click en él se enviaiá la infoimacion a la accion mencionaua. • El helpei Toq::enJIorm{) cieiia el foimulaiio. La columna ue la sucuisal visualiza el couigo ue esta tal y como está en la tabla lo cual no es muy amigable paia el usuaiio final. Las asociaciones pueuen iesolvei esto y obtenei el uetalle ue la sucuisal poi caua cuenta en foima natuial. Se uefine una multipliciuau n a 1 en el mouelo 'Account' asi: <?php class Account extends ActiveRecord { /* getters y setters */ /** * Devuelve el saldo total de la cuenta * * @return double */ public function getBalanceTotal(){ return $this->balance+$this->swap_balance; } /** * Inicializa el modelo * */ public function initialize(){ $this->belongsTo("sucursal"); } } Be esta foima se pueue ieemplazai la linea ue la vista showTiansactionActivity.phtml en uonue se impiime el couigo ue la sucuisal poi: <td align='center'>{$account->getSucursal()->getName()}</td> Al enviai los uatos uel foimulaiio a la accion bonkinq,qetSelecteJActivity, se iecibe las cuentas seleccionauas y consulta los movimientos asociauos a estas: <?php class BankingController extends ApplicationController { protected function initialize(){ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S4 $this->setTemplateAfter("menu"); } public function indexAction(){ } private function _getActiveAccounts(){ $userData = SessionNamespace::get('UserData'); $customerId = $userData->getCustomer(); return $this->Account->find("customer_id='$customerId' AND status='A'"); } public function checkBalanceAction(){ $this->setParamToView("accounts", $this->_getActiveAccounts()); } public function showTransactionActivityAction(){ $this->setParamToView("accounts", $this->_getActiveAccounts()); } public function getSelectedActivityAction(){ $selectedAccountsIds = $this->getPostParam("cuenta"); $customerAccounts = array(); if(is_array($selectedAccountsIds)){ $userData = SessionNamespace::get('UserData'); $customerId = $userData->getCustomer(); foreach($selectedAccountsIds as $accountId){ $accountId = $this->filter($accountId, "int"); $existsAccount = $this->Account->count("customer_id = '$customerId' AND id='$accountId' AND status='A'"); if($existsAccount==true){ $customerAccounts[] = $accountId; } else { Flash::error("Cuentas invalidas en la peticion"); return; } } } else { Flash::error("Datos invalidos en la peticion"); return; } $movements = $this->Movement->find("account_id IN (".join(", ", $customerAccounts).")", "order: created_at DESC"); $this->setParamToView("movements", $movements); } } La explicacion uel pioceuimiento es la siguiente: • Se obtienen las cuentas seleccionauas uel foimulaiio meuiante $selecteJAccountslJs = $tbis-~qetPostPorom{"cuento"); • En la siguiente linea se valiua que el valoi obteniuo sea un vectoi con las cuentas • Luego se valiua que caua una ue las cuentas que es enviaua sea iealmente uel cliente activo en la sesion y que la cuenta esté activa. • Bespués ue filtiai las cuentas se consulta el movimiento asociauo a estas, se envia los iesultauos a la vista uonue en una tabla paginaua se piesentan los iegistios. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS Cieacion ue Aplicaciones 7 Aplicaciones en Kumbia Enterprise 7.1 Introducción 0na aplicacion web es una extension uinámica ue un sitio web o un seiviuoi ue aplicaciones. Existes 2 tipos ue aplicaciones web: • [8(#$%,-,7 , 3, K8#7#$%,+(:$5 Son aplicaciones que geneian páginas web uinámicas usanuo uifeientes lenguajes ue maicas (BTNL, XNL, etc) y tecnologias como (CSS, }avaSciipt, etc) geneianuo conteniuos ue iespuesta ue acueiuo a las peticiones iecibiuas. • [8(#$%,-,7 , '#8M(+(.75 Implementan enupoints paia seivicios web. Aplicaciones oiientauas a la piesentacion suelen sei clientes ue las oiientauas a seivicios. Kumbio Fnterprise Iromework {KFI) piopoiciona un completo y iobusto entoino paia el uesaiiollo, testeo, implementacion y puesta en piouuccion ue ambos tipos ue aplicaciones web usanuo tecnologia PBP. 7.2 Instancias del framework 0na instancia uel fiamewoik hace iefeiencia a una uistiibucion uel fiamewoik que iesiue en un seiviuoi web. Las instancias pueuen contenei una o más aplicaciones compaitienuo una misma veision uel fiamewoik y un mismo uiiectoiio público. Las instancias pueuen veise también como opplicotion contoiners mantenienuo la memoiia y iecuisos ue las aplicaciones en foima sepaiaua peio piopoicionanuo un entoino integiauo ue opeiacion. 7.3 Estructura de directorios de una Instancia La estiuctuia ue aichivos ue una instancia ue Kumbio Fnterprise Iromework tiene lo siguiente: E(7%,-.5 /7%8"+%"8, -# -(8#+%.8(.7 28#-#%#81($,-, LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S6 apps/ default/ controllers/ application.php config/ filters/ library/ models/ base/ plugins/ validators/ views/ config/ languages/ Library/ public/ javascript/ css/ files/ temp/ img/ index.php scripts/ test/ index.php La uesciipcion ue caua uiiectoiio es la siguiente: T,93,5 6#7+8(2+(:$ -# -(8#+%.8(.7 -#3 *8,1#R.8S 6(8#+%.8(. 6#7+8(2+(:$ apps El uiiectoiio apps contiene touas las aplicaciones que usen la misma veision uel fiamewoik uefault Es la aplicacion poi uefecto, el Fiont-Contiollei paia esta aplicacion peimite acceuei uiiectamente a los contiolauoies sin inuicai el nombie ue la aplicacion. contiolleis Es el uiiectoiio en el que se ueben ubicai touos contiolauoies. application.php Contiene la clase ContiolleiBase ue la cual heieuan touos los contiolauoies y en uonue también uefinimos el métouo init config Contiene los aichivos ue configuiacion poi aplicacion y peisonalizaua ue aplicacion filteis Contiene filtios peisonalizauos poi usuaiio. Es opcional la piesencia ue este uiiectoiio. libiaiy Contiene componentes peisonalizauos poi aplicacion. Es opcional la piesencia ue este uiiectoiio. mouels Aqui se ueben ubicai touos los mouelos ue la aplicacion, Kumbia LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S7 Enteipiise Fiamewoik peimite oiganizai logicamente en uiiectoiios los giupos ue mouelos. views Peimite cieai la piesentacion ue aplicaciones meuiante el componente view. plugins Es posible cieai plugins que aumenten la funcionaliuau ue la implementacion NvC. valiuatois Peimiten cieai valiuauoies paia ActiveRecoiu que se ayuuen a valiuai la logica ue uatos. config Contiene la configuiacion geneial uel fiamewoik languages Contiene los mensajes localizauos uel fiamewoik. Libiaiy Contiene al fiamewoik como tal y libieiias ue teiceios public Bace el papel ue BocumentRoot (iaiz ue uocumentos) ue la aplicacion, touo los aichivos uebajo ue este uiiectoiio pueuen sei acceuiuos públicamente. En sus subuiiectoiios se encuentia touo el conteniuo estático como imágenes, javasciipt, css y aichivos uescaigables. sciipts Contiene sciipts que automatizan taieas en el fiamewoik y ieuucen la couificacion manual. test Contienen test ue uniuau ue los fiamewoik. La estiuctuia ue uiiectoiios esta pensaua buscanuo convencion sobie configuiacion, asi el uesaiiollo piouuciuo es más mantenible y se hace más eficiente el uesaiiollo cuanuo touo se encuentia en su lugai. 7.4 Publicar contenido estático El uiiectoiio public en la estiuctuia ue aichivos está uestinauo a publicai conteniuo estático que es visible públicamente. Cualquiei aichivo ubicauo en este uiiectoiio o en un subuiiectoiio pueue sei acceuiuo poi los clientes ue la aplicacion. Con el fin ue establecei ubicaciones que hagan más mantenibles las aplicaciones se incluyen poi uefecto los siguientes subuiiectoiios: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S8 '"9-(8#+%.8(. 6#7+8(2+(:$ img Contiene imágenes pieuefiniuas uel fiamewoik y su objetivo es colocai aqui imagenes a sei usauas poi la aplicacion. css Contiene aichivos ue estilos CSS. El aichivo style.css contiene las uefiniciones ue estilos estánuaies paia touas las aplicaciones. javasciipt Está uestinauo a almacenai aichivos }avaSciipt. El fiamewoik coloca en este uiiectoiio los fiamewoiks y funciones básicas }avaSciipt. temp Biiectoiio paia aichivos tempoiales. files Biiectoiio paia aichivos a uescaigai. El uesaiiollauoi uebe tenei en cuenta que cuanuo un conteniuo en estos uiiectoiios no existe la peticion es uiieccionaua a la aplicacion. Evitai las peticiones a aichivos inexistentes es una buena piáctica en miias a mejoiai el ienuimiento ue las aplicaciones. 7.5 Bootstrap En cualquiei estiuctuia NvC el boostiap cumple el papel ue tomai la 0RL ieesciita e invocai tanto el Bispotcber como los eniutauoies necesaiios paia ejecutai la peticion. Paia entenuei la foima en la que el Bispotcber busca el contiolauoi en las aplicaciones y ejecuta la accion asociaua es necesaiio compienuei la foima en la que ueben foimai las 0RLs antes ue geneiai una peticion. Paia una estiuctuia ue uiiectoiios que incluye 2 aplicaciones, la piimeia uefault y la segunua que se llama piouuccion que ilustiamos asi: /0#123.5 /7%8"+%"8, -# -(8#+%.8(.7 2,8, 1G3%(23#7 ,23(+,+(.$#7 empresa/ apps/ default/ controllers/ clientes_controller.php productos_controller.php config/ models/ views/ produccion/ controllers/ compras_controller.php config/ models/ views/ 0na peticion al contiolauoi clientes seiia asi: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S9 /0#123.5 B++#-#8 , 3,7 ,23(+,+(.$#7 \ +.$%8.3,-.8#7 -#7-# "$, ;<E http://www.ejemplo.com/empresa/clientes/ http://www.ejemplo.com/empresa/clientes/buscar http://www.ejemplo.com/empresa/clientes/consultar/18 En uonue, el uominio uel seiviuoi es www.ejemplo.com, la iuta al fiamewoik es empiesa (en este uiiectoiio uel BocumentRoot esta el fiamewoik), el nombie uel contiolauoi es clientes, la accion en la teiceia 0RL seiia consultai y el paiámetio paia esta accion es el númeio 18. 0na peticion paia la aplicacion ue piouuccion se coloca el nombie ue esta uespués uel uiiectoiio uonue esta Kumbio Fnterprise Iromework, asi: /0#123.5 B++#-#8 , 3, ,23(+,+(:$ -# 28.-"++(:$ -#7-# "$, ;<E http://www.ejemplo.com/empresa/produccion/compras/ http://www.ejemplo.com/empresa/produccion/verEstado/22 Caua aplicacion uentio ue apps contiene una estiuctuia ue uiiectoiios paia contiolauoies, mouelos y vistas única, la foima ue acceuei a caua aplicacion es inuicanuo su nombie antes uel nombie uel contiolauoi. 7.6 Crear la acción por defecto en una Aplicación La clase ControllerBose ubicaua en opps,Jefoult,controllers,opplicotion.pbp peimite uefinii el métouo init que se ejecuta en caso que no se uefina un contiolauoi o accion poi uefecto: /0#123.5 B++(:$ 2.8 -#*#+%. #$ "$, ,23(+,+(:$ <?php class ControllerBase { public function init(){ //Cargar algunas extensiones Extensions::loadExtension("Kumbia.ApplicationMonitor"); Extensions::loadExtension("Kumbia.Acl"); //Enrutar al controlador login Router::routeTo("controller: login"); } } 7.7 Crear un procedimiento de inicialización de la aplicación El métouo ControllerBose::init es ejecutauo si no se especifica un contiolauoi en la 0RL, en cieitas ocasiones pueue que no sea útil si se iequieie inicializai extensiones o ejecutai algún LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 6u pioceso ue inicializacion. El métouo ControllerBose::onStortApplicotion iesulta más apiopiauo, en estos casos. Este métouo solo ejecuta un pioceuimiento en cuanto se iealiza la piimeia peticion a la aplicacion. El siguiente ejemplo ilustia mejoi el funcionamiento ue este métouo: /0#123.5 6#*($(8 "$ 28.+#-(1(#$%. -# ($(+(,3(>,+(:$ -# 3, ,23(+,+(:$ <?php class ControllerBase { public function onStartApplication(){ //Cargar algunas extensiones Extensions::loadExtension("Kumbia.Feed"); Extensions::loadExtension("Kumbia.Acl"); } public function init(){ //Enrutar al controlador login Router::routeTo("controller: login"); } } También se uebe evitai iealizai cualquiei tipo ue saliua al exploiauoi ya que este métouo es ejecutauo antes ue inicializaise el contexto ue sesion. 7.8 Detectar un cambio en la ejecución de una instancia a otra En la clase ControllerBose también es posible implementai el métouo onCbonqelnstonceFvent que es ejecutauo cuanuo se uetecta que en la misma sesion se ha ejecutauo ya una aplicacion en otia instancia ue Kumbio Fnterprise Iromework. <?php class ControllerBase { public function onChangeInstanceEvent(){ //Se ha cambiado la instancia } } Es posible que este evento no se llame coiiectamente si las aplicaciones e instancias tienen auaptauoies ue sesion uifeientes. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 61 Paite 1: La logica ue uominio 8 Componente Controller 8.1 Introducción El componente Controller cumple una impoitante taiea uentio ue la aiquitectuia NvC ue Kumbia. El fiamewoik piopoiciona la integiacion ue este componente con el componente view y ActiveRecorJ que iealiza el papel ue los mouelos. La integiacion ue estos componentes piopoiciona una estiuctuia estable y eficiente paia las aplicaciones oiientauas a la Web. Auemás ue esto, el componente ofiece un sistema ue peisistencia tianspaiente al uesaiiollauoi que aceica las aplicaciones Web a aplicaciones ue esciitoiio, eliminanuo la complejiuau ue auministiai el estauo y entoino ue la logica ue negocios en una sesion. Poi meuio ue plug-ins es posible extenuei la funcionaliuau ue este componente. 8.2 Como funciona el componente Controller? Kumbio Fnterprise Iromework ha implementauo una estiuctuia jeiáiquica ue clases que peimiten cieai uifeientes tipos ue seivicios y uesaiiollai la logica ue aplicacion en uifeientes niveles ue flexibiliuau o piacticiuau. El componente Controller posee la siguiente jeiaiquia ue clases e implementacion ue seivicios: T,93,5 ]#8,8^"(, -# +3,7#7 -#3 +.12.$#$%# I.$%8.33#8 I3,7# ;9(+,+(:$ 6#7+8(2+(:$ ContiolleiBase apps¡uefault¡contiolleis¡ application.php Es la clase pauie ue touos los contiolauoies, el uesaiiollauoi pueue agiegai métouos que seián heieuauos poi cualquiei contiolauoi ue la aplicacion. Aqui se pueue agiegai valiuacion ue seguiiuau o Auuitoiia ue sistemas. Contiollei Libiaiy¡Kumbia¡Contiollei¡C Es el componente Contiollei en si, LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 62 ontiollei¡Contiollei.php implementa touos los métouos comunes paia los tipos ue contiolauoies uel fiamewoik. ApplicationContiollei Libiaiy¡Kumbia¡Contiollei¡A pplication¡ Application.php El uiseño ue este contiolauoi ayuua al piogiamauoi a inteiactuai con vistas y mouelos ue la foima más uiiecta y flexible. StanuaiuFoim Libiaiy¡Kumbia¡Contiollei¡St anuaiuFoim¡ StanuaiuFoim.php Es una implementacion uel componente Contiollei que funciona como Scallfoluing (geneiauoi ue couigo) uinámico. Busca ayuuai al uesaiiollauoi a cieai captuias ue limitaua peisonalizacion peio que iealizan las opeiaciones ue cieacion, consulta, mouificacion, iepoite y eliminacion ue los uatos ue una tabla. WebSeiviceContiollei Libiaiy¡Kumbia¡Contiollei¡ WebSeiviceContiollei¡ ApplicationContiollei.php Este tipo ue contiolauoi Peimite cieai Seivicios web basauos en el estánuai S0AP, geneiai uesciipciones en WSBL y oiquestai el inteicambio ue uatos entie aplicaciones usanuo este métouo. NultiThieauContiollei Libiaiy¡Kumbia¡Contiollei¡A pplication¡ NultiThieauContiollei.php Es una sub-implementacion ue ApplicationContiollei que está uiseñaua paia coiiei piocesos ue negocio que iequieian seguimiento estilo cioss-cutting. El objetivo ue caua contiolauoi es básicamente sepaiai la logica ue la piesentacion, el componente Controller implementa el pation Iront-Controller en el cual touas las peticiones a la aplicacion son atenuiuas inicialmente poi él y luego son eniutauas a contiolauoies ue usuaiio y acciones que atienuen caua una. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 6S 8.3 Crear un Controlador Los contiolauoies son clases que heieuan ue las implementaciones ue Contiolauoies como ApplicationContiollei o WebSeiviceContiollei y que ueben sei cieauos bajo cieitas convenciones en el uiiectoiio apps¡uefault¡contiolleis¡ Al cieai un contiolauoi paia la auministiacion ue la infoimacion ue clientes se ciea un aichivo llamauo customei_contiollei.php, en él una clase CustomeiContiollei heieuanuo ue alguna ue las implementaciones uel componente Contiollei. La accion poi uefecto en el contiolauoi uebe tenei visibiliuau pública y llamaise inuexAction asi: /0#123.5 ;$ +.$%8.3,-.8 \ 7" ,++(:$ 2.8 -#*#+%. <?php class CustomerController extends ApplicationController { public function indexAction(){ $this->renderText("Hola Mundo"); } public function getStatusAction($id){ $this->renderText("Ver el estado del cliente $id"); } } Paia iealizai una peticion a la aplicacion se hace meuiante la siguiente 0RL: /0#123.5 B++#-#8 ,3 +.$%8.3,-.8 1#-(,$%# "$, ;<E http://www.example.com/company/customer/index http://www.example.com/company/customer/ Ya que inuex es la accion poi uefecto no es necesaiio inuicaila, ya que es implicita. El inuicaila piouuciiia el mismo iesultauo. Paia acceuei a la accion qetStotus se hace ue la siguiente foima: /0#123.5 B++#-#8 , "$, ,++(:$ 2#87.$,3(>,-, -#7-# "$, ;<E http://www.example.com/company/customer/getStatus/190 • El componente Contiollei esta integiauo con el componente view que implementa el pation Templote view. Esta integiacion peimite que en cuanto teimina la ejecucion ue la logica en la accion automáticamente se ienueiiza la piesentacion o vista coiiesponuiente al contiolauoi y accion solicitauos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 64 • El funcionamiento uel componente Controller se apoya tanto en Bispotcber como en Router paia iealizai touo el tiabajo al atenuei una peticion a la aplicacion. No es necesaiio entenuei el funcionamiento ue estos componentes en uetalle aunque si se uesea extenuei la funcionaliuau ue la aiquitectuia implementaua en Kumbio Fnterprise Iromework pueue iesultai útil • Piimeio la clean 0RL es fiagmentaua usanuo el métouo Router::rewrite aqui se ueteimina que aplicacion, contiolauoi y accion se iequieie ejecutai. El componente Routei es quien iealiza la oiquestacion ue touo el flujo ue ejecucion. • El componente Bispatchei iecibe los paiámetios ue contiolauoi y accion y busca el inuicauo en el uiiectoiio ue contiolauoies paia su piocesamiento y uelegacion a la opeiacion iequeiiua. • Antes ue ejecutai la peticion Bispotcber busca si esta uefiniuo el métouo o atiibuto beforeIilter en la clase uel contiolauoi o en su jeiaiquia y lo ejecuta. • Si el flujo ue la ejecucion no ha siuo cambiauo meuiante el métouo Controller::routeTo entonces ejecuta la accion solicitaua en el contiolauoi. La accion tiene acceso a touo el entoino BTTP e infoimacion enviaua poi métouos P0ST, uET, P0T, etc. • Si no cambia el flujo ue ejecucion Bispotcber busca si esta uefiniuo el métouo o atiibuto ofterIilter en la clase contiolauoia en su jeiaiquia ue clases y lo ejecuta. • El pioceso ue eniutamiento es ciclico y teimina solo cuanuo se ueja o no se invoca el métouo Controller::routeTo. • El Compontente view toma el contiol y iecibe lo geneiauo poi Contiollei y visualiza la piesentacion paia éste, en caso ue que exista. El pation Iront-Controller junto con HoJel-view-Controller funciona como el coiazon el fiamewoik e integia los componentes Contiollei, Routei, Bispatchei y Coie paia haceilo funcionai. Cuanuo iequeiimos ue entenuei o mouificai la ejecucion uel flujo ue aplicacion nos iemitimos a los seivicios que estos componentes piopoicionan. 8.4 Servicios del Componente Router voiJ Router::rewrite{strinq $url) Toma la clean 0RL y fiagmenta caua componente localizanuo la aplicacion, contiolauoi y accion solicitauos, este métouo es llamauo automáticamente en el bootstiap uel fiamewoik ubicauo en public¡inuex.php. ceuula LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 6S voiJ Router::ifRouteJ{) Antes ue la ejecucion ue cualquiei accion busca en la tabla ue eniutamiento estático geneiaua a paitii ue config¡ioutes.ini si se uebe eniutai a otia contiolauoi o accion uinámicamente. booleon Router::qetRouteJ{) Este métouo uevuelve el estauo uel ioutei que inuica si es necesaiio hacei una eniutacion o continuai con el flujo noimal ue la aplicacion. strinq Router::qetApplicotion{) Bevuelve el nombie ue la aplicacion que fue solicitaua en la peticion. strinq Router::qetHoJule{) Bevuelve el nombie uel mouulo que fue solicitauo en la peticion. strinq Router::qetController{) Bevuelve el nombie uel contiolauoi que fue solicitauo en la peticion. Esta infoimacion auicionalmente se pueue obtenei usanuo el métouo en el contiolauoi llamauo getContiolleiName(). strinq Router::qetAction{) Bevuelve el nombie ue la accion que fue solicitaua en la peticion. Esta infoimacion auicionalmente se pueue obtenei usanuo el métouo en el contiolauoi llamauo getActionName(). strinq Router::qetlJ{) Bevuelve el piimei paiámetio enviauo poi 0RL en la peticion. orroy Router::qetPorometers{) Bevuelve en un aiiay los paiámetios enviauos poi 0RL en la peticion, estos igualmente se les hace binuing a la accion como paiámetios uel métouo ejecutauo ue la clase contiolauoia. orroy Router::qetAllPorometers{) Bevuelve un aiiay con touos los fiagmentos ue la 0RL solicitaua en la peticion. orroy Router::routeTo{mixeJ $poroms) Peimite cambiai el flujo ue ejecucion ue la aplicacion tiansfiiiénuoselo a otio contiolauoi y¡o LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 66 accion. orroy Router::routeTo0Rl{strinq $uri) Peimite cambiai el flujo ue ejecucion ue la aplicacion tiansfiiiénuoselo a otio contiolauoi y¡o accion meuiante un 0nifoim Resouice Iuentifiei. strinq Router::qetActiveApplicotion{) Bevuelve el nombie ue la aplicacion actual. Cuanuo es la aplicacion poi uefecto uevuelve la palabia uefault. voiJ Router::setApplicotion{strinq $nome) Peimite establecei uinámicamente el nombie ue la aplicacion actual. voiJ Router::setBefoultActionNome{strinq $octionNome) Peimite establecei el nombie ue la accion poi uefecto en touos los contiolauoies. strinq Router::qetBefoultActionNome{) Bevuelve el nombie ue la accion poi uefecto en touos los contiolauoies. 8.5 Servicios proporcionados por Dispatcher voiJ Bispotcber::setControllersBir{strinq $Jirectory) Peimite establecei el uiiectoiio ue contiolauoies usauo paia hacei el lookup ue un contiolauoi cuanuo se iealiza una peticion. Controller Bispotcber::qetControllerlnstonce{) Bevuelve el objeto contiolauoi instanciauo que se está ejecutanuo. int Bispotcber:.qetBispotcbStotus{) Bevuelve el estauo actual uel flujo ue ejecucion. Pueue sei alguna ue las constantes ue la clase Bispatchei: • STAT0S_0NINITIALIZEB: Inuica que no se ha iniciauo el pioceso ue ejecucion • STAT0S_BISPATCBINu: Inuica que se esta localizanuo el contiolauoi y su accion solicitaua LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 67 • STAT0S_R0NNINu_BEF0RE_FILTERS: Inuica que se están localizanuo los métouos y atiibutos befoieFiltei y se están ejecutanuo. • STAT0S_R0NNINu_AFTER_FILTERS: Inuica que se están localizanuo los métouos y atiibutos afteiFiltei y se están ejecutanuo. • STAT0S_RENBER_PRESENTATI0N: Inuica que el contiol ue la aplicacion fue tiansfeiiuo al componente view. • STAT0S_R0NNINu_BEF0RE_ST0RE_PERSISTENCE: Inuica que se va a iealizai el pioceuimiento ue almacenamiento ue los uatos peisistentes uel contiolauoi. • STAT0S_R0NNINu_AFTER_ST0RE_PERSISTENCE: Inuica que se ha iealizauo el pioceuimiento ue almacenamiento ue los uatos peisistentes uel contiolauoi. • STAT0S_R0NNINu_C0NTR0LLER_ACTI0N: Inuica que el contiol ue ejecucion lo tiene el contiolauoi como tal y su accion solicitaua. booleon Bispotcber::isRunninqController{) Inuica si el contiol ue ejecucion esta a nivel uel contiolauoi y no uel fiamewoik. booleon Bispotcber::isRunninq0serlevel{) Inuica si la ejecucion esta a nivel ue la logica uel uesaiiollauoi y no uel fiamewoik. mixeJ Bispotcber::qetvolueReturneJ{) Bevuelve el valoi que ietoino la última accion ejecutaua en la peticion. 8.6 Excepciones Generadas en el Dispatcher En el pioceso uel Bispotcber pueuen ocuiiii excepciones que son enviauas uiiectamente al cliente si no se encuentia uefiniuo el métouo onFxception ya sea en el contiolauoi o en ControllerBose. Las excepciones ocuiiiuas en Bispotcber lanzan una excepcion ue clase BispotcberFxception en las siguientes ciicunstancias: T,93,5 I:-().7 \ -#7+8(2+(:$ -# #H+#2+(.$#7 )#$#8,-,7 #$ 6(72,%+C#8 I:-(). 6#7+8(2+(:$ Bispatchei::N0T_F00NB_ACTI0N Se geneia cuanuo no existe un métouo con el nombie ue la accion inuicauo en la clase contiolauoia y auemás no existe la accion notIounJAction. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 68 Bispatchei::N0T_F00NB_C0NTR0LLER Se geneia cuanuo no se encuentia el contiolauoi solicitauo peio si existe el aichivo coiiecto. Bispatchei::N0T_F00NB_FILE_C0NTR0LLER 0cuiie cuanuo no existe el aichivo uel contiolauoi y poi enue la clase uel mismo al solicitai la peticion a este. Bispatchei::N0T_F00NB_INIT_ACTI0N 0cuiie cuanuo se esta tiatanuo ue ejecutai el métouo init en ContiolleiBase peio este no se ha uefiniuo o su visibiliuau no es pública. Bispachei:: INvALIB_NETB0B_CALLBACK Se geneia cuanuo se tiata ue invocai exteinamente el constiuctoi ue la clase contiolauoia o un métouo piotegiuo o piivauo. Bispatchei::INvALIB_ACTI0N_vAL0E_PARANETER Se geneia cuanuo no se ha enviauo poi la 0RL o al ieuiieccionai a una ueteiminaua accion se ha omitiuo el valoi paia un paiámetio ue una accion en el contiolauoi solicitauo. Como se ha mencionauo anteiioimente es posible uefinii un métouo que actúe como una capa pievia al lanzamiento ue la excepcion al usuaiio llamaua onFxception. Esta iecibe el objeto instanciauo ue la excepcion geneiaua, este métouo iecibe auemás cualquiei excepcion inuepenuiente ue si geneia en Bispotcber o uentio uel mismo contiolauoi: /0#123.5 6#*($(8 "$ 1_%.-. ^"# ,-1($(7%8# 3,7 #H+#2+(.$#7 #$ +.$%8.3,-.8#7 <?php class CustomerController extends ApplicationController { public function indexAction(){ } public function onException($e){ if($e instanceof DispatcherException){ if($e->getCode()==Dispatcher::NOT_FOUND_ACTION){ Flash::notice(“Lo sentimos la página no existe”); } } else { //Se relanza la excepción LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 69 throw $e; } } } 4.%,5 0na excepcion que se piesenta fiecuentemente es la INvALIB_ACTI0N_vAL0E_PARANETER, que se geneia cuanuo se omite en la 0RL un paiámetio uel métouo ue la accion que no es opcional o que tiene un valoi poi uefecto. Kumbio Fnterprise Iromework es estiicto en este sentiuo y geneiaiá una excepcion cuanuo se omita un valoi aunque PBP en si geneiaiia solo una auveitencia. La foima más piáctica ue evitai esto es asignai valoies pieueteiminauos a caua paiámetio uel métouo hacienuo la logica ue aplicacion más consistente evitanuo mensajes en la pantalla uel cliente (exploiauoi, consola, etc). Este tipo ue excepciones también se geneian al iealizai el eniutamiento y omitii el valoi ue algún paiámetio. 8.7 Peticiones HTTP a Controladores Cuanuo se iealiza una peticion a un contiolauoi meuiante piotocolo BTTP es posible cieai el objeto ue peticion ContiolleiRequest y auemás utilizai métouos que ayuuan a inteiactuai con los uatos enviauos a estos como poi ejemplo cuanuo se usan foimulaiios BTNL. La instancia ue ContiolleiRequest se pueue obtenei en el contiolauoi usanuo el métouo Controller::qetRequestlnstonce{), el objeto obteniuo encapsula toua la infoimacion enviaua en la peticion BTTP y la infoimacion ue su entoino paia sei utilizaua uentio uel contiolauoi: /0#123.5 [9%#$#8 "$ ($7%,$+(, -# 3, +3,7# I.$%8.33#8<#^"#7% <?php class CustomerController extends ApplicationController { public function indexAction(){ $request = $this->getRequestInstance(); if($request->isPost()==true){ Flash::notice(“La petición se ha realizado por método http POST”); } } /** * Devuelve el nombre del cliente usando JSON solo si la petición * fue realizada con AJAX */ public function getCustomerClientAction(){ $this->setResponse(“json”); $request = $this->getRequestInstance(); if($request->isAjax()==true){ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 7u $this->renderText($this->jsonEncode(array(“name” => “John Smith”))); } } } Los valoies ue las vaiiables supeiglobales $_uET, $_P0ST, $_C00KIE, $_REQ0EST, $_SERvER Y $_ENv pueuen sei accesauos usanuo los métouos ue ControllerRequest usanuo qetPorom6et, qetPoromPost, qetPoromCookie, qetPoromServer y qetPoromFnv. Be igual foima pueue utilizai los métouos uel contiolauoi qetµueryPorom, qetPostPorom, qetRequestPorom, qetCookiePorom, qetServerPorom y qetFnvPorom paia obtenei estos valoies sin obtenei la instancia ue la clase ControllerRequest aunque esto se haga implicitamente. `OaOb B-1($(7%8,8 ,8+C(M.7 ,-0"$%.7 #$ "$, 2#%(+(:$ Los aichivos aujuntos en una peticion pueuen sei auministiauos usanuo los métouos ue ControllerRequest llamauos bosIiles, qetPoromIile y qet0plooJeJIiles. <?php class Movement extends ApplicationController { public function loadMovementAction(){ if($this->getRequestInstance()->hasFiles()==true){ foreach($this->getRequestInstance()->getUploadedFiles() as $file){ print "Nombre original del archivo: ".$file- >getFileName(); print "Tamaño del archivo: ".$file->getFileSize(); print "MIME del archivo: ".$file->getFileType(); print "Nombre Temporal: ".$file->getTempName(); $file->moveFileTo('movement/'.$file->getFileName()); } } } } `OaOP BKZ -# I.$%8.33#8<#^"#7% Auicional a los métouos mencionauos anteiioimente la iefeiencia uel API ue ControllerRequest auemás tiene: voiJ setPoromRequest{strinq $inJex, mixeJ $volue) Cambia un valoi enviauo en una peticion en la supeiglobal $_REQ0EST. Este métouo automáticamente actualiza $_P0ST y $_uET si es necesaiio. voiJ setPorom6et{strinq $inJex, mixeJ $volue) Cambia un valoi enviauo en una peticion en la supeiglobal $_uET. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 71 voiJ setPoromPost{strinq $inJex, mixeJ $volue) Cambia un valoi enviauo en una peticion en la supeiglobal $_P0ST. voiJ setPoromCookie{strinq $inJex, mixeJ $volue) Cambia un valoi enviauo en una peticion en la supeiglobal $_C00KIE. booleon isSetRequestPorom{$inJex) Inuica si existe una llave paia un valoi en la supeiglobal $_REQ0EST. booleon isSetµueryPorom{$inJex) Inuica si existe una llave paia un valoi en la supeiglobal $_uET. booleon isSetPostPorom{$inJex) Inuica si existe una llave paia un valoi en la supeiglobal $_P0ST. booleon isSetCookiePorom{$inJex) Inuica si existe una llave paia un valoi en la supeiglobal $_C00KIE. booleon isSetServerPorom{$inJex) Inuica si existe una llave paia un valoi en la supeiglobal $_SERvER. booleon isSetFnvPorom{$inJex) Inuica si existe una llave paia un valoi en la supeiglobal $_ENv. booleon isSetRequestPorom{$inJex) Elimina un valoi en la supeiglobal $_REQ0EST. Implicitamente elimina el valoi ue $_uET y $_P0ST. booleon isSetµueryPorom{$inJex) Elimina un valoi en la supeiglobal $_uET. booleon isSetPostPorom{$inJex) Elimina un valoi en la supeiglobal $_P0ST. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 72 boolean isAjax() Inuica si la peticion ha siuo iealizaua usanuo A}AX. Funciona cuanuo se utiliza el fiamewoik }avasciipt Piototype. booleon isIlosbRequesteJ{) Inuica si la peticion ha siuo iealizaua uesue un objeto Naciomeuia Flash inciustauo en un sitio Web. booleon isSoopRequesteJ{) Inuica si la peticion ha siuo iealizaua uesue un cliente S0AP. Al solicitaisen este tipo ue peticiones a la aplicacion el auministiauoi ue piesentacion y eniutamiento se cambian paia cieai una comunicacion mocbine-to-mocbine. booleon isSecure{) Inuica si la peticion se iealiza bajo una conexion enciiptaua usanuo BTTPS. strinq qetRowBoJy{) Bevuelve el cueipo ue la peticion BTTP uiiectamente. strinq qetEeoJer{strinq $nome) Bevuelve un encabezauo BTTP a paitii ue su nombie. Funciona anteponienuo el sufijo BTTP_ o sin él. strinq qetScbeme{) Bevuelve el scheme (piotocolo) utilizauo paia iealizai la peticion BTTP. Bevuelve http o https geneialmente. strinq qetEttpEost{) Bevuelve el host y pueito en el que iealizo la peticion. ueneialmente es la ip pública o piivaua uel seiviuoi uonue esta instalauo el inteipiete PBP. strinq qetHetboJ{) Bevuelve el métouo BTTP utilizauo paia hacei la peticion P0ST, uET, P0T, etc. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 7S booleon is6et{) Bevuelve tiue si la peticion BTTP fue iealizaua usanuo métouo uET. booleon isPost{) Bevuelve tiue si la peticion BTTP fue iealizaua usanuo métouo P0ST. booleon isPut{) Bevuelve tiue si la peticion BTTP fue iealizaua usanuo métouo P0T. Es útil cuanuo se ciean aplicaciones REST. booleon is0ptions{) Bevuelve tiue si la peticion BTTP fue iealizaua usanuo métouo 0PTI0NS. Es útil cuanuo se ciean aplicaciones REST. booleon isEeoJ{) Bevuelve tiue si la peticion BTTP fue iealizaua usanuo métouo BEAB. Es útil cuanuo se ciean aplicaciones REST. booleon isBelete{) Bevuelve tiue si la peticion BTTP fue iealizaua usanuo métouo BELETE. Es útil cuanuo se ciean aplicaciones REST. booleon bosIiles{) Inuica si la peticion incluye aichivos subiuos meuiante métouo P0ST. orroy qet0plooJeJIiles{) 0btiene un vectoi con objetos Controller0plooJIile que encapsulan la infoimacion ue aichivos subiuos en la peticion. strinq qetETTPReferer{) 0btiene el BTTP iefeiei ue la peticion. orroy qetAcceptobleContent{) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 74 0btiene un vectoi con los mimes uel tipo ue conteniuo aceptauo poi el cliente BTTP junto con su caliuau. Bevuelve un aiiay como: Aiiay ( •u€ =• Aiiay ( •accept€ =• text¡html •quality€ =• 1 ) •1€ =• Aiiay ( •accept€ =• application¡xhtml‚xml •quality€ =• 1 ) •2€ =• Aiiay ( •accept€ =• application¡xml •quality€ =• u.9 ) •S€ =• Aiiay ( •accept€ =• ƒ¡ƒ •quality€ =• u.8 ) ) orroy qetClientCborsets{) Bevuelve la lista ue iuiomas sopoitauos poi el cliente BTTP junto con su caliuau. Bevuelve un aiiay como: Aiiay ( •u€ =• Aiiay ( •accept€ =• IS0-88S9-1 •quality€ =• 1 ) •1€ =• Aiiay ( •accept€ =• utf-8 •quality€ =• u.7 ) •2€ =• Aiiay ( •accept€ =• ƒ •quality€ =• u.7 ) ) strinq qetBestµuolityCborset{) 0btiene el chaiset ue mejoi caliuau sopoitauo poi el cliente BTTP. 8.8 Respuestas HTTP de Controladores La iespuesta que geneian los contiolauoies en una peticion BTTP es encapsulaua en el objeto ControllerResponse el cual funciona como un 6otewoy entie la vista y el contiolauoi. Este objeto esta implementauo al igual que ControllerRequest con el pation Sinqleton, es uecii que poi caua peticion a la aplicacion solo existiiá una intancia en touo el contexto ue ejecucion. Paia obtenei la instancia ue la clase ControllerResponse se usa el métouo estático qetlnstonce{). /0#123.5 ;7. -#3 .90#%. I.$%8.33#8<#72.$7# <?php class DocumentsController extends ApplicationController { public function indexAction(){ $response = ControllerResponse::getInstance(); $response->setHeader(“Content-Type: application/pdf”); $response->setResponse(ControllerResponse::RESPONSE_OTHER); $response->setResponseAdapter(‘pdf’); } } En el ejemplo anteiioi la accion inuex visualiza un aichivo en foimato PBF que es leiuo en la piesentacion, el métouo setEeoJer establece un encabezauo BTTP apto paia la saliua y auemás inuica a la aplicacion que no uebe utilizai el auaptauoi ue piesentacion poi uefecto (BTNL) sino uebe usai 'puf'. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 7S `O`Ob /7%,93#+#8 #3 %(2. -# 7,3(-, -# 3, K#%(+(:$ El contiolauoi piopoiciona el métouo Controller::setResponse que peimite establecei el tipo ue saliua que se geneia en la accion solicitaua. Los tipos ue saliua que aumite este métouo son los siguientes: T,93,5 T(2.7 -# 8#72"#7%, ^"# ,+#2%, #3 .90#%. I.$%8.33#8<#72.$7# Y,3.8 6#7+8(2+(:$ view Inuica que solo la vista coiiesponuiente a la accion solicitaua seiá la que se visualizaiá. 0sualmente aplica cuanuo se ienueiizan vistas paiciales o fiagmentos A}AX. ajax Realiza lo mismo que 'view' peio uocumenta el couigo más claiamente. json Peimite piouucii saliuas usanuo notacion }S0N (}avaSciipt Seiializable 0bject Notation). xml Piouuce una saliua XNL, agiega el encabezauo Content-type: text¡xml y no muestia ningun layout asociauo. iss Piouuce una saliua XNL agiega el encabezauo encabezauo Content-type: application¡iss‚xml y no muestia ningun layout asociauo. Los valoies ue los tipos ue saliua son inteinamente conveitiuos a un tipo ue saliua sopoitauo poi ControllerResponse: T,93,5 T(2.7 -# 8#72"#7%, ,M,$>,-.7 -#3 .90#%. I.$%8.33#8<#72.$7# Y,3.8 6#7+8(2+(:$ RESP0NSE_N0RNAL Es la iespuesta que se geneia noimalmente. No es necesaiio estableceila. RESP0NSE_0TBER Inuica que no se uebe usai el auaptauoi ue visualizacion poi uefecto poique se geneiaiá una saliua en otio foimato. En el siguiente ejemplo se ilustia como geneiai una saliua usanuo }S0N, la accion countltemsAction implementa una saliua piimeio establecienuo el tipo ue saliua y uespués hacienuo la saliua ue la misma, en qetltemsAction se iesumen los uos pasos anteiioies en una sola linea: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 76 /0#123.5 Z123#1#$%,8 "$, 7,3(-, ]'[4 -#7-# "$ +.$%8.3,-.8 <?php class CartController extends ApplicationController { public $items = array(); public function addToListAction($item){ $this->ítems[] = $item; } public function countItemsAction(){ $this->setResponse(‘json’); $this->renderText($this->jsonEncode(count($this->ítems))); } public function getItemsAction(){ $this->outputJSONResponse($this->ítems); } } 4.%,5 El métouo setResponse tiene una funcionaliuau limitaua poi lo cual ha siuo maicauo como obsoleto, en vez ue este se uebe usai view::setRenJerlevel en conjunto con Controller::setResponseType. `O`OP BKZ -# I.$%8.33#8<#72.$7# El API ue la clase ControllerResponse es: public stotic ControllerResponse qetlnstonce{) 0btiene la instancia uel objeto ControllerResponse. public voiJ setEeoJer{strinq $beoJer, booleon $reploce=true) Peimite establecei un encabezauo BTTP en la peticion actual. El paiámetio $reploce inuica si el encabezauo uebe ieemplazai uno uel mismo tipo estableciuo anteiioimente. public orroy qetEeoJers{booleon $process=true) 0btiene un aiiay con los encabezauos BTTP que van a sei enviauos en la iespuesta ue la peticion. Si el paiámetio $piocess es true uevolveia un aiiay asociativo cuyas claves coiiesponuen a los nombies ue los encabezauos. public booleon bosEeoJer{strinq $beoJerNome) Inuica si ya se ha uefiniuo un encabezauo paia sei enviauo en la iespuesta a la peticion. public voiJ setResponseType{int $type) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 77 Peimite establecei el tipo ue iespuesta que uebe geneiai la peticion. El paiámetio $type iecibe los valoies ue las constantes ControllerResponse::RFSP0NSF_N0RHAl y ControllerResponse:: RFSP0NSF_0TEFR. public inteqer qetResponseType{) 0btiene el tipo ue iespuesta que va a geneiai el contiolauoi. Bevuelve el valoi ue cualquieia ue las S constantes mencionauas anteiioimente. public inteqer setResponseAJopter{strinq $oJopter) Establece el nombie uel auaptauoi utilizauo paia piocesai la saliua ue la peticion. Los posibles valoies paia $oJopter son json, puf y xml. En la iefeiencia uel componente view se explica como utilizai otios auaptauoies. public function qetResponseAJopter{) Bevuelve el auaptauoi usauo paia geneiai la saliua. 8.9 Controlar acciones no encontradas Cuanuo se iealiza una peticion a un contiolauoi y la accion solicitaua no esta implementaua se geneia una excepcion que cuanuo no es contiolaua piesenta infoimacion ue la excepcion al usuaiio ue la aplicacion. La infoimacion ue excepciones piesenta infoimacion técnica que en manos equivocauas pueue peimitii facilitai el ataque a la aplicacion. El uesaiiollauoi pueue implementai la accion notIounJAction ya sea en el contiolauoi o en la jeiaiquia ue clases lo cuál peimitiiá piesentai al usuaiio un mensaje peisonalizauo y piobablemente almacenai un log ue la situacion ocuiiiua. /0#123.5 6#*($(8 "$, ,++(:$ ^"# ,-1($(7%8# 3,7 2#%(+(.$#7 , +.$%8.3,-.%#7 \ ,++(.$#7 ^"# $. #7%#$ -#*($(-,7 <?php class ReportsController extends ApplicationController { public function notFoundAction($actionName=””){ $logger = new Logger(“File”, “notFoundReports.txt”); $logger->log(“No se encontró la acción $actionName”); } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 78 8.10 Filtros en controladores Caua accion ejecutaua en cualquiei contiolauoi ue la aplicacion ejecuta, si están piesentes filtios antes y uespués ue la ejecucion uel métouo solicitauo. Los filtios peimiten ejecutai taieas ue autenticacion, politicas ue seguiiuau, valiuacion y eniutamiento, auemás ue acceuei poi completo al entoino BTTP y mouificai la iespuesta ue la peticion. Los uos tipos ue filtios son: beforeIilter que es ejecutauo antes ue ejecutai la accion solicitaua como tal y ofterIilter que se ejecuta inmeuiatamente uespués. Los filtios son métouos que se implementan uiiectamente como métouos en la clase contiolauoia o en la jeiaiquia ue clases uel mismo. 0sualmente filtios geneiales paia touos contiolauoies se implementan en la clase pauie ControllerBose, ue esta foima inteiceptan touas las peticiones a la aplicacion. /0#123.5 6#*($(8 *(3%8.7 , $(M#3 )#$#8,3 #$ 3, ,23(+,+(:$ <?php class ControllerBase { public function init(){ Router::routeTo("controller: login"); } public function beforeFilter(){ $activeRole = Session::getData("activeRole"); if(Router::getController()=="admin"&&$activeRole!="Administradores"){ Router::routeTo("controller: login", “action: index”); return false; } } } Se uebe uevolvei false uesue beforeIilter cuanuo se iealiza un eniutamiento a otio contiolauoi uifeiente al activo. Cuanuo se implementan múltiples filtios es necesaiio invocai el filtio pauie en el momento inuicauo: /0#123.5 6#*($(+(:$ -# 1G3%(23#7 *(3%8.7 <?php LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 79 class CustomerController extends ApplicationController { public function beforeFilter(){ /** * Algún código de filtro */ parent::beforeFilter(); } } 8.11 Enrutamiento en controladores El componente Router ofiece seivicios que peimiten al uesaiiollauoi alteiai el flujo ue ejecucion como sea necesaiio, ya sea ieesciibienuo 0RLs, ieuiieccionanuo meuiante BTTP o hacienuo eniutamientos a nivel ue contiolauoi. El pioceso ue eniutamiento se iequieie en una aplicacion cuanuo es necesaiio llevai al usuaiio a un contiolauoi y accion sin que sea solicitauo piopiamente poi el mismo. `ObbOb I(+3. -# #$8"%,1(#$%. Poi caua peticion que se iealiza a la aplicacion se inicia un ciclo ue eniutamiento que peimite ejecutai touas las acciones iequeiiuas en los contiolauoies según la logica ue negocio. Este ciclo ejecuta caua accion eniutaua como si se tiataia ue una peticion noimal ue usuaiio. El psuuo-couigo uel ciclo ue eniutamiento es el siguiente: K7#"-.+:-().5 !3"0. \ .8-#$ -# #0#+"+(:$ -# #M#$%.7 #$ +(+3. -# #$8"%,1(#$%. Intentar InvocarEventoDeControlador(“beforeDispatchLoop”) HayEnrutamiento := Verdadero Mientras HayEnrutamiento = Verdadero Hacer HayEnrutamiento := InvocarEventoDeControlador(“beforeDispatch”) HayEnrutamiento := InvocarEventoDeControlador(“beforeExecuteRoute”) EjecutarFiltroBeforeFilter() HayEnrutamiento := EjecutarAccionEnControlador() EjecutarFiltroAfterFilter() HayEnrutamiento := InvocarEventoDeControlador(“afterExecuteRoute”) HayEnrutamiento := InvocarEventoDeControlador(“afterDispatch”) ContinuarMientras InvocarEventoDeControlador(“afterDispatchLoop”) CapturarExcepción InvocarEventoDeControlador(“onExceptions”) FinIntentar Cuanuo teimina el ciclo ue eniutamiento se tiansfieie el contiol ue la aplicacion a la piesentacion (vista), en uonue el compontente view iealiza este tiabajo. `ObbOP /$8"%,8 "7,$-. <."%#8558."%#T. El Componente Routei ofiece el métouo estático routeTo que iealiza las taieas ue eniutamiento y valiua si existen iutas estáticas pieuefiniuas con la piioiiuau uel caso. Es LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 8u posible utilizai paiámetios con nombie paia inuicai la iuta iequeiiua uonue se uesea eniutai. El métouo routeTo ue Controller es un pioxy al métouo estático mencionauo. En el siguiente ejemplo se ilustia la valiuacion ue un usuaiio y su eniutamiento ue acueiuo a si la autenticacion es exitosa o falla: /0#123.5 Y,3(-,+(:$ -# "7",8(. \ #$8"%,1(#$%. +.$-(+(.$,3 <?php class LoginController extends ApplicationController { public function startSessionAction(){ $login = $this->getPostParam('login', 'alpha'); $pass = $this->getPostParam('pass', 'alpha'); if($this->Usuarios->findFirst("login = ’$login’ AND clave = '$pass'")){ Flash::success('Bienvenido '.$this->Usuarios->getNombre()); $this->routeTo('controller: menu'); } else { Flash::error('Permisos Insuficientes/Password Incorrecto'); $this->routeTo('action: startSession'); } } } El métouo routeTo, giacias a los paiámetios poi nombie, pueue iecibii la iuta ue eniutamiento en cualquiei oiuen, usanuo las claves: contiollei, action e iu. Si es necesaiio pasai más paiámetios auicionales pueue usai llaves numéiicas que coinciuan con el oiuen en que la accion iecibe los paiámetios iequeiiuos: Router::routeTo(“controller: invoice”, “action: setMovementDate”, “id: 2008/01/12”, “1: 2008/01/17”); Cuanuo se solicita un eniutamiento con routeTo{) solo es efectivo hasta que teimina la ejecucion ue touo el métouo ue la accion, es posible utilizai ietuin paia salii uel métouo anticipauamente. `ObbOc /$8"%,8 "7,$-. <."%#8558."%#T.;<ZVW También es posible hacei eniutamientos usanuo un 0nifoim Resouice Inuentifiei como lo es una clean 0RL uentio ue la misma logica ue aplicacion. Paia esto se iecuiie al métouo estático Router::routeTo0Rl que iealiza el papel uel mou_iewiite fiagmentanuo la 0RL y conviitiénuola en los valoies inteinos necesaiio paia hacei el eniutamiento. El siguiente ejemplo ilustia la ieesciituia ue una fecha pasaua poi la 0RL estilo Bloggei: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 81 /0#123.5 <##7+8(%"8, -# ;<E 1#-(,$%# <."%#8558."%#T.;<Z <?php class BloggerController extends ApplicationController { public function showPostAction ($year, $month, $date, $name){ $this->routeToURI(“/blogger/showPostByDate/$year-$month- $date/$name”); } public function showPostByDateAction($date, $name) { // alguna lógica aqui } } 8.12 Inicialización de Controladores Bebiuo a que el componente Controller piopoiciona un entoino ue estauo ue peisistencia, los objetos instanciauos ue las clases contiolauoias no son uestiuiuos al teiminai la sesion y son peisistiuos uuiante toua la sesion ue usuaiio. Según lo anteiioi los constiuctoies ue las clases contiolauoias no son confiables paia inicializai las conuiciones ue ejecucion caua vez que se geneia una peticion a los mismos. Poi esta iazon se piopoiciona la posibiliuau ue uefinii el métouo piotegiuo 'initialize' con el fin ue inicializai el objeto uesue la peisistencia en caua peticion al contiolauoi. /0#123.5 Z$(+(,3(>,8 "$ +.$%8.3,-.8 1#-(,$%# ($(%(,3(>#VW <?php class UsuariosController extends StandardForm { public $scaffold = true; public $template = "admin_menu"; public function beforeInsert(){ $clave = sprintf("%04s", mt_rand(0, 9999)); $this->Usuarios->clave = sha1($clave); Flash::success('La clave del Usuario es "'.$clave.'", por favor no la olvide'); } public function beforeUpdate(){ $usuario = new Usuarios(); $usuario->find($this->getRequestParam("fl_id", "int")); $this->Usuarios->clave = $usuario->clave; } public function initialize(){ $this->ignore('clave'); $this->setTextUpper("nombre"); $this->setComboStatic('perfil', array( array('Administradores', 'ADMINISTRADOR'), array('Cajeros', 'CAJERO'), array('Meseros', 'MESERO') )); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 82 $this->setComboStatic("estado", array( array("A", "ACTIVO"), array("I", "INACTIVO") )); } } Este métouo es invocauo tanto en el constiuctoi uel contiolauoi como en el evento __wokeup que ocuiie al ueseiializai el objeto uesue la peisistencia ue sesion. 8.13 Estado de persistencia de Controladores Como se menciono anteiioimente Kumbio Fnterprise Iromework implementa peisistencia uel estauo ue los contiolauoies buscanuo apioximai el uesaiiollo Web a un compoitamiento ue aplicacion ue esciitoiio. Paia activai¡uesactivai la peisistencia es necesaiio invocai el métouo setPersistonce{bool $persitence), en el métouo inicializauoi el contiolauoi. uiacias a la implementacion uel pation base Reqistry en el componente Bispotcber, caua objeto ue una clase contiolauoia instanciaua se almacena tempoialmente y si se iealizan eniutamientos a contiolauoies pieviamente acceuiuos estos no son llevauos a peisistencia poi lo que el estauo ue sesion uel contiolauoi se mantiene intacto como la piimeia vez que se invoco un métouo ue la misma. Al activai la peisistencia el valoi uel atiibuto name se mantiene entie peticiones al contiolauoi: /0#123.5 Z123#1#$%,8 2#87(7%#$+(, #$ #3 +.$%8.3,-.8 <?php class ProductsController extends ApplicationController { public $name; public function indexAction(){ $this->name = “TV 22’”; } public function showProductAction(){ Flash::notice($this->name); } public function initialize(){ $this->setPersistance(true); } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 8S `ObcOb Y#$%,0,7 -#3 /7%,-. -# K#87(7%#$+(, El estauo ue peisistencia o contexto ue conveisacion peimite que: ! Implementai atiibutos mouulaies en los contiolauoies ue tal foima que se haga un uso más intuitivo ue los uatos ue sesion. ! Implementai inteifaces y componentes que "iecueiuen" el estauo que se le uio la última vez que se acceuio a ellos. ! Cieai conveisaciones con el usuaiio ue la aplicacion ue tal foima que contextualmente caua mouulo mantenga un flujo ue tiabajo o pioceso como paite ue su natuialeza ue negocio misma. `ObcOP I.$7(-#8,+(.$#7 -#3 #7%,-. -# K#87(7%#$+(, El estauo ue peisistencia esta pensanuo en uai la posibiliuau ue mantenei los valoies ue los atiibutos ue los contiolauoies con el fin ue establecei un contexto ue conveisacion entie el cliente y la aplicacion. Los contiolauoies en un "estauo" peisistente almacenan los uatos en el auministiauoi ue sesiones, si el volumen ue uatos almacenauo es elevauo el ienuimiento ue la aplicacion pouiia uisminuii. Instancias ue entiuaues y otios objetos complejos que hagan paite ue los uatos ue peisistencia son excluiuos ue los uatos almacenauos uebiuo a la cantiuau ue iecuisos que consumen. Pueue utilizai el componente Cocbe paia almacenai este tipo ue objetos usanuo uiveisos backenus. En el capitulo ue optimizacion y ienuimiento se piesenta el componente 6orboqeCollector que peimite ue foima contiolaua compiimii y¡o eliminai uatos ue estauo ue peisistencia que sean utilizauos poi la aplicacion. `ObcOc T8,$7,++(.$#7 \ I.$+"88#$+(, -#3 /7%,-. -# K#87(7%#$+(, Los contiolauoies con estauo ue peisistencia activo geneian una tiansaccion ue los atiibutos ue al iniciai la ejecucion ue cualquiei accion en el. Nientias se ejecuta la peticion en el contiolauoi la tiansaccion peimanece en un nivel ue isolacion en el cuál no iealiza ningún bloqueo sobie los uatos ue sesion. Se pueue entenuei que se iealizan tiansacciones atomicas con estos uatos peisistentes. Peticiones con un alto giauo ue concuiiencia en la misma sesion ue usuaiio y al mismo contiolauoi pouiian geneiai inconsistencias. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 84 Cuanuo se geneia una excepcion no contiolaua la tiansaccion iealiza un iollback hacienuo que los atiibutos uel contiolauoi peimanezcan intactos a su estauo en la última peticion exitosa. `ObcOd /M#$%.7 -#3 #7%,-. -# K#87(7%#$+(, 0n contiolauoi con el contexto ue peisistencia activauo pueue implementai eventos que peimitan mouificai la estauo inicial al iestauiai el objeto ue su estauo "uoimiuo" y también cual seiá su estauo final antes ue sei almacenauo "uoimii": T,93,5 T(2.7 -# 8#72"#7%, ^"# ,+#2%, #3 .90#%. I.$%8.33#8<#72.$7# /M#$%. 6#7+8(2+(:$ afteiRestoiePeisistence Se geneia cuanuo uespieita el contiolauoi ue su estauo "uoimiuo" en la peisistencia. Esto solo ocuiie cuanuo se iealiza una peticion al contiolauoi. befoieStoiePeisistence Se geneia cuanuo el objeto contiolauoi se esta piepaianuo paia ii a la peisistencia. En el siguiente ejemplo se implementa el evento beforeStorePersitence paia evitai que un uato ue gian tamaño no ielevante se lleve a la peisistencia: /0#123.5 Z123#1#$%,8 "$ #M#$%. -#3 #7%,-. -# 2#87(7%#$+(, <?php class ProductsController extends ApplicationController { public $name; public $veryLongData; public function indexAction(){ $this->name = “TV 22’”; } public function showProductAction(){ Flash::notice($this->name); } public function initialize(){ $this->setPersistance(true); } public function beforeStorePersitence(){ $this->veryLongData = “”; } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 8S 8.14 La Clase ControllerBase Esta clase es la pauie ue touos los contiolauoies, el concepto ue esta clase esta inspiiauo en el pation "ApplicotionController" (no esta ielacionauo con la clase uel mismo nombie), que es una extension al NvC peimitienuo que paite ue la logica ue negocio sea compaitiua poi un clase ue la cual heieuan las uemás. Esta clase auemás siive ue punto ue inteiseccion y peimite ajustai el flujo ue ejecucion ue acueiuo al contexto en el que se invoque. El uesaiiollauoi pueue implementai métouos que seián heieuauos poi cualquiei contiolauoi ue la aplicacion. Es impoitante piotegei la visibiliuau ue la logica compaitiua en esta clase ue tal foima que solo sea utilizaua inteinamente poi los contiolauoies. 8.15 La Clase Controller La clase Controller implementa funcionaliuau compaitiua a touas las implementaciones ue contiolauoies. Esta clase actúa como el coiazon ue la capa ue logica ue uominio. 8.16 Controladores usando ApplicationController `ObeOb I.$%8.3,-.8#7 "7,$-. @"3%(TC8#,-I.$%8.33#8 Este tipo ue contiolauoi es una sub-implementacion ue ApplicotionController cuyo objetivo es pouei implementai piocesamiento asimetiico paia gianues piocesos en contiolauoies. Be esta foima es posible ejecutai en foima simultanea taieas ue seguimiento y monitoiizacion paia piocesos ue negocio. Los piocesos se ejecutan ue foima asincionica y en un oiuen que no pueue sei uenominauo seguio poi lo tanto son aptos paia piocesos ue uebug o monitoiizacion y no paia implementai otios piocesos ue negocio buscanuo su ejecucion simultánea. En el siguiente ejemplo se simula la implementacion ue un pioceso ue negocio que uebiuo a la cantiuau ue uatos que se ueben piocesai pueue taiuai un tiempo piolongauo en piocesaise, si el pioceso fuese más gianue y complejo hacei un seguimiento y monitoiizacion uetallauo pueue uegiauai piogiesivamente la logica misma. El contiolauoi contiene una accion llamaua buqeProcess que contiene el pioceso a ejecutai, la anotacion Çsynchionizeu en el métouo loqProcessStote inuica que este métouo uebe sei ejecutauo simultáneamente con cualquiei accion ejecutaua en el contiolauoi: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 86 class MyProcessController extends MultiThreadController { private $_percent; private $_customerName; /** * Realiza el log del proceso * * @synchronized */ public function logProcessState(){ if($this->_logger==null){ $this->_logger = new Logger('File', 'processLog.txt'); } $this->_logger('El cliente actual es: '.$this->_customerName. ' '.$this->_percent); } public function hugeProcessAction(){ $totalQuantity = 0; foreach($this->Movement->find() as $movement){ $customer = $movement->getCustomer(); $this->_customerName = $customer->getName(); $this->_percent = $movement->getQuantity()/ $customer->getCreditAmmount(); $product = $movement->getProduct(); if($product->getType()=='A'){ $totalQuantity+=$movement->getQuantity(); } } $this->setParamToView('totalQuantity', $totalQuantity); } } Núltiples métouos uel contiolauoi pueuen tenei la anotacion Çsynchionizeu ue tal foima que sean ejecutauos ue maneia simúltanea con cualquiei accion uel contiolauoi. 8.17 Servicios Web usando WebServiceController `ObaOb f"_ #7 "$ ?#9 '#8M(+#g Según la uefinicion ue la aiquitectuia ue Seivicios Web uel WSC, un seivicio Web es un sistema ue softwaie uiseñauo paia sopoitai inteiaccion inteiopeiable maquina a maquina sobie una ieu ue computacion. Caua seivicio Web contiene una uesciipcion que otia maquina pueue piocesai (usanuo WSBL piobablemente). Algunos seivicios Web pueuen inteiactuai uiiectamente usanuo mensajes S0AP apoyánuose en seiializacion XNL y el piotocolo BTTP en si. Con Seivicios Web es posible uotai a las aplicaciones ue inteiopeiativiuau estánuai peimitienuo su comunicacion ue foima inuepenuiente a su platafoima tecnologica. Kumbio Fnterprise Iromework peimite al uesaiiollauoi implementai contiolauoies como Seivicios Web automatizanuo los piocesos ue publicacion uel seivicio, auministiacion y peisistencia en foima tianspaiente. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 87 0n contiolauoi WebServiceController funciona como un Seivice Pioviuei el cual piopoiciona un contiato ue seivicio que lo confoiman las acciones uel mismo y que son expuestas públicamente como opeiaciones uel mismo ue tal foima que clientes exteinos pueuan utilizailos ue maneia contiolaua. Los Seivice Customeis (clientes ue seivicios) y Seivices Pioviueis ofiecen funcionaliuau concieta paia el envio y iecepcion ue mensajes en una comunicacion maquina a maquina. Esto es tianspaiente paia el uesaiiollauoi aunque uebe sei mencionauo ue maneia infoimativa. Kumbio Fnterprise Iromework piopoiciona capas ue Softwaie que peimiten implementai ya sea Seivice Customeis o Seivices Pioviueis en aplicaciones uesaiiollauas con él. Be esta foima usteu pueue pieocupaise poi uesaiiollai la logica ue negocio sin pieocupaise poi la foima en que los seivicios Web vayan a inteiactuai a más bajo nivel. `ObaOP K,8, ^"# 7.$ $#+#7,8(.7 3.7 ?#9 '#8M(+#7 Las aplicaciones empiesaiiales se pueuen vei muy beneficiauas con el uso ue Web Seivices. Cieai contiatos ue seivicio auecuauos peimite a los uesaiiollauoies extiaei en foima abstiacta seivicios que peimitan el inteicambio ue infoimacion con aplicaciones ue teiceios, encapsulanuo uetalles como la conexion a bases ue uatos, cieuenciales ue seguiiuau, uominio y contiol ue la infoimacion entiegaua bajo las conuiciones pactauas. Sistemas empiesaiiales ganan nuevos sub-sistemas ue comunicacion estanuaiizaua entie aplicaciones ue tal foima que su composicion sea ieutilizable y componible. Neuiante el uso ue Web Seivices se eliminan uepenuencias uel pasauo como el tiaspaso ue infoimacion meuiante aichivos planos, vistas en las bases ue uatos, conexiones poi FTP o uiiectamente a los RBBNs que caiecian ue un contiol auecuauo y obligaban a implementaciones iigiuas y complicauas auemás ue exigii la integiacion ue otios componentes en su aplicacion. `ObaOc B8^"(%#+%"8, [8(#$%,-, , '#8M(+(.7 V'[BW Las oiganizaciones empiesaiiales ue hoy en uia iequieien inteiconectai piocesos e infoimacion entie los uepaitamentos ue las mismas, sus pioveuoies, clientes y socios comeiciales extenuienuo sus fionteias y aumentanuo la competitiviuau y capaciuau ue ciecimiento. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 88 La Aiquitectuia 0iientaua a Seivicios piopoiciona elementos que peimiten que un conjunto ue aplicaciones uistiibuiuas se convieita en conjunto ue iecuisos que pueuan sei utilizauos tanto inteina como exteinamente y como iesultauo se obtiene mayoi agiliuau y piouuctiviuau en la oiganizacion. Kumbio Fnterprise Iromework ofiece heiiamientas paia la constiuccion ue una Aiquitectuia 0iientaua a Seivicios, sin embaigo, uebe sei el aiquitecto o uesaiiollauoi quien uebe ueteiminai si es iealmente necesaiio implementai esta estiategia ue acueiuo a la complejiuau y objetivos uel negocio. Tiansfoimai la logica ue negocios empiesaiial a una aiquitectuia oiientaua a seivicios incluye implementai contiatos ue seivicio, ieusabiliuau, abstiaccion, loose coupling (acoplamiento uébil) y composibiliuau. S0A es un mouelo aiquitectacional paia platafoimas ue tecnologia y caua empiesa pueue uefinii los objetivos asociauos a computacion oiientaua a seivicios usanuo uifeientes tecnologias. 0sai Web Seivices es piobablemente uno ue las mejoies opciones paia aplicai los piincipios S0A y empezai a usai esta aiquitectuia. `ObaOd I8#,8 "$ ?#9 '#8M(+# Como se menciono anteiioimente es posible cieai seiviuoies paia seivicios Web usanuo la implementacion ue Contiollei llamaua WebServiceControllei. Este tipo ue Contiolauoi peimite cieai seivicios web XNL y encapsula toua la comunicacion basaua en el estánuai S0AP. Las comunicaciones sopoitan las especificaciones S0AP 1.1 y 1.2 asi como el uso ue uesciiptoies WSBL. A pesai que los mensajes S0AP son complejos„ touos estos uetalles son tianspaientemente implementauos en una capa funcional apta al uesaiiollo iápiuo y efectivo. Bel lauo uel seiviuoi el uesaiiollauoi pueue implementai seivicios usanuo lenguaje PBP nativo y la aiquitectuia y seivicios uel fiamewoik sin uemasiauos cambios. Bel lauo uel cliente es posible utilizai seivicios Web invocanuo el nombie ue los métouos¡acciones implementauos en el seivicio seiviuoi. uiacias a que se cumple con la especificaciones uefiniuas poi el WSC (Woiu Wiue Web LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 89 Consoitium) es posible tenei inuepenuencia uel lenguaje PBP tanto uel lauo uel cliente como uel seiviuoi. Lo anteiioi peimite acceuei a seivicios Web cieauos en otias platafoimas y lenguajes y que están acceuan a otios cieauos usanuo PBP. El ejemplo a continuacion muestia la uefinicion ue un seivicio Web simplificauo que peimite chequeai la uisponibiliuau ue fechas paia iealizai una ieseiva en un sistema ficticio. En el piimei métouo stortSession se iecibe como paiámetios el login y passwoiu y usanuo el componente Autb se autentica contia un seiviuoi ActiveBirectory usanuo el auaptauoi LBAP, si estas cieuenciales son valiuas entonces el iesultauo uevuelto es uevuelto y posteiioimente peimite valiuai que el usuaiio este autenticauo. Notese que el segunuo métouo qetAvolobility lanza una excepcion WebServiceControllerFxception cuanuo no se cumple una valiuacion la cual se notifica al cliente ue igual maneia. Los valoies escalaies uevueltos poi caua métouo se tiansfieien tianspaientemente entie el seiviuoi y el cliente, uatos más complejos exigen uistiibuii componente compaitiuos ue tal maneia que no haya peiuiua ue infoimacion entie el Seivice Pioviuei (seiviuoi) y el Customei (cliente). Notese que touos los métouos ue la clase que vayan a sei acceuiuos iemotamente ueben tenei el sufijo Action. /0#123.5 '#8M(+(. R#9 +.$ ?#9'#8M(+#I.$%8.33#8 <?php class ReservationController extends WebServiceController { public function startSessionAction($login, $password){ $password = $this->filter($password, “alpha”); $login = $this->filter($login, “alpha”); $auth = new Auth(“ldap”, “server: ldap.server.local”, “accountDomainName: server.local”, “username: CN=$login,DC=server,DC=local”, “password: $password”); if($auth->autentícate()){ return true; } else { sleep(2); return false; } } public function getAvalabilityAction($initialDate, $finalDate){ if(Auth::isValid()==false){ return false; } if(Date::compareDates($initialDate, $finalDate)==-1){ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 9u throw new WebServiceControllerException(“Fechas incorrectas”); } else { $reserva = Reserva($initialDate, $finalDate); return $reserva->checkAvalability(); } } public function getTicketNumberAction(){ if(Auth::isValid()==false){ return false; } return “AE1872”; } } En el cliente se utiliza la clase SoopClient estánuai paia acceuei al seivicio Web Basauo en Soap: /0#123.5 B++#-#8 , "$ 7#8M(+(. R#9 "7,$-. '.,2I3(#$% <?php class VerifierController extends ApplicationController { public function validateAction(){ $initialDate = $this->getPostParam(“initialDate”, “date”); $finalDate = $this->getPostParam(“finalDate”, “date”); $reservationService = new SoapClient(null, array( 'location' => 'http://web.server.local/w/reservation', 'uri' => 'http://app-services' )); try { if($reservationService->startSession(“webserviceUser”, “2fe05187a”)==true) { if($reservationService->getAvailability($initialDate, $finalDate)==true) { $ticketNumber = $reservationService- >getTicketNumber(); return $this->routeTo(“action: successChecking”, “id: $ticketNumber”); } } } catch(SoapFault $e) { Flash::error(“Ha ocurrido un error”); } } public function successCheckingAction($ticketNumber){ Flash::success(“Felicidades, esta disponible el ticket $ticketNumber”); } } `ObaON ?#9'#8M(+#I3(#$% Kumbio Fnterprise Iromework también piopoiciona la clase WebServiceClient que extienue el cliente S0AP SoopClient y pietenue uai más faciliuaues al tiabajai con seivicios Web con seiviuoies en este fiamewoik. El piimei paiámetio uel constiuctoi pueue sei la ubicacion uel LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 91 seivicio (locotion) cuyo 0niform Resource lJentificoJor (uii) es bttp:,,opp-services: /0#123.5 I8#,8 "$ 7#8M(+(. R#9 +.$ ?#9'#8M(+#I3(#$% $webService = new WebServiceClient('http://web.server.local/w/reservation'); Es posible uefinii los paiámetios uel cliente meuiante un aiiay ue esta foima: /0#123.5 6#*($(8 2,8U1#%8.7 #H%8, #$ #3 7#8M(+(. R#9 +.$ ?#9'#8M(+#I3(#$% $webService = new WebServiceClient(array( ‘wdsl’ => ‘http://www.example.com/external-services/reservation.wsdl’, ‘location’ => 'http://web.server.local/w/reservation', ‘uri’ => ‘http://www.example.com/external-services’, ‘encoding’ => ‘ISO-8859-1’ )); El constiuctoi establece los siguientes paiámetios poi uefecto paia el cliente SoopClient: T,93,5 K,8U1#%8.7 ^"# 8#+(9# #3 +.$%8"+%.8 -# ?#9'#8M(+#I3(#$% K,8U1#%8. Y,3.8 wsul null uii http://app-services encouing 0TF-8 compiession S0AP_C0NPRESSI0N_ACCEPT | S0AP_C0NPRESSI0N_uZIP La extension Soap ue PBP es iequeiiua paia usai este cliente. `ObaOe [9%#$(#$-. #3 ?'6E -# "$ '#8M(+(. ?#9 Kumbio Fnterprise Iromework pueue hacei AutoBiscover ue seivicios Web basauos en WebSeiviceContiollei, en caso que no se uefina un WSBL manualmente paia el seivicio. Paia geneiai un uesciiptoi WSBL coiiecto es necesaiio agiegai PBPBocs a caua accion uel contiolauoi y asi pouei ueteiminai el tipo ue uato uevuelto poi caua opeiacion pública uel Service ProviJer, sino se pueue ueteiminai se geneia un empty type. El mapeo ue los valoies escalaies tanto los que se ieciben como los que se envian en PBP a su LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 92 coiiesponuiente xsu o soap-enc, es el siguiente: Stiing : <xsu:stiing•, Integei : <xsu:integei•, Float y Boubles : <xsu:float•, Boolean: <xsu:bool•, Aiiay : <soap-enc:Aiiay• y objetos <xsu:stiuct•. Los espacios ue nombies XNL usauos son: xsu: …http:¡¡www.wS.oig¡2uu1¡XNLSchema" soap-enc: "http:¡¡schemas.xmlsoap.oig¡soap¡encouing¡… Es posible invocai la accion getWSBLBesciiptoi en el contiolauoi paia obtenei una uesciipcion WSBL uel seivicio. `ObaOa [8^"#7%,+(:$ -# 7#8M(+(.7 La logica ue negocio ue los seivicios web es implementaua usanuo contiolauoies que hacen paite ue la aiquitectuia NvC, tanto la capa ue logica ue uominio como la ue uatos tienen sentiuo paia el uesaiiollauoi peio la piesentacion no existe o no es claio su implementacion ya que en seivicios web la comunicacion se iealiza entie maquinas y no existe inteivencion humana uonue se iequieia. Al iecibii una peticion uesue un cliente Soap la instancia uel fiamewoik es capaz ue eniutai a la accion en el contiolauoi auecuaua examinanuo el mensaje S0AP enviauo a la aplicacion. Luego ue ejecutai la logica ue uominio en la accion el valoi uevuelto poi esta es tiatauo y conveitiuo en un mensaje S0AP que se envia al cliente. La manipulacion a bajo nivel ue los mensajes S0AP se le encaiga al componente Soap que implementa los iecuisos necesaiios paia iecibii y enviai comunicaciones ue seivicios Web y haceilo tianspaiente al usuaiio. En el siguiente ejemplo se ilustia como la comunicacion ue seivicios Web es tianspaiente al uesaiiollauoi y como el entoino NvC facilita la oiquestacion ue seivicios: En la maquina seiviuoi1 se implementa el siguiente seivicio web: /0#123.5 '#8M(+(. R#9 ,8(%1_%(+. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 9S <?php class AritmethicController extends WebServiceController { public function addAction($a, $b){ return $a + $b; } } En la maquina seiviuoi2 se implementa un cliente uel Seivicio Web: /0#123.5 B++#7. ,3 7#8M(+(. R#9 ,8(%1_%(+. <?php class CalculatorController extends WebServiceController { public function addAction($x, $y){ $service = new WebServiceClient(“http://server1/ins/aritmethic/”); $result = $service->add($x, $y); //Realiza la suma en el servidor1 } } Al invocaise la accion colculoJor,oJJ en seiviuoi 2 se mapean automáticamente los valoies ue $x y $y a la accion auu a $a y $b iespectivamente en seiviuoi1 al invocai este métouo en el objeto ue seivicio cieauo. El mismo ejemplo se pueue implementai utilizanuo un Pioxy a un teicei seiviuoi quien finalmente iealiza la opeiacion. El seivicio web en el seiviuoi2 queua asi implementauo: /0#123.5 6#*($(8 "$ K8.H\ , 7#8M(+(.7 R#9 <?php class AritmethicController extends WebServiceController { public function addAction($a, $b){ $service = new WebServiceClient(“http://server3/ins/aritmethicserver/”); return $service->add($x, $y); //Devuelve la suma en el servidor3 } } El seivicio Web AritmetbicServer implementauo en el seiviuoiS: /0#123.5 '#8M(+(. R#9 ,8(%1_%(+. #$ #3 %#8+#8 7#8M(-.8 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 94 <?php class AritmethicServerController extends WebServiceController { public function addAction($c, $d){ return $c + $d; } } Aunque no es necesaiio implementai este ejemplo usanuo S maquinas, peimite ilustiai como se pueue abstiaei la logica ue aplicacion en foima uistiibuiua ue tal foima que múltiples aplicaciones acceuan a seivicios ieutilizables que aumentan la escalabiliuau ue los sistemas uesaiiollauos. `ObaO` I,8,+%#8=7%(+,7 -# '#8M(+(.7 ?#9 #$ h"19(, /$%#828(7# Al igual que los otias implementaciones ue contiolauoies, en los seivicios web usanuo WebServiceController se usa ue foima tianspaiente toua la funcionaliuau uel fiamewoik que se usa en los contiolauoies ue aplicacion, algunas ue estas son: • Es posible acceuei a los mouelos como piopieuaues ue la clase contiolauoia • Se pueue implementai peisistencia uel estauo uel contiolauoi entie sesiones y peticiones • Se pueue eniutai el flujo ue ejecucion a otios seivicios Web uentio ue la misma aplicacion • Seguiiuau ueclaiativa y piogiamacional se pueue implementai en este tipo ue contiolauoies 8.18 Controladores StandardForm La implementacion ue contiolauoies StonJorJIorm es una caiacteiistica heieuaua ue Kumbio PEP Iromework. Poi motivos ue compatibiliuau con aplicaciones existentes en la veision Fnterprise su funcionaliuau se mantiene intacta. El objetivo ue esta implementacion es la geneiacion uinámica ue foimulaiios que peimitan auministiai la infoimacion ue tablas en la conexion pieteueiminaua uel entoino actual. El uesaiiollauoi uebe evaluai si las limitantes ue esta implementacion no afectaián en un futuio los objetivos ue negocio ue la aplicacion. 4.%,5 Esta implementacion esta agenuaua paia sei maicaua como obsoleta en veisiones posteiioies uel fiamewoik. louJerTecbnoloqy está activamente uesaiiollauo louJer LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 9S Applicotion Iorms el cuál geneia componentes ue aplicacion iobustos que apiovechan ue maneia más auecuaua y flexible las posibiliuaues uel fiamewoik. `Ob`Ob I,8,+%#8=7%(+,7 -# '%,$-,8-!.81 • ueneiacion uinámica ue un CR0B (Cieate, Reau, 0puate, Belete) con posibiliuau ue utilizai paite ue ellas o touos. • Be acueiuo a la infoimacion ue los meta-uatos ue una tabla en la base ue uatos geneianuo componentes ue inteifaz ue usuaiio auecuauos paia caua campo. • Es posible iealizai valiuacion uel lauo uel cliente y uel seiviuoi. • Es posible implementai eventos ue acueiuo a las acciones ejecutauas poi el usuaiio en el contiolauoi. • La infoimacion ue la tabla cieaua pueue sei expoitaua a PBF, BTNL, Niciosoft Woiu y Excel. `Ob`OP E(1(%,$%#7 -# '%,$-,8-!.81 • La especificacion uel mouelo entiuau-ielacion esta limitaua a tablas y campos uefiniuos meuiante las convenciones uel fiamewoik • La funcionaliuau ue los foimulaiios geneiauos sobie touo la visual pueue sei uificil ue peisonalizai con iespecto a los objetivos uel uesaiiollauoi. 8.19 Plugins de Controladores En cieitas ocasiones cuanuo las aplicaciones coiien en múltiples entoinos con uifeientes caiacteiisticas, la funcionaliuau y alcance ue la misma aplicacion no es suficiente y se uebe extenuei automáticamente uuiante el iuntime. La aiquitectuia ue plugins ue Contiolauoies peimite obseivai, extenuei y manipulai el compoitamiento ue las clases contiolauoias ue la aplicacion según las conuiciones lo exijan. Los plugins peimiten inteiceptai eventos ue los contiolauoies ue tal foima que estos sean obseivables y auemás ejecutáise uno tias otio ue maneia centializaua sin iequeiii iefactoiizacion o ieintegiacion en la aplicacion. `ObiOb I8#,8 "$ K3")($ -# I.$%8.3,-.8 Los plugins ue contiolauoi son clases que implementan eventos que son invocauos a meuiua que avanza la ejecucion ue una peticion en cualquiei contiolauoi. Estas clases ueben cumplii con los siguientes iequeiimientos: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 96 ! Beben estai ubicauos en el uiiectoiio ue plugins usualmente opps,opp-nome,pluqins ! El nombie uel aichivo que implementa la clase uebe sei el nombie uel plugin ! El nombie ue la clase uebe tenei la extension Pluqin ! Los plugins ue contiolauoi ueben heieuai ue la clase ControllerPluqin o sei subclase ue ella Las clases pueuen implementai métouos públicos que iefeiencian los eventos ocuiiiuos en los contiolauoies, la lista ue ellos es la siguiente: T,93,5 /M#$%.7 ^"# 7# 2"#-#$ (123#1#$%,8 #$ 23")($7 -# I.$%8.3,-.8 4.198# /M#$%. 6#7+8(2+(:$ befoieBispatchLoop 0cuiie antes ue iniciai el ciclo ue eniutamiento, en este punto no se ha caigauo el contiolauoi, aunque se encuentia uisponible touo el entoino ue la aplicacion. befoieBispatch 0cuiie uentio uel ciclo ue eniutamiento y justo antes ue invocai el contiolauoi solicitauo. Este evento se invoca poi caua contiolauoi usauo en el flujo ue ejecucion. befoieExecuteRoute 0cuiie antes ue ejecutai la accion solicitaua en el contiolauoi, en este punto se pueue obtenei los uatos ue la peticion, contiolauoi, accion y paiámetios. afteiExecuteRoute 0cuiie uespués ue ejecutai la accion solicitaua en el contiolauoi. afteiBispatch 0cuiie uespués uel pioceso ue ejecucion ue la accion poi contiolauoi. afteiBispatchLoop 0cuiie cuanuo teimina el ciclo ue eniutamiento. befoieNotFounuAction 0cuiie cuanuo la accion o contiolauoi ejecutauo solicitauo no esta implementauo. Es inuepenuiente ue si la accion notFounuAction está implementaua. befoie0ncaugthException 0cuiie antes ue lanzaise una excepcion que no fue captuiaua poi la aplicacion. onContiolleiException 0cuiie cuanuo se geneia una excepcion uentio uel contiolauoi. Se ejecuta antes ue befoie0ncaughException LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 97 9 Componente UDDI 9.1 Introducción Este componente es una implementacion ue la especificacion ue seivicios Web, 0niveisal Besciiption, Biscoveiy anu Integiation (0BBI). El piinicipal objetivo ue este componente es peimitii a seivicios e contiolauoies uesaiiollauos en Kumbio Fnterprise seivii como iegistios ue seivicios peimitienuo que uominios ue computacion heteiogeneos pueuan consultailos y conectai seivicios a sistemas existentes. 9.2 Requerimientos Se iequieie tenei en cuenta lo siguiente paia utilizai 0BBI: ! K#87(7%#$+(,5 El componente 0BBI iequieie ue un gestoi ielacional paia almacenai los iegistios uel uiiectoiio. ! B"%#$%(+,+(:$5 El componente Autb es iequeiiuo paia ofiecei los seivicios ue autenticacion a los contiolauoies ue publicacion ue iegistios. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 98 10 Componente BusinessProcess 10.1 Introducción Este componente ua la posibiliuau ue implementai meta-piocesos usanuo BPN, ue esta foima se busca la optimizacion y mejoiamiento ue piocesos ue negocio en una aplicacion uesaiiollaua usanuo Kumbio Fnterprise. Actualmente el lenguaje PBL es sopoitauo poi este componente con el cual se pueue expiesai piocesos ue negocio en teiminos ue taieas, estauos ue espeia, comunicacion sincionica, etc. El componente peimite su integiacion con otios componentes peimitienuo levantai configuiacion, establecei peisistencia, iuentificacion, etc. 10.2 Job Executor El componente BusinessPiocess ofiece un entoino ue ejecucion paia PBP que peimite ejecutai piocesos PBL ya sea paia oiquestai seivicios o ejecutai piocesos funcionales. 10.3 Crear un Proceso de Negocio 0n pioceso ue negocio se especifica utilizanuo una estiuctuia XNL LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 99 11 Componente Filter 11.1 Introducción El componente Iilter piopoiciona un conjunto ue filtios ue uatos y una inteifase consistente paia su aplicacion a uatos y entiaua ue usuaiio en un pioceso ue negocio. Los filtios están uiseñauos paia tiansfoimai uatos, quitai paites inueseauas, eliminai espacios o caiacteies innecesaiios y en iesumen aseguiaise que una vaiiable contiene lo que se espeia que contenga. El aplicai los filtios auecuauos a la entiaua ue usuaiio constituye el piimei paso paia ceicioiaise que los piocesos ue negocio se ejecutaian utilizanuo uatos que en cieita foima no uañen ni alteien el flujo y estauo noimal ue una aplicacion. 11.2 Estructura del Componente El componente lo constituye la clase Iilter y una seiie ue filtios base ue uso geneial que incluye el fiamewoik paia su aplicacion al común ue aplicaciones Web ue negocios. Los filtios base son los siguientes: T,93,5 !(3%8.7 9,7# -#3 +.12.$#$%# !(3%#8 4.198# 4.198# I.8%. ;7.J6#7+8(2+(:$ Alnum alnum Filtia caiacteies alfanuméiicos (letias y númeios). Alpha alpha Filtia letias uel abeceuaiio occiuental incluyenuo caiacteies latinos como vocales con tilue y eñes. AuuSlaches auuslaches Escapa las comillas simples y uobles paia evitai inyeccion ue SQL. BaseName basename Filtia un path paia obtenei el nombie uel aichivo o el último uiiectoiio. Bate uate Filtia una cauena ue caiacteies uevolvienuo una fecha que coinciua con la expiesion iegulai LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1uu '¡(19|2u)(\u†2‡)•-\¡€(\u†1,2‡)•-\¡€(\u†1,2‡)¡' o el foimato YYYY-NN-BB. Bigits uigits Filtia una cauena paia que contenga solo uigitos (númeios uel u al 9) Bouble uouble Filtia un valoi uevolvienuo un valoi numéiico ue alta piecision. Email email Filtia una cauena ue caiacteies uevolvienuo un coiieo electionico valiuo. Extiaspaces extiaspaces Filtia una cauena ue caiacteies eliminanuo espacios y saltos ue linea al piincipio y final ue la cauena. Float float Filtia un valoi uevolvienuo un valoi numéiico ue alta piecision BtmlEntities htmlentities Convieite touos los caiacteies aplicables ue una cauena ue caiacteies a sus entiuaues BTNL coiiesponuientes. BtmlBecoue htmluecoue Convieite entiuaues BTNL a su caiáctei 0TF-8 coiiesponuiente. Iuentifiei iuentifiei Filtia un valoi uejanuo solo un iuentificauoi ue vaiiable valiuo. Int int Filtia el valoi iecibiuo en un enteio ue S2bit o 64 bit uepenuienuo ue la platafoima. Ipv4 ipv4 Filtia una cauena ue caiacteies uevolvienuo una uiieccion IP veision 4. Ipv6 ipv6 Filtia una cauena ue caiacteies uevolvienuo una uiieccion IP veision 6. Lowei lowei Filtia una cauena ue caiacteies uevolviénuola en minúsculas. Este filtio iespeta el chaiset ue la aplicacion. Locale locale Filtia una cauena ue uefinicion ue localizacion 0NIC0BE. NuS muS Convieite una cauena ue caiacteies a su iesumen ciiptogiáfico muS LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1u1 Numeiic numeiic Convieite el valoi iecibiuo en valoi numéiico. 0nechai onechai Filtia la cauena paia obtenei un solo caiáctei. Stiipspace stiipspace Elimina los caiacteies espacios en toua la cauena ue caiacteies iecibiua. Stiiptags stiiptags Elimina las etiquetas BTNL que contenga la cauena ue caiacteies iecibiua. Stiipslaches stiipslaches Bes-escapa una cauena ue caiácteies conviitienuolos a sus caiácteies ue comillas noimales. 0ppei uppei Filtia una cauena ue caiacteies uevolviénuola en mayúsculas. Este filtio iespeta el chaiset ue la aplicacion. 0tf8 utf8 Convieite una cauena ue caiacteies en IS0- 88S9-1 a 0TF-8 11.3 Usar filtros en forma directa Paia aplicai un filtio a un valoi en foima uiiecta es necesaiio instanciai la clase Filtei e invocai el métouo applyFilteis envianuo como piimei paiámetio el valoi a filtiai y como paiámetios siguientes los nombies coitos ue los filtios a aplicai: /0#123.5 I8#,8 *(3%8.7 #$ *.81, -(8#+%, <?php $filter = new Filter(); print $filter->applyFilter("a1b2c3d4e5", "digits"); // Imprime 12345 $filter = new Filter(); print $filter->applyFilter("<h1>Hola</h1>", "striptags", “upper”); // Imprime HOLA Es necesaiio cieai una instancia ue filtei poi caua combinacion ue filtios que se iequieian aplicai ya que caua objeto filtei almacena en un buffei estos filtios: /0#123.5 ;7,8 #3 9"**#8 -# 3.7 *(3%8.7 <?php $filter = new Filter(); print $filter->applyFilter("a1b2c3d4e5", "digits"); // Imprime 12345 print $filter->applyFilter("www.radiobox77.com"); // Imprime 77 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1u2 11.4 Crear chains de Filtros Es posible cieai chains paia la aplicacion ue filtios base y ue usuaiio a un mismo valoi ue la siguiente maneia: /0#123.5 Z123#1#$%,8 IC,($7 -# !(3%8.7 <?php Filter::load("striptags", "email", "lower", “special”); $filter = new Filter(); $filter->addFilter(new StriptagsFilter()); $filter->addFilter(new EmailFilter()); $filter->addFilter(new LowerFilter()); $filter->addFilter(new LowerFilter()); $filter->addFilter(new SpecialFilter()); print $filter->applyFilter("<b>[email protected]</b>")."<br>"; El métouo estático Iilter::looJ caiga uno o más filtios ya sean ue usuaiio o base luego se agiegan los filtios y se aplican como es estánuai. Los filtios también pueuen agiegaise poi su nombie coito, agiegai vaiios a la vez y mezclailos. El oiuen en que se agiegan inuica el oiuen ue aplicacion: /0#123.5 B23(+,8 1G3%(23#7 *(3%8.7 , "$ M,3.8 <?php Filter::load("striptags", "email", "lower", “special”); $filter = new Filter(); $filter->addFilter("striptags"); $filter->addFilter("email", new LowerFilter()); $filter->addFilter(new SpecialFilter()); print $filter->applyFilter("<b>[email protected]</b>")."<br>"; 11.5 Usar filtros en Controladores Los contiolauoies son piobablemente un punto uonue los filtios tengan mayoi paiticipacion ya que es aqui uonue se iequieie aseguiai que los piocesos ue negocio se ejecuten con uatos consistentes y confiables. El métouo ue Controller::filter actua como un Pioxy al componente Iilter peimitienuo filtiai vaiiables sin instanciai explicitamente alguna clase auicional: /0#123.5 B23(+,8 "$ *(3%8. -#7-# "$ +.$%8.3,-.8 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1uS <?php class InvoicesController extends ApplicationController { public function listInvoicesAction(){ //Se obtiene un valor de la entrada y se filtra $initialDate = $this->getPostParam("initialDate"); $initialDate = $this->filter($initialDate, "date"); //Resto del proceso… } } Auicional a lo anteiioi los métouos ue Controller qetPostPorom, qetRequestPorom y qetµueryPorom ieciben como paiámetios extia al valoi iequeiiuo nombies coitos ue filtios los cuales se aplican en este oiuen y se ietoinan al pioceso: /0#123.5 B23(+,8 "$ *(3%8. , 3, #$%8,-, -# "7",8(. <?php class InvoicesController extends ApplicationController { public function listByNameInvoicesAction(){ //Se obtiene un valor de la entrada y se filtra directamente $name = $this->getPostParam("name", “striptags”, “extraspaces”); //Resto del proceso… } } 11.6 Filtrar la entrada de usuario El componente filtei está integiauo a los contiolauoies peimitienuo valiuai la entiaua ue usuaiio cuanuo es iecibiua uesue un foimulaiio o una 0RL. El siguiente ejemplo uefine una seiie ue ieglas paia valiuai los valoies iecibiuos uesue una entiaua ue usuaiio geneianuo los mensajes coiiesponuientes: <?php class UsersController extends ApplicationController { public function doRegisterAction(){ $fields = array( 'username' => array( 'message' => 'Por favor indique su nombre de usuario', 'filter' => 'extraspaces|striptags' ), 'password' => array( 'message' => 'Por favor indique su contrase&ntilde;a' LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1u4 ), 'confirmPassword' => array( 'message' => 'Por favor indique la confirmaci&oacute;n de la contrase&ntilde;a' ), 'email' => array( 'message' => 'Por favor indique su correo electrónico', 'filter' => 'email' ), 'confirmEmail' => array( 'message' => 'Por favor indique la confirmación de su correo electrónico', 'filter' => 'email' ), 'name' => array( 'message' => 'Por favor indique su nombre', 'filter' => 'extraspaces|striptags' ), 'lastName' => array( 'message' => 'Por favor indique sus apellidos', 'filter' => 'extraspaces|striptags' ), 'address' => array( 'message' => 'Por favor indique la dirección de su residencia', 'filter' => 'extraspaces|striptags' ), 'phone' => array( 'message' => 'Por favor indique su teléfono' ), 'city' => array( 'message' => 'Por favor indique la ciudad' ), 'company' => array( 'message' => 'Por favor indique la empresa' ) ); if($this->validateRequired($rules)==false){ foreach($this->getValidationMessages() as $message){ $message->showErrorMessage(); } $this->routeTo(array('action' => 'startSignIn')); } } } La piopieuau ue la iegla 'filtei' peimite uefinii el filtio que uebe sei aplicauo a caua valoi iecibiuo antes ue ueteiminai si está piesente, ue esta foima se contiola que el valoi evaluauo sea váliuo y se geneie el mensaje coiiesponuiente. Si se iequieie que se aplique más ue un filtio, se pueue inuicai una lista sepaiaua poi | (pipes). Consulte el componente voliJotor paia obtenei más infoimacion sobie filtiai la entiaua ue usuaiio. 11.7 Crear un filtro de usuario El uesaiiollauoi pueue cieai sus piopios filtios en la aplicacion e integiailo al componente filtei paia su posteiioi utilizacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1uS Tanto los filtios base como los ue usuaiio ueben implementai la inteiface Iilterlnterfoce que tiene la siguiente estiuctuia: <?php interface FilterInterface { public function execute($value); } bbOaOb <#^"#8(1(#$%.7 -# "$ *(3%8. -# "7",8(. Al cieai un filtio ue usuaiio se uebe tenei en cuenta lo siguiente: • Se ciea un aichivo ubicauo en el uiiectoiio filters, ue la aplicacion o uonue la opcion filtersBir uel aichivo ue configuiacion confiq,config.ini inuique. • El nombie uel aichivo es el nombie uel filtio con la piimeia letia en mayúscula • El aichivo uebe contenei una clase con el nombie uel filtio y sufijo "Iilter" • La clase uebe implementai la inteiface Iilterlnterfoce En el siguiente ejemplo se ciea un filtio ue usuaiio que apaitii ue una 0RL filtia el uominio que coiiesponue a ella: /0#123.5 !(3%#8 -# "7",8(. ^"# *(3%8, -.1($(.7 #$ "$, ;<E <?php class DomainFilter implements FilterInterface { public function execute($url){ $protocol = strpos($url, "//"); if($protocol!==false){ $url = substr($url, $protocol+2); } $fisrtSlash = strpos($url, "/"); if($fisrtSlash!==false){ $url = substr($url, 0, $fisrtSlash); } return $url; } } En cualquiei paite ue la aplicacion se pueue utilizai usanuo su nombie coito o caiganuolo meuiante Iilter::looJ: /0#123.5 B23(+,8 "$ *(3%8. -# "7",8(. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1u6 <?php $filter = new Filter(); $url = "http://www.google.com/?q=kumbia%20framework"; print $filter->applyFilter($url, "domain"); // www.google.com LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1u7 12 ActionHelpers 12.1 Introducción Los ActionEelpers son subcomponentes auxiliaies que complementan y auxilian a las implementaciones ue contiolauoies algunas veces establecienuo puentes a la piesentacion y otias veces a la capa ue uatos. 12.2 Mensajes usando Flash El ActionEelper Ilosb peimite la geneiacion ue mensajes contextuales en cualquiei paite ue la aplicacion. Auicional a esto es posible almacenai mensajes paia sei mostiauos cuanuo se iequieia en otias peticiones. bPOPOb j#$#8,8 1#$7,0#7 +.$%#H%",3#7 Los mensajes contextuales peimiten apaite uel mensaje poi meuio ue coloies e iconos infoimai el caiáctei uel mismo. T,93,5 T(2.7 -# 1#$7,0#7 +.$%#H%",3#7 +.$ !3,7C @_%.-. T(2. 6#7+8(2+(:$ Flash::eiioi Eiioi Infoima que hay una situacion ue eiioi. Poi uefecto se usa fonuo iosa, texto en iojo y un icono ue auminiiacion. Flash::notice Infoimacion Ba el contexto ue infoimacion. Poi uefecto se usa fonuo azul y letia azul oscuio. Flash::success ˆxito Inuica que la opeiacion tuvo éxito o se ejecuto un pioceso satisfactoiiamente. Poi uefecto se usa fonuo veiue llamativo y letia veiue oscuia. Flash::waining Auveitencia ueneia un mensaje con el contexto ue auveitencia. Poi uefecto se usa amaiillo claio en el fonuo, letia en negio y un icono ue aleita. Touos los métouos ieciben en su paiámetio el mensaje a mostiai. bPOPOP I,19(,8 #3 #7%(3. 2.8 -#*#+%. -# 3.7 1#$7,0#7 Si se uesea cambiai el estilo ue los mensajes ue texto se pueue mouificai o sobieesciibii las clases CSS en el aichivo public,css,style.css que siempie se inseita en touas las peticiones. Poi LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1u8 uefecto las clases tienen los siguientes estilos: .kumbiaDisplay { font-size: 11px; font-weight: bold; margin: 0 auto; padding: 2px 25px; background-repeat: no-repeat; background-position: 5px center; text-align: left; } .errorMessage { background-image: url("@path/img/error.gif"); background-color: #FFDDDD; color: #B30000; border: 1px solid #FFB7B7; margin: 2px; text-align: left; } .noticeMessage { background-image: url("@path/img/user.gif"); background-color: #CCDEFF; color: #004A6F; margin: 2px; border: 1px solid #004A6F; text-align: left; } .sucessMessage { background-image: url("@path/img/ok.gif"); background-color: #CCFF99; color: #008000; border: 1px solid #008000; } .warningMessage { background-image: url("@path/img/warning.gif"); background-color: #FFFFC6; color: #000000; border: 1px solid #DDDD00; } bPOPOc I,19(,8 #3 #7%(3. #$ *.81, -($U1(+, Si se iequieie cambiai la piesentacion ue un mensaje en foima piogiamacional se pueue enviai un listauo ue clases CSS como segunuo paiámetio. Flash::notice("Esto es una información personalizada", array("mi_clase_css", "otra_clase_css")); bPOPOd /$M(,8 1G3%(23#7 1#$7,0#7 -#3 1(71. %(2. #$ *.81, 7(1G3%,$#, Cuanuo el piimei paiámetio iecibiuo poi un métouo ue mensajes es un vectoi con mensajes la lista ue estos es enviaua una tias otia en el oiuen iecibiuo. Flash::error(array( "Este es el primer error", "Este es el segundo error", "Este es el tercer error", )); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1u9 bPOPON @.7%8,8 1#$7,0#7 2.8 7" %(2. El métouo ue Ilosb llamauo messoqe peimite mostiai un mensaje utilizanuo una constante como segunuo paiámetio que establece el tipo a mostiai: Flash::message("Esto es una advertencia", Flash::WARNING); Flash::message("Esto es un error", Flash::ERROR, array("my_error_css")); T,93,5 I.$7%,$%#7 -# 3.7 %(2.7 -# 1#$7,0#7 Y,3.8 I.$7%,$%# 6#7+8(2+(:$ u Flash::ERR0R Nensajes ue eiioi 1 Flash::N0TICE Nensajes ue infoimacion 2 Flash::S0CCESS Nensajes ue éxito S Flash::WARNINu Nensajes ue auveitencia bPOPOe I,+C#,8 1#$7,0#7 2,8, 1.7%8,83.7 #$ 3, 28:H(1, 2#%(+(:$ Si se iequieie mostiai mensajes al usuaiio uespués ue iealizai una ieuiieccion se pueue utilizai el métouo oJJHessoqe que funciona como el métouo messoqe iecibe el mensaje y un couigo inuicanuo el tipo. Los mensajes que se agiegan ue esta foima no son visualizauos sino hasta que se invoca el métouo qetHessoqes{). El siguiente ejemplo ilustia el funcionamiento ue este tipo ue mensajes: <?php class LoginController extends ApplicationController { public function indexAction(){ Flash::addMessage("Bienvenido usuario", Flash::SUCCESS); $this->redirect("login/menu"); } public function menuAction(){ foreach(Flash::getMessages() as $message){ Flash::message($message['message'], $message['type']); } } } Los mensajes agiegauos con oJJHessoqe se almacenan en un buffei uel contexto ue sesion. Cuanuo los mensajes se obtienen con qetHessoqes el buffei inteino se iesetea. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 11u 12.3 Condiciones SQL con FormCriteria El actionhelpei IormCriterio peimite cieai conuiciones SQL a paitii ue los paiámetios iecibiuos poi un foimulaiio ue entiaua ue usuaiio. Be acueiuo a los paiámetios iecibiuos, solo los que tengan valoies no nulos se incluyen en las conuiciones geneiauas. En el siguiente ejemplo se muestia como cieai la conuicion ue búsqueua paia uiveisos tipos ue uatos obteniuos uesue un foimulaiio. Los uatos captuiauos son: ! I:-().5 Coiiesponue al couigo uel piouucto y es ue tipo numéiico. ! 4.198#5 El nombie uel piouucto y es ue tipo texto. ! I,%#).8=,5 Campo ue tipo enteio ue la entiuau ProJucts que es ielacion a la tabla ProJuctCoteqories. Se usa Toq::select paia caigai los uatos ue esta tabla y se inuica el paiámetio useBummy paia agiegai la opcion 'Seleccione‰'. ! T(2.5 Combo cieauo apaitii ue un aiiay con valoies estáticos que coiiesponue al campo type ue la entiuau ProJucts. El foimulaiio en la vista views,proJucts,inJex.pbtml es el siguiente: <h1>Buscar Productos</h1> <?php echo Tag::form('products/search'); ?> <table> <tr> <td align="right">Código:</td> <td><?php echo Tag::numericField('code') ?></td> </tr> <tr> <td align="right">Nombre:</td> <td><?php echo Tag::textField('name') ?></td> </tr> <tr> <td align="right">Categoría:</td> <td><?php echo Tag::select('product_category_id', $ProductsCategories->find(), 'using: id,name', 'useDummy: yes') ?></td> </tr> <tr> <td align="right">Tipo:</td> <td><?php echo Tag::selectStatic('type', array( 'A' => 'ALIMIMENTOS', 'B' => 'BEBIDAS', 'O' => 'OTRO' ), 'useDummy: yes') ?></td> </tr> <tr> <td></td> <td><?php echo Tag::submitButton('Enviar') ?></td> </tr> </table> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 111 <?php echo Tag::endForm() ?> En el contiolauoi se uefine la búsqueua según se envie los paiámetios a la accion seorcb: <?php class ProductsController extends ApplicationController { public function indexAction(){ } public function searchAction(){ $criteria = new FormCriteria($_POST, array( 'code' => array( 'type' => 'integer', 'fieldName' => 'id' ), 'name' => array( 'type' => 'string' ), 'product_categories_id' => array( 'type' => 'integer', 'operator' => '=', 'nullValue' => '@' ), 'type' => array( 'type' => 'string', 'operator' => '=', 'nullValue' => '@' ) )); $this->Products->find($criteria->getConditions()); } } El constiuctoi iecibe 2 paiámetios, el piimeio coiiesponue al oiigen ue los uatos ue los cuales se constiuiia el ciiteiio ue búsqueua. El segunuo es un uesciiptoi con los campos que se ieciben uel foimulaiio y la foima en que uebe constiuiise la conuicion paia caua uno. Las llaves uel uesciiptoi son los nombies ue las vaiiables que vienen uel foimulaiio y que son paite uel oiigen ue uatos. En el ejemplo el oiigen ue uatos es la supeiglobal $_P0ST. La uesciipcion ue las opciones paia caua campo es: [2+(:$ 6#7+8(2+(:$ type Es el tipo ue uato que se espeia iecibii uel foimulaiio. Pueue sei integei, float, uouble, uate y stiing. Bepenuienuo uel tipo ue uato es posible que se apliquen filtios. opeiauoi 0n opeiauoi compatible con el gestoi ielacional utilizauo. Cuanuo la opcion "type" es integei, float, uouble y uate se utiliza el opeiauoi '=' cuanuo es stiing se usa el opeiauoi 'LIKE'. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 112 miss0nNull 0n valoi booleano que ueteimina si se uebe omitii la conuicion caso ue que el valoi iecibiuo sea nulo o el valoi estableciuo paia nulo meuiante 'nullvalue'. Poi uefecto su valoi es true. nullvalue El valoi que uebe entenueise como valoi nulo paia sabei si se uebe omitii al geneiai la conuicion. fieluName El nombie uel atiibuto en la entiuau. Si no se inuica se usa el nombie ue la llave en el uesciiptoi. Si se envia el valoi coue=1u se piouuce la conuicion: id = 10 Si se envian los valoies coue=1u y nombie="cheese cake" se piouuce la conuicion: id = 10 OR name LIKE ‘%cheese%cake%’ Si se envian los valoies piouuct_categoiies_iu = 2 y type='A' (type es el nombie uel campo) se piouuce la conuicion: product_categories_id = 2 OR type = ‘A’ Poi uefecto el opeiauoi paia unii las conuiciones es 0R, con lo que si cualquieia ue las opciones se cumple entonces se obtiene el iesultauo. Si se uesea lo contiaiio entonces se pueue enviai el opeiauoi como paiámetio ue qetConJitions asi. $this->Products->find($criteria->getConditions(‘AND’)); bPOcOb I8(%#8(.7 -# <,$).7 Con IormCriterio también es posible cieai ciiteiios ue iangos cuyos valoies sean obteniuos ue un foimulaiio ue entiaua ue usuaiio. Si lo que se iequieie es que apaitii ue campos obteniuos uel foimulaiio se ciee la conuicion entonces uebe uefinii ue la siguiente foima: $criteria = new FormCriteria($_POST, array( 'fechaInicial:fechaFinal' => array( 'type' => 'date', 'fieldName' => 'fecha' ) )); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 11S Si se envian los valoies fechaInicial="2uu8-1u-2u" y fechaFinal="2uu8-11-22" se piouuciiia la siguiente conuicion: fecha >= ‘2008-10-20’ AND fecha <= ‘2008-11-22’ Y si lo que se iequieie es que el valoi ue la entiaua ue usuaiio se encuentie entie 2 campos ue la tabla entonces se uefine asi: //La tabla es de registro de vuelos $criteria = new FormCriteria($_POST, array( ‘fecha' => array( 'type' => 'date', 'fieldName' => 'fechaLlegada:fechaSalida' ) )); Si se envian el valoi fecha="2uu8-1u-2u" se piouuciiia la siguiente conuicion: fechaLlegada >= ‘2008-10-20’ AND fechaSalida <= ‘2008-10-20’ bPOcOP ;$(8 M,8(,7 +.$-(+(.$#7 vaiias ciiteiios pueuen sei uniuos utilizanuo opeiauoies uifeientes paia ue esta foima constiuii conuiciones más complejas: $criteria1 = new FormCriteria($_POST, array( 'code' => array( 'type' => 'integer', 'fieldName' => 'id' ), 'product_categories_id' => array( 'type' => 'integer', 'operator' => '=', 'nullValue' => '@' ), )); $criteria2 = new FormCriteria($_POST, array( 'code' => array( 'type' => 'integer', 'fieldName' => 'id' ), 'name' => array( 'type' => 'string' ), )); $conditions = FormCriteria::join(‘OR’, array( $criteria1->getConditions(‘AND’), $criteria2->getConditions(‘AND’) )); El métouo estático IormCriterio::join pueue unii 2 o más objetos IormCriterio con un opeiauoi uifeiente. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 114 12.4 Información del Navegador con Browser Este ActionEelper peimite obtenei infoimacion uel exploiauoi uel cliente uesue el cuál se está acceuienuo a la aplicacion. bPOdOb BKZ -# k8.R7#8 El API es la siguiente: public stotic booleon isIirefox{) Bevuelve tiue si el exploiauoi utilizauo es Nozilla Fiiefox. public stotic booleon isSofori{) Bevuelve tiue si el exploiauoi utilizauo es Apple Safaii. public stotic booleon isComino{) Bevuelve tiue si el exploiauoi utilizauo es Camino. public stotic booleon islnternetFxplorer{) Bevuelve tiue si el exploiauoi utilizauo es Hicrosoft lnternet Fxplorer. public stotic booleon isHobileSofori{) Bevuelve tiue si el exploiauoi utilizauo es Apple Hobile Sofori, el que usa el S0 uel iPbone y iPoJ Toucb. public stotic booleon islFHobile{) Bevuelve tiue si el exploiauoi utilizauo es Hicrosoft lnternet Fxplorer Hobile usauo en el sistema opeiativo WinJows Hobile. public stotic booleon is0peroHobile{) Bevuelve tiue si el exploiauoi utilizauo es 0pero Hobile si el exploiauoi utilizauo es 0peia paia WinJows Hobile. public stotic strinq qetversion{) Bevuelve la veision uel exploiauoi utilizauo. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 11S public stotic strinq qet0serAqent{) Bevuelve el 0sei Agent uel exploiauoi cliente. public static boolean isuecko() Bevuelve tiue si el motoi ue ienueiizauo uel exploiauoi es uecko. public static boolean isWebKit() Bevuelve tiue si el motoi ue ienueiizauo uel exploiauoi es WebKit. public stotic strinq qetAcceptFncoJinq{) Inuica los tipo ue couificacion sopoitauoi poi el exploiauoi. public static stiing getAcceptLanguage() 0btiene el iuioma utilizauo poi el exploiauoi usanuo el estánuai RFC. public stotic booleon occeptCompresseJ0utput{) Inuica si el exploiauoi acepta saliua compiimiua ya sea usanuo gzip o ueflate. public stotic strinq qetBrowserAbrev{) Bevuelve una abieviatuia uel 0sei Agent uel exploiauoi. public stotic booleon isHobile{) Inuica si el exploiauoi usauo se encuentia en una platafoima movil. public stotic booleon isHoc0SX{) Bevuelve true si el sistema opeiativo uel cliente es Apple Nac 0S X. public stotic booleon isWinJows{) Bevuelve true si el sistema opeiativo uel cliente es Niciosoft Winuows public stotic booleon islinux{) Bevuelve true si el sistema opeiativo uel cliente es Linux. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 116 12.5 Autocompletar con Scriptaculous El helpei Scriptoculous peimite conveitii un conjunto ue uatos en el foimato compatible al componente visual ue autocompletai que piopoiciona el fiamewoik sciipt.aculo.us. En el siguiente ejemplo se muestia el uso ue este: En la vista se usa el helpei ue la vista Toq::textWitbAutocomplete paia cieai un campo con autocompletai: <?php echo Tag::textFieldWithAutocomplete('pais', 'action: paises/consultar') ?> Según su uefinicion cuanuo el usuaiio esciiba algunos caiácteies se obtenuián los uatos uel iesultauo ue la accion consultor en el contiolauoi poises. Si los uatos ue paises se obtienen ue un aiiay estático entonces el contiolauoi paises es el siguiente: <?php class PaisesController extends ApplicationController { public function consultarAction(){ //Se indica que la respuesta es AJAX $this->setResponse('ajax'); //Se obtiene lo que digitó el usuario en la caja de texto $pais = $this->getPostParam('pais'); //Obtener los datos de un array estatico $paises = array( 'C' => 'COLOMBIA', 'E' => 'ECUADOR', 'M' => 'MEXICO', 'A' => 'ARGENTINA', 'U' => 'URUGUAY', 'B' => 'BOLIVIA' ); //Se filtran los que coincida con la busqueda $paisesBusqueda = Scriptaculous::filter($pais, $paises); //Se genera el HTML a devolver al usuario $htmlCode = Scriptaculous::autocomplete($paisesBusqueda); $this->renderText($htmlCode); } } Si los uatos ue paises se obtienen ue una tabla entonces el contiolauoi paises es el siguiente: <?php LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 117 class PaisesController extends ApplicationController { public function consultarAction(){ //Se indica que la respuesta es AJAX $this->setResponse('ajax'); //Campos del modelo utilizados para crear el resultado $fields = array('cod_pais', 'nombre'); //Obtener los paises requeridos $paises = Scriptaculous::querySource(‘paises’, $fields, $pais); //Se genera el HTML a devolver al usuario $htmlCode = Scriptaculous::autocomplete($paises, $fields); $this->renderText($htmlCode); } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 118 13 Componente Validator 13.1 Introducción Este componente está integiauo a las implementaciones ue contiolauoies y peimite iealizai valiuaciones sobie la entiaua ue usuaiio. Al sei inuepenuiente ue la capa ue logica ue uominio y piesentacion pueue sei usauo en los puntos ue la aplicacion que se iequieia sin afectai la aiquitectuia ue la misma. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 119 Paite 2: Seguiiuau 14 Seguridad con Kumbia Enterprise 14.1 Introducción Las aplicaciones Web y Seivicios Web cieauas usanuo Kumbia Enteipiise Fiamewoik pueuen sei uistiibuiuas e implementauas usanuo uifeientes entoinos uentio ue una misma instancia. Caua aplicacion pueue constituii una aiquitectuia multicapa inuepenuiente con iequeiimientos ue seguiiuau uifeientes. La seguiiuau ue una aplicacion pueue sei implementaua ue 2 foimas: • 6#+3,8,%(M, /H%#8$,5 Se uefinen los iequeiimientos ue seguiiuau ue una aplicacion utilizanuo iecuisos exteinos a la misma sin inteivenii ue maneia intiusiva en la logica ue la aplicacion. La uesciipcion ue esta incluye uetalles sobie como los ioles acceuen a los iecuisos ue la aplicacion y sus politicas. • K8.)8,1,+(.$,3 Z$%#8$,5 Esta embebiua en la aplicacion y esta implementaua en foima ue uecisiones ue seguiiuau, es suficiente cuanuo los iequeiimientos ue seguiiuau son simples y no cambian con fiecuencia. 14.2 Características de Seguridad Necanismos auecuauos ue seguiiuau ofiecen la siguiente funcionaliuau: • Pievienen acceso inautoiizauo a infoimacion y piocesos ue negocio • Contiolan que las activiuaues iealizauas poi un usuaiio no inteifieian con las iealizauas poi otios impactanuo la integiiuau uel sistema. • Piotegen el los seivicios uel sistema ue iiesgos que pueuan uecaei la caliuau uel seivicio piopoicionaua La seguiiuau ue aplicaciones basauas en Kumbio Fnterprise Iromework consiste en la implementacion ue componentes que ayuuen a piotegei los iecuisos ue la misma. Los piocesos ue seguiiuau iequieien ue la implementacion auecuaua ue autenticacion, iuentificacion, contiol ue acceso, integiiuau ue uatos y caliuau uel seivicio: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 12u ! B"%#$%(+,+(:$5 La aplicacion ejecuta piocesos que peimiten confiai que quien hace uso ue la misma es quien iealmente se espeia. ! B"%.8(>,+(:$5 Es el pioceso ue iuentificai a que conjunto ue iecuisos pueue utilizai¡acceuei con el pioposito ue establecei contioles auecuauos ue integiiuau ue uatos y limitaciones. ! Z$%#)8(-,- -# 6,%.75 Peimiten que solo usuaiios o ioles autoiizauos alteien la infoimacion a la que se les ha peimitiuo el acceso y que no inteivengan con otios piocesos ue otios usuaiios autenticauos. ! I.$*(-#$+(,3(-,- : K8(M,+(-,-5 Peimite que la infoimacion solo esté uisponible paia el usuaiio auecuauo y ue la foima auecuaua. ! I,3(-,- -#3 '#8M(+(. Vf.'W5 Peimite que se ofiezca una mejoi expeiiencia ue usuaiio apiovechanuo uifeientes tecnologias. ! B"-(%.8(,5 Peimite almacenai un iegistio consistente que peimita sabei las activiuaues que un usuaiio iealizo y bajo que conuiciones se iealizaion. 14.3 Mecanismos de Seguridad Kumbia Enteipiise Fiamewoik ofiece uifeientes componentes paia una auecuaua implementacion ue seguiiuau tanto ue aplicaciones Web como ue Seivicios Web empiesaiiales: ! B++#77 I.$%8.3 E(7% VBIEW5 Este componente peimite cieai listas en uonue se establece a que iecuisos pueue acceuei ueteiminauos ioles. ! B"%C5 Peimite iealizai el pioceso ue autenticacion utilizanuo uifeientes auaptauoies como Bigest, LBAP, Bases ue Batos, KeibeiosS y Rauius. ! B"-(%E.))#85 Peimite cieai iegistios ue auuitoiia ue las activiuaues iealizauas en las aplicaciones. ! '#77(.$5 Nantiene la peisistencia ue sesion inuepenuiente entie aplicaciones y usuaiios autenticauos. ! '#+"8(%\5 Peimite uetectai ataques ue negacion ue seivicio o bloqueai el acceso a un cliente atiavés ue su uiieccion IP. 14.4 Seguridad a nivel de Capa de Aplicación Los contiolauoies en las aplicaciones son apiopiauos paia establecei contioles ue seguiiuau en las aplicaciones, sin embaigo, touos los iequeiimientos ue seguiiuau no pueuen sei LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 121 contiolauos en piofunuiuau uesue este punto y geneialmente es necesaiio apoyaise poi fiiewalls u otias técnicas paia aumentai la confiabiliuau ue un sistema. Como caua aplicacion maneja sus piopios entoinos ue ejecucion y ue memoiia la infoimacion ue seguiiuau iesiue en foima inuepenuiente facilitanuo la auministiacion ue caua entoino. Cuanuo se utilizan seivicios Web con múltiples inteimeuiaiios es posible que haya la necesiuau ue implementai mecanismos ue seguiiuau compaitiuos y tiansfeiencia ue iuentiuau entie aplicaciones. Las ventajas ue la seguiiuau a nivel ue aplicacion incluyen: ! La seguiiuau ue caua aplicacion se pueue auaptai¡geneiai ue acueiuo a las necesiuaues ue caua una. ! La seguiiuau es optimizaua con opciones especificas ue caua una. Las uesventajas ue este tipo ue implementacion son: ! La aplicacion es uepenuiente ue atiibutos ue seguiiuau que no pueuen sei estableciuos o tiansfeiiuos uesue otia. ! Se ciea un único punto ue vulneiabiliuau que ue sei violauo exponuiia muchos aspectos ue las aplicaciones. 14.5 Seguridad a nivel de Capa de Transporte El uso ue piotocolos como BTTPS¡SSL pueue mejoiai la seguiiuau uesue otio punto ue vista sin que pueua ieemplazai la seguiiuau a nivel ue aplicacion. La seguiiuau a nivel ue capa ue tianspoite tiata ue mecanismos uno a uno en uonue poi meuio ue llaves ciiptogiáficas es posible implementai autenticacion, integiiuau ue mensajes y confiuencialiuau. Ceitificauos uigitales son iequeiiuos paia implementai este tipo ue seguiiuau. Estos están uiiectamente asociauos al seiviuoi Web utilizauo y suponen una capa ue la cual el fiamewoik no pueue tenei contiol. Las ventajas ue la seguiiuau en la capa ue tianspoite son: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 122 ! Fácil ue implementai. ! Esta basauo en estánuaies 14.6 Implementar Seguridad Declarativa El componente ue listas ue contiol ue Acceso ue Kumbio Fnterprise (ACL) esta integiauo con el Coie uel fiamewoik inteiceptanuo caua peticion y valiuanuo que su ejecucion este peimitiua en el contexto actual. La seguiiuau ueclaiativa está implementaua usanuo listas ue contiol ue acceso uefiniuas en la configuiacion ue la aplicacion meuiante uesciiptoies. Los uesciiptoies peimiten uefinii la estiuctuia ue autoiizacion ue seguiiuau que incluye: ioles, contiol ue acceso y iequeiimientos ue autenticacion en foima exteina a la aplicacion. La opcion securityAccesslist en la seccion application uel aichivo confiq.ini peimite establecei el tipo ue lista ue acceso que contiolaiá la seguiiuau ue la aplicacion: /0#123.5 Z123#1#$%,8 7#)"8(-,- -#+3,8,%(M, -#7-# +.$*()O($( [application] mode = production name = "Project Name" dbdate = Y-m-d debug = Off securityAccessList = “xml:filePath=%app-base%/security/security.xml” Los uesciiptoies ACL tienen el foimato ue un Boto Source Nome inuicanuo piimeio el nombie uel auaptauoi a utilizai y luego las opciones uel mismo usanuo punto y comas paia sepaiai las mismas. Los uesciiptoies ueben ii entie comillas uobles con el fin ue que cieitos caiacteies no causen conflictos al leei el aichivo .ini. En el siguiente ejemplo ue un uesciiptoi ue una lista ue acceso basaua en XNL se muestia como uefinii los aspectos básicos ue una lista. En el capitulo uel componente Acl se uetalla la implementacion ue caua paite uel aichivo XNL. /0#123.5 E(7%, BIE #$ l@E 2,8, +.$%8.3 -# ,++#7. <?xml version="1.0" encoding="UTF-8" ?> <security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- ROLES DE LA APLICACION --> <roles-collection> <role> <name>Public</name> <description>Rol para usuarios no autenticados</description> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 12S </role> <role> <name>EconomyCustomers</name> <description>Usuarios con plan economico</description> </role> </roles-collection> <!-- RECURSOS DE LA APLICACION --> <resources-collection> <resource> <name>banking</name> <description>Controlador para operaciones del cajero</description> </resource> <resource> <name>login</name> <description>Controlador para operaciones de inicio de sesión</description> </resource> </resources-collection> <!-- CONSTRAINTS DE ACCESO --> <access-constraint> <role-name>Public</role-name> <resource-name>*</resource-name> <action-name>*</action-name> <rule-type>deny</rule-type> </access-constraint> <access-constraint> <role-name>Public</role-name> <resource-name>login</resource-name> <action-name>validateCredentials</action-name> <rule-type>allow</rule-type> </access-constraint> <access-constraint> <role-name>EconomyCustomers</role-name> <resource-name>*</resource-name> <action-name>*</action-name> <rule-type>allow</rule-type> </access-constraint> <access-constraint> <role-name>EconomyCustomers</role-name> <resource-name>banking</resource-name> <action-name>checkBalance</action-name> <rule-type>deny</rule-type> </access-constraint> </security> Los iecuisos ue una aplicacion paia la seguiiuau ueclaiativa son los contiolauoies ue la misma y sus nombies coinciuen con estos en las opciones resource-nome en el ejemplo. La asociacion iecuiso-contiolauoi ofiece un potente sistema ue contiol paia caua peticion a la aplicacion ue foima tianspaiente paia el uesaiiollauoi. El iol con el cual se iealizan las valiuaciones ue seguiiuau es el uefiniuo meuiante el métouo uel componente Security llamauo setActiveRole{strinq $roleNome), cuanuo el iol no se ha uefiniuo aún se usa la convencion paia el iol Public ue tal foima que se asuma que la aplicacion es pública o no se ha uefiniuo iuentificacion ue quien usa la aplicacion. Los iecuisos que no se han mencionauo en las listas ue acceso tienen poi uefecto la politica LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 124 'Allow' con lo que se hacen públicos con solo acceuei a ellos. Poi caua peticion a la aplicacion el métouo Security::cbeckResourceAccess valiua si el iol activo tiene acceso al iecuiso solicitauo. Cuanuo se tiene acceso al iecuiso el pioceso ue negocio en la accion uel contiolauoi se ejecuta noimalmente, cuanuo la valiuacion falla, la aplicacion tiata ue eniutai a la accion uel contiolauoi llamaua unoutborizeJAccessAction. 14.7 Implementar Seguridad Programacional La seguiiuau piogiamacional esta embebiua en la aplicacion y esta implementaua en foima ue uecisiones ue seguiiuau. Es más útil cuanuo la seguiiuau ueclaiativa iesulta muy básica y no se auapta a las necesiuaues ue negocio. En este punto los filtios ue contiolauoies y el punto ue entiaua a la aplicacion ControllerBose iesultan apiopiauos paia uefinii las ieglas ue seguiiuau y aplicai el API ue los componentes Acl y Autb paia contiolai los piocesos iequeiiuos. 14.8 Definir Realms, Usuarios y Grupos para Autenticación Los Reolms son colecciones ue usuaiios los cuales pueuen o no peitenecei a un ueteiminauo giupo y son contiolauos meuiante una misma politica ue autenticacion. Noimalmente una aplicacion establece contioles como un usuaiio y contiaseña antes ue piopoicionai acceso a un iecuiso piotegiuo, los uatos piopoicionauos poi un usuaiio se valiuan en foima ue cieuenciales piouucienuo un iesultauo ue éxito uel pioceso ue autenticacion. Kumbio Fnterprise Iromework ofiece uifeientes auaptauoies ue autenticacion usanuo el componente Autb. En algunos casos los usuaiios ue las aplicaciones tienen asignauos ioles, esto inuica que hacen paite ue giupos con caiacteiisticas se seguiiuau uefiniuas en un uominio ue aplicacion. bdO`Ob <#,317 Los iealms son bases ue uatos ue usuaiios y giupos que contienen las cieuenciales necesaiias paia contiolai una politica ue autenticacion. Bebiuo a la flexibiliuau uel componente ue autenticacion Auth es posible cieai bases ue uatos ue autenticacion en vaiios foimatos caua uno con caiacteiisticas uistintas. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 12S bdO`OP ;7",8(.7 Los usuaiios son iuentiuaues inuiviuuales que son ieconociuos poi la aplicacion. 0n usuaiio pueue tenei ioles asociauos que peimiten conocei que iecuisos pueuen acceuei ue acueiuo a una politica ue seguiiuau. bdO`Oc j8"2.7 Los giupos iepiesentan una seiie ue caiacteiisticas compaitiuas poi uno o vaiios usuaiios. 0n giupo es un conjunto ue usuaiios que compaiten los mismos accesos y contioles ue seguiiuau en la aplicacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 126 15 Componente ACL (Lista de Control de Acceso) 15.1 Introducción La Lista ue Contiol ue Acceso o en inglés (Access Contiol List) es un componente ue Kumbio Fnterprise Iromework es un concepto ue seguiiuau infoimática usauo paia fomentai la sepaiacion ue piivilegios. Es una foima ue ueteiminai los peimisos ue acceso apiopiauos a un ueteiminauo objeto, uepenuienuo ue cieitos aspectos uel pioceso que hace el peuiuo. Al igual que otios componentes uel fiamewoik que están basauos en componentes se implementa el pation virtuol Proxy, una instancia ue Acl solo actúa como un Proxy al objeto ieal instanciauo que coiiesponue al tipo ue auaptauoi utilizauo poi el mismo. 15.2 Estructura del Componente Kumbio Fnterprise Iromework ha integiauo la siguiente estiuctuia jeiáiquica ue clases que peimiten la implementacion ue este componente: T,93,5 ]#8,8^"(, -# +3,7#7 -#3 +.12.$#$%# B+3 I3,7# 6#7+8(2+(:$ Acl.php Es la clase constiuctoia ue las listas Acl. Es un Pioxy a la funcionaliuau implementaua en caua auaptauoi. Inteiface.php Es la inteifase que ueben utilizai touos los auaptauoies Acl . Auapteis¡Nemoiy.php Es el auaptauoi que peimite auministiai las listas ue acceso en memoiia. Auapteis¡Xml.php El Auaptauoi peimite uefinii listas ue acceso en aichivos ue uesciipcion en XNL. Auapteis¡Nouel.php Es el auaptauoi peimite la auministiacion ue la lista ue acceso a una base ue uatos como backenu. Resouice¡Resouice.php Es la clase que peimite auministiai caua iecuiso como una entiuau inuepenuiente ue su backenu. Role¡Role.php Es la clase que peimite auministiai los ioles que tenuián acceso a la lista ACL inuepenuientemente ue su backenu. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 127 15.3 ¿Que es un Recurso? 0n iecuiso es cualquiei elemento ue una aplicacion uel cual se pueua contiolai su acceso. Poi conveniencia los contiolauoies ue la aplicacion son vistos como iecuisos con el objetivo ue geneiai un mouelo ue seguiiuau consistente. 15.4 ¿Que es un Rol? 0n iol es un nombie abstiacto paia el peimiso ue usuaiios a un conjunto paiticulai ue iecuisos en una aplicacion. 0n iol pueue sei compaiauo a la llave que abie un canuauo, este abie sin impoitai quien tiene la clave. Los ioles están geneialmente asociauos a los mismos usuaiios, a los giupos ue estos o a sus peifiles. 15.5 ¿Que es un Acceso? Los accesos son las opeiaciones o acciones que se pueuen iealizai en los iecuisos. Niveles más piofunuos ue seguiiuau contiolan hasta este nivel lo que se pueua hacei poi paite ue los usuaiios. 15.6 Tipos de Reglas El acceso a un ueteiminauo iecuiso tiene una iegla ue 'peimitii' (ollow) o 'uenegai' (Jeny), no están sopoitauas otios tipos ue ieglas ue acceso. 15.7 ACL en Acción En el siguiente ejemplo se ilustia como al uefinii un filtio beforeIilter en la clase ControllerBose en opps,Jefoult,controllers,opplicotion.pbp con el que se pueue implementai el contiol ue acceso a los iecuisos ue la aplicacion en foima piogiamacional: /0#123.5 ;%(3(>,8 BIE +.$ 1.-#3.7 2,8, M,3(-,8 #3 ,++#7. , 3.7 8#+"87.7 -# "$, ,23(+,+(:$ <?php class ControllerBase { public function beforeFilter(){ $role = Session::get('role'); if($role==""){ $role = 'Public'; } $acl = new Acl('Model', 'className: AccessList'); $resourceName = $this->getControllerName(); $operationName = $this->getActionName(); if($acl->isAllowed($role, $resourceName, $operationName)==false){ if($this->getControllerName()!='appmenu'){ $this->routeTo("controller: appmenu"); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 128 } else { throw new ApplicationControllerException("No tiene permiso para usar esta aplicación"); } $authLog = new Log(“File”, "auth_failed.txt"); $authLog->log("Autenticación fallo para el rol '$role' en el recurso '". $this->getControllerName()."/".$this->getActionName()."'"); return false; } } } uiacias a que el métouo beforeIilter se encuentia en la jeiaiquia ue touos los contiolauoies este se ejecuta pieviamente a cualquiei accion solicitaua. Se obtiene ue los uatos ue sesion, la vaiiable role inuica el nombie uel iol actualmente logueauo, si aun no hay un iol activo es asignauo poi uefecto Public. Ahoia es posible instanciai la clase Acl, y uefinii como auaptauoi un Nouelo en uonue se ha iefeiencia a la clase Accesslist quien mapea a la tabla llamaua access_list, la cual auministia los accesos a los iecuisos ue la aplicacion. La tabla contiene un Security Policy Bomoin ue un P0S (Point 0f Sale): /0#123.5 6,%.7 -# 3(7%, BIE 9,7,-, #$ @.-#3.7 SQL > select * from access_list order by role; +----+-----------------+-----------------------+--------+-------+ | id | role | resource | action | allow | +----+-----------------+-----------------------+--------+-------+ | 6 | Public | * | * | Y | | 7 | Public | dinein | * | N | | 15 | Public | users | * | N | | 27 | Public | appmenu | * | Y | | 29 | Public | admin | * | Y | | 30 | Public | menus | * | N | | 9 | Administradores | * | * | Y | | 10 | Cajeros | * | * | Y | | 11 | Cajeros | ambient_items | * | N | | 12 | Cajeros | drop_invoice | * | N | | 13 | Cajeros | menus | * | N | | 14 | Cajeros | menus_items | * | N | | 16 | Cajeros | users | * | N | | 17 | Cajeros | modifiers | * | N | | 18 | Cajeros | ambient_menus_items | * | N | | 19 | Cajeros | discount | * | N | | 26 | Cajeros | data | query | N | +----+-----------------+-----------------------+--------+-------+ El paiámetio clossNome peimite establecei un mouelo que contiene la estiuctuia uesciita en la tabla anteiioi. El campo resource y oction pueuen contenei asteiiscos (ƒ) que son usauos como comouines paia cualquiei ciiteiio que coinciua. El campo ollow pueue tenei los valoies Y(es) o N(o) paia inuicai si le conceue el acceso al iecuiso. La piincipal ventaja ue la listas ACL es que valiuan los accesos en foima jeiáiquica ya sea a LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 129 nivel ue iecuisos o meuiante heiencia ue ioles. En el ejemplo el acceso ue jeiaiquia más alto es en el que hay comouines tanto paia el iecuiso como paia la accion, el métouo Acl::isAlloweJ busca jeiáiquicamente si existe un acceso o no en la lista ue acceso. Según el ejemplo las siguientes consultas a la lista ue acceso uaiian como iesultauo: /0#123.5 I.12.8%,1(#$%. -# 3, 3(7%, BIE 7#)G$ -,%.7 -# #0#123. $acl = new Acl('Model', 'className: AccessList'); //Esta permitido el rol ‘Public’ a acceder al recurso ‘menus’ en la operación ‘index’? //No Permitido $acl->isAllowed("Public", "menus", "index") //Esta permitido el rol ‘Cajeros’ a acceder al recurso ‘dinein’ en cualquier operación? //Permitido $acl->isAllowed("Cajeros", "dinein", "*") //Esta permitido el rol ‘Cajeros a acceder al recurso ‘data’ en la operación ‘query’? //No Permitido $acl->isAllowed("Cajeros", "data", "query") El piimei paiámetio ue Acl::isAlloweJ es el nombie uel iol, el segunuo el nombie uel iecuiso y el teiceio el nombie ue la accion. Cuanuo no se encuentia una iegla especifica paia iol- iecuiso-opeiacion, se busca iol-iecuiso-cualquieia y poi ultimo iol-cualquieia-cualquieia. 15.8 Herencia de Roles 0na ue las gianues ventajas uel uso ue listas ue contiol ue acceso es la constiuccion ue aiboles ue jeiaiquia ue ioles. Be esta foima los peimisos ue acceso pueuen sei heieuauos o compaitiuos entie vaiios ioles sin que haya ieuunuancia ue infoimacion piopoicionanuo a la aplicacion capaciuaues ue contiol ue acceso potentes y flexibles. 15.9 Adaptadores de ACL Kumbio Fnterprise Iromework peimite utilizai vaiios backenus paia almacenai listas Acl. Caua auaptauoi implementa la inteiface Acllnterfoce: <?php interface AclAdapter { public function addRole(AclRole $roleObject, $accessInherits=''); public function addInherit($role, $roleToInherit); public function isRole($role_name); public function isResource($resource_name); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1Su public function addResource(AclResource $resource); public function addResourceAccess($resource, $accessList); public function dropResourceAccess($resource, $accessList); public function allow($role, $resource, $access); public function deny($role, $resource, $access); public function isAllowed($role, $resource, $accessList); } A continuacion se explican las consiueiaciones ue uso ue caua auaptauoi: bNOiOb [email protected]#3 La lista ue accesos también pueue sei auministiaua usanuo mouelos uisponibles en la aplicacion. Paia esto es necesaiio cieai una entiuau con la siguiente estiuctuia: CREATE TABLE `access_list` ( `id` int(11) NOT NULL, `role` varchar(24) NOT NULL, `resource` varchar(32) NOT NULL, `action` varchar(32) NOT NULL, `allow` char(1) default NULL, PRIMARY KEY (`id`), ) Al instanciai el objeto Acl se uebe inuicai el mouelo a utilizai meuiante el paiámetio className, luego el compoitamiento y utilizacion es el noimal: /0#123.5 ;7. -# 3(7%,7 BIE +.$ @.-#3.7 $acl = new Acl('Model', 'className: AccessList'); $acl->isAllowed("Administrators", "customers", "create") bNOiOP B+3@#1.8\ El auaptauoi AclHemory almacena los peimisos en memoiia. La lista ue contiol ue acceso pueue constiuiise en un pioceso inicializauoi y almacenaise en un backenu ue cache paia usaise en otias peticiones. Paia aplicaciones con iequeiimientos ue valiuacion ue contiol ue acceso ieuuciuos este auaptauoi pueue sei una opcion a tenei en cuenta. bNOiOc B+3l@E Este auaptauoi peimite cieai listas ue contiol ue acceso en aichivos XNL. Estos aichivos mantienen los contioles ue foima estiuctuiaua hacienuo sencilla su manipulacion uesue otios lenguajes y aplicaciones. El aichivo uebe contenei la siguiente estiuctuia: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S1 ! 0n nouo iaiz 'secuiity' que contenuiá la lista en si ! 0n solo nouo 'ioles-collection' que contiene nouos 'iole' con infoimacion ue ioles ! Los nouos 'iole' ueben tenei los sub-nouos 'name' y 'uesciiption' con el nombie y uesciipcion uel iol iespectivamente. ! 0n solo nouo 'iesouices-collection' que contiene nouos 'iesouice' con infoimacion ue los iecuisos en la lista. ! Los nouos 'iesouice' ueben tenei los sub-nouos 'name' y 'uesciiption' con el nombie y uesciipcion uel iecuiso iespectivamente. ! Núltiples nouos 'access-constiaint' con las ieglas ue acceso. El oiuen ue estas inuica la piioiiuau ue caua una. ! Caua nouo 'access-constiaint' contiene los nouos 'iole-name' que es nombie uel iol, 'iesouice-name' que es el nombie uel iecuiso, 'action-name' que es nombie uel acceso y 'iule-type' que contiene 'allow' si tiene acceso al iecuiso y 'ueny' ue lo contiaiio. El siguiente es el ejemplo ue una lista ACL en XNL: <?xml version="1.0" encoding="UTF-8" ?> <security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- ROLES DE LA APLICACION --> <roles-collection> <role> <name>Public</name> <description>Rol para usuarios no autenticados</description> </role> <role> <name>Customers</name> <description>Usuarios clientes de la empresa</description> </role> <role> <name>QueryOnly</name> <description>Usuarios con permisos de solo lectura</description> </role> </roles-collection> <!-- RECURSOS DE LA APLICACION --> <resources-collection> <resource> <name>banking</name> <description>Controlador para operaciones del cajero</description> </resource> <resource> <name>login</name> <description>Controlador para operaciones de inicio de sesión</description> </resource> </resources-collection> <!-- CONSTRAINTS DE ACCESO --> <access-constraint> <role-name>Public</role-name> <resource-name>*</resource-name> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S2 <action-name>*</action-name> <rule-type>deny</rule-type> </access-constraint> <access-constraint> <role-name>Public</role-name> <resource-name>login</resource-name> <action-name>validateCredentials</action-name> <rule-type>allow</rule-type> </access-constraint> <access-constraint> </security> 15.10 API de un Adaptador public booleon oJJRole{AclRole $role0bject, mixeJ $occesslnberits) Agiega un iol a la lista ue ioles ue la lista ue Acceso. En este tipo ue Auaptauoi el iol se ciea en la entiuau uefiniua en el constiuctoi ue la lista en el paiámetio: iolesClassName. public voiJ oJJlnberit{$role, $roleTolnberit) Agiega una heiencia a la lista en la que el iol $iole heieua touos los constiaints ue acceso que tiene el iol $roleTolnberit. public booleon isRole{strinq $roleNome) Peimite sabei si $roleNome esta piesente en la lista ACL public booleon isResource{strinq $resourceNome) Peimite sabei si un iecuiso existe o no en la lista ue acceso actual. public booleon oJJResource{AclResource $resource) Agiega un iecuiso paia sei auministiauoi poi la lista ue contiol ue acceso. public voiJ oJJResourceAccess{strinq $resource, mixeJ $occesslist) Agiega una opeiacion¡accion a un iecuiso ue la lista ACL. El paiámetio $accessList pueue sei un stiing o un vectoi. public voiJ JropResourceAccess{$resource, $occesslist) Elimina una opeiacion¡accion ue un iecuiso ue la lista ACL. El paiámetio $accessList pueue sei un stiing o un vectoi. public voiJ ollow{strinq $role, strinq $resource, mixeJ $occess) Agiega una iegla que ua acceso a un ueteiminauo iol a un iecuiso. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1SS public voiJ Jeny{strinq $role, strinq $resource, mixeJ $occess) Agiega una iegla ueneganuo el acceso ue un ueteiminauo iol a un iecuiso. public booleon isAlloweJ{strinq $role, strinq $resource, orroy $occesslist) Realiza una consulta en la lista ACL 15.11 API de AclResource public voiJ qetNome{) 0btenei el nombie uel iecuiso public voiJ qetBescription{) 0btenei la uesciipcion uel iecuiso 15.12 API de AclRole public voiJ qetNome{) 0btenei el nombie uel Role public voiJ qetBescription{) 0btenei la uesciipcion uel Role, usualmente el nombie extenuiuo uel iol. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S4 16 Componente Auth 16.1 Introducción El componente Auth esta uiseñauo paia peimitii la autenticacion y auministiacion ue la entiuau ue los usuaiios en una aplicacion ya sea ue foima inuepenuiente o ue maneia compaitiua. Este componente acceue a sus auaptauoies usanuo el pation virtuol Proxy, es uecii, una instancia ue Autb solo actúa como un Proxy al objeto ieal instanciauo que coiiesponue al tipo ue auaptauoi utilizauo poi el mismo. Esta implementacion peimite cieai un punto ue entiaua único pai la utilizacion ue auaptauoies uel fiamewoik o ue usuaiio. La instancia inteina uel auaptauoi se pueue obtenei usanuo el métouo Autb::qetAJopterlnstonce{). 16.2 Adaptadores de Auth El componente implementa una aiquitectuia ue auaptauoies ue autenticacion, estos establecen inteifaces consistentes a uifeientes pioveeuoies ue iuentificacion bajo una misma inteifaz ue aplicacion. Caua auaptauoi iequieie ue uifeientes paiámetios solicitauos poi el seivicio ue autenticacion utilizauo. Los auaptauoies uisponibles son: T,93,5 B-,2%,-.8#7 -# B"%C -(72.$(93#7 B-,2%,-.8 6#7+8(2+(:$ Bigest Peimite la autenticacion usanuo un iealm basauo en un aichivo plano ue texto. Rauius Implementa autenticacion usanuo piotocolo Rauius Autentication RFC- 286S. Keibeios v Autentica usanuo seiviuoies Keibeios S y auemás peimite obtenei las politicas asociauas al usuaiio iuentiuau. Nouel 0sa un mouelo ue la aplicacion en uonue los atiibutos ue esta actuan como cieuenciales en la autenticacion. LBAP Peimite utilizai seiviuoies LBAP como ActiveBiiectoiy paia LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1SS autenticaise en una aplicacion. Touos los auaptauoies ue Autb implementan la inteiface Autblnterfoce: interface AuthInterface { public function __construct($auth, $extraArgs); public function getIdentity(); public function authenticate(); } 16.3 Administración de Identidad La auministiacion ue iuentiuau es uno ue los piocesos más usuales en cualquiei aplicacion Web, una vez se piouuce la autenticacion e iuentificacion uel usuaiio es necesaiio conocei la iuentiuau uuiante toua la sesion uel mismo en la aplicacion. Al iealizai una autenticacion satisfactoiia con el componente Autb automáticamente se ciea un iegistio ue la iuentiuau ue quien inicio sesion y pouei cumplii con objetivos ue la aplicacion como peisonalizacion o confiuencialiuau. El métouo estático ue Autb llamauo qetActivelJentity{) uevuelve la iuentiuau cieaua en la autenticacion en cualquiei paite ue la aplicacion. Paia uestiuii la iuentiuau activa se usa el también métouo estático JestroylJentity{). Paia conocei si existe una iuentiuau valiua en la aplicacion se usa el métouo Autb::isvoliJ{) que uevuelve un valoi boleano coiiesponuiente a esa infoimacion. 16.4 Expiración de Sesión El componente Autb sopoita expiiacion ue la sesion con lo que es posible contiolai que un usuaiio autenticauo solamente pueua utilizai la aplicacion uuiante un ueteiminauo iango ue tiempo. En estos casos se uebe establecei el tiempo en segunuos que uebe uuiai la sesion meuiante el métouo uel objeto Autb llamauo setFxpireTime uespués ue la autenticacion uel usuaiio. 16.5 Control de Autenticación concurrente Las ieglas uel negocio en una aplicacion pouiian contemplai que un usuaiio este autenticauo LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S6 en una aplicacion solamente uesue una teiminal ue tiabajo. En otios casos cuanuo se geneie una autenticacion uel usuaiio uesue otia maquina se iequieia que se cieiie o se invaliuen las sesiones abieitas en otias teiminales. 16.6 Autenticación con Modelos El auaptauoi HoJel peimite iealizai la autenticacion meuiante un iealm en una entiuau uel gestoi ielacional poi uefecto en confiq,environment.ini. La piincipal ventaja ue este auaptauoi es que apiovecha las capaciuaues paia atenuei múltiples peticiones concuiientes ue autenticacionn que pueua tenei el gestoi ielacional. El siguiente ejemplo ilustia como iealizai una autenticacion atiavés usanuo este auaptauoi: /0#123.5 ;7. -#3 +.12.$#$%# B"%C +.$ 1.-#3.7 <?php class LoginController extends ApplicationController { public function indexAction(){ } public function authSessionAction(){ $login = $this->getPostParam("login"); $password = sha1($this->getPostParam("password")); $auth = new Auth('model', "class: Usuarios", "login: $login", "password: $password"); if($auth->authenticate()==false){ Flash::error("Usuario/clave incorrectos"); $this->routeTo("action: index"); } else { $this->routeTo("controller: menu"); } $this->setRequest("password", ""); } } T,93,5 K,8U1#%8.7 ^"# 8#^"(#8# #3 ,-,2%,-.8 B"%C +.$ 1.-#3.7 4.198# 6#7+8(2+(:$ class Nombie ue la clase uel mouelo que seiviia como iealm. Los campos que confoiman la clave ue iuentiuau ueben sei pasauos como paiámetios con su iespectivo valoi. La iuentiuau se constiuye apaitii ue los atiibutos ue la entiuau exceptuanuo los campos ue passwoiu o contiaseña. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S7 16.7 Autenticación con KerberosV Este auaptauoi peimite autenticaise usanuo seiviuoies auministiativos Keibeios S asi como obtenei las politicas asociauas a los usuaiios autenticauos. Pueue obtenei más infoimacion sobie seiviuoies Keibeios en http:¡¡web.mit.euu¡keibeios¡www¡kibS-1.2¡kibS-1.2.8¡uoc¡aumin_toc.html. El siguiente ejemplo ilustia como iealizai una autenticacion atiavés usanuo este auaptauoi: /0#123.5 ;7. -#3 +.12.$#$%# B"%C +.$ "$ 7#8M(-.8 h#89#8.7Y <?php class LoginController extends ApplicationController { public function startSessionAction(){ $login = $this->getPostParam("login"); $password = $this->getPostParam("password"); $auth = new Auth('kerberos5', "realm: GONICUS.LOCAL", "username: admin/admin", "password: 12345"); if($auth->authenticate()==true){ $identity = $auth->getIdentity(); $policies = $auth->getPolicies(); Flash::success("Bienvenido {$identity['username']}"); foreach($policies as $policy){ Flash::notice($policy); } } else { Flash::error("Fallo autenticacion. Credenciales invalidas"); } } } T,93,5 K,8U1#%8.7 ^"# 8#^"(#8# #3 ,-,2%,-.8 B"%C +.$ h#89#8.7Y 4.198# 6#7+8(2+(:$ seivei Es el nombie ue uominio o uiieccion IP uel seiviuoi Keibeios v. Este paiámetio es obligatoiio. iealm El nombie ue la base ue uatos con la politica ue autenticacion en el seiviuoi KS. piincipal 0na combinacion usuaiio¡giupo con el que se haiá la autenticacion passwoiu Contiaseña uel usuaiio usauo en piincipal. La iuentiuau uevuelta está consta ue los campos iealm y useiname. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S8 !"#$%&$'()*+ El uso ue este auaptauoi iequieie que este piesente la extension ue PBP llamaua php_kaumS. 16.8 Autenticación con Radius Este auaptauoi peimite la autenticacion meuiante piotocolo Rauius (RFC286S - http://www.faqs.org/rfcs/rfc2865). Este auaptauoi iequieie ue la extension php_iauius que se encuentia uisponible en platafoimas 0nix (FieeBSB, Linux) y Winuows. El siguiente ejemplo ilustia como iealizai una autenticacion atiavés usanuo este auaptauoi: /0#123.5 ;7. -#3 +.12.$#$%# B"%C +.$ "$ 7#8M(-.8 <,-("7 <?php class LoginController extends ApplicationController { public function startSessionAction(){ $login = $this->getPostParam("login"); $password = $this->getPostParam("password"); $auth = new Auth('radius', "server: 172.16.2.10", "port: 1821", "secret: a1b2c3d4", "username: tierry", "password: henry" ); if($auth->authenticate()==true){ $identity = $auth->getIdentity(); Flash::success("Bienvenido {$identity['username']}"); } else { Flash::error("Fallo autenticacion. Credenciales invalidas"); } } } T,93,5 K,8U1#%8.7 ^"# 8#^"(#8# #3 ,-,2%,-.8 B"%C +.$ <,-("7 4.198# 6#7+8(2+(:$ seivei Es el nombie ue uominio o uiieccion IP uel seiviuoi Rauius v. Este paiámetio es obligatoiio. poit Pueito 0BP uonue escucha el seivicio Rauius. Si el pueito es u el auaptauoi localiza el seivicio meuiante el aichivo ¡etc¡seivices y como última opcion el pueito estánuai 1812. seciet La clave compaitiua que se pasaiá al seiviuoi Rauius. timeout Númeio ue segunuos que el auaptauoi espeia poi obtenei iespuesta uel seiviuoi. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S9 max_ietiies Númeio ue intentos que iealiza paia tiatai ue autenticaise. useiname Nombie ue usuaiio a autenticai. passwoiu Passwoiu el usuaiio a autenticai. La iuentiuau se constiuye con el campo useiname. 16.9 Autenticación con Digest El auaptauoi ue autenticacion Biqest peimite utilizai aichivos planos ue texto como iealms paia la compiobacion ue iuentiuau ue los usuaiios ue una aplicacion. 0n aichivo Bigest tiene la siguiente estiuctuia: nombreusuario:nombrerealm:resumenpassword otronombreusuario:nombrerealm:otroresumenpassword Caua linea uel aichivo constituye una iuentiuau. Los campos ue la iuentiuau están sepaiauos poi ":" (uos puntos). El piimei campo es el nombie uel usuaiio, este pueue tenei la foima john.smith. El segunuo campo es el iealm al que peitenece el usuaiio, un aichivo uigest pueue tenei vaiios iealms en él. Poi último el teicei campo es un iesúmen ciiptogiáfico coiiesponuiente al passwoiu uel usuaiio. El algoiitmo estánuai ue una sola via utilizauo es NBS peio es posible utilizai otio meuiante la opcion ue configuiacion olqoritbm. Paia un aichivo uigest como el siguiente: john.smith:Production:5ebe2294ecd0e0f08eab7690d2a6ee69 El siguiente pioceso ue autenticacion es satisfactoiio: /0#123.5 B"%#$%(+,+(:$ "7,$-. #3 ,-,2%,-.8 6()#7% <?php class LoginController extends ApplicationController { public function startSessionAction(){ $auth = new Auth('digest', "filename: auth/passwd.txt", "username: john.smith", "password: secret", "realm: Production" ); if($auth->authenticate()==true){ $identity = $auth->getIdentity(); Flash::success("Bienvenido {$identity['username']}"); } else { Flash::error("Falló autenticación. Credenciales invalidas"); } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 14u } /0#123.5 B"%#$%(+,+(:$ "7,$-. "$ ,8+C(M. +.$ .%8. +C,87#% -(*#8#$%# ,3 -# #$%8,-,O <?php class LoginController extends ApplicationController { public function startSessionAction(){ $auth = new Auth('digest', "filename: auth/passwd.txt", "username: お読みください", "password: secret", "realm: フォルダに入れてください", “charset: EUC-JP” ); if($auth->authenticate()==true){ $identity = $auth->getIdentity(); Flash::success("Bienvenido {$identity['username']}"); } else { Flash::error("Falló autenticación. Credenciales invalidas"); } } } T,93,5 K,8U1#%8.7 ^"# 8#^"(#8# #3 ,-,2%,-.8 B"%C +.$ 6()#7% 4.198# 6#7+8(2+(:$ filename Ruta al aichivo uigest. El aichivo uebe sei ue texto, si está uisponible la extension ue PBP Nultibyte Stiings su couificacion pueue sei cualquieia que sopoite ésta. useiname Nombie uel usuaiio a autenticai passwoiu Passwoiu plano uel usuaiio iealm Realm al que peitenece el usuaiio a autenticai algoiithm Callback uel algoiitmo que se utilizaiá paia compaiai el passwoiu uel usuaiio con los uel aichivo uigest. Poi uefecto es NBS. chaiset Couificacion que tiene el aichivo ue iuentiuaues uigest. El valoi poi uefecto es 0TF-8. La iuentiuau se constiuye a paitii ue los campos useiname y iealm uel usuaiio encontiauo. 16.10 Autenticación con LDAP El piotocolo LBAP "liqbtweiqbt Birectory Access Protocol" es utilizauo paia acceuei a seiviuoies ue uiiectoiios. Estos son estiuctuias que almacenan uatos en una jeiaiquia ue aibol. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 141 El auaptauoi ue autenticacion LBAP sopoita autenticacion con seiviuoies ue uiiectoiios como Niciosoft Active Biiectoiy, 0penLBAP, Sun 0penBS o Nac 0S X Seivei LBAP Seivice. La notacion BN o "Bistinguisheu Name" iepiesentan iutas a objetos alojauos en un seiviuoi LBAP. Caua atiibuto esta inuicauo con su nombie estanuai, un igual y su valoi. Los atiibutos están sepaiauos poi comas y el oiuen ue lectuia ue los atiibutos se iealiza ue ueiecha a izquieiua. En el siguiente ejemplo se ilustia la autenticacion a un seiviuoi LBAP a paitii ue los paiámetios ue un foimulaiio: /0#123.5 ;7. -#3 +.12.$#$%# B"%C +.$ "$ 7#8M(-.8 E6BK <?php class LoginController extends ApplicationController { public function startSessionAction(){ $login = $this->getPostParam("login"); $password = $this->getPostParam("password"); $auth = new Auth('ldap', "server: server.local", "accountDomainName: example.com", "baseDN: dc=example,dc=com", "username: uid=$login,dc=example,dc=com", "password: $password", "identityAttributes: cn,uid", "port: 1389" ); if($auth->authenticate()==true){ $identity = $auth->getIdentity(); Flash::success("Bienvenido {$identity['username']}"); } else { Flash::error("Falló autenticación. Credenciales invalidas"); } } } Los siguientes paiámetios ueben sei inuicauos paia iealizai una autenticacion satisfactoiia en un seiviuoi LBAP: T,93,5 K,8U1#%8.7 ^"# 8#+(9# #3 ,-,2%,-.8 B"%C +.$ E6BK 4.198# 6#7+8(2+(:$ seivei Es el nombie ue uominio o uiieccion IP uel seiviuoi LBAP. Este paiámetio es obligatoiio. accountBomainName Nombie uel uominio al que peitenece la cuenta a autenticai. useiname BN uel usuaiio que se va a autenticai en el seiviuoi. Este paiámetio LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 142 es obligatoiio. passwoiu Contiaseña uel usuaiio que se va a autenticai. Si el paiámetio no es inuicauo se piouuce un intento ue autenticacion anonimo. baseBN BN base uonue se hace la búsqueua ue la iuentiuau uel usuaiio. Es el BN uel seiviuoi uonue la cuenta se encuentia ubicaua. poit Pueito uel seiviuoi uonue escucha el LBAP Seivei. iuentityAttiibutes Atiibutos ue la entiaua uel seiviuoi LBAP que seián usauos paia constiuii la iuentiuau uel usuaiio autenticauo. accountCanonicalFoim Inuica la foima en la que el nombie ue usuaiio esta canonizauo, uepenuienuo uel tipo ue seiviuoi LBAP el auaptauoi tiauuce este nombie automáticamente al auecuauo. 0n valoi ue 2 inuica la foima noimal, S usa la foima \\SERvIB0R\usuaiio y la 4 usuaiioÇseiviuoi. La iuentiuau se constiuye apaitii ue los campos uel iegistio uel nombie canonico uel usuaiio en el seiviuoi LBAP. !"#$%&$'()*+ El uso ue este auaptauoi iequieie que este piesente la extension ue PBP llamaua php_luap. 17 Componente AuditLogger 17.1 Introducción El componente AuJitloqqer esta uiseñauo paia asistii las taieas ue auuitoiia ue sistemas cieanuo logs que lleven el iegistio ue las activiuaues iealizauas en una aplicacion ue negocios poi paite ue caua uno ue los ioles que la utilizan. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 14S 17.2 Crear un componente de control <?php class MyApplicationAudit extends AuditLogger { public function __construct($note, $transaction=null){ parent::__construct("Audit"); $this->bindToField("USER_ID", "usuarios_id"); $this->bindToField("USERNAME", "nombre"); $this->bindToField("NOTE", "nota"); $this->bindToField("IP_ADDRESS", "ipaddress"); $this->setFieldData("controller", Router::getController()); $this->setFieldData("action", Router::getAction()); $this->setFieldData("USER_ID", Session::get("usuariosId")); $this->setFieldData("USERNAME", Session::get("usuariosNombre")); $this->setFieldData("NOTE", $note); if($transaction!=null){ $this->setTransaction($transaction); } $this->commit(); } } 18 Componente Security 18.1 Introducción El objetivo ue este componente es ofiecei funcionaliuaues vaiias ue seguiiuau a aplicaciones web empiesaiiales. 0na caiacteiistica impoitante ue este componente es un Fiiewall que peimite uefinii ieglas ue acceso estilo fiiewall a una aplicacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 144 18.2 Subcomponente SecurityFirewall b`OPOb Z$%8.-"++(:$ El objetivo uel subcomponente SecuiityFiiewall es el ue peimitii al uesaiiollauoi analizai el entoino uesue el cual se acceue a un ueteiminauo punto ue la aplicacion y valiuai si se peimite el acceso o no. Las ieglas se uefinen en un aichivo XNL en el oiuen ue piioiiuau como ueben sei evaluauas. 0n ejemplo es el siguiente uocumento XNL: <?xml version="1.0" encoding="UTF-8"?> <firewallRules> <hostTraslation> <hostname>localhost</hostname> <address>::1</address> </hostTraslation> <rule> <source>localhost</source> <controller>products</controller> <action>*</action> <target>reject</target> </rule> <rule> <source>192.168.10.120</source> <controller>admin</controller> <action>*</action> <target>reject</target> </rule> <rule> <source>localhost</source> <controller>*</controller> <action>*</action> <target>accept</target> </rule> </firewallRules> El nouo iaiz firewollRules abie el uocumento. Los nouos bostTroslotion contienen tiauucciones pieuefiniuas paia nombies-ue-maquina¡uiiecciones-ip, asi es posible inuicaile al fiiewall que un mismo nombie ue maquina tiene vaiias uiiecciones IP asignauas. En el ejemplo la uiieccion ::1 uel loopback ue una maquina Nac 0S X es agiegaua como localhost. Los nouos rule peimiten uefinii las ieglas uel fiiewall. Poi obligacion estos nouos ueben tenei un atiibuto taiget que inuica que el tipo ue accion a ejecutai cuanuo se cumple la iegla. b`OPOP I.1. 7# #M,3",$ 3,7 8#)3,7 Las ieglas son evaluauas en el oiuen en el que se uefinieion en el aichivo XNL. Si una iegla cumple con las conuiciones uel entoino ue la peticion entonces las uemás ieglas no son evaluauas. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 14S Es necesaiio tenei en cuenta el oiuen en el que se uefinen paia evitai que una iegla sobieesciiba a otias y no se logie el objetivo espeiauo. b`OPOc T(2.7 -# B%8(9"%.7 -# "$, <#)3, 0na iegla uel SecuiityFiiewall pueue tenei los siguientes tipos ue atiibutos: 4.198# 6#7+8(2+(:$ souice El oiigen ue la peticion. Pueue sei un nombie ue maquina en la ieu, un nombie ue uominio o una uiieccion IP. Cuanuo se establece un nombie ue maquina se utilizan las capaciuaues ue iesolucion ue nombies que tenga la maquina actual paia obtenei las uiiecciones IP coiiesponuientes. La uiieccion IP uel cliente se obtiene incluso cuanuo el acceso se iealiza meuiante un pioxy tianspaiente. Las IPs no pueuen sei obteniuas cuanuo se usa un pioxy anonimo. mac La NIC ue la taijeta ue ieu pueue sei obteniua cuanuo la aplicacion es ejecutaua en sistemas Linux¡0nix y cuanuo los clientes se encuentian en la mismo iango ue ieu uel seiviuoi. contiollei El nombie uel contiolauoi ue aplicacion o seivicio web en la aplicacion activa que se está tiatanuo ue acceuei. Se pueue usai ƒ como comouin que coinciua con cualquiei contiolauoi. action El nombie ue la accion en el contiolauoi solicitauo que se está tiatanuo ue acceuei. Se pueue usai ƒ como comouin que coinciua con cualquiei nombie ue accion. isAjaxRequesteu Inuica si la peticion se está tiatanuo ue hacei usanuo A}AX. isSoapRequesteu Inuica si la peticion se está tiatanuo ue hacei uesue un cliente Soap. isSecuie Inuica si la conexion se iealiza usanuo una conexion seguia. isFlashRequesteu Inuica si la conexion se iealiza uesue un plug-in ue Auobe Flash. hasBeauei Si la peticion contiene un ueteiminauo encabezauo. Núltiples encabezauos pueuen uefiniise sepaianuolos poi pipes (|). methou Peimite inuicai el tipo ue métouo BTTP utilizauo paia solicitai la peticion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 146 Paite S: La logica ue uatos 19 Persistencia, Transacciones y Concurrencia 19.1 Introducción El papel ue la capa ue peisistencia en una aplicacion es tiaei y llevai los uatos iequeiiuos paia LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 147 que la logica ue uominio en los contiolauoies pueue iealizai su tiabajo coiiectamente. Cuanuo se habla ue peisistencia se piensa noimalmente en bases ue uatos ielacionales y el tiatamiento ue estas geneialmente conlleva a tiatai inconvenientes ue bajo nivel como conexiones o incompatibiliuau ue la sintaxis ue lenguaje SQL. Kumbio Fnterprise Iromework ofiece una vaiieuau ue componentes paia acceuei a gestoies ielacionales a bajo o alto nivel. 20 Componente Db 20.1 Introducción Kumbio Fnterprise Iromework implementa una uoble capa ue abstiaccion paia la manipulacion ue la peisistencia ue la aplicacion cuanuo se utilizan bases ue uatos. El componente Bb auministia touo lo ielacionauo con la inteiaccion a bajo nivel con los gestoies ielacionales ue base ue uatos, esto incluye abstiaei uetalles ue conexion, utilizacion ue lenguaje SQL, cuisoies, tiansacciones, etc. Esta inuepenuencia se logia meuiante la implementacion ue auaptauoies que ciean puntos ue compatibiliuau a los motoies ue bases ue uatos ue tal foima que sin impoitai el gestoi utilizauo se gaiantice que las opeiaciones sobie ellos va a sei consistente logianuo el iesultauo espeiauo. Nientias que el Kumbio PEP Iromework ofiece múltiples opciones paia conectaise a bases ue uatos, Kumbio Fnterprise Iromework iecomienua su uso en piouuccion a los auaptauoies ue NySQL y 0iacle, aunque algunos otios tienen una mauuiez aceptable. 20.2 Capas de acceso El componente Bb pueue utilizai multiples capas ue abstiaccion existentes paia el acceso a gestoies ielacionales, ue esta foima se aumentan las posibiliuaues y capaciuaues ue apiovechai la funcionaliuau uel motoi uesue una aplicacion. Las capas ue acceso sopoitauas son las siguientes: 4.198# 6#7+8(2+(:$ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 148 Native Sin capa inteimeuia. 0tiliza las extensiones PBP esciitas en lenguaje C que implementan acceso uiiecto a los motoies ue base ue uatos. PB0 0tiliza la capa PBP Bata 0bjects (PB0) esciita en lenguaje C que implementa acceso unifoime a los piincipales motoies ue base ue uatos ue couigo abieito y ceiiauo. }BBC 0tiliza la capa ue acceso a bases ue uatos }ava Batabase Connectivity (}BBC) ue }ava. Con lo que es possible utilizai uiiveis }BBC y la funcionaliuau ue estos. Solo uisponible cuanuo se usa IBN WebSpheie sNash. 20.3 Adaptadores del componente Db En la siguiente tabla se uetalla los auaptauoies ue la uistiibucion ue Kumbio Fnterprise Iromework junto con sus caiacteiisticas y estauo ue mauuiez: T,93,5 B-,2%,-.8#7 -#3 +.12.$#$%# 69 \ 1,-"8#> ,+%",3 4.198# I,2, -# B++#7. /7%,-. -# @,-"8#> NySQL Nativo (NySQL) Estable NySQLi Nativo (NySQLi) Estable 0iacle Nativo (oci8) Estable PostgieSQL Nativo Beta Niciosoft SQL Seivei PB0 Beta IBN Infoimix PB0 Beta SQLite PB0 Beta 0iacle PB0 Beta 0iacle }BBC Estable Caua auaptauoi nativo heieua ue la clase BbBose la cual implementa métouos utiles valiuos paia cualquiei gestoi ielacional en foima ue capa ue abstiaccion inteimeuia. La inteiface BbBoselnterfoce es implementaua poi caua auaptauoi ue tal foima que caua uno mantenga una estiuctuia consistente que peimita efectuai opeiaciones básicas y avanzauas sin incuiiii en uetalles ue bajo nivel o uepenuientes ue caua gestoi ielacional. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 149 La estiuctuia ue la inteiface BbBoselnterfoce es la siguiente: interface DbBaseInterface { public function __construct($descriptor=''); public function connect($descriptor=''); public function query($sqlStatement); public function fetchArray($resultQuery='', $opt=''); public function close(); public function numRows($resultQuery=''); public function fieldName($position, $resultQuery=''); public function dataSeek($position, $resultQuery=''); public function affectedRows($resultQuery=''); public function error($errorInfo='', $resultQuery=''); public function noError($resultQuery=''); public function inQuery($sqlStatement, $type=db::DB_BOTH); public function inQueryAssoc($sql); public function inQueryNum($sql); public function fetchOne($sql); public function fetchAll($sql); public function insert($tableName, $values, $fields='', $automaticQuotes=true); public function update($tableName, $fields, $values, $whereCondition=null, $automaticQuotes=true); public function delete($tableName, $whereCondition=''); public function limit($sqlStatement, $number); public function forUpdate($sqlQuery); public function sharedLock($sqlQuery); public function begin(); public function rollback(); public function commit(); public function listTables($schemaName=''); public function describeTable($tableName, $schemaName=''); public function getRequiredSequence($tableName='', $identityColumn='', $sequenceName=''); public function lastInsertId($tableName='', $identityColumn='', $sequenceName=''); public function createTable($tableName, $definition, $index=array(), $tableOptions=array()); public function dropTable($tableName, $ifExists=false); public function tableExists($tableName, $schema=''); public function getDateUsingFormat($date, $format='YYYY-MM-DD'); public function getHaveAutoCommit(); public function setIsolationLevel($isolationLevel); public function getCurrentDate(); public function getLastResultQuery(); public function getConnectionId(); public function getDatabaseName(); public function getUsername(); public function getHostName(); } 20.4 Generación de SQL Caua gestoi ielacional sigue estánuaies uel lenguaje SQL, piincipalmente ue las especificaciones ANSI92 y ANSI99. Nuchos motoies ue base ue uatos agiegan extensiones al lenguaje o no implementan auecuauamente los estánuaies estableciuos poi uiveisas iazones. Cuanuo se esciiben aplicaciones multi-motoi es posible encontiai cieitas incompatibiliuaues que pouiian conllevai a ieesciituias ue couigo que ieabien el ciclo uel softwaie y pouiian geneiai sobiecostos. La capa ue abstiaccion ue Kumbio Fnterprise Iromework se encaiga ue los uetalles y geneia la mayoi paite ue las sentencias ue BNL que sopoita un gestoi LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1Su ielacional. A nivel ue aplicacion el lenguaje PBP ofiece una extensa biblioteca ue funciones que peimiten conectaise y efectuai opeiaciones sobie una gian vaiieuau ue gestoies ielacionales. Sin embaigo, la foima en que estan implementauas estas funciones no es estánuai y consistente poi lo que el cambio ue un gestoi a otio conlleva a ieesciibii couigo y se piesentan las situaciones mencionauas anteiioimente. /0#123.5 I.$#H(:$ %8,-(+(.$,3 , )#7%.8#7 8#3,+(.$,3#7 "7,$-. KLK //Conexión a Oracle $connId = oci_connect("scott", "tiger", "//192.168.0.40/XE"); //Conexión a Informix $connId = ifx_connect("stores@ol_srv1", "informix", "pass"); //Conexión en PostgreSQL $connId = pg_connect("host=192.62.10.1 port=5432 dbname=bankdb user=dma password=2fe051871"); Clausulas que extenuienuen el lenguaje SQL como LINIT en SELECT, estan sopoitauas poi algunos gestoies ielacionales y en otios es necesaiio implementailos ue tal foima que sea tianspaiente y funcionen como se espeia. /0#123.5 Z$+.12,%(9(3(-,- -# ,3)"$,7 #H%#$7(.$#7 -#3 3#$)",)# 'fE #$ )#7%.8#7 8#3,+(.$,3#7 //LIMIT en SQLServer ó Sybase SELECT * FROM (SELECT TOP 10 * FROM (SELECT TOP 10 customers.categoryId FROM customers) AS itable) AS otable //LIMIT en MySQL SELECT customers.categoryId FROM customers LIMIT 10 El componente BBR implementa en caua uno ue los auaptauoies métouos que geneian SQL optimizauo paia caua gestoi ielacional sopoitauo aumentanuo las capaciuaues ue caua aplicacion uesaiiollaua con el mismo. 20.5 Conexiones a gestores relacionales por defecto Caua aplicacion piopoiciona el aichivo ue configuiacion environment.ini en uonue se pueuen establecei los paiámetios ue conexion ue acueiuo a los entoinos ue las fases ue uesaiiollo ue la aplicacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S1 El aichivo ue configuiacion environment.ini pieueteiminauo tiene la siguiente estiuctuia: [development] database.type = mysql database.host = localhost database.username = root database.password = database.name = development_db [production] database.type = mysql database.host = localhost database.username = root database.password = database.name = production_db [test] database.type = mysql database.host = localhost database.username = root database.password = database.name = test_db Los paiámetios ue conexion tienen el piefijo uatabse y pueuen vaiiai ue acueiuo al gestoi ielacional utilizauo. Paia inuicai el auaptauoi a usai se utiliza el paiámetio Jotobose.type. A continuacion se explican las consiueiaciones ue conexion paia los motoies sopoitauos: PQONOb I.$7(-#8,+(.$#7 2,8, [8,+3# 0iacle es muy conociuo poi sus capaciuaues ue escalamiento y caiacteiisticas, auemás es liuei en bases ue uatos y está uisponible en vaiias platafoimas. El auaptauoi ue conexion a 0iacle iequieie que la extension ue PBP oci8 este uisponible, meuiante esta es posible conectaise a 0iacle en sus veisiones 8i, 9i, 1ug y 11g. Auicional a esto es necesaiio instalai el 0iacle Instant Client apiopiauo a la platafoima iequeiiua. Estas libieiias pueuen sei uescaigauas en la siguiente 0RL: http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html. Las vaiiables ue entoino 0RACLE_B0NE, 0RACLE_SIB, LB_PREL0AB Y NLS_LANu ueben estai uefiniuas paia iealizai la conexion a 0iacle. Paiámetios ue configuiacion ue la extension 0CI8 como oci8.mox_persistent, oci8.persistent_timeout y oci8.Jefoult_prefetcb también uebeiian teneise en cuenta. Be acueiuo a la veision ue la extension 0CI8 pouiia o no habei compatibiliuau con el gestoi LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S2 ielacional iequeiiuo. En la siguiente tabla se piesenta la compatibiliuau ue acueiuo a la veision ue 0CI8: T,93,5 @,%8(> -# +.12,%(9(3(-,- #$%8# KLKm [IZ` \ +3(#$%# [8,+3# 6(7%8(9"+(:$ Y#87(:$ KLK Y#87(:$ -# [IZ` Y#87(.$#7 -#3 +3(#$%# [8,+3# 7.2.8%,-. PBP CvS S.2.7‚ 1.2.S 8i, 9i, 1ug, 11g PBP Binaiio paia Winuows S.27‚ 1.2.S 1ug, 11g PECL 0CI8 CvS Se pueue constiuii uesue PBP 4.S.9 1.S.4 9iR2, 1ug, 11g Zenu Coie foi 0iacle 2.S S.2.S 1.2.S Incluye el 0iacle Instant Client 1u poi lo que se sopoitan: 8i, 9i, 1ug, 11g Este auaptauoi no sopoita múltiples tiansacciones simultaneas, esto quieie uecii que al tiatai ue cieai una tiansaccion cuanuo ya hay una activa se geneiaiá una excepcion. Los paiámetios ue conexion al conectaise a 0iacle son: [production] database.type = oracle database.host = 127.0.0.1 database.username = scott database.password = tiger database.instance = XE database.port = 1521 database.territory = spain database.sort = spanish_m database.comp = linguistic database.charset = AL32UTF8 La uesciipcion ue los paiámetios es la siguiente: T,93,5 K,8U1#%8.7 -# +.$#H(:$ , [8,+3# "7,$-. ,-,2%,-.8 4,%(M. K,8U1#%8. 6#7+8(2+(:$ uatabase.useiname Los usuaiios en 0iacle son piopieuau ue schemas que tienen el mismo nombie uel usuaiio. Este paiámetio peimite inuicai LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1SS el nombie uel usuaiio o ambiguamente el schema. uatabase.host Nombie ue la maquina o uiieccion IP uonue se encuentia el seiviuoi 0iacle. uatabase.passwoiu Contiaseña uel usuaiio con el que se iealiza la conexion. uatabase.instance Nombie ue la instancia ue 0iacle o uel seivicio uel TNS Listenei. Cuanuo se usa 0iacle Batabase Expiess este es 'XE' poi uefecto. uatabase.poit Pueito uel seivicio TNS Listenei. Poi uefecto es 1S21. uatabase.soit Este paiámetio peimite establecei como se haiá el oiuenamiento ue columnas que contengan valoies alfanuméiicos como CBAR o vARCBAR2. Su valoi poi uefecto es spanish_m. En paises hispano-hablantes las letias ch, ll y ñ son consiueiauas paite uel alfabeto y esta vaiiable peimite que el oiuenamiento sea auecuauo a la localizacion utilizaua. uatabase.comp Es la foima en la que se iealizan las compaiaciones entie valoies constantes y columnas ue las tablas. El valoi poi uefecto linguistic peimite que las compaiaciones no sean sensibles a mayúsculas¡minúsculas. uatabase.chaiset Peimite establecei el chaiset en el que se almacenan¡uevolveian valoies en las bases ue uatos. El valoi AlS20TF8 es el nombie ue 0iacle paia el chaiset 0TF8. uatabase.teiiitoiy Peimite establecei el teiiitoiio en el que se encuentia la aplicacion. Bepenuienuo ue este los foimatos ue fechas y ue valoies númeiicos se ajusta a la localizacion iequeiiua. Poi uefecto es 'spain'. uatabase.language El iuioma en el que se piesentaián los mensajes ue eiioi uel motoi y se foimateaián los iesultauos numéiicos y ue fechas. Poi uefecto es 'spanish'. PQONObOb I.$#+%,8 , [8,+3# 1#-(,$%# ]6kI También es posible iealizai conexiones a 0iacle usanuo el auaptauoi }BBC cuanuo la aplicacion ha siuo implementaua en un conteneuoi ue aplicaciones IBN WebSpheie sNash. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S4 El aichivo }AR ojubc14.jai uebe estai ubicauo en el uiiectoiio lib ue la aplicacion sNash siguienuo las convenciones ue aiquitectuia ue la maquina. Poi ejemplo si se ejecuta en Linux sobie un piocesauoi aiquitectuia x86 entonces la ubicacion es: lib/x86/linux/ojdbc14.jar Los paiámetios en enviroment.ini ueben sei: [production] database.layer = jdbc database.type = oracle database.driver = "oracle.jdbc.driver.OracleDriver" database.dsn = "thin:@192.168.151.12:1521:XE" database.username = scott database.password = tiger PQONOP I.$7(-#8,+(.$#7 2,8, @(+8.7.*% 'fE '#8M#8 SQL Seivei es el motoi ue base ue uatos ielacional ue Niciosoft. La conexion a este motoi es iealizaua via PBP Bata 0bjects (PB0). Este auaptauoi solo sopoita conexiones a SQL Seivei uesue Winuows usanuo conexiones 0BBC meuiante el uiivei php_puo_oubc. Las veisiones ue SQL Seivei sopoitauas van uesue la 7.x hasta la 2uu8. PQONOPOb I8#,+(:$ -# "$ 6'4 [6kI 2,8, 'fE '#8M#8 A continuacion se ilustia el pioceso ue cieacion ue una conexion a SQL Seivei meuiante 0BBC. 0tilizanuo un usuaiio con cieuenciales auministiativas se abie el Auministiauoi ue 0iigenes ue Batos 0BBC uesue Panel ue Contiol -• Beiiamientas Auministiativas. En esta pantalla se selecciona la pestaña 'BSN ue usuaiio' y se ua click en el boton 'Agiegai‰' paia cieai una nuevo oiigen ue uatos: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1SS A continuacion se selecciona el tipo ue uiivei utilizauo, se busca 'SQL Seivei' y se ua click en siguiente: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S6 Se ua click en 'Finalizai' paia abiii el asistente ue oiigenes ue uatos paia SQLSeivei. Se piesenta la siguiente pantalla: El campo nombie hace iefeiencia nombie al oiigen ue uatos o Boto Source Nome (BSN) que seiá utilizauo luego paia iealizai la conexion en la aplicacion. El campo seiviuoi inuica el nombie ue la instancia y maquina uonue está instalauo SQL Seivei. Se ua click en siguiente paia continuai. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S7 El tipo ue autenticacion se uebe tenei en cuenta cuanuo se iealice la conexion uesue Kumbio Fnterprise. Si se selecciona autenticacionn ue Winuows NT no seiá necesaiio inuicai el paiámetio 0IB y PWB uel usuaiio ue conexion. En este caso el usuaiio con el que se ejecute el pioceso uel seiviuoi web se utilizaiá paia autenticaise en SQL Seivei. Si se selecciona autenticacion ue SQL Seivei se ueben inuicai los paiámetios mencionauos anteiioimente. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S8 En la siguiente pantalla se pueue configuiai la base ue uatos pieueteiminaua. Las opciones '0sai iuentificauoies entiecomillauos ANSI' y '0sai nulos, iellenos y auveitencias ANSI' ueben estai seleccionauos. En esta pantalla se pueuen activai otias opciones, al teiminai se ua click en 'Finalizai': LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 1S9 La última pantalla peimite piobai la conexion, si touo esta bien no habiá pioblema al efectuai una conexion uesue Kumbio Fnterprise. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 16u Los paiámetios iequeiiuos ue conexion al conectaise con el auaptauoi "mssql" son: [production] database.layer = “pdo” database.type = mssql database.dsn = "DRIVER={SQL Server};SERVER=SQLEXPRESS;DATABASE=test" 0sanuo un BSN ue 0suaiio: [production] database.layer = “pdo” database.type = mssql database.dsn = "bankdb" Establecienuo el usuaiio y contiaseña: [production] database.layer = “pdo” database.type = mssql database.dsn = "bankdb;UID=sa;PWD=mypass" Establecienuo el usuaiio y contiaseña sin BSN: [production] database.layer = “pdo” database.type = mssql database.dsn = "DRIVER={SQL Server};SERVER=SQLEXPRESS;DATABASE=test;UID=sa;PWD=pass" K,8U1#%8. 6#7+8(2+(:$ uatabase.puo Inuica que se uebe caigai un Auaptauoi PB0. Su valoi uebe sei 0n paia que tenga efecto. uatabase.usn Inuica los paiámetios uel Bata Souice Name (BSN) uel oiigen uatos. SERvER es la maquina uonue está instalaua la instancia uel fiamewoik. BATABASE es el nombie ue la base ue uatos ue tiabajo. 0IB es el nombie uel usuaiio con el que se haiá la conexion. PWB es el passwoiu uel usuaiio. BRIvER es el nombie uel uiivei 0BBC paia SQL Seivei, noimalmente es 'SQL Seivei'. PQONOc I.$7(-#8,+(.$#7 2,8, @\'fE NySQL es uno ue los motoies 0pen Souice más populaies y con mayoi piesencia en aplicaciones paia Inteinet. Existen 2 auaptauoies que peimiten la conexion a NySQL, el piimeio es "mysql" que usa la extension ue PBP nativa uel mismo nombie y que peimite la conexion usanuo libieiias cliente uesue la veision 4.1. La segunua es "mysqli" que utiliza la extension uel mismo nombie y que tiene una funcionaliuau y ienuimiento supeiioi a la ue la LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 161 extension "mysql". Ambos auaptauoies sopoitan tiansacciones en sesiones ue conexion uifeientes. Kumbio Fnterprise Iromework pueue tiabajai con NySQL cuanuo está en mouo SQL estiicto y no estiicto. En mouo estiicto se geneiaián excepciones BblnvoliJIormotFxception cuanuo se tiate ue inseitai un valoi que no tenga un foimato auecuauo al tipo ue uato iequieiiuo ue la columna ue este. Los paiámetios iequeiiuos ue conexion al conectaise con el auaptauoi "mysql" son: [production] database.type = mysqli database.host = localhost database.username = root database.password = my_password database.name = production_db Los posibles paiámetios ue conexion al conectaise con el auaptauoi "mysql" son: [production] database.type = mysql database.host = localhost database.username = root database.password = my_password database.name = production_db database.port = 3306 database.autocommit = Off database.compression = Off database.ssl = Off database.interactive = Off La uesciipcion ue los paiámetios anteiioies es la siguiente: T,93,5 K,8U1#%8.7 -# +.$#H(:$ , @\'fE "7,$-. #3 ,-,2%,-.8 D1\7^3F K,8U1#%8. 6#7+8(2+(:$ uatabase.useiname El nombie ue usuaiio ue NySQL con el que se efectuaiá la conexion. uatabase.passwoiu El passwoiu uel usuaiio ue NySQL. uatabase.host Seiviuoi ue NySQL. Se pueue utilizai el stiing ue conexion hostname:pueito o :¡path¡al¡socket cuanuo se tiata ue localhost. uatabase.name Nombie ue la base ue uatos. uatabase.poit Pueito uel seiviuoi ue NySQL al especificaise se hace la LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 162 conexion poi TCP¡IP. uatabase.autocommit Cuanuo el valoi es 0n. Inuica si la sesion ue NySQL uebe estableceise en mouo A0T0C0NNIT, esto significa que se uebe hacei un C0NNIT obligatoiiamente paia que se tenga efecto los cambios iealizauos sobie la base ue uatos. Poi uefecto es 0ff. uatabase.compiession Inuica si el cliente NySQL uebe compiimii touo el tiáfico ue ieu entie la aplicacion y el seiviuoi ue base ue uatos. Poi uefecto es 0ff uatabase.ssl Inuica si se uebe enciiptai el tiáfico entie la aplicacion y el seiviuoi ue base ue uatos meuiante SSL. Poi uefecto es 0ff. uatabase.inteiactive Inuica si se uebe cieai una sesion inteiactiva en vez ue una conexion tempoial. Poi uefecto es 0ff. Los paiámetios iequeiiuos ue conexion al conectaise con el auaptauoi "mysqli" son: [production] database.type = mysqli database.host = localhost database.username = root database.password = my_password database.name = production_db Los posibles paiámetios ue conexion al conectaise con el auaptauoi "mysqli" son: [production] database.type = mysqli database.host = localhost database.socket = /tmp/mysql.sock database.username = root database.password = my_password database.name = production_db database.port = 3306 database.autocommit = Off database.compression = Off database.ssl = Off database.interactive = Off database.charset = utf8 database.key = “/home/user/key.pem” database.cert = “/home/user/ca.crt” database.ca = “/home/user/ca_file” database.capath = “/home/user/capath” database.cipher = “aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192- cbc,aes256-cbc” Los paiámetios auicionales que sopoita el auaptauoi "mysqli" son: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 16S K,8U1#%8. 6#7+8(2+(:$ uatabase.socket Aplica cuanuo el host el localhost y peimite establecei el path al socket 0NIX o al nameu pipe en Winuows. uatabase.chaiset Peimite establecei el chaiset utilizauo poi el cliente NySQL paia enviai la infoimacion al seiviuoi. uatabase.key La iuta a uonue se encuentia el aichivo ue llave compaitiua. Este paiámetio solo aplica cuanuo la opcion SSL está 0n. Poi uefecto su valoi es N0LL. uatabase.ceit La iuta al aichivo ue ceitificauo. Este paiámetio solo aplica cuanuo la opcion SSL está 0n. Poi uefecto su valoi es N0LL. uatabase.ca La iuta al aichivo ceitificate authoiity. Este paiámetio solo aplica cuanuo la opcion SSL está 0n. Poi uefecto su valoi es N0LL. uatabase.capath La iuta al aichivo que contiene ceitificauos SSL valiuos en foimato PEN. Este paiámetio solo aplica cuanuo la opcion SSL está 0n. Poi uefecto su valoi es N0LL. Poi uefecto su valoi es N0LL. uatabase.ciphei 0na lista ue métouos ue cifiauo paia usai en la enciiptacion SSL. Este paiámetio solo aplica cuanuo la opcion SSL está 0n. Poi uefecto su valoi es N0LL. PQONOd I.$7(-#8,+(.$#7 2,8, Zk@ Z$*.81(H Kumbio Fnterprise utiliza PEP Boto 0bjects {PB0) paia acceuei a bases ue uatos IBN Infoimix. Es posible iealizai conexiones a Infoimix (IBS) veision 7.x, 0niveisal Seivei (I0S) 9.x y a Infoimix Bynamic Seivei 2uuu, 1u y 11. Los siguientes iequisitos son necesaiios paia iealizai una conexion satisfactoiia a este motoi: • PBP uebe estai compilauo con la extension puo_infoimix, esta pueue sei obteniua via PECL o al compilai PBP uesue el couigo fuente. • Cuanuo se compila uesue el couigo fuente la opcion ue configuiacion uebe incluii ./configure --with-pdo-informix=/path/to/SDK[,shared] • La extension PECL pueue sei instalaua usanuo el comanuo pecl install pdo_informix en entoinos 0nix. Paia una compilacion satisfactoiia ue la extension el cliente SBK ue IBN paia Infoimix uebe estai instalauo en la maquina o el seiviuoi LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 164 Infoimix en si mismo. • La vaiiable ue entoino INF0RNIXBIR uebe apuntai al uiiectoiio ue instalacion ue infoimix o uel client SBK. • ESQL¡C es necesaiio paia tiabajai con infoimix. El Infoimix Client SBK contiene este softwaie. El client SBK paia IBN Infoimix pueue sei uescaigauo uesue el sitio web ue sopoite ue IBN en http://www-306.ibm.com/software/data/informix/tools/csdk/ . Si está utilizanuo Infoimix veision 1u o 11 no es necesaiio instalai CSBK ya que este viene incluiuo en la uistiibucion uel seiviuoi. • El seiviuoi ue Infoimix uebe estai configuiauo paia aceptai conexiones meuiante tcp meuiante el mouulo onsoctcp. 0na vez las extensiones pbp_pJo y pbp_pJo_informix se encuentien uisponibles la conexion pueue iealizaise ue la siguiente foima: [development] database.layer = “pdo” database.type = informix database.dsn = "host=127.0.0.1;service=9800;database=bankdb;server=ids_server; protocol=onsoctcp;EnableScrollableCursors=1" database.username = informix database.password = bypass Paiámetios ue conexion con Infoimix: K,8U1#%8. 6#7+8(2+(:$ uatabase.puo Inuica que se uebe caigai un auaptauoi PB0. Su valoi uebe sei 0n paia que tenga efecto. uatabase.usn Los paiámetios ue conexion uel Bata Souice Name. El paiámetio host inuica el nombie uel maquina o uiieccion IP uonue está instalauo el Infoimix. Seivice es el pueito uonue se iealizaiá la conexion TCP¡IP. Batabase es el nombie ue la base ue uatos. Seivei es nombie ue la instancia ue infoimix. Piotocol uebe sei siempie onsoctcp. EnableSciollableCuisois uebe sei igual a 1 paia peimitii el uso ue cuisoies que se pueuen iecoiiei en cualquiei oiuen, esto pueue mejoiai el ienuimiento cuanuo se usan paginauoies poi ejemplo. 0tias opciones que se pueuen enviai en el BSN son: Tiaslation0ption, peimite utilizai una libieiia ue tiauuccion ue LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 16S mensajes, con valoi u peimite solucionai un pioblema común en unix0BBC. IsolationLevel: Inuica el nivel ue isolacion ue la conexion. u es Pieueteiminauo, 1 es Reau 0ncommiteu, 2 es Reau Commiteu, S es Repeteable Reau, 4 es Seiializable y S es LastCommiteu. CuisoiBehavioi: Cuanuo es u el cuisoi se cieiia automáticamente al iecoiiei los iegistios, cuanuo es 1 se pieseiva. ClienteLocale: Peimite establecei la localizacion uel cliente. Poi uefecto es en_0S.CP12S1 BatabaseLocale: Peimite establecei la localizacion ue la base uatos poi uefecto es: en_0S.819 AutoCommit0ptimization: Inuica si el uiivei uebe efectuai optimizacion paia conexiones no-tiansaccionales. uatabase.useiname Nombie uel usuaiio que iealizaiá la conexion. uatabase.passwoiu Contiaseña uel usuaiio. PQONOdOb I.$*()"8,+(:$ -#3 '#8M(-.8 Es posible que ueba cambiai el usuaiio con el que se ejecutan los piocesos uel seiviuoi web al usuaiio infoimix o un usuaiio uel giupo infoimix. En el caso ue Apocbe Web Server pueue mouificai esto cambianuo los paiámetios 0sei y uioup asi: User informix Group informix Si el seiviuoi está instalauo en Winuows y se usa Niciosoft IIS se uebe entiai a la consola ue auministiacion ue seivicios. Pueue ingiesai a ella meuiante el comanuo seivices.msc en el cuauio ue uialogo ejecutai. Se ua click ueiecho en el seivicio "Infoimix IBS - Nombie" y luego en piopieuaues. En la pestaña inicio ue sesion se coloca el usuaiio con peimisos uel motoi y luego click en 'Aceptai'. La siguiente es una configuiacion ue las vaiiables ue entoino paia un piofile paia el usuaiio "infoimix" en un seiviuoi 0nix o Winuows: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 166 export INFORMIXDIR=/opt/IBM/informix export INFORMIXTMP=/opt/IBM/informix/tmp export INFORMIXSERVER=ol_server export INFORMIXSQLHOSTS=$INFORMIXDIR/etc/sqlhosts export ONCONFIG=onconfig export TERMCAP=/home/informix/etc/termcap export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/IBM/informix/lib:/opt/IBM/informix/etc/lib :/opt/IBM/informix/lib/esql export DBDATE=y4md export DB_LOCALE=en_US.819 export SERVER_LOCALE=en_US.819 export CLIENT_LOCALE=en_US.819 export TERM=ansi export PATH=$PATH:$HOME/bin:$INFORMIXDIR/bin El aichivo INF0RNIXSQLB0STS uebe tenei al menos un seivicio tcp¡ip uisponible: ol_server onsoctcp localhost informixserver El aichivo ¡etc¡seivices uebe incluii la uesciipcion TCP paia el seivicio cieauo: informixserver 9800/tcp # Informix Dynamic Server PQONOdOP I.$7(-#8,+(.$#7 +.$ T8,$7,++(.$#7 El uesaiiollauoi uebe activai el logging ue la base ue uatos a 0nbuffeieu Logging o Buffeieu Logging usanuo la heiiamienta onmonitor o meuiante el comanuo ontope -B Jbnome, ue lo contiaiio el auaptauoi geneiaiá una excepcion al tiatai ue iealizai un commit o un iollback a una tiansaccion. Infoimix no geneia un timeout cuanuo iegistios que se vayan a mouificai o leei esten sienuo mouificauos en otia tiansaccion. Kumbio Fnterprise geneiaiá una excepcion como •Infoimix€•Infoimix 0BBC Biivei€•Infoimix€Coulu not uo a physical-oiuei ieau to fetch next iow. sqleiim(t) (SQLFetchScioll•-244€ at ¡ioot¡PB0_INF0RNIX¡infoimix_statement.c:889)€ (-244) ue tipo BblockAJquisitionTimeout. Touos los niveles ue isolacion son sopoitauos en iuntime. El nivel ue isolacion C0RS0R SCALABILITY es valiuauo con IS0LATI0N_SERIALIZABLE. 4.%,5 IBN Infoimix no sopoita la extension uel lenguaje SQL LINIT poi lo que el uesaiiollauoi uebe aseguiaise que los iesultauos uevuelva el númeio ue iegistios iequeiiuos via conuiciones en la clausula WBERE. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 167 PQONON I.$7(-#8,+(.$#7 +.$ 'fE(%# SQLite es un motoi ue base ue uatos esciito en C que es embebible en aplicaciones web ue baja concuiiencia. La libieiia SQLite peimite auministiai bases ue uatos que se ciean en un solo aichivo y que se pueuen uistiibuii junto con la aplicacion. Como se menciono anteiioimente las bases ue uatos SQLite no están iecomenuauas paia gianues aplicaciones con alto tiáfico y acceso concuiiente elevauo. Kumbio Fnterprise sopoita SQLite veision S meuiante la capa ue abstiaccion PB0 (PBP Bata 0bjects) poi lo que se iequieie que las extensiones ue PBP puo y puo_sqlite esten uisponibles poi la aplicacion. Este auaptauoi no sopoita múltiples tiansacciones simultáneas. Los paiámetios ue Conexion a SQLite son: [development] database.layer = “pdo” database.dsn = "data/company.db" database.type = sqlite K,8U1#%8. 6#7+8(2+(:$ uatabase.layei Inuica que se uebe caigai un Auaptauoi PB0. Su valoi uebe sei "puo" paia que tenga efecto. uatabase.usn Cuanuo se tiata ue SQLite inuica la iuta al aichivo base ue uatos. La extension .ub es opcional peio es más iepiesentativa. El PATB uel aichivo pueue sei un path absoluto uesue el uiiectoiio uonue está instalaua la instancia o un path ielativo. 20.6 Pool de Conexiones El componente BbBose meuiante la implementacion ue un Sinqleton contiola que caua vez que se solicite la conexion a la base ue uatos se uevuelva la misma conexion evitanuo la cieacion ue múltiples conexiones al gestoi ielacional ue foima innecesaiia aumentanuo los iecuisos iequeiiuos poi la aplicacion. El métouo estático Botobose::rowConnect{) uevuelve la misma conexion activa sin impoitai el númeio ue veces que sea invocauo, si aun no existe una conexion entonces la ciea. Los paiámetios ue conexion son los estableciuos poi entoino activo en environment.ini. Si se LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 168 iequieie una nueva conexion al gestoi se pueue enviai true como piimei paiámetio y si se iequieie ienovai la conexion es uecii ieemplazai la conexion uel Sinqleton se envia true como segunuo paiámetio. PQOeOb I.$#H(.$#7 -# k,0. 4(M#3 Es posible establecei conexiones ue bajo nivel a múltiples motoies inuepenuientemente uel gestoi ielacional iequeiiuo. El subcomponente BblooJer peimite tanto caigai el auaptauoi activo estableciuo en enviroment.ini como uno cualquieia usanuo el métouo estático factoiy. El piimei paiámetio coiiesponue al nombie uel auaptauoi iequeiiuo paia efectuai la conexion, el segunuo es un vectoi que contiene las opciones ue conexion. Estas son las mismas utilizauas en una seccion ue un aichivo ue configuiacion enviroment.ini. /0#123.5 /7%,93#+#8 "$, +.$#H(:$ , "$ )#7%.8 8#3,+(.$,3 1#-(,$%# 69E.,-#855*,+%.8\ <?php $db = DbLoader::factory('MySQL', array( "host" => "localhost", "username" => "root", "password" => "mypass", "name" => "bankdb" )); print_r($db->fetchAll(“SELECT * FROM accounts”)); Si se uesea usai los auaptauoies PB0 hay que inuicai la opcion auicional "pJo" =~ true en el vectoi ue configuiacion. /0#123.5 /7%,93#+#8 "$, +.$#H(:$ , "$ )#7%.8 8#3,+(.$,3 1#-(,$%# "$ ,-,2%,-.8 K6[ <?php $db = DbLoader::factory('MySQL', array( "pdo" => true, "host" => "localhost", "username" => "root", "password" => "mypass", "name" => "bankdb" )); $db->fetchAll("SELECT * FROM account"); 0n uesciiptoi stiing también pueue sei usauo paia establecei una conexion. Estos tienen el mismo foimato que un BSN ue PB0. /0#123.5 /7%,93#+#8 "$, +.$#H(:$ 1#-(,$%# "$ -#7+8(2%.8 7%8($) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 169 $descriptor = “mysql:host=localhost;username=root;password=mypass;name=bankdb”; $db = DbLoader::factoryFromDescriptor($descriptor); PQOeOP T8,>,8 I.$#H(.$#7 La piopieuau ue las conexiones ue geneiai tiazas peimite obtenei una lista ue touas las opeiaciones SQL ue bajo nivel ejecutauas en una session al gestoi ielacional. Paia activai la tiaza en una conexion se uebe llamai al métouo setTrocinq con paiámetio tiue apaitii uel momento uonue se uesea empezai la tiaza: /0#123.5 B+%(M,8 \ .9%#$#8 3, %8,>, -# 7#)"(1(#$%. #$ "$ 28.+#-(1(#$%. +.$ )#7%.8#7 8#3,+(.$,3#7 <?php $db = DbBase::rawConnect(); $db->setTracing(true); $results1 = $db->fetchAll(“SELECT * FROM customers”); $results2 = $db->fetchAll(“SELECT * FROM customers WHERE status = ‘Active’”); foreach($db->getTracedSQL() as $sqlStatement){ echo $sqlStatement.”\n”; } 20.7 Generar Profiles de ejecución de SQL Los objetos uel componente Bb peimiten geneiai Piofiles ue la ejecucion ue sentencias SQL que se envian al gestoi ielacional. La infoimacion geneiaua incluye los tiempos en milisegunuos que uuio la ejecucion ue caua sentencia y asi pouei iuentificai cuellos ue botella en la aplicacion. /0#123.5 B+%(M,8 #3 28.*(3($) -#7-# .90#%. -# +.$#H(:$ , "$ )#7%.8 8#3,+(.$,3 <?php $db = DbBase::rawConnect(); $db->setProfiling(true); Inteinamente una instancia ue BbProfiler es instanciaua paia geneiai los piofiles ue las opeiaciones SQL. El uesaiiollauoi pueue uefinii su piopio piofilei establecienuo una instancia ue la clase que implemente la inteifaz BbProfilerlnterfoce como paiámetio ue setProfilinq{). /0#123.5 6#*($(8 "$, +3,7# -# 28.*(3# 2#87.$,3(>,-, LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 17u <?php $db = DbBase::rawConnect(); $db->setProfiling(new MyProfiler()); La inteiface BbProfilerlnterfoce exige la implementacion ue: interface DbProfileInterface { public function startProfile($sqlStatement); public function stopProfile(); public function getNumberTotalStatements(); public function getTotalElapsedSeconds(); public function getProfiles(); public function reset(); public function getLastProfile(); } 20.8 Manejar Excepciones de Db Cieai la instancia uel auaptauoi o uiiectamente en el constiuctoi uel mismo ciea automáticamente una conexion a la base ue uatos. Si ocuiien pioblemas al hacei la conexion o alguno ue los paiámetios es invaliuo se geneia una excepcion en la misma la cual uebe sei contiolaua poi el uesaiiollauoi. Las excepciones son contiolauas meuiante un bloque try,cotcb que captuie una excepcion uel tipo BbFxception: /0#123.5 I,2%"8,8 "$, #H+#2+(:$ 69/H+#2%(.$ )#$#8,-, 2.8 #3 ,-,2%,-.8 -# +.$#H(:$ ,3 )#7%.8 8#3,+(.$,3 <?php try { $db = DbLoader::factory('MySQL', array( "pdo" => true, "host" => "localhost", "username" => "root", "password" => "hea101", "name" => "bankdb" )); } catch(DbException $e){ //No se pudo cargar el adaptador } PQO`Ob T(2.7 -# /H+#2+(.$#7 3,$>,-,7 2.8 #3 +.12.$#$%# 69 /H+#2+(:$ 6#7+8(2+(:$ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 171 BbException Excepcion geneiica lanzaua poi auaptauoi ue conexion al gestoi ielacional utilizauo. BbLockAuquisitionException Excepcion lanzaua cuanuo la tiansaccion actual en la conexion no pueue efectuai un bloqueo sobie algún iecuiso poi ejemplo una tabla o una seiie ue iegistios. BbSQLuiammaiException Excepcion lanzaua cuanuo se envia una sentencia SQL mal foimaua o con eiioies ue sintaxis. BbContiaintviolationException Excepcion lanzaua cuanuo la opeiacion ue mouificacion o actualizacion viola un constiaint ue llave foiánea. BbInvaliuFoimatException Excepcion lanzaua cuanuo se tiata ue inseitai o actualizai un valoi en una tabla con un foimato eiioneo. PQO`OP Z$*.81,+(:$ #H%#$-(-, -# #H+#2+(.$#7 )#$#8,-,7 2.8 69 Las excepciones geneiauas poi el componente Bb ofiecen infoimacion extenuiua uel oiigen ue una excepcion. Cuanuo la aplicacion se encuentia en mouo uebug esta infoimacion se pueue visualizai en pantalla. La iefeiencia ue la pantalla ue excepciones es la siguiente: En la esquina supeiioi ueiecha se piesenta el tipo ue excepcion geneiaua: Bespués ue esta el mensaje que ha enviauo el gestoi ielacional y la sentencia SQL que geneio la excepcion. En este caso tanto el tipo ue excepcion como el mensaje ue eiioi inuica que la LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 172 sentencia SQL esta mal foimaua o tiene eiioies ue sintaxis. El iu ue conexion es un couigo inteino que iuentifica el iecuiso utilizauo paia conectaise al motoi ue base ue uatos. El mensaje ue la excepcion infoima que conexion estaba activa cuanuo se piouujo la excepcion. El iu apaiece al final como "Resource iJ #64". El couigo ue eiioi enviauo poi el motoi también pueue iesultai ue ayuua en algunos casos. Este se muestia al final uel mensaje ue eiioi entie paiéntesis. Como la aplicacion se encuentia en mouo uebug se visualiza la tiaza ue ejecucion ue la excepcion. Si Kumbia Entepiise uetecta que la excepcion se ha geneiauo en un aichivo ue la aplicacion entonces se muestia el fiagmento ue couigo iesaltanuo la linea exacta uonue se geneio la excepcion: Bebajo ue la tiaza se encuentia el cuauio "Batos ue la conexion activa" y piesenta atiibutos uel estauo ue la conexion en el momento ue la excepcion: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 17S En este caso la tiaza se encuentia uesactivaua, al activaila se obtenuiia touas las intiucciones SQL que se ejecutaion en la misma conexion pieviamente a que se piouujeia la excepcion. La tiaza se pueue activai ueclaiativamente en el mouo activo en confiq,environment.ini o piogiamacionalmente pasanuo el paiámetio "trocinq" =~ true al constiuctoi uel objeto conexion. El aichivo confiq,environment.ini entonces queuaiia asi: [development] database.host = 127.0.0.1 database.username = my_user database.password = my_password database.name = bankdb database.type = mysql database.tracing = true Al ejecutai nuevamente el pioceuimiento se pueue visualizai la tiaza ue la conexion: El campo "Tiaza" uice "SI" y uebajo ue este el nuevo campo "Conteniuo ue la Tiaza" muestia en oiuen cionologico las sentencias SQL geneiauas en la conexion activa. Nás uebajo se visualiza el cuauio uatos ue entiaua, en él se uetalla la infoimacion que fue enviaua al pioceuimiento uesue el foimulaiio o enlace anteiioi. El objetivo uel cuauio es iuentificai si los uatos ue entiaua pueuen sei los causantes uel pioblema: Los valoies ue entiaua se muestian en mouo uetallauo ayuuanuo asi a conocei su conteniuo LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 174 más fácilmente. Si la infoimacion geneiaua no es suficiente paia iuentificai la causa ue la excepcion pueue utilizai el componente Bebuq el cual piopoiciona ayuuas paia iealizai pioceuimientos tiauicionales ue iastieo ue piocesos. 20.9 Tipos de Resultado al Obtener de Registros Caua auaptauoi implementa los mismos tipos ue vectoi al obtenei iegistios, esto se iefieie a la foima en la que los vectoies uevueltos estan inuexauos. Los métouos inµuery, fetcb0ne y fetcbAll peimiten establecei en su segunuo paiámetio los valoies ue las constantes que peimiten cambiai la foima en la que estan uispuestos los iesultauos al obteneilos. T,93,5 T(2.7 -# +.$7%,$%#7 2,8, .9%#$#8 3.7 8#)(7%8.7 -# "$ 8#7"3%,-. I.$7%,$%# 6#7+8(2+(:$ Bb::BB_N0N Bevuelve caua iegistio como un vectoi inuexauo solamente numéiicamente. Bb::BB_ASS0C Bevuelve caua iegistio como un vectoi inuexauo solamente asociativamente. Las claves utilizauas como inuices coiiesponuen a los nombies ue las columnas ue la sentencia SELECT ejecutaua. Cuanuo se iealizan }0INs en múltiples tablas es posible que el nombie ue los inuices se iepita poi lo cual es necesaiio implementai alias paia las columnas iepetiuas. Paia touos los gestoies ielacionales los inuices se encuentian en minúsculas. Bb::BB_B0TB Bevuelve caua iegistio inuexauo tanto numéiicamente como asociativamente. El númeio ue elementos poi vectoi iesultauo es el uoble uel númeio ue columnas uevuelto en la sentencia SELECT. 20.10 Leer registros Los siguientes métouos coiiesponuen al API uel componente Bb que peimiten leei iegistios ue las entiuaues: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 17S public resourcejfolse query{strinq $sqlµuery) Envia una sentencia SQL al gestoi ielacional. La sentencia pueue uevolvei iegistios o no uevolveilos. /0#123.5 /$M(,8 "$, 7#$%#$+(, 'fE ,3 )#7%.8 8#3,+(.$,3 1#-(,$%# #3 1_%.-. ^"#8\VW <?php $db = DbLoader::factory('Oracle', array( "host" => "192.168.2.140", "username" => "scott", "password" => "tiger", "instance" => "XE" )); $result = $db->query("SELECT id, name FROM customer WHERE category_id = 1"); while($row = $db->fetchArray($result)){ print $row['name']."\n"; } public orroy finJ{strinq $tobleNome, strinq $wbereClouse, strinq $fielJs="", strinq $orJerBy="1") Realiza una consulta SELECT en una tabla en foima abstiaiua. /0#123.5 <#,3(>,8 "$, 9G7^"#-, "7,$-. #3 1_%.-. *($-VW <?php //Mostrar todos los clientes activos $db = DbBase::rawConnect(); $resultset = $db->find(“customers”, “status = ‘Active’”); foreach($resulset as $row){ print $row[‘name’].”\n”; } public orroy inµuery{strinq $sqlµuery, int $fetcbType=Jb::BB_B0TE) Bevuelve los iesultauos ue una consulta SQL en un aiiay. El paiámetio $fetcbType se iefieie a las constantes Jb::BB_ASS0C, Jb::BB_N0H y Jb::BB_B0TE que es el tipo ue inuexamiento uel vectoi uevuelto poi iegistio. public orroy fetcbAll{strinq $sqlµuery, int $fetcbType=Jb::BB_B0TE) 0btiene touos los iesultauos ue una consulta SQL en un aiiay. Es un alias paia el métouo inQueiy. public orroy inµueryAssoc{strinq $sqlµuery) 0btiene touos los iesultauos ue una consulta SQL en un aiiay. Caua iegistio es un aiiay inuexauo asociativamente. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 176 /0#123.5 <#,3(>,8 "$ +.$7"3%, ^"# -#M"#3M# 3.7 8#)(7%8.7 +.1. M#+%.8#7 ($-#H,-.7 ,7.+(,%(M,1#$%# <?php $db = db::rawConnect(); $customers = $db->inQueryAssoc(“SELECT id, name FROM customers ORDER BY id”); foreach($customers as $customer) { print $customer[‘name’].”\n”; } public orroy inµueryNum{strinq $sqlµuery) 0btiene touos los iesultauos ue una consulta SQL en un aiiay. Caua iegistio es un aiiay inuexauo numéiicamente. /0#123.5 <#,3(>,8 "$ +.$7"3%, ^"# -#M"#3M# 3.7 8#)(7%8.7 +.1. M#+%.8#7 ($-#H,-.7 $"1_8(+,1#$%# <?php $db = db::rawConnect(); $customers = $db->inQueryNum(“SELECT id, name FROM customers ORDER BY id”); foreach($customers as $customer) { print $customer[1].”\n”; //Imprime el nombre } public orroy fetcb0ne{strinq $sqlµuery, int $fetcbType=Jb::BB_B0TE) Bevuelve un solo iegistio en un aiiay ue la consulta SELECT en $sqlµuery. El paiámetio $type se iefieie a las constantes Jb::BB_ASS0C, Jb::BB_N0H y Jb::BB_B0TE que es el tipo ue inuexamiento uel aiiay uevuelto poi iegistio. /0#123.5 [9%#$#8 "$ 8#7"3%,-. 2,8, +.$7"3%,7 ^"# -#M"#3M#$ "$ 7.3. 8#)(7%8. <?php $db = DbBase::rawConnect(); $customer = $db->fetchOne(“SELECT * FROM customers WHERE id = 124”); public orroy fetcbArroy{resource $resultµuery) 0btiene un iegistio uel ultimo iecuiso ue consulta geneiauo en el objeto auaptauoi o el inuicauo meuiante el iecuiso $resultµuery. El iesultauo uevuelto uepenue uel fetchNoue estableciuo con setIetcbHoJe. public voiJ numRows{resource $resultµuery=null) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 177 Bevuelve el númeio ue filas obteniuas en la ultima consulta SQL ejecutaua en el objeto auaptauoi. Es posible establecei el iecuiso uevuelto poi el métouo query paia obtenei esta infoimacion. /0#123.5 [9%#$#8 #3 $G1#8. -# 8#)(7%8.7 ^"# -#M"#3M# "$, +.$7"3%, <?php $db = Db::rawConnect(); $result = $db->query("SELECT id, name FROM customer WHERE status = 'Active'"); print "Hay ".$result->numRows($result)." clientes activos"; public booleon JotoSeek{int $number, resource $resultµuery=null) Peimite establecei la posicion en el cuisoi inteino o el estableciuo poi $resultµuery hacienuo que el pioximo iegistio que obtenga fetcbArroy sea el númeio $number. /0#123.5 @.M#8 #3 2"$%#8. -#3 8#7"3%,-. -# "$, +.$7"3%, <?php $db = DbLoader::factory('MySQL', array( "host" => "127.0.0.1", "username" => "root", "password" => "hea101", "name" => "bankdb" )); $db->query("SELECT id, name FROM customer WHERE category_id = 1"); if($db->numRows()>10){ //Empezar desde el 10 registro $db->dataSeek(10); while($row = $db->fetchArray()){ print $row['name']."\n"; } } public resource qetlostResultµuery{) 0btiene el último iecuiso geneiauo en una consulta SQL meuiante el objeto. /0#123.5 [9%#$#8 #3 G3%(1. 8#7"37#% )#$#8,-. <?php $db = Db::rawConnect(); $db->query("SELECT id, name FROM customer WHERE status = 'A'"); $result = $db->getLastResultQuery(); while($row = $db->fetchArray()){ print $row['name']."\n"; } public strinq limit{strinq $sqlµuery, int $number) La extension uel la sentencia SQL SELECT llamaua LINIT peimite especificai al gestoi LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 178 ielacional que no uebe uevolvei más uel numeio ue iegistios limitauos a $number. No touos los gestoies ielacionales implementan esta extension y otios peimiten haceilo utilizanuo otios pioceuimientos. Este métouo peimite cieai una sentencia SQL que iepiouuzca la funcionaliuau LINIT en foima tianspaiente. /0#123.5 B23(+,8 3, #H%#$7(:$ -#3 3#$)",0# 'fE EZ@ZT , "$, +.$7"3%, <?php $db = Db::rawConnect(); $sqlQuery = $db->limit("SELECT id, name FROM customer WHERE status = 'A'", 10); $db->query($sqlQuery); $result = $db->getLastResult(); while($row = $db->fetchArray()){ print $row['name']."\n"; } 20.11 Manipular Registros Los siguientes métouos peimiten la geneiacion y ejecucion ue sentencias SQL que peimiten la manipulacion ue iegistios: public booleon insert{strinq $toble, orroy $volues, orroy $fielJs=orroy{), booleon $outomoticµuotes=folse) Peimite iealizai una inseicion sin usai SQL uiiectamente. El SQL es geneiauo está ue acueiuo al gestoi ielacional utilizauo. Notese que poi uefecto el métouo espeia que los valoies a inseitai esten coiiectamente escapauos, el paiámetio $outomoticµuotes peimite que se agiegen comillas simples y se escapen los valoies usanuo la funcion oJJslocbes{) en foima automática. Las columnas que son omitiuas se les aplica la iegla uel gestoi ielacional BEFA0LT si esta existe, en caso contiaiio se inseitan valoies nulos. /0#123.5 <#,3(>,8 "$, ($7#8+(:$ +.$ n,"%.1,%(+f".%#7 \ 7($ #33,7 <?php $db = DbBase::rawConnect(); //Usando Quotes Manualmente LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 179 $values = array(“’0044’”, “’England’”); $fields = array(“code”, “name); if($db->insert(“countries”, $values, $fields)){ Flash::success(“Se insertó correctamente el registro”); } //Usando Quotes en forma automática $values = array(“0044”, “England”); $fields = array(“code”, “name); if($db->insert(“countries”, $values, $fields, true)){ Flash::success(“Se insertó correctamente el registro”); } Cuanuo se agiega el paiámetio $outomoticµuotes y se iequieie inseitai expiesiones o ejecucion ue funciones ue la base ue uatos es necesaiio inuicai estos usanuo instancias ue la clase BbRowvolue. /0#123.5 Z$7#8%,8 "$ M,3.8 #H28#7(:$ -# 3, 9,7# -# -,%.7 <?php $db = DbBase::rawConnect(); $values = array(“John Smith”, new DbRawValue(“current_date()”)); $fields = array(‘name’, ‘created_at’); if($db->insert(“employees”, $values, $fields, true)){ Flash::success(“Se insertó correctamente el registro”); } public booleon upJote{strinq $toble, orroy $fielJs, orroy $volues, strinq $wbereClouse=null, booleon $outomoticµuotes=folse) Peimite iealizai una actualizacion sin usai SQL uiiectamente. El SQL es geneiauo ue acueiuo al gestoi ielacional utilizauo. Notese que poi uefecto el métouo espeia que los valoies a actualizai esten coiiectamente escapauos, el paiámetio $outomoticµuotes peimite que se agiegen comillas simples y se escapen los valoies usanuo la funcion oJJslocbes{). /0#123.5 <#,3(>,8 "$, ,+%",3(>,+(:$ -# -,%.7 <?php $db = DbBase::rawConnect(); $fields = array(“code”, “name); $values = array(“’0044’”, “’England’”); if($db->update(“countries”, $fields, $values)){ Flash::success(“Se actualizó correctamente el registro”); } $fields = array(“code”, “name); $values = array(“0044”, “England”); if($db->update(“countries”, $fields, $values, true)){ Flash::success(“Se actualizó correctamente el registro”); } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 18u public voiJ Jelete{strinq $toble, strinq $wbereConJition="") Peimite iealizai una eliminacion ue iegistios sin usai SQL uiiectamente. El SQL es geneiauo ue acueiuo al gestoi ielacional utilizauo. /0#123.5 <#,3(>,8 "$, #3(1($,+(:$ -# -,%.7 <?php $db = DbBase::rawConnect(); //Eliminar todos los registros de la tabla customer if($db->delete(“customer”)==true){ Flash::success(“Se eliminaron correctamente todos los registros”); } //Eliminar usando condiciones if($db->delete(“customer”, “status = ‘Active’”)==true){ Flash::success(“Se eliminaron correctamente los registros”); } public inteqer offecteJRows{Resource $resultµuery=null) Bevuelve el numeio ue filas afectauas poi una opeiacion ue inseicion, actualizacion o boiiauo. El paiámetio $iesultQueiy peimite cambiai el iecuiso uevuelto poi otia ejecucion uel métouo query o exec. /0#123.5 [9%#$#8 ($*.81,+(:$ -# 3.7 8#)(7%8.7 ,*#+%,-.7 #$ "$, .2#8,+(:$ -# 1,$(2"3,+(:$ -# -,%.7 <?php $db = Db::rawConnect(); $db->query("DELETE FROM customer WHERE status = 'I'"); print "Filas borradas = ".$db->affectedRows(); 20.12 Administrar Transacciones public booleon beqin{) Peimite iniciai una tiansaccion en la conexion utilizaua. /0#123.5 ;7. -# %8,$7,++(.$#7 , 9,0. $(M#3 <?php $db = DbBase::rawConnect(); $db->begin(); $fields = array("name", "createdAt"); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 181 $values = array("John Smith", "2007-10-21"); if($db->insert("customer", $values, $fields, true)==false){ $values = array("Darren Davison", "2007-12-02"); if($db->insert("customer", $values, $fields, true)==false){ $db->commit(); } else { $db->rollback(); } } else { $db->rollback(); } public booleon rollbock{) Peimite anulai una tiansaccion en la conexion utilizaua. public booleon commit{) Peimite hacei commit a una tiansaccion penuiente en la conexion actual. public strinq for0pJote{strinq $sqlµuery) ueneia un SQL que efectúa un bloqueo no-compaitiuo uel giupo ue iegistios seleccionauos. public strinq sboreJlock{strinq $sqlµuery) ueneia un SQL que efectúa un bloqueo compaitiuo uel giupo ue iegistios seleccionauos. public voiJ setlsolotionlevel{int $isolotionlevel) Peimite establecei el nivel ue isolacion ue la conexion. Los niveles ue isolacion ueben estai uisponibles en el gestoi ielacional, consulte la uocumentacion si tiene uuuas ue ello. El valoi uel paiámetio $isolotionlevel es alguna ue las constantes: T,93,5 6#7+8(2+(:$ -# +.$7%,$%#7 -# $(M#3#7 -# Z7.3,+(:$ Y,3.8 4.198# 6#7+8(2+(:$ 1 IS0LATI0N_REAB_0NC0NNITEB Los SELECTs se ejecutan en un mouo ue no-bloqueo. 2 IS0LATI0N_REAB_C0NNITEB Las consultas se ejecutan un un mouo ue lectuias consistentes con no-bloqueo. S IS0LATI0N_REPEATABLE_REAB uestoies tiansaccionales noimalmente tiabajan sobie este mouo ue isolacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 182 4 IS0LATI0N_SERIALIZABLE Algunos gestoies ielacionales como 0iacle sopoitan nativamente este mouo, otios como NySQL convieiten touas las instiucciones SELECT en SELECT ‰ L0CK IN SBARE N0BE bloqueanuo el giupo ue iegistios obteniuos en una consulta a mouo-solo lectuia. public booleon is0nJerTronsoction{) Peimite conocei si la conexion se encuentia bajo una tiansaccion activa. public voiJ qetEoveAutoCommit{) Peimite conocei si la conexion tiene auto-commit o nivel ue isolacion REAB 0NC0NNITEB. 20.13 Crear, Cerrar y obtener información de conexiones public Bb rowConnect{booleon $newConnection=folse, booleon $renovote=folse) 0btiene un objeto conexion a la base ue uatos uel entoino actual con los paiámetios estableciuos en el aichivo confiq,enviroment.ini. Este métouo implementa el pation Sinqleton contiolanuo que solo una instancia ue la conexion se ciee caua vez que se hace el llamauo al mismo uesue cualquiei paite ue la aplicacion. <?php //Crear o obtener la última conexión creada $db = DbBase::rawConnect(); //Crear una nueva conexión sin cambiar la conexión del Singleton $db = DbBase::rawConnect(true); //Crear una nueva conexión renovando la conexión del Singleton $db = DbBase::rawConnect(true, true); public ResourceConnection connect{stJCloss $Jescriptor) Establece la conexion al gestoi ielacional. <?php $db = new Db(); $db->connect("192.168.2.140", "scott", "tiger", "bankdb"); $result = $db->query("SELECT * FROM customer"); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 18S while($row = $db->fetchArray($result)){ print $row['name']."\n"; } public resource qetConnectionlJ{) 0btiene el iecuiso inteino ue bajo nivel con el que se iuentifica la conexion al gestoi ielacional. public voiJ close{) Cieiia la conexion actual con el gestoi ielacional. Si la conexion es peisistente no se ceiiaiá. public voiJ setReoJ0nly{booleon $reoJ0nly) Establece si la conexion seiá ue solo lectuia. En este estauo se geneiaiá una excepcion cuanuo se tiate ue iealizai una inseicion, mouificacion o eliminacion ue uatos. public voiJ isReoJ0nly{) Peimite sabei si la conexion es ue solo lectuia o no. 20.14 Información de Errores public strinq error{strinq $errorStrinq=´´, resource $resultµuery=null) Bevuelve infoimacion uel último eiioi geneiauo en el auaptauoi. public inteqer noFrror{resource $resultµuery=null) Bevuelve el númeio uel último eiioi geneiauo. 20.15 Obtener el valor de la columna identidad Algunos gestoies ielacionales sopoitan columnas iuentiuau, es uecii, que manejan un consecutivo auto-numéiico paia uifeienciai univocamente caua iegistio en una tabla. public inteqer lostlnsertlJ{strinq $toble=´´, strinq $iJentityIielJ="") 0btiene el último valoi inseitauo en una columna iuentiuau. Algunos gestoies ielacionales no sopoitan este tipo ue columnas y poi ello es necesaiio obtenei el valoi buscanuo el máximo valoi inseitauo en el campo llave piimaiia. public booleon tobleFxists{strinq $toble, strinq $scbemo="") Peimite consultai si una ielacion con el nombie $table existe en el schema ue la conexion LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 184 actual o el inuicauo usanuo el paiámetio $schema. 20.16 Obtener información de Tablas public orroy qetIielJsIromToble{strinq $tobleNome) Este métouo obtiene los campos ue una tabla en un vectoi. El vectoi pueue sei inuexauo numéiicamente o asociativamente: <?php $db = DbBase::rawConnect(); $fields = $db->getFieldsFromTable(“customer”); public strinq fielJNome{int $number, Resource $resultµuery=null) 0btiene el nombie ue un campo en la posicion estableciua poi $numbei uel iesultauo $iesultQueiy. public orroy listTobles{strinq $scbemoNome=´´) Bevuelve un aiiay con las tablas que hay en la schema actual o en el que se inuique en $schemaName. En algunos gestoies ielacionales también se uevuelven las vistas a las que tenga acceso el usuaiio ue la conexion activa. public orroy JescribeToble{strinq $tobleNome=´´, strinq $scbemoNome=´´) Bevuelve un aiiay con la uesciipcion ue los campos ue una tabla junto con sus tipos ue uatos. 20.17 Crear y Eliminar Tablas public booleon creoteToble{strinq $tobleNome, orroy $Jefinition, orroy $inJex=orroy{), orroy $toble0ptions=orroy{)) Peimite cieai tablas fisicas o tempoiales en la conexion activa. El paiámetio $Jefinition es un vectoi con la lista ue campos ue la tabla y sus atiibutos. El paiámetio $inuex peimite inuicai inuices que se ueban cieai junto con la tabla y poi último $table0ptions peimite inuicai opciones ue la tabla a cieai tales como el Fnqine en el caso ue NySQL, el chaiset o el tablespace en el caso ue 0iacle. Bevuelve un valoi booleano inuicanuo el éxito ue la opeiacion. /0#123.5 I8#,8 "$, %,93, "7,$-. "$ ,-,2%,-.8 #$ #72#+(,3 <?php LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 18S $db = DbLoader::factory('MySQL', array( 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'name' => 'test' )); $db->createTable(“example”, array( "id" => array( "type" => DbMySQL::TYPE_INTEGER, "notNull" => true, "primary" => true, "auto" => true ), "nombre" => array( "type" => DbMySQL::TYPE_VARCHAR, "notNull" => true, "size" => 120 ), "texto" => array( "type" => DbMySQL::TYPE_TEXT, "notNull" => true ), "cantidad" => array( "type" => DbMySQL::TYPE_INTEGER, "notNull" => true, "size" => 11 ), "fecha" => array( "type" => DbMySQL::TYPE_DATETIME, "notNull" => true ), "fecha_at" => array( "type" => DbMySQL::TYPE_DATE ), "fecha_in" => array( "type" => DbMySQL::TYPE_DATE ), "estado" => array( "type" => DbMySQL::TYPE_CHAR , "notNull" => true, "size" => 1 ) ), array( “ix1” => “nombre”, “ix2” => array(“fecha”, “estado”) )); También es posible cieai la tabla usanuo la conexion pieueteiminaua uel entoino actual: /0#123.5 I8#,8 "$, %,93, "7,$-. 3, +.$#H(:$ 28#-#%#81($,-, <?php $db = Db::rawConnect(); $db->createTable(“example”, array( "id" => array( "type" => Db::TYPE_INTEGER, "notNull" => true, "primary" => true, "auto" => true ), "nombre" => array( "type" => Db::TYPE_VARCHAR, "notNull" => true, "size" => 120 ) )); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 186 Los tipos ue atiibutos con los que se pueue uesciibii un campo en la uefinicion ue las columnas es la siguiente: B%8(9"%. 6#7+8(2+(:$ type El tipo ue uato que se almacenaiá en la columna, se pueue utilizai un stiing con el tipo ue uato o usai las constantes uel auaptauoi lo que es más iecomenuable. notNull Inuica si la columna uebe peimitii nulos o no. piimaiy Inuica si el campo hace paite ue la llave piimaiia ue la tabla. auto Inuica si el campo es iuentiuau. Solo pueue habei un campo autonuméiico en la tabla. size Tamaño uel campo. scale Peimite establecei la escala uel campo. piecision Peimite establecei la piecision uel campo. uefault Peimite establecei el valoi poi uefecto ue la columna cuanuo se inseita un valoi nulo en ella. public booleon JropToble{strinq $tobleNome, $ifFxists=folse) Elimina una tabla uel schema actual ue la conexion. El paiámetio $ifFxists peimite establecei si se uebe compiobai que la tabla exista antes ue sei eliminaua lo que evita una excepcion geneiaua poi el gestoi ielacional. Bevuelve un valoi booleano inuicanuo el éxito ue la opeiacion. <?php $db = DbBase::rawConnect(); $db->dropTable(“customer”); 20.18 Fecha del gestor relacional public strinq qetBote0sinqIormot{strinq $Jote, strinq $formot="YYYY-HH-BB") Bevuelve la fecha uel gestoi ielacional en un ueteiminauo foimato. public strinq qetCurrentBote{) 0btiene la fecha actual uesue el gestoi ielacional. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 187 public strinq oJJµuotes{strinq $volue) Agiega comillas especiales sopoitauas poi el gestoi ielacional a un valoi $value. 20.19 Debug, Seguimiento y Traza protecteJ voiJ loq{strinq $msq, int $type=loqqer::BFB06) Envia un valoi al log inteino uel objeto conexion. La vaiiable $type uebe tenei el valoi ue una ue las constantes uel componente loqqer. protecteJ voiJ Jebuq{strinq $sqlStotement) Realiza un uebug ue la instiuccion SQL $sqlStatement envianuola a pantalla. ueneialmente no es usauo exteinamente y se invoca cuanuo la conexion se encuentia en mouo uebug. public voiJ setBebuq{booleon $Jebuq) Peimite impiimii en pantalla las opeiaciones inteinas ue SQL geneiauas en el objeto. public voiJ setTrocinq{booleon $trocinq) Establece si el objeto está en mouo tiaza o no. public orroy qetTroceJSµl{) Bevuelve un vectoi con las opeiaciones SQL ejecutauas en la conexion mientias se encontiaba en mouo tiaza. public voiJ setloqqer{mixeJ $loqqer) Establece el nombie uel aichivo con el que se haiá seguimiento a las opeiaciones SQL geneiauas en la conexion. Si se envia true como paiámetio se cieaiá un log con la convencion JbYYYYHHBB.txt. Si se establece una instancia ue un auaptauoi ue loggei este es tomauo paia hacei el seguimiento. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 188 21 Componente Active Record - ORM 21.1 Introducción Nuchos ue los piocesos ciiticos uel softwaie en una empiesa están ielacionauos con el funcionamiento, uesaiiollo y mantenimiento ue los uatos que iepiesentan la infoimacion, un activo muy valioso ue una oiganizacion. Los entoinos empiesaiiales actuales iequieien ue la integiacion continua ue iequeiimientos uauas las conuiciones ue un munuo cambiante y evolutivo. Las aplicaciones uesaiiollauas bajo un componente ue acceso a la infoimacion poco escalable o uemasiauo uepenuiente ue componentes y pioveeuoies tecnologicos, pueue llevai a que una oiganizacion pieiua clientes o uineio uebiuo a la imposibiliuau ue auaptaise iápiuamente a las necesiuaues iequeiiuas sin peiuei estabiliuau o iequiiienuo mayoi tiempo ue uesaiiollo e implementacion geneianuo sobie costos. 0n componente impoitante en Kumbio Fnterprise Iromework es el componente ActiveRecorJ. Este es el encaigauo ue iealizai el mapeo objeto-ielacional y ue encaigaise ue los mouelos en la aiquitectuia NvC ue las aplicaciones. El concepto ue 0RN se iefieie a una técnica ue mapeai las ielaciones ue una base ue uatos a objetos nativos uel lenguaje utilizauo (PBP en este caso), ue tal foima que se pueua inteiactuai con ellos en foima más natuial. Los objetivos ue este componente van más allá ue mapeai tablas y conveitiilas en clases (incluyenuo tipos ue uatos, constiaints, logica ue uominio, etc.) o ue conveitii iegistios en objetos. La iuea es ieuucii los uetalles ue la inteiaccion con las bases ue uatos en gian meuiua meuiante vaiias capas ue abstiaccion, incluyenuo ieuucii el uso ue SQL o liuiai con conexiones y sintaxis piogiamacional ue bajo nivel. Al implementai el acceso a las bases ue uatos usanuo un 0RN se gana: • Inuepenuencia ue la base ue uatos utilizaua en gian meuiua, esto aumenta las caiacteiisticas comeiciales ue un softwaie ya que es posible cambiai ue RBBN con un menoi impacto sobie las áieas implicauas al uso e implementacion uel mismo. • Reuuccion uel tamaño uel couigo hacienuo más simple el uso y entenuimiento a nivel ue uesaiiollo ue sistemas que utilicen bases ue uatos. • La capa inteimeuia ue acceso a loas RBBNs piopoiciona un métouo potente ue inteiceptacion ue cualquiei evento ielacionauo con las bases ue uatos, lo cual facilita la valiuacion ue la logica ue uominio, integiiuau ue uatos, uefinii niveles ue seguiiuau, LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 189 logging , auuitoiia ue sistemas, etc. • El 0RN peimite auministiai las asociaciones ue las entiuaues uel mouelo incluso si el backenu ue almacenamiento es uistinto. • ActiveRecoiu piopoiciona event hanuling en la capa inteimeuia, lo cual peimite notificai cambios en el mouelo ue foima unifoime y consistente. La mayoi paite ue la implementacion ue ActiveRecorJ se basa en el pation ue uiseño uel tipo Boto Source Arcbitecturol uel mismo nombie. En conjunto con el almacenamiento ue meta- uatos y la auministiacion ue tiansacciones se iealizan los piocesos ue inteiaccion con bases ue uatos a más alto nivel. 21.2 Cuando usar ActiveRecord ActiveRecorJ es un pation ue uiseño en los cual los uatos y la estiuctuia ue los mismos se encuentian asociauos en una misma clase. Los uatos geneialmente son peisistentes, es uecii que están almacenauos en algún gestoi ielacional, aichivo o meuio fisico. La logica ue acceso a los uatos es fácilmente implementable usanuo ActiveRecoiu y auemás la convieite en paite ue la logica ue uominio ue la aplicacion. ActiveRecorJ es una buena opcion cuanuo la logica ue uominio no es muy compleja, es uecii se implementa un mouelo isomoifico, se usan ueiivaciones, colecciones o heiencia no-sencilla. Nouelos entiuau-ielacion con un uiseño consistente ayuuan a mejoiai la implementacion ue pation ue uiseño. 21.3 Entidades Las entiuaues son objetos peisistentes ligeios que noimalmente iepiesentan una tabla en una base ue uatos ielacional. El estauo peisistente ue una entiuau este iepiesentauo usanuo atiibutos peisistentes asociauos a los campos ue las tablas. Caua entiuau se implementa en un mouelo que es una clase en un aichivo en el uiiectoiio moJels,. PbOcOb <#^"#8(1(#$%.7 -# 3,7 I3,7#7 -# /$%(-,-#7 Las clases ueben tenei los siguientes iequeiimientos: • Caua aichivo uebe tenei el nombie ue la tabla y la extension .php • Bebe habei una entiuau poi aichivo • La clase uebe sei subclase (heieuai) ue la clase ActiveRecorJ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 19u • La clase no uebe tenei constiuctoies • La clases que iepiesenten entiuaues finales no uebe sei abstiacta PbOcOP B%8(9"%.7 -# 3,7 /$%(-,-#7 Bebiuo a que PBP es un lenguaje con tipificacion uinámica los atiibutos ue las clases entiuau no iepiesentan el tipo ue uato ieal uel campo en la base ue uatos. Con objetivos funcionales los getteis ue algunos campos ciean objetos asociauos al tipo ue uato ieal, poi ejemplo, los campos tipo fecha uevuelven un objeto ue la clase Bote con el valoi uel campo. Es posible agiegai casting al valoi ue caua objeto usanuo la opcion uel sciipt que ciea mouelos asi: php scripts/create_model.php –-table-name customers –-enable-casting yes Los tipos ue uatos a los que les aplica casting son los siguientes: T,93,5 <#3,+(:$ -# +,7%($) #$%8# %(2. -# -,%. -# 3, 9,7# -# -,%.7 \ %(2. -# -,%. -# KLK T(2. 6,%. k6 T(2. 6,%. KLKJh"19(, /$%#828(7# vaichai, Chai, Text, Blob Stiing Integei, smallint, tinyint Integei uecimal, float, Noney uouble uate Bate time Time 21.4 Atributos y Campos persistentes La implementacion ue los atiibutos ue las entiuaues en las clases se pueue iealizai estáticamente o uinámicamente uepenuienuo ue los iequeiimientos ue la aplicacion. En geneial una implementacion estática piopenue poi mejoies piacticas ue uesaiiollo y softwaie más seguio. En la foima estática se uefinen los campos ue la tabla como atiibutos piotegiuos ue la clase. Esto peimite encapsulai el estauo inteino ue caua piopieuau y evitai que sea cambiaua poi LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 191 equivocacion o a pioposito en logica ue la aplicacion. En estos casos también es necesaiio implementai métouos get¡set paia pouei obtenei¡establecei el valoi ue los atiibutos. Los métouos ue ActiveRecorJ isAttribute{$property), writeAttribute{$property, $volue) y reoJAttribute{$property) peimiten uinámicamente conocei si existe un atiibuto, obtenei y uevolvei su valoi en foima pública. Poi ejemplo isNome{), qetNome{) y setNome{) es una implementacion estática paia el atiibuto 'name' ue una entiuau Customer. La foima geneial en la que los getteis¡setteis ueben sei implementauos es la siguiente: public function getProperty(); public function setProperty($valueOfProperty); El métouo piotegiuo setTiasient($attiibute) peimite establecei que campos ue la entiuau no ueben sei peisistiuos. Las opeiaciones ue inseicion y actualizacion omiten los atiibutos maicauos como Tiasient. /0#123.5 /7%,93#+#8 "$ +,12. %8,7(#$% #$ #3 1.-#3. protected function initialize(){ $this->setTransient(“user_code”); } Cuanuo los campos se mapean uinámicamente su visibiliuau queua estableciua como pública poi uefecto. 21.5 Llaves Primarias ueneialmente ue entiuaues tienen una llave piimaiia que peimite iuentificai un iegistio en foima única. Kumbio Fnterprise Iromework lee los meta-uatos ue la tabla mapeaua uiiectamente uel gestoi ielacional e iuentifica la llave piimaiia con sus caiacteiisticas: simples, compuestas y¡o auto-numéiicas. El tipo ue uato ue llaves piimaiias uebe sei un tipo ue uato integial, en geneial se uebe evitai el uso ue campos con tipo ue uato flotante, uecimal o Noney, ya que pueuen vaiiai ligeiamente y no ofiecen seguiiuau en que un iegistio sea univoco. Los accesoies (métouos get) ue los atiibutos que peitenezcan a una llave piimaiia compuesta o simple ueben sei touos públicos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 192 21.6 Convenciones en llaves primarias Kumbio Fnterprise Iromework sopoita convencion en llave piimaiia, paia esto uebe tenei los siguientes iequisitos: • El campo uebe llamaise 'iu' • El campo uebe estai maicauo como llave piimaiia en el gestoi ielacional • El campo uebe sei enteio piefeiiblemente unsigneu (sin signo) • El campo uebe sei una columna iuentiuau osea sei autonuméiico (BB2, NySQL, Sybase, Niciosoft SQL Seivei) o estai asociauo a una secuencia (0iacle, BB2, PostgieSQL, Inteibase) El uso ue esta convencion ieuuce la complejiuau ue la aplicacion y ieuuce la couificacion ya que muchos aspectos el fiamewoik pueue asumii esto. 21.7 Fechas Auto-Asignables ActiveRecorJ sopoita fechas auto-asignables meuiante convencion meuiante lo cual se pueue iealizai veisionamiento concuiiente optimista o simplemente llevai un iegistio ue fechas ue cieacion y mouificacion ue iegistios. Las convenciones paia fechas auto-asignables son las siguientes: ! Paia que un campo tome automáticamente la fecha uel sistema en la opeiacion ue inseitai este uebe tenei el sufijo "_at" y peimitii valoies nulos. ! Paia que un campo tome automáticamente la fecha uel sistema en la opeiacion ue actualizai este uebe tenei el sufijo "_in" y peimitii valoies nulos. 21.8 Multiplicidad en Relaciones de Entidades Existen cuatio tipos ue multipliciuau en ielaciones: una-a-una, una-a-muchos, muchos-a-una y muchos-a-muchos. La multipliciuau pueue sei uniuiieccional o biuiieccional y caua una pueue sei simple o meuiante combinacion ue tablas. El tipo ue ielaciones establece como se lleva a peisistencia una instancia ue una entiuau. Noimalmente el gestoi ielacional auministia constiaints ue llave foiánea coiiesponuientes a estas ielaciones, la uefinicion ue estos ayuua a que la integiiuau ue uatos sea confiable y las ielaciones uefiniuas obtengan los iesultauos espeiauos. A tiavés ue la implementacion ue las ielaciones es posible acceuei a los iegistios LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 19S ielacionauos a caua iegistio ue foima unifoime ahoiianuo couigo. PbO`Ob I.$M#$+(.$#7 #$ <#3,+(.$#7 Los nombies ue campos ue las entiuaues con cieitas convenciones peimiten que se establezcan automáticamente los campos iefeiencias y se automaticen taieas ue couificacion meuiante una estiuctuia nemotécnica: • Paia especificai un campo que es llave foiánea a otia ielacion se utiliza el nombie ue campo "nombie_tabla_iu" • La tabla iefeienciaua uebe tenei un campo iuentiuau que sea llave piimaiia con nombie "iu". • Si es posible, los campos ielacionauos ueben tenei el mismo tipo ue uato. PbO`OP <#3,+(.$#7 ;$(-(8#++(.$,3#7 Las ielaciones uniuiieccionales son aquellas que se geneian ue una ielacion a otia peio no viceveisa. Neuiante los métouos belonqsTo, bosHony o bos0ne se establece que uno o mas campos hacen iefeiencia a otios equivalentes en otia entiuau. PbO`Oc <#3,+(.$#7 k(-(8#++(.$,3#7 Las ielaciones biuiieccionales establecen asociaciones en las que caua una ue ellas tiene una viceveisa complementaiia. PbO`Od @"+C.7 , "$. La asociacion uniuiieccional muchos-a-uno es la más común ue touas. Paia establecei una ielacion ue este tipo se utiliza el métouo piotegiuo ue ActiveRecoiu belongsTo: /0#123.5 @"3%(23(+(-,- 1"+C.7 , "$. 8#3,+(.$,-, +.$ "$ 7.3. +,12. Paia 2 Tablas: CREATE TABLE `country` ( `code` int(11) NOT NULL, `name` varchar(20) default NULL, PRIMARY KEY (`code`) ); CREATE TABLE `city` ( `code` int(11) NOT NULL, `country_code` int(11) default NULL, `name` varchar(80) default NULL, PRIMARY KEY (`code`) ); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 194 El mouelo ue ciuuaues con una ielacion muchos-a-uno se implementa asi: <?php class City extends ActiveRecord { protected function initialize(){ $this->belongsTo(“country_code”, “country”, “code”); } } El piimei paiámetio ue belonqsTo inuica el campo ue la entiuau que hace la asociacion, el segunuo inuica el nombie ue la entiuau iefeienciaua y el teiceio el nombie uel campo en la entiuau iefeienciaua. La asociacion una vez uefiniua se pueue utilizai asi: /0#123.5 ;%(3(>,8 "$, ,7.+(,+(:$ 1"+C.7 , "$. $city = EntityManager::getEntityInstance(“City”); $city->findByName(“Bogotá”); $country = $city->getCountry() print $country->getNombre(); // => Colombia 0n gettei con el nombie ue la ielacion 'Country' peimite obtenei el iegistio asociauo al pais en la ciuuau consultaua. <#3,+(.$,-, +.$ M,8(.7 +,12.75 El siguiente ejemplo implementa una ielacion muchos a uno con 2 campos iefeiencia, en este caso los nombies ue los campos son iguales en ambas tablas si fuesen uifeientes se pouiian uefinii en el teicei paiámetio ue belonqsTo. /0#123.5 ;%(3(>,8 "$, 8#3,+(:$ +.12"#7%, 1"+C.7 , "$. CREATE TABLE `customer` ( `identification_type` char(3) NOT NULL default '', `number` varchar(40) NOT NULL default '', `nombre` varchar(120) default NULL, `status` char(1) default NULL, PRIMARY KEY (`identification_type`,`number`) ); CREATE TABLE `flights` ( `flight_number` varchar(12) NOT NULL default '', `identification_type` char(3) default NULL, `number` varchar(40) default NULL, `flight_date` date default NULL, `initial_hour` time default NULL, `final_hour` time default NULL, PRIMARY KEY (`flight_number`) ); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 19S El mouelo Flights se implementa asi: /0#123.5 6#*($(8 "$, 8#3,+(:$ 9#3.$)7T. #$ "$ 1.-#3. #$%(-,-A8#3,+(:$ 7($ +.$M#$+(.$#7 <?php class Flights extends ActiveRecord { protected function initialize(){ $this->belongsTo(array(“identification_type”, “number”), “customer”); } } La ielacion pueue sei utilizaua asi: $flight = $this->Flights->findByDate(“2008-11-01”); $customer = $flight->getCustomer(); 0n gettei con el nombie ue la ielacion peimite obtenei el iegistio asociauo al cliente en el vuelo consultauo. PbO`ON ;$. , @"+C.7 La asociacion uniuiieccional uno-a-muchos inuica que paia caua iegistio ue una entiuau existen uno o más iegistios asociauo en la entiuau iefeienciaua. Paia establecei una ielacion ue este tipo se utiliza el métouo piotegiuo ue ActiveRecorJ bosHony. PbO`Oe ;$. , ;$. La asociacion uniuiieccional uno-a-uno es la más inusual ue touas. Inuica que paia caua iegistio ue una entiuau existe solo uno asociauo en la entiuau iefeienciaua. Paia establecei una ielacion ue este tipo se utiliza el métouo piotegiuo ue ActiveRecorJ bos0ne. PbO`Oa @"+C.7 , @"+C.7 FALTA 21.9 API de ActiveRecord A continuacion se piesenta una iefeiencia ue los piincipales métouos ue la clase ActiveRecorJ. PbOiOb [8()#$ -# 6,%.7 public voiJ setSource{$source) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 196 Peimite establecei la entiuau uel gestoi ue uonue se mapeaian los atiibutos uel mouelo. public strinq qetSource{) Bevuelve el nombie ue la entiuau usaua inteinamente paia mapeai los atiibutos uel mouelo. public voiJ setScbemo{strinq $scbemo) Establece el nombie uel $schema en uonue se encuentia la tabla uonue se mapeaian los uatos. public voiJ setConnection{Bb $connection) Peimite establecei un objeto Bb uinámicamente sobiesciibienuo la conexion actual uel mouelo. public BbBose qetConnection{) 0btiene el objeto Bb utilizauo paia iealizai las opeiaciones a bajo nivel con el gestoi ielacional. PbOiOP Y.3+,-. -# @#%,A6,%.7 public booleon isBumpeJ{) Inuica si ya se han obteniuo los meta-uatos uel gestoi ielacional en el objeto. public voiJ JumpHoJel{) Foiza al mouelo a obtenei los meta-uatos uel gestoi ielacional. protecteJ booleon Jump{) 0btiene los meta-uatos uel gestoi ielacional. Si ya se han obteniuo no se vuelven a consultai public voiJ resetHetoBoto{) Elimina los meta-uatos obteniuos uel gestoi-ielacional caiganuolos nuevamente. PbOiOc 6#9") \ '#)"(1(#$%. public voiJ setBebuq{booleon $Jebuq) Establece si el mouelo esta en mouo uebug. Touas las opeiaciones inteinas ue la conexion activa se visualizan como Ilosb::notices en la saliua al navegauoi. public voiJ setloqqer{mixeJ $loqqer) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 197 Establece el mouelo en mouo uebug. Touas las opeiaciones inteinas ue la conexion asociaua al mouelo son almacenauas en un aichivo con nombie $loqqer. Si el piimei paiámetio es true se utiliza la convencion ubYYYYNNBB.txt //Grabar todas las operaciones SQL internas a un archivo en logs/customersDebug.txt $this->Employees->setLogger(“customersDebug.txt”); También es posible pasai una instancia ue loggei utilizanuo cualquiei auaptauoi uisponible utilizanuo como paiámetio el objeto cieauo: /0#123.5 E.)"#,8 3,7 .2#8,+(.$#7 ($%#8$,7 -# "$ 1.-#3. , "$ 3.))#8 ^"# "7, +.128#7(:$ $logger = new Logger(‘Compressed’, ‘log.employees.txt.gz’); $logger->setPath(“/usr/local/log/”); $this->Employees->setLogger($logger); El uesaiiollauoi también pueue pasai una instancia ue un objeto que implemente un métouo log como paiámetio e implementai opeiaciones peisonalizauas meuiante él. /0#123.5 6#*($(8 "$ E.))#8 2#87.$,3(>,-. 2,8, C,+#8 7#)"(1(#$%. , 3,7 .2#8,+(.$#7 ($%#8$,7 -# "$ 1.-#3. $myLog = new MyUserLog(); $this->Employees->setLogger($myLog); public strinq inspect{) 0btiene una cauena ue inspeccion con los valoies inteinos ue caua atiibuto ue la entiuau. PbOiOd T8,$7,++(.$#7 public voiJ setTronsoction{ActiveRecorJTronsoction $tronsoction) Establece la tiansaccion utilizaua paia efectuai las opeiaciones en el mouelo. La tiansaccion uebe habeise inicializauo antes ue asignaila al objeto o geneiaiá una excepcion ActiveRecorJFxception. PbOiON I.$7"3%,8 8#)(7%8.7 public ActiveRecorJResulset finJAllBySql{strinq $sqlµuery) Peimite iealizai una consulta en el mouelo usanuo lenguaje ue consulta SQL. Los valoies obteniuos son uevueltos como instancias ue la clase. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 198 public ActiveRecorJResulset finJBySql{strinq $sqlµuery) Peimite iealizai una consulta en el mouelo que uevuelve un solo iegistio usanuo lenguaje ue consulta SQL. Los valoies obteniuos son uevueltos como instancias ue la clase. /0#123.5 <#,3(>,8 "$, +.$7"3%, #$ "$ 1.-#3. "7,$-. 'fE //Obtener los empleados con una condición en un subselect $empoyees = $this->Employees->findBySql(“SELECT employees.* FROM employees WHERE id NOT IN (SELECT employees_id FROM historical_data WHERE period = ‘2005-02’”); public BbResource sql{strinq $sqlµuery) Peimite iealizai una consulta usanuo lenguaje SQL. El cuisoi ue bajo nivel es uevuelto uiiectamente. public ActiveRecorJ finJIirst{mixeJ $poroms) Peimite iealizai una búsqueua ue iegistios que uevuelve un solo iegistio o el piimeio que coinciua con las conuiciones inuicauas. Los paiámetios ue consulta se establecen usanuo paiámetios poi nombie. /0#123.5 ;%(3(>,8 *($-!(87% 2,8, .9%#$#8 #3 28(1#8 8#)(7%8. -# "$ 1.-#3. : #3 28(1#8. ^"# +"123, -#%#81($,-,7 +.$-(+(.$#7 //Obtener el primer empleado que se almacenó en la entidad $employee = $this->Employees->findFirst(); //Obtener el primer usuario cuyo login sea ‘j.smith’ $user = $this->Users->findFirst(“login = ‘j.smith’”); //Obtener el ultimo producto cuyo precio sea menor a 100 y este activo $user = $this->Products->findFirst(“price < 100 AND status = ‘Active’”, “order: price DESC”); public ActiveRecorJResulset finJ{mixeJ $poroms) Peimite iealizai una búsqueua ue iegistios que uevuelve touos los que coinciuan con las conuiciones inuicauas. /0#123.5 ;%(3(>,8 *($- 2,8, +.$7"3%,8 3.7 8#)(7%8.7 -#3 1.-#3. //Obtener todos los registros de una entidad $employees = $this->Employees->find(); //Obtener todos los registros que cumplan con una condición $employees = $this->Employees->find(“status = ‘Active’”); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 199 //Obtener todos los registros que cumplan una condición y aplicándoles un ordenamiento $employees = $this->Employees->find(“status = ‘Active’”, “order: name desc”); //Obtener todos los registros y aplicarles un ordenamiento $employees = $this->Employees->find(“order: name”); //Obtener los 20 primeros registros que cumplan con unas condiciones $employees = $this->Employees->find(“agreement_date >= ‘2008-12-31’ AND status=’Active’”, “limit: 20”); public ActiveRecorJResulset finJIor0pJote{$poroms) Peimite iealizai una búsqueua ue iegistios que uevuelve touos los que coinciuan con las conuiciones inuicauas. Los iegistios encontiauos son bloqueauos en mouo no compaitiuo poi lo que otias sesiones ue aplicacion que tiaten ue leei¡esciibii estos iegistios iesultaian en una espeia. /0#123.5 k3.^"#,8 "$ +.$0"$%. -# 8#)(7%8.7 #$ 1.-. $. +.12,8%(-. #$ "$, %8,$7,++(:$ <?php class OrdersController extends ApplicationController { public function increaseQuantityAction(){ try { $transaction = new ActiveRecordTransaction(true); $this->Products->setTransaction($transaction); foreach($this->Products->findForUpdate(“quantity<100”) as $product){ $product->setQuantity($product->getMinStock()*2); if($product->save()==false){ $transaction->rollback(); } } } catch(TransactionFailed $e) { Flash::error($e->getMessage()); } } } public ActiveRecorJResulset finJWitbSboreJlock{$poroms) Peimite iealizai una búsqueua ue iegistios que uevuelve touos los que coinciuan con las conuiciones inuicauas. Los iegistios encontiauos son bloqueauos en mouo no compaitiuo poi lo que otias sesiones ue aplicacion que tiaten ue esciibii en estos iegistios iesultaian en una espeia poi paite uel gestoi ielacional. public strinq convertPoromsToSql{mixeJ $poroms) Ciea una consulta ue SQL meuiante los paiámetios poi nombie inuicauos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2uu public orroy Jistinct{mixeJ $poroms) Realiza una sentencia BISTINCT sobie una columna uel mouelo uevolvienuo un listauo ue los valoies uifeientes encontiauos. public booleon exists{strinq $wberePk) public ActiveRecorJResultset finJAllBy{strinq $fielJ, mixeJ $volue) public stotic orroy sinqleSelect{strinq $sql) Realiza una consulta SQL sobie el gestoi ielacional en la tabla 'uual' en el caso ue 0iacle o solo hace la instiuccion SELECT sobie ninguna entiuau en otios motoies. PbOiOe I.$%,8 8#)(7%8.7 public inteqer count{mixeJ $poroms) Bevuelve un conteo ue iegistios a paitii ue las conuiciones inuicauas. Los paiámetios pueuen sei estableciuos usanuo paiámetios poi nombie o un aiiay cuyos inuices inuiquen el tipo ue paiámtio a establecei. El paiámetio especial qroup mouifica el iesultauo obteniuo agiupanuolo meuiante otios atiibutos ue la entiuau. /0#123.5 <#,3(>,8 +.$%#.7 7.98# ,%8(9"%.7 -#3 1.-#3. //Cuantos productos hay? $this->Products->count(); //Cuantos productos tienen categoria 1 $this->Products->count("categories_id = 1"); //Contar productos por categoria foreach($this->Products->count("group: categories_id") as $result){ print $result->categories_id." ".$result->rowcount; } // Contar productos por categoria, mostrar aquellas categorias que tienen mas de // 10 productos $resultset =$this->Products->count("group: categories_id", “having: rowcount>10”); foreach($resultset as $result){ print $result->categories_id." ".$result->rowcount; } public mixeJ countBySql{strinq $sqlµuery) Realiza un conteo en el mouelo meuiante una sentencia SQL. PbOiOa K8.1#-(,8 8#)(7%8.7 public Jouble overoqe{$poroms) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2u1 Bevuelve un piomeuio ue los valoies ue una columna numéiica a paitii ue las conuiciones inuicauas. El paiámetio especial qroup mouifica el iesultauo obteniuo agiupánuolo meuiante otios atiibutos ue la entiuau. /0#123.5 <#,3(>,8 28.1#-(.7 7.98# ,%8(9"%.7 -#3 1.-#3. //En promedio, cual es el precio de un producto $this->Products->average(“price”); //En promedio, cual es el precio de un producto activo $this->Products->average(“price”, “conditions: status=’Active’”); //Promedio de precios por categoria $averages = $this->Products->average(“price”, “group: categories_id”); foreach($averages as $result){ print $result->categories_id." ".$result->average.”\n”; } PbOiO` <#,3(>,8 7"1,%.8(,7 public Jouble sum{$poroms) Este métouo peimite iealizai sumatoiias ue los atiibutos ue la entiuau. El paiámetio especial qroup mouifica el iesultauo obteniuo agiupanuolo meuiante otios atiibutos ue la entiuau. /0#123.5 <#,3(>,8 7"1,%.8(,7 7.98# ,%8(9"%.7 -#3 1.-#3. //Cuanto suman los impuestos en las ordenes de compra? $this->Orders->sum(“taxes”); //Cuanto suman los impuestos del año 2007? $this->Orders->sum(“taxes”, “conditions: year = ‘2007’”); //Cuanto suman las cantidades en las ordenes de compra por cada cliente $summatories = $this->Orders->sum(“quantity”, “group: customers_id”); foreach($summatories as $result){ print $result->categories_id." ".$result->summatory.”\n”; } //Cuanto suman las cantidades en las ordenes de compra por cada cliente, cuya //cantidad sea superior a 100 unidades $summatories = $this->Orders->sum(“quantity”, “group: customers_id”, “having: summatory>100”); foreach($summatories as $result){ print $result->categories_id." ".$result->summatory.”\n”; } PbOiOi [9%#$#8 #3 M,3.8 1UH(1. -# "$ ,%8(9"%. public mixeJ moximum{$poroms) Bevuelve un valoi máximo ue una columna numéiica a paitii ue las conuiciones inuicauas. El paiámetio especial qroup mouifica el iesultauo obteniuo agiupanuolo meuiante otios LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2u2 atiibutos ue la entiuau. /0#123.5 [9%#$#8 #3 M,3.8 1UH(1. -# "$ ,%8(9"%. -# "$ 1.-#3. //Quien es el empleado más antiguo? $this->Employees->maximum(“contract_date”, “conditions: status=’Active’”); PbOiObQ [9%#$#8 #3 M,3.8 1=$(1. -# "$ ,%8(9"%. public mixeJ minimum{$poroms) Bevuelve un valoi minimo ue una columna numéiica a paitii ue las conuiciones inuicauas. El paiámetio especial qroup mouifica el iesultauo obteniuo agiupanuolo meuiante otios atiibutos ue la entiuau. /0#123.5 [9%#$#8 #3 M,3.8 1=$(1. -# "$ ,%8(9"%. -# "$ 1.-#3. //Quien es el empleado más nuevo? $this->Employees->minimum(“contract_date”, “conditions: status=’Active’”); PbOiObb B7()$,8 M,3.8#7 , ($7%,$+(,7 public ActiveRecorJ JumpResult{orroy $result) Toma un vectoi cuyos inuices coinciuen con los nombies ue los atiibutos uel mouelo y los asigna uevolvienuo un objeto copia ue este con los valoies asignauos. Si algún inuice no coiiesponue a un atiibuto uel mouelo se geneia una excepcion. public voiJ JumpResultSelf{orroy $result) Toma un vectoi cuyos inuices coinciuen con los nombies ue los atiibutos uel mouelo y los asigna al mismo objeto. Si algún inuice no coiiesponue a un atiibuto uel mouelo se geneia una excepcion. PbOiObP Y,3(-,+(:$ public orroy qetHessoqes{) 0btiene los mensajes ue valiuacion geneiauos en un pioceso ue inseicion o actualizacion. public voiJ oppenJHessoqe{ActiveRecorJHessoqe $messoqe) Agiega un mensaje al buffei ue mensajes ue valiuacion uel mouelo. PbOiObc Z$*.81,+(:$ -# ,%8(9"%.7 public orroy qetAttributes{) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2uS 0btiene un vectoi con los nombies ue los atiibutos ue la entiuau. public orroy qetAttributesNomes{) 0btiene un vectoi con los nombies ue los atiibutos ue la entiuau. Es un alias ue getAttiibutes(). public booleon bosIielJ{$strinq fielJ) Peimite consultai si una entiuau tiene un ueteiminauo campo $fielu. public orroy qetPrimoryKeyAttributes{) 0btiene un vectoi con los nombies ue los atiibutos ue la entiuau que son llave piimaiia. public orroy qetNonPrimoryKeyAttributes{) 0btiene un vectoi con los nombies ue los atiibutos ue la entiuau que no son llave piimaiia. public orroy qetNotNullAttributes{) 0btiene un vectoi con los nombies ue los atiibutos ue la entiuau que no aceptan valoies nulos. public orroy qetBotesAtAttributes{) 0btiene un vectoi con los nombies ue los atiibutos ue la entiuau que auto-asignan la fecha actual cuanuo se iealiza una opeiacion ue inseicion. public orroy qetBoteslnAttributes{) 0btiene un vectoi con los nombies ue los atiibutos ue la entiuau que auto-asignan la fecha actual cuanuo se iealiza una opeiacion ue mouificacion. public booleon isANumericType{strinq $fielJ) Peimite consultai si un atiibuto en la tabla tiene un tipo ue uato númeiico (int, integei, float, numbei, bigint, Noney, etc). PbOiObd I8#,+(:$ \ ,+%",3(>,+(:$ -# 8#)(7%8.7 public booleon creote{orroy $volues=orroy{)) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2u4 public booleon upJote{orroy $volues) public booleon sove{) Este métouo peimite cieai¡actualizai iegistios ue acueiuo a si estos ya existen en la entiuau asociaua a un mouelo. El métouo save es llamauo también inteinamente poi los métouos creote y upJote ue ActiveRecorJ. Paia que este métouo funcione como se espeia es necesaiio que se haya uefiniuo una llave piimaiia coiiectamente en la entiuau paia pouei ueteiminai si un iegistio uebe sei actualizauo o cieauo. El métouo save() ejecuta los valiuauoies asociauos, llaves piimaiias viituales y eventos que se hayan uefiniuo en el mouelo. El geneiauoi ue iuentificauoies asociauo también es ejecutauo y al teiminai el pioceso el objeto se iefiesca con los valoies finales que queuaion en la base ue uatos. /0#123.5 I8#,8 "$ 8#)(7%8. "7,$-. #3 1_%.-. 7,M#VW -# B+%(M#<#+.8- <?php $product = new Products(); $product->setName('Potattos'); $product->setType('Food'); if($product->save()==false){ foreach($product->getMessages() as $message){ Flash::error($message->getMessage()); } } El ejecutaise save(), este uevuelve un valoi booleano inuicanuo el éxito ue la opeiacion. En el ejemplo anteiioi se obtienen y muestian los mensajes ue valiuacion en pantalla cuanuo save() uevuelve false. PbOiObN /3(1($,+(:$ -# 8#)(7%8.7 public booleon Jelete{$poroms) Elimina el iegistio activo asociauo al objeto ActiveRecoiu. PbOiObe [2#8,+(.$#7 #$ k,%+C public booleon upJoteAll{$volues) public booleon JeleteAll{$conJitions) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2uS PbOiOba E#+%"8,J#7+8(%"8, -# B%8(9"%.7 public mixeJ reoJAttribute{strinq $ottribute) 0btiene el valoi ue un atiibuto uel mouelo apaitii ue su nombie. Este métouo lee el valoi inuepenuiente ue la visibiliuau ue la piopieuau en la clase. public mixeJ writeAttribute{strinq $ottribute, mixeJ $volue) Asigna un valoi a un atiibuto uel mouelo apaitii ue su nombie. Este métouo esciibe el valoi inuepenuiente ue la visibiliuau ue la piopieuau en la clase. PbOiOb` Y,3(-,+(:$ protecteJ voiJ voliJote{strinq $voliJotorCloss, orroy $options) Agiega un valiuauoi a un mouelo. Consulte el capitulo ue valiuauoies ue integiiuau paia apienuei más sobie este métouo. public booleon voliJotionEosIoileJ{) Este métouo pueue sei usauo uentio ue un evento ue valiuacion paia inuicai si el pioceso ue completo ue valiuacion ha fallauo. Consulte el capitulo ue valiuauoies ue integiiuau paia apienuei más sobie este métouo. PbOiObi @"3%(23(+(-,- -# 8#3,+(.$#7 protecteJ voiJ bos0ne{mixeJ $fielJs, strinq $referenceToble, mixeJ $referenceJIielJs) Ciea una ielacion 1 a 1 con otia entiuau piesente en el auministiauoi ue entiuaues. El piimei paiámetio especifica el atiibuto o atiibutos en la entiuau local y $iefeienceuFielus el atiibuto o atiibutos en la tabla iefeienciaua. El paiámetio $iefeienceTable inuica la tabla iefeienciaua. /0#123.5 /7%,93#+#8 8#3,+(.$#7 C,7[$# Vb , bW -# ,+"#8-. ,3 1.-#3. #$%(-,-A8#3,+(.$ //Relación de un campo a otro por convención $this->hasOne(“tabla_id”); //Relación de un campo a otro $this->hasOne(“campo“, “tabla_referenciada”, “campo_referenciado”); //Relación de varios campos a varios campos $this->hasOne( array(“campo1“, “campo2), “tabla_referenciada”, array(“campo_referenciado1”, “campo_referenciado2”) ); protecteJ voiJ belonqsTo{mixeJ $fielJs, strinq $referenceToble, mixeJ $referenceJIielJs, strinq $relotionNome=´´ ) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2u6 Ciea una ielacion 1 a 1 inveisa con otia entiuau piesente en el auministiauoi ue entiuaues. El piimei paiámetio especifica el atiibuto o atiibutos en la entiuau local y $iefeienceuFielus el atiibuto o atiibutos en la tabla iefeienciaua. El paiámetio $iefeienceTable inuica la tabla iefeienciaua. /0#123.5 /7%,93#+#8 8#3,+(.$#7 9#3.$)7T. V1"+C.7 , bW -# ,+"#8-. ,3 1.-#3. #$%(-,-A 8#3,+(.$ //Relación de un campo a otro por convención $this->belongsTo(“tabla_id”); //Relación de un campo a otro $this->belongsTo(“campo“, “tabla_referenciada”, “campo_referenciado”); //Relación de varios campos a varios campos $this->belongsTo( array(“campo1“, “campo2), “tabla_referenciada”, array(“campo_referenciado1”, “campo_referenciado2”) ); protecteJ voiJ bosHony{mixeJ $fielJs, strinq $referenceToble, mixeJ $referenceJIielJs) Ciea una ielacion 1 a n con otia entiuau piesente en el auministiauoi ue entiuaues. El piimei paiámetio especifica el atiibuto o atiibutos en la entiuau local y $iefeienceuFielus el atiibuto o atiibutos en la tabla iefeienciaua. El paiámetio $iefeienceTable inuica la tabla iefeienciaua. /0#123.5 /7%,93#+#8 8#3,+(.$#7 C,7@,$\ Vb , 1"+C.7W -# ,+"#8-. ,3 1.-#3. #$%(-,-A 8#3,+(.$ //Relación de un campo a otro por convención $this->hasMany(“tabla_id”); //Relación de un campo a otro $this->hasMany(“campo“, “tabla_referenciada”, “campo_referenciado”); //Relación de varios campos a varios campos $this->hasMany( array(“campo1“, “campo2), “tabla_referenciada”, array(“campo_referenciado1”, “campo_referenciado2”) ); piotecteu voiu hasAnuBelongsToNany(mixeJ $fielJs, strinq $referenceToble, strinq $qoteToble, mixeJ $referenceJIielJs) Ciea una ielacion n a m inveisa con otia entiuau piesente en el auministiauoi ue entiuaues. El piimei paiámetio especifica el atiibuto o atiibutos en la entiuau local y $referenceJIielJs el atiibuto o atiibutos en la tabla iefeienciaua. El paiámetio $referenceToble inuica la tabla LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2u7 iefeienciaua y $qoteToble la tabla puente paia acceuei a la tabla iefeienciaua. PbOiOPQ L#8#$+(, public voiJ porent0f{strinq $porent) Establece una ielacion ue heiencia que utiliza una estiategia ue tabla poi subclase meuiante un uisciiminauoi. El paiámetio $paient inuica la entiuau pauie. PbOiOPb /H+#2+(.$#7 protecteJ voiJ exceptions{$e) Al ieesciibii este métouo es posible tiatai las excepciones geneiauas uentio ue un mouelo antes que sean lanzauas a otias paites ue la aplicacion. 21.10 Identifiers Las clases mapeauas con ActiveRecorJ que pietenuan efectuai opeiaciones ue manipulacion ue uatos ueben ueclaiai llaves piimaiias. Poi uefecto se utilizan estiategias paia obtenei el valoi ue estas al hacei una inseicion. Los tipos ue iuentificauoies sopoitauos son: T,93,5 T(2.7 -# )#$#8,-.8#7 7.2.8%,-.7 T(2. 6#7+8(2+(:$ Inciement ueneia iuentificauoies ue tipo integei, que son únicos solo cuanuo otios piocesos no geneiai opeiaciones ue inseicion concuiientes. Esta opcion no uebeiia sei usaua en clusteies. Iuentity No iealiza ninguna opeiacion en especial ya que apiovecha una columna iuentiuau piesente en la entiuau. Este tipo ue columnas son sopoitauas poi NySQL, IBN BB2, Niciosoft SQL Seivei, IBN Infoimix y SQLite. Sequence 0btiene el valoi ue un objeto uel gestoi ielacional llamauo secuencias. Las secuencias son sopoitauas poi 0iacle, PostgieSQL e IBN BB2. Bilo 0tiliza un algoiitmo tipo hi¡lo paia eficientemente geneiai los valoies únicos ue tipo inteqer. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2u8 00IB ueneia iuentificauoies unicos ue 128bits tipo stiing basauos en el algoiitmo 00IB (0niveisal 0nique Iuentifiei. Assigneu No aplica ninguna estiategia y utiliza el valoi asignauo uiiectamente al objeto instancia uel mouelo. 0niqiu Peimite obtenei iuentificauoies únicos ue 128bits usanuo la funcion ue PBP llamaua uniqiJ. PbObQOb /7%,93#+#8 #3 j#$#8,-.8 Paia establecei este tipo ue iuentificauoies se uebe usai el métouo piotegiuo ue ActiveRecorJ llamauo setlJ6enerotor. El piimei paiámetio inuica que tipo ue geneiauoi se usaiá y el segunuo peimite establecei las opciones uel geneiauoi. PbObQOP B3).8(%1. L(JE. El geneiauoi Bi¡Lo peimite obtenei el valoi que ueba se utilizauo como llave piimaiia ue un campo en otia entiuau en foima eficiente. En una tiansaccion al obtenei el valoi uel iuenticauoi se efectúa (si se sopoita) un bloqueo poi fila en el iegistio paia aseguiaise que ningún otio pioceso obtenga el mismo valoi. /0#123.5 /7%,93#+#8 "$ )#$#8,-.8 #*(+(#$%# L(JE. #$ "$ 1.-#3. <?php class Invoices extends ActiveRecord { public function initialize(){ $this->setIdGenerator("Hilo", “code”, array( "table" => "invoces_data", "column" => "consecutive", "max_lo" => 100 )); } } La opcion max_lo inuica el valoi minimo que uebe tomai el consecutivo. T,93,5 K,8U1#%8.7 -#3 )#$#8,-.8 L(JE. T(2. 6#7+8(2+(:$ table Table uonue se encuentia el consecutivo columna Columna que lleva el consecutivo LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2u9 souice Es opcional. Peimite establecei que la tabla se encuentia en otio schema. max_lo Es opcional. Peimite contiolai el minimo valoi que uebe almacenai la columna. numbei Es opcional. Inuica cuantos consecutivos se ueben geneiai paia aumentai la eficiencia. 0no ue los objetivos uel algoiitmo Bi¡Lo es aumentai la eficiencia meuiante la ieuuccion ue la lectuia¡esciituia ue la tabla consecutivo. Esto solo es posible cuanuo la opeiacion se encuentia en meuio ue una tiansaccion auministiaua poi el TronsoctionHonoqer. PbObQOc B3).8(%1. ;;Z6 El algoiitmo 00IB geneia iuentificauoies únicos que pueuen sei usauos como llave piimaiia meuiante el algoiitmo uel mismo nombie. El sistemas 0NIX utiliza ¡uev¡uianuom paia geneiai el iuentificauoi. 0n 00IB tiene la siguiente foima: 4cfce7c2-6089-102c-91cf-d8dbbe268425 Se establece un geneiauoi 00IB ue esta foima: /0#123.5 /7%,93#+#8 "$ )#$#8,-.8 -# (-#$%(*(+,-.8#7 ^"# "7# #3 ,3).8(1. ;;Z6 <?php class Media extends ActiveRecord { public function initialize(){ $this->setIdGenerator("Uuid", “id”); } } PbObQOd j#$#8,-.8 ;$(^Z- El geneiauoi 0niqiu geneia iuentificauoies únicos apaitii ue la funcion 0niqiu ue PBP. El valoi geneiauo es un stiing ue S2 caiacteies (un númeio hexauecimal ue 128 bits) que es muy uificil ue iepetii. /0#123.5 /7%,93#+#8 "$ )#$#8,-.8 -# (-#$%(*(+,-.8#7 ^"# "7# #3 ,3).8(%1. "$(^(- <?php LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 21u class Media extends ActiveRecord { public function initialize(){ $this->setIdGenerator("Uniqid", “id”); } } PbObQON j#$#8,-.8 4,%(M# El geneiauoi "Native" uebe usaise en aquellos casos en los que el valoi ue la columna iuentiuau son asignauos poi un tiiggei en la tabla y que toma el valoi ue una secuencia. En estos casos ActiveRecorJ no asignaiá ningún valoi en la sentencia INSERT cieaua iespetanuo el consecutivo ue la secuencia aunque si consultaiá su valoi paia actualizai el estauo uel objeto. El geneiauoi "Native" uebe estableceise ue la siguiente foima: /0#123.5 /7%,93#+#8 "$ )#$#8,-.8 $,%(M. #$ "$ 1.-#3. <?php class Orders extends ActiveRecord { public function sequenceName(){ return “ORDERS_SEQ”; } public function initialize(){ $this->setIdGenerator("Native", “id”); } } PbObQOe I.3"1$,7 Z-#$%(-,- \ '#+"#$+(,7 Paia bases ue uatos que sopoiten columnas iuentiuau el geneiauoi asigna el valoi auecuauo paia que se geneie valoi autonuméiico en la columna auecuaua. En estos casos el geneiauoi lJentity se pueue usai con motoies como IBN BB2, NySQL y Niciosoft SQL Seivei. Paia los motoies que sopoitan secuencias como 0iacle, PostgieSQL e IBN BB2 se uebe utilizai el geneiauoi "Sequence" o "Native". El geneiauoi "Sequence" se uebe establecei cuanuo no existan tiiggeis que asignen el valoi ue la columna en la tabla ya que esto haiá que se alteie el consecutivo innecesaiiamente. /0#123.5 /7%,93#+#8 "$ )#$#8,-.8 -# 7#+"#$+(,7 2,8, "$ 1.-#3. +.$ "$ )#7%.8 8#3,+(.$,3 ^"# 3. 7.2.8%# LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 211 <?php class Orders extends ActiveRecord { public function initialize(){ $this->setIdGenerator("Sequence", “id”, array( “name” => “ORDERS_ID” )); } } El nombie ue la secuencia también pueue sei estableciuo meuiante el métouo público sequenceNome tanto paia los mouelos con geneiauoies como los que tienen iuentificauoi poi convencion: /0#123.5 6#*($(8 #3 $.198# 3, 7#+"#$+(, -#3 )#$#8,-.8 -# M,3.8#7 (-#$%(-,- <?php class Orders extends ActiveRecord { public function sequenceName(){ return “ORDERS_ID_SEQ”; } public function initialize(){ $this->setIdGenerator("Sequence", “id”); } } 21.11 Convenciones en Identificadores ActiveRecorJ pueue automáticamente establecei el tipo ue geneiauoi a lJentity si en los meta- uatos ue la entiuau encuentia que existe una columna iuentiuau. Igualmente si el campo se llama explicitamente 'iu' igualmente se entenueiá la convencion que se tiata ue un campo iuentiuau geneiauo poi el gestoi ielacional o meuiante el geneiauoi Inciement. Requisitos paia utilizai la convencion en iuentificauoies: • El campo uebe llamaise "iu" • El campo uebe tenei un tipo ue uato enteino (bigint, int, integei, numbei) • El campo uebe sei la llave piimaiia ue la tabla • El campo uebe sei no nulo LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 212 21.12 Los Meta-datos en ActiveRecordMetadata uian paite ue la ciencia en la implementacion ue ActiveRecorJ esta ielacionaua con la auministiacion ue los metauatos ue las tablas mapeauas. El almacenamiento ue sus caiacteiisticas es punto funuamental paia la utilizacion ue los métouos que consultan, boiian, mouifican, almacenan, etc. El subcomponente ActiveRecorJHetoJoto implementa el pation HetoJoto Hoppinq el cual peimite cieai un uata map poi schema sobie la infoimacion ue las tablas y asi ieuucii el consumo ue memoiia poi objeto ActiveRecorJ y consoliuai una base ue uatos in-memoiy ue las caiacteiisticas ue caua entiuau utilizaua en la aplicacion. Noimalmente los meta-uatos son esciitos manualmente poi el uesaiiollauoi peio Kumbio Fnterprise los toma uiiectamente uel gestoi ielacional, con esto se gana eficiencia en el uesaiiollo geneianuo un schema auto-actualizable que iefleja cualquiei cambio en la estiuctuia uel mouelo ue uatos. PbObPOb T(2.7 -# @#%,A6,%.7 B31,+#$,-.7 En ActiveRecorJHetoBoto se almacenan vaiios tipos ue infoimacion sobie entiuaues que pietenuen aceleiai las opeiaciones ue manipulacion y consulta ue uatos en ActiveRecorJ. Estos tipos ue uatos son: T(2. @#%,A6,%. 6#7+8(2+(:$ Campos ue la tabla Nombies ue los campos ue las tablas Llaves Piimaiias Campos que hacen paite ue la llave piimaiia ue las tablas. Campos no llave piimaiia Conjunto ue campos que no peitenece a la llave piimaiia ue las tablas. Campos No Nulos Campos que no peimiten valoies nulos Tipos ue Batos Tipo ue uatos ue caua campo en una tabla. Campos Fecha Auto- Asignables Campos que poi convencion asignan automáticamente la fecha uel sistema al actualizai o mouificai. PbObPOP @#%,A6,%.7 #$ #%,2,7 -# 6#7,88.33. Cuanuo las aplicaciones se encuentian en etapa ue uesaiiollo es posible que el los uesaiiollauoies encuentien que los cambios en la estiuctuias ue la base ue uatos no se ven ieflejauos en las aplicaciones. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 21S Esto suceue poique los meta-uatos ue las tablas son cacheauos tempoialmente en sesion paia evitai que la base ue uatos sea acceuiua continuamente uisminuyenuo el ienuimiento. Paia hacei que los meta-uatos sean caigauos nuevamente es necesaiio ceiiai y abiii el navegauoi o el cliente web y asi se veián los cambios uel mouelo ue uatos ieflejauos. PbObPOc BKZ -# B+%(M#<#+.8-@#%,6,%, public voiJ stotic existsHetoBoto{strinq $toble, strinq $scbemo) Peimite sabei si ya se ha uefiniuo los meta-uatos paia una tabla y esquema en especial. public voiJ stotic creoteHetoBoto{strinq $toble, strinq $scbemo) Ciea un iegistio paia meta-uatos en el meta-uata stoie. public voiJ stotic setAttributes{strinq $tobleNome, strinq $scbemoNome, orroy $ottributes) Establece los nombies ue los campos ue una ueteiminaua tabla. public orroy stotic qetAttributes{strinq $tobleNome, strinq $scbemoNome) 0btiene los nombies ue los campos ue una ueteiminaua tabla. public orroy stotic setPrimoryKeys{strinq $tobleNome, strinq $scbemoNome, orroy $primoryKey) Establece los campos que son llave piimaiia a una ueteiminaua tabla. public orroy stotic qetPrimoryKeys{strinq $tobleNome, strinq $scbemoNome="") 0btiene los campos que son llava piimaiia en una ueteiminaua tabla public voiJ stotic setNonPrimoryKeys{strinq $tobleNome, strinq $scbemoNome, orroy $nonPrimoryKey) Establece los campos que no son llave piimaiia a una ueteiminaua tabla. public orroy stotic qetNonPrimoryKeys{$tobleNome, $scbemoNome) 0btiene los campos que no son llava piimaiia en una ueteiminaua tabla LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 214 public voiJ stotic setNotNull{strinq $tobleNome, strinq $scbemoNome, orroy $notNull) Establece los campos que no pueuen tenei valoies nulos. public orroy stotic qetNotNull{$tobleNome, $scbemoNome) 0btiene los valoies que no son nulos en una tabla. public voiJ stotic setBotoType{strinq $tobleNome, strinq $scbemoNome, orroy $JotoType) Establece los tipos ue uatos ue una tabla. public orroy stotic qetBotoTypes{strinq $tobleNome, strinq $scbemoNome) 0btiene los tipos ue uatos ue una ueteiminaua tabla. public voiJ stotic setBotesAt{strinq $tobleNome, strinq $scbemoNome, orroy $JotesAt) Establece los atiibutos ue la tabla a los cuales se les asigna fecha automática al inseitai. public orroy stotic qetBotesAt{strinq $tobleNome, strinq $scbemoNome) 0btiene los atiibutos ue la tabla a los cuales se les asigna fecha automática al inseitai. public voiJ stotic setBotesln{strinq $tobleNome, strinq $scbemoNome, orroy $Jotesln) Establece los atiibutos ue la tabla a los cuales se les asigna fecha automática al actualizai. public orroy stotic qetBotesln{strinq $tobleNome, strinq $scbemoNome) 0btiene los atiibutos ue la tabla a los cuales se les asigna fecha automática al actualizai. public voiJ stotic JumpHetoBoto{strinq $toble, strinq $scbemo, orroy $metoBoto) Almacena los meta-uatos paia una ueteiminaua tabla en el meta-uata stoie. 21.13 Cursores y Resulsets de Consultas Los iesultauos uevueltos poi los métouos ue consulta ue ActiveRecorJ son objetos instancias ue la clase ActiveRecorJResulset que encapsulan la manipulacion y obtencion ue los iegistios inuiviuuales en el cuisoi enviauo poi el RBBN. La clase implementa las inteifaces lterotor, ArroyAccess, Seekoblelterotor y Countoble con lo cuál el objeto se pueue iecoiiei usanuo una sentencia como foreocb, acceuei a inuices LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 21S inuiviuuales meuiante el opeiauoi ue acceso ue vectoies y contai el total ue iegistios usanuo funciones como count o sizeof. La implementacion ue este objeto logia una auministiacion ue memoiia más eficiente ya que solo el iegistio activo en el cuisoi consume memoiia en el sciipt actual y se va libeianuo a meuiua que se iecoiien los iegistios. Las implementaciones ue 0RN que uevuelven los iegistios en un aiiay consumen mayoi memoiia y si la consulta uevuelve una cantiuau consiueiable ue iegistios es piobable que el inteipiete PBP aboite uebiuo al consumo excesivo ue memoiia poi paite ue la aplicacion. PbObcOb ;%(3(>,8 #3 +"87.8 +.1. %(2. !.8R,8-A[$3\ Los objetos ue iesultauo ue consulta pueuen sei iecoiiiuos usanuo sentencias uel lenguaje como foreocb y wbile utilizanuolos como cuisoies tipo forworJ-only. Al teiminai ue iecoiiei los iegistios los cuisoies son auto-iesetauos peimitienuo volvei a iecoiieilos. //Recorrerlo con Foreach foreach($this->Products->find() as $product){ print $product->getId()."\n"; } //Recorrerlo con While $resultSet = $this->Products->find(); while($resultSet->valid()){ $product = $resultSet->current(); print $product->getId()."\n"; } PbObcOP ;%(3(>,8 #3 +"87.8 +.1. '+8.33,93# Los iesultsets también pueuen sei iecoiiiuos en mouo sciollable ue esta foima se pueue acceuei a un iegistio en paiticulai usanuo un inuice paia establecei su posicion. $resultSet = $this->Products->find(); //Obtener el primer registro print $resultSet->getFirst()->id."\n"; //Obtener el segundo registro print $resultSet->offsetGet(1)->id."\n"; //Obtener el último print $resultSet->getLast()->id."\n"; PbObcOc BKZ -# B+%(M#<#+.8-<#7"37#% public inteqer key{) 0btiene el númeio uel iegistio que está actualmente activo en el cuisoi. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 216 public booleon offsetFxists{inteqer $inJex) Peimite consultai si existe un iegistio en una ueteiminaua posicion. public voiJ rewinJ{) Bevuelve el cuisoi inteino uel iesulset al piimei iegistio. public booleon voliJ{) Inuica la posicion actual uel cuisoi inteino es valiua, es uecii que aun queuan más iegistios paia iecoiiei. public voiJ next{) Nueve el cuisoi inteino al siguiente iegistio uel Resultset. public voiJ current{) Bevuelve el objeto ActiveRecoiu activo en el cuisoi. public voiJ seek{int $position) Nueve el cuisoi inteino uel iesultset a la posicion inuicaua poi $position, esta uebe sei un númeio enteio mayoi a u. public inteqer count{) Implementa el métouo que exige la inteiface Countoble el cual peimite sabei cuantos iegistios ha uevuelto el iesultset. public ActiveRecorJ qetIirst{) 0btiene el piimei iegistio uel cuisoi. Implicitamente iebobina el punteio al piimei iegistio. public ActiveRecorJ qetlost{) 0btiene el último iegistio uel cuisoi. Implicitamente mueve el punteio inteino al último iegistio. public ActiveRecorJ offset6et{$inJex) 0btiene el iegistio ubicauo en la posicion $inuex uel cuisoi. Las posiciones empiezan en u. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 217 public booleon offsetFxists{$inJex) Peimite consultai si existe un iegistio una ueteiminaua posicion uel cuisoi. public strinq qetSµlµuery{) Bevuelve el SQL que piouujo la consulta. public ActiveRecorJ qetFntity{) Bevuelve la entiuau que piouujo la consulta. 21.14 Mensajes de ActiveRecord ActiveRecorJ tiene un subsistema ue mensajes que peimite flexibilizai la foima en que se piesentan o almacena la saliua ue valiuacion que se geneia en los piocesos ue inseicion o actualizacion. Caua mensaje consta ue una instancia ue la clase ActiveRecorJHessoqe. El giupo ue mensajes geneiauo pueue sei iecogiuo usanuo el métouo qetHessoqes{) uel objeto ActiveRecorJ uonue se piouujo la opeiacion. Caua mensaje ofiece infoimacion extenuiua como el nombie uel campo que geneio el mensaje y el tipo ue mensaje. En el siguiente ejemplo se ilustia como impiimii los mensajes que iesultan ue un pioceso falliuo ue inseicion: /0#123.5 [9%#$#8 3.7 1#$7,0#7 -# M,3(-,+(:$ -# "$ 1.-#3. <?php $customer = new Customer(); $customer->setName("Steve Conrad"); $customer->setEmail("[email protected]"); if($customer->save()==false){ foreach($customer->getMessages() as $message){ Flash::error($message->getMessage()); } } PbObdOb BKZ -# B+%(M#<#+.8-@#77,)# El API ue la clase ActiveRecorJHessoqe es la siguiente: public voiJ setType{strinq $type) Establece el tipo ue mensaje. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 218 public strinq qetType{) 0btiene el tipo ue mensaje. public voiJ setHessoqe{strinq $messoqe) Establece el mensaje inteino uel objeto. public strinq qetHessoqe{) 0btiene el mensaje geneiauo. public voiJ setIielJ{strinq $fielJ) Establece el nombie uel campo ue cuyo valoi se geneio el mensaje. public strinq qetIielJ{) 0btiene el nombie uel campo que geneio el mensaje. 21.15 Transacciones en ActiveRecord Las aplicaciones empiesaiiales geneialmente auministian uatos cuyo valoi es ciitico paia las oiganizaciones y su manejo uebe sei seguio, estable y confiable. La integiiuau ue uatos se pieiue cuanuo las opeiaciones son inteiiumpiuas y no se completan satisfactoiiamente. Las tiansacciones en el softwaie tiatan piecisamente ue evitai estas situaciones buscanuo que haya integiiuau en los uatos y que se pueue iecupeiai la infoimacion si ocuiie un estauo ue fallo. La implementacion ue Tiansacciones ue Negocio paia ActiveRecorJ esta basaua en la iuea uel pation uel giupo 0bject-Relotionol Beboviorol llamauo 0nit of Work, aunque este sin auministiai el log ue objetos utilizauos. Su funcionamiento básicamente peimite sepaiai los objetos ActiveRecorJ que peitenecen a una tiansaccion ue tal foima que touas las opeiaciones efectuauas poi ellos mantengan un estauo ue concuiiencia consistente y se pueua contiolai si se alteia la base ue uatos o se hace iollback en caso que se iequieia. La implementacion ue tiansacciones en ActiveRecoiu tiene 2 ventajas piincipales: • Se encapsulan uetalles sobie la implementacion ue tiansacciones uel gestoi ielacional utilizauo. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 219 • Sopoita auministiacion ue tiansacciones ueclaiativas. • Esta integiauo con el componente TronsoctionHonoqer que ieuuce la couificacion y auministia globalmente las tiansacciones. PbObNOb B-1($(7%8,+(.$ -# T8,$7,++(.$#7 La auministiacion ue tiansacciones pueue sei utilizaua a nivel global o nivel local, inuepenuientemente ue la foima en que se utilicen su objetivo es piimoiuialmente contiolai la concuiiencia a los iecuisos ue peisistencia ue la aplicacion. La gestion ue tiansacciones uepenue explicitamente ue los iequisitos ue la aplicacion: • j3.9,3#75 Las globales son auministiauas y gestionauas poi la aplicacion, el bloqueo ue iecuisos es uepenuiente ue la natuialeza ue los mismos. Como el estauo ue ejecucion ue una aplicacion Web uueime entie una peticion y otia es necesaiio cancelai y¡o aceptai las tiansacciones penuientes caua vez que teiminan los hilos ue ejecucion. Las tiansacciones pueuen sei compaitiuas entie la ejecucion ue vaiias acciones en un mismo hilo. Kumbio Fnterprise Iromework peimite establecei tiansacciones en foima automática paia cualquiei peticion a la aplicacion y caua objeto instanciauo, sin embaigo esta implementacion pueue iesultai uemasiauo inconuicional paia las ieglas ue negocio ue una aplicacion. Su mayoi ventaja es que las opeiaciones que se iealizan a nivel global pueuen sei ieplicauas a vaiios iecuisos tiansaccionales. • E.+,3#75 Peimiten al uesaiiollauoi establecei mouelos ue piogiamacion más natuiales y faciles ue implementai que cumplen uetallauamente con la logica ue negocio ue la aplicacion. La piincipal uesventaja es que tiene a invauii el mouelo ue piogiamacion ue la aplicacion. El componente TronsoctionHonoqer auministia la cieacion, cancelacion, uestiuccion y aceptacion ue tiansacciones cuanuo se implementan en múltiples acciones en un ueteiminauo flujo ue ejecucion o cuanuo se usan tiansacciones globales. Este componente implementa la inteifase TronsoctionHonoqerlnterfoce, asi el uesaiiollauoi pueue implementai un componente piopio ue auministiacion ue tiansacciones implementanuo esta: interface TransactionManagerInterface { LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 22u public function getUserTransaction($definition=null); public function commit(); public function rollback(); public function initializeManager(); public function rollbackPendent(); public static function notifyRollback(); public static function notifyCommit(); } El métouo TronsoctionHonoqer::qet0serTronsoction{) uevuelve la última tiansaccion o ciea una si es necesaiio ue acueiuo a la uefinicion pasaua como aigumento. La uefinicion es una instancia ue la clase TronsoctionBefinition. La uefinicion ue la tiansaccion establece paiámetios como el nivel ue isolacion o si la tiansaccion es piopagable: /0#123.5 /7%,93#+#8 3.7 2,8U1#%8.7 -# 3, %8,$7,++(:$ +.$ "$ T8,$7,+%(.$6#*($(%(.$ <?php class AccountsController extends ApplicationController { public function createCustomerDataAction(){ try { $definition = new TransactionDefinition(); $definition-> setIsolationLevel(TransactionDefinition::ISOLATION_SERIALIZABLE); $definition->setPropagation(false); $definition->setReadOnly(false); $definition->setTimeout(0); $transaction = TransactionManager::getUserTransaction($definition); $customer = new Customer(); $customer->setTransaction($transaction); $customer->setName("John Smith"); $customer->setStatus("Active"); if($customer->save()){ $this->routeToAction("action: createAccountData"); } else { $transaction->rollback(); } } catch(TransactionFailed $e){ Flash::error($e->getMessage()); } } public function createCustomerDataAction($clientId){ $clientId = $this->filter($clientId, "int"); try { $transaction = TransactionManager::getUserTransaction($definition); $this->Account->setTransaction($transaction); $accounts = $this->Account- >findWithSharedLock("client_id=’$clientId’"); foreach($accounts as $account){ if($account->getStatus()=='Inactive'){ $account->setBalance(0); $account->setStatus('Active'); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 221 if($account->save()==false){ foreach($account->getMessages() as $message){ Flash::error($message- >getMessage()); } $transaction->rollback(); } } } if($transaction->commit()==true){ Flash::success("Se creó correctamente el cliente"); } } catch(TransactionFailed $e){ Flash::error($e->getMessage()); } } } El ejemplo muestia como se aplica la tiansaccion cieaua meuiante la uefinicion y se ieutiliza entie las uifeientes acciones que confoiman la opeiacion ue negocio. 0na uesciipcion ue los paiámetios que se pueuen uefinii en TronsoctionBefinition es la siguiente: • Z7.3,+(:$5 Peimite establecei el giauo ue isolacion con el que tiabajaian las tiansacciones. Este se iefieie al estánuai SQL92 y uepenue ue si esta sopoitauo poi el gestoi ielacional. • K8.2,),%(.$5 La piopagacion ue tiansacciones peimite que cuanuo una tiansaccion sea cancelaua se cancelen otias cieauas en la misma peticion a la aplicacion. • <#,-A[$3\5 Peimite establecei una tiansaccion ue solo lectuia, cualquiei intento ue mouificacion (inseicion, actualizacion, boiiauo) ue iegistios teimina en la geneiacion ue una excepcion. • T(1#."%5 Peimite establecei un tiempo en segunuos uespués uel cual la tiansaccion seiá cancelaua automáticamente si no se ha iealizauo un commit. Esto peimite contiolai cieitos piocesos ue negocio uonue el acceso a los iecuisos es poi uemanua. El métouo estático TronsoctionHonoqer::qet0serTronsoction{) uevuelve una instancia ue la clase ActiveRecorJTronsoction quien auministia el acceso al Bata Souice ue la tiansaccion. Núltiples entiuaues compaiten un mismo BataSouice aunque esto sea tianspaientemente auministiauo. PbObNOP '($+8.$(>,+(:$ -# <#+"87.7 +.$ T8,$7,++(.$#7 El uesaiiollauoi uebe tenei cuiuauo al utilizai tiansacciones, ya que multiples auministiauoies tiansaccionales que tiabajen sobie un mismo gestoi ielacional pouiia LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 222 iealizai bloqueos sobie iecuisos necesaiios en una misma opeiacion ue negocio que teimina en un JeoJlock y una excepcion. El uso ue TronsoctionHonoqer peimite evitai esto en cieita meuiua ya que este contiola la cieacion, ieutilizacion, piopagacion, cancelacion y aceptacion ue los piocesos ielacionauos con tiansacciones asi como otias opeiaciones. PbObNOPOb '($+8.$(>,+(:$ -# B3%. 4(M#3 El métouo ue ActiveRecorJ::setTronsoction{) piopoiciona un métouo paia el objeto que iepiesenta un iegistio compaita una tiansaccion ue foima tianspaiente. La sincionizacion ue alto nivel peimite que vaiios objetos ActiveRecorJ compaitan un mismo BotoSource bajo una tiansaccion y touas sus opeiaciones ue bajo nivel son auministiauas poi los componentes uel fiamewoik lo cual aumenta la seguiiuau y confiabiliuau que la opeiacion no se salga ue contiol y se ejecuten las taieas ue finalizacion ue tiansacciones iequeiiuas. PbObNOPOP '($+8.$(>,+(:$ , k,0. 4(M#3 La conexion al gestoi ielacional pueue sei obteniua ue un objeto ActiveRecoiu meuiante el métouo qetConnection{). El objeto uevuelto es una instancia ue la clase Bb que es quien ejecuta las taieas ue bajo nivel uiiectamente en el gestoi ielacional. Los métouos beqin{), rollbock{) y commit{) estan piesentes y peimiten iniciai y teiminai tiansacciones a bajo nivel. /0#123.5 ;%(3(>,8 %8,$7,++(.$#7 , 9,0. $(M#3 $invoice = new Invoice(); $db = $invoice->getConnection(); $db->begin(); $invoice->find(124); $invoice->setStatus(“Cancelled”); $invoice->save(); $db->commit(); PbObNOc I.$7(-#8,+(.$#7 -# '($+8.$(>,+(:$ La impoitancia ue la sincionizacion yace en la necesiuau ue una coiiecta implementacion uel pioceso ue negocio en uonue la uisponibiliuau ue los iecuisos sea consistente entie los que son tiansaccionales y los que no. Es funuamental entenuei que los objetos que poseen una misma tiansaccion auministian cieitos iecuisos y se uebe contiolai que no vayan a sei utilizauos o iequeiiuos en otia tiansaccion uentio uel mismo pioceso, si no se contiolan estas situaciones es posible que se LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 22S piesenten inconsistencias en los piocesos ue negocio. En el siguiente pioceso se pueue compienuei la situacion piesentaua: /0#123.5 '($+8.$(>,+(:$ -# 8#+"87.7 #$ +.$%8.3,-.8#7 <?php try { $transaction = new ActiveRecordTransaction(true); foreach($Accounts->find("status = 'P'") as $accountItem){ $accountItem->setTransaction($transaction); $accountItem->setStatus("A"); if($accountItem->save()==false){ foreach($accountItem->getMessages() as $message){ Flash::error($message->getMessage()); } $transaction->rollback(); } } foreach($Accounts->find("status = 'A' AND customer_id = '$customerId'") as $accountItem){ $accountItem->setTransaction($transaction); $accountItem->setBalance($accountItem->getBalance()- $manageDiscount); if($accountItem->save()==false){ foreach($accountItem->getMessages() as $message){ Flash::error($message->getMessage()); } $transaction->rollback(); } } $transaction->commit(); } catch(TransactionFailed $e){ Flash::error($e->getMessage()); } En el piimei foieach se consultan las cuentas cuyo estauo sea igual a 'P' y se les cambia el estauo a 'A', en el segunuo foreocb se consultan las cuentas cuyo estauo sea igual a 'A' y peitenezcan a un cliente ueteiminauo paia luego aplicai un uescuento sobie estas cuentas. El pioceso espeia que las cuentas iecién actualizauas en el piimei foreocb se les haga igualmente el uescuento uel segunuo, sin embaigo esto no seiá asi ya que los iesultauos uevueltos poi la tiansaccion base peitenecen a un espejo uifeiente al espejo ue los objetos auministiauos poi la tiansaccion $tronsoction. En iesumen, los objetos que se espeia que también se les aplique el uescuento en el segunuo foreocb queuaian sin este, ya que en el gestoi ielacional aún no se ha ieflejauo la actualizacion LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 224 ue estauos uel piimei foreocb. La solucion a este inconveniente es seguii las siguientes consiueiaciones: • Los piocesos ue negocio que acceuan a un mismo iecuiso, en este caso la entiuau Account ueben asociai touas las instancias a una misma tiansaccion • Si existe integiiuau iefeiencial en el mouelo ue uatos igualmente es necesaiio que touas las entiuaues ielacionauas y sus piocesos estén auministiauas poi una misma tiansaccion. Si no es necesaiio que se ieflejen los cambios en el mouelo ue uatos uentio ue un mismo pioceso ue negocio entonces pueue hacei caso omiso a estas consiueiaciones y utilizai tantos auministiauoies ue tiansacciones como iequieia. El ejemplo piesentauo anteiioimente sin el inconveniente mencionauo se implementaiia asi: /0#123.5 '($+8.$(>,+(:$ -# 8#+"87.7 #$ +.$%8.3,-.8#7 <?php try { $transaction = new ActiveRecordTransaction(true); $Accounts->setTransaction($transaction); foreach($Accounts->find("status = 'P'") as $accountItem){ $accountItem->setStatus("A"); if($accountItem->save()==false){ foreach($accountItem->getMessages() as $message){ Flash::error($message->getMessage()); } $transaction->rollback(); } } foreach($Accounts->find("status = 'A' AND customer_id = '$customerId'") as $accountItem){ $accountItem->setBalance($accountItem->getBalance()- $manageDiscount); if($accountItem->save()==false){ foreach($accountItem->getMessages() as $message){ Flash::error($message->getMessage()); } $transaction->rollback(); } } $transaction->commit(); } catch(TransactionFailed $e){ Flash::error($e->getMessage()); } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 22S Caua instancia uevuelta poi finJ esta automáticamente asociaua a la tiansaccion $tronsoction y se contiola que touas las opeiaciones efectuauas sobie la entiuau Accounts se iefleje en touo el pioceso ue negocio. PbObNOd BKZ -# T8,$7,+%(.$6#*($(%(.$ public voiJ setlsolotionlevel{int $isolotionlevel) Establece el nivel ue Isolacion que tenuiá la conexion asociaua a la tiansaccion. El valoi uel paiámetio $isolotionlevel es una constante ue TronsoctionBefinition que pueue sei IS0LATI0N_BEFA0LT, IS0LATI0N_REAB_C0NNITEB, IS0LATI0N_REAB_0NC0NNITEB, IS0LATI0N_REPETEABLE_REAB y IS0LATI0N_SERIALIZABLE. La uisponibiliuau ue estas uepenue exclusivamente ue si esta sopoitaua poi el gestoi ielacional. public voiJ setPropoqotion{booleon $propoqotion) Establece un valoi booleano que inuica si las tiansacciones cieauas al cancelaise cualquieia se piopagaiá el estauo a las uemás uel auministiauoi ue tiansacciones. public voiJ setTimeout{int $timeout) Establece el tiempo máximo que pueua uuiai una tiansaccion antes que sea cancelaua. public voiJ setReoJ0nly{booleon $reoJ0nly) Establece el caiáctei ue solo lectuia ue la conexion PbObNON BKZ -# B+%(M#<#+.8-T8,$7,+%(.$ public __construct{booleon $outoBeqin=folse, TronsoctionBefinition $Jefinition=null) Constiuctoi ue la uefinicion ue la tiansaccion. public booleon commit{) Realiza la opeiacion ue 'commit' sobie la tiansaccion auministiaua. public booleon rollbock{) Realiza la opeiacion ue 'iollback' sobie la tiansaccion auministiaua. Si la tiansaccion es piopagable cancelaiá otias tiansacciones cieauas bajo el mismo TronsoctionHonoqer. public booleon beqin{) Peimite iniciai la tiansaccion en la conexion activa al gestoi ielacional. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 226 public BbBose qetConnection{) 0btiene le objeto uel auaptauoi al gestoi ielacional que auministiaua la tiansaccion. public voiJ setlsNewTronsoction{booleon $isNew) Establece si la tiansaccion ha cieauo una nueva conexion al gestoi ielacional o esta ieusanuo una existente. protecteJ voiJ setPropoqotion{booleon $propoqotion) Establece si la tiansaccion esta en mouo ue piopagacion. La piopagacion solo funciona si la tiansaccion fue cieaua con el TronsoctionHonoqer. public bool qetPropoqotion{) Bevuelve el estauo ue piopagacion ue la tiansaccion. La piopagacion solo funciona si la tiansaccion fue cieaua con el TronsoctionHonoqer. PbObNOe T(1#."%7 #$ T8,$7,++(.$#7 Kumbio Fnterprise ofiece un entoino auministiauo paia la implementacion ue tiansacciones ue tal foima que es posible conocei cuanuo ocuiie alguna noveuau con una tiansaccion. Los timeouts son un ejemplo ue esto, cuanuo un pioceuimiento no pueue obtenei un bloqueo paia efectuai la opeiacion una excepcion ue tipo BblockAJquisitionFxception es geneiaua. /0#123.5 I,2%"8,8 "$, #H+#2+(:$ ,3 $. 2.-#8 .9%#$#8 "$ 93.^"#. #$ "$, %8,$7,++(:$ <?php class OrdersController extends ApplicationController { public function increaseQuantityAction(){ try { $transaction = new ActiveRecordTransaction(true); $this->Products->setTransaction($transaction); foreach($this->Products->findForUpdate(“quantity<100”) as $product){ $product->setQuantity($product->getMinStock()*2); if($product->save()==false){ $transaction->rollback(); } } } catch(DbLockAdquisitionException $e){ Flash::error(“No se pudo obtener el bloqueo requerido”); } catch(TransactionFailed $e){ Flash::error($e->getMessage()); } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 227 } 21.16 Validadores de Integridad de Datos ActiveRecorJ peimite que los mouelos ejecuten taieas ue valiuacion uefiniuas poi el uesaiiollauoi que gaianticen que los uatos que se almacenen en la peisistencia sean integios y se evite touo lo que esto conlleva. Los eventos uel mouelo: beforevoliJotion, beforevoliJotion0nCreote, beforevoliJotion0n0pJote y voliJotion peimiten uefinii ieglas ue valiuacion en foima geneial o ue acueiuo a la opeiacion que se vaya a iealizai sobie el mouelo: <?php class Customers extends ActiveRecord { protected $id; protected $name; protected $e_mail; protected $status; protected function setId($id){ $this->id = $id; } protected function setName($name){ $this->name = $name; } protected function setEMail($e_mail){ $this->e_mail = $e_mail; } protected function setStatus($status){ $this->status = $status; } protected function validation(){ $this->validate("Length", array("field" => "name", "minimum" => 10, "maximum" => 50)); $this->validate("Email", "e_mail"); $this->validate("InclusionIn", array("field" => "status", “domain” => array(“A”, “I”), “required” => false); if($this->validationHasFailed()==true){ return false; } } } El métouo piotegiuo ue los mouelos ActiveRecorJ::voliJote{) iecibe en su piimei paiámetio el valiuauoi con el que se efectuaiá la valiuacion y como segunuo paiámetio una lista ue opciones paia el mismo. Algunos valiuauoies pueuen iecibii simplemente el nombie uel campo a valiuai como segunuo paiámetio. El uesaiiollauoi pueue ueteiminai si la valiuacion uebe cancelai la accion que se está ejecutanuo sobie el mouelo meuiante el métouo ActiveRecorJ::voliJotionEosIoileJ{) el cuál inuica si se han geneiauo mensajes ue valiuacion LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 228 en las clases valiuauoias. El uevolvei folse uesue cualquieia ue los eventos ue valiuacion conlleva a la cancelacion ue la accion actual y a que el métouo sove, creote o upJote también uevuelvan folse. El Listauo ue valiuauoies poi uefecto que contiene la veision estánuai ue Kumbio Fnterprise Iromework son los siguientes: T,93,5 Y,3(-,-.8#7 2.8 -#*#+%. ^"# C,+#$ 2,8%# -# B+%(M#<#+.8- Y,3(-,-.8 6#7+8(2+(:$ Piesence0f Es un valiuauoi implicito paia los mouelos cuyas entiuaues tengan atiibutos N0T N0LL y sean iequeiiuos al inseitai o actualizai. BateIn valiua que el valoi ue un atiibuto ue la entiuau tenga un foimato ue fecha valiuo. Length valiua que el numeio ue caiacteies ue un el valoi ue un atiibuto ue la entiuau tipo Stiing tenga un limite infeiioi, supeiioi o ambos. InclusionIn valiua que el valoi ue un atiibuto ue la entiuau se encuentie en un listauo estático uefiniuo en un vectoi. El vectoi se uefine usanuo la opcion 'uomain'. ExclusionIn valiua que el valoi ue un atiibuto ue la entiuau no se encuentie en un listauo estático uefiniuo en un vectoi. El vectoi se uefine usanuo la opcion 'uomain' Numeiicality valiua que el valoi ue un atiibuto ue la entiuau sea numéiico. Foimat valiua que el valoi ue un atiibuto ue la entiuau tenga un foimato estableciuo en una expiesion iegulai, esta se uefine usanuo la opcion 'foimat'. Email valiua que el valoi ue un atiibuto ue la entiuau tenga un foimato ue e-mail coiiecto. 0niqueness Peimite valiuai que el valoi ue un atiibuto no exista en otio iegistio ue la entiuau. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 229 PbObeOb Y,3(-,-.8#7 2,8, ,%8(9"%.7 4.A4"3.7 Cuanuo se uefine un valiuauoi, este valiua cualquiei valoi que se vaya a inseitai o actualizai sobie la peisistencia. Algunas veces el atiibuto pueue peimitii nulos, el valoi nulo igual seiá valiuauo poi el valiuauoi y si no cumple con las conuiciones estableciuas geneiaiá un mensaje y uepenuienuo ue las conuiciones pouiia uetenei la ejecucion ue la opeiacion actual. 0na foima ue establecei una iegla ue excepcion paia estos casos es agiegai la opcion 'requireJ' con valoi false al métouo voliJote: /0#123.5 /7%,93#+#8 8#)3,7 -# M,3(-,+(:$ -# ($%#)8(-,- -# -,%.7 #$ 1.-#3.7 protected function validation(){ $this->validate("Numericality", array(“field" => “precio_venta", “required” => false)); if($this->validationHasFailed()==true){ return false; } } PbObeOP T8,%,8 #3 8#7"3%,-. -# "$ 28.+#7. -# Y,3(-,+(:$ Cuanuo se ejecuta el métouo inteligente sove{) se ejecutan los piocesos ue valiuacion y los valiuatois asociauos al mouelo, noimalmente, el métouo save uevuelve un valoi booleano inuicanuo el éxito ue la opeiacion, cuanuo el valoi uevuelto es folse es posible obtenei los mensajes que se han geneiauo y tiatailos auecuauamente paia sei piesentauos al usuaiio. /0#123.5 [9%#$#8 3.7 1#$7,0#7 -# M,3(-,+(:$ +",$-. *,33, "$, .2#8,+(:$ -# 1,$(2"3,+(:$ -# -,%.7 <?php $customer = new Customer(); $customer->setName("Carl Johnson"); $customer->setEmail("[email protected]"); $customer->setContractDate(“2009-02-01”); if($customer->save()==false){ foreach($customer->getMessages() as $message){ Flash::error($message->getMessage()); } } Aplicanuo la API ue ActiveRecorJHessoqe es posible peisonalizai los mensajes ue valiuacion y la foima en que se tiatan. En el siguiente ejemplo se muestia como piesentai los mensajes ue valiuacion ue coiieo electionico como auveitencias y el iesto como eiioies: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2Su /0#123.5 K#87.$,3(>,8 3, 28#7#$%,+(:$ -# 3.7 1#$7,0#7 -# M,3(-,+(:$ 1#-(,$%# #3 BKZ -# !(&)#$,$(-%".$//*0$ <?php $customer = new Customer(); $customer->setName("Carl Johnson"); $customer->setEmail("[email protected]"); $customer->setContractDate(“2009-02-01”); if($customer->save()==false){ foreach($customer->getMessages() as $message){ if($message->getType()==’Email’){ Flash::warning($message->getMessage()); } else { Flash::error($message->getMessage()); } } } El campo que geneia el mensaje también peimite peisonalizai los mensajes geneiauos: /0#123.5 [9%#$#8 ($*.81,+(:$ -# 3.7 1#$7,0#7 -# M,3(-,+(:$ #$ "$ 28.+#7. -# 1,$(2"3,+(:$ -# -,%.7 <?php $customer = new Customer(); $customer->setName("Carl Johnson"); $customer->setEmail("[email protected]"); $customer->setContractDate($contractDate); if($customer->save()==false){ foreach($customer->getMessages() as $message){ if($message->getField()==’contractDate’){ Flash::warning(“La fecha de contrato no ha sido establecida”); } else { Flash::error($message->getMessage()); } } } PbObeOc Y,3(-,-.8#7 -# ;7",8(. El uesaiiollauoi pueue uefinii valiuauoies ue aplicacion que extienuan o se auecuen mejoi a las ieglas ue negocio ue la aplicacion. Touos los valiuauoies ueben cumplii con unos iequisitos paia su integiacion con ActiveRecorJ y su coiiecta ejecucion: • El valiuauoi uebe estai ubicauo en el uiiectoiio voliJotors en el uiiectoiio ue la aplicacion. Si este uiiectoiio no existe se uebe cieai. • Los aichivos uonue se implementan las clases valiuauoias ueben tenei la siguiente convencion: Nombievaliuatoi.php • Los valiuauoies pueuen heieuai la clase ActiveRecorJvoliJotor la cual implementa una LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S1 estiuctuia consistente paia el uesaiiollo ue un valiuauoi eliminanuo uetalles poco usables. • Las clases valiuauoias ueben llamaise usanuo la convencion: Nombievaliuatoi • Las clases valiuauoias ueben implementai la inteiface ActiveRecorJvoliJotorlnterfoce. La inteiface ActiveRecorJvoliJotorlnterfoce tiene la siguiente estiuctuia: interface ActiveRecordValidatorInterface { public function __construct($record, $field, $value, $options = array()); public function checkOptions(); public function getMessages(); public function validate(); } Tanto el constiuctoi como el métouo qetHessoqes{) se encuentian ya uefiniuos en la clase ActiveRecorJvoliJotor. 0n valiuauoi solo implementa valiuate y opcionalmente sobiesciibe cbeck0ptions. El piimeio iealiza la valiuacion en si y uevuelve un valoi booleano inuicanuo si el pioceso fue satisfactoiio o no. El métouo cbeck0ptions peimite chequeai si los paiámetios enviauos en las opciones uel valiuauoi son coiiectos. En el siguiente ejemplo se implementa un valiuauoi que piopoiciona a la aplicacion un seivicio ue valiuacion ue númeios ue iuentificacion ue acueiuo a las convenciones ue algún pais. Los númeios ue iuentificacion ueben sei ue 2u uigitos, los S piimeios ueben sei las letias ABC si es una empiesa o XYZ si es una peisona natuial. El aichivo voliJotors,lJentificotionvoliJotor.pbp queua asi: /0#123.5 I8#,8 "$ M,3(-,-.8 2,8, ($%#)8(-,- -# -,%.7 #$ 1.-#3.7 <?php class IdentificationValidator extends ActiveRecordValidator implements ActiveRecordValidatorInterface { public function checkOptions(){ if($this->isSetOption('type')==false){ throw new ActiveRecordException("Debe indicar el tipo de numero de identificaci&oacute;n para IdentificationValidator"); } if(!in_array($this->getOption('type'), array('any', 'company', 'people'))){ throw new ActiveRecordException("El tipo de numero de identificaci&oacute;n no es valido, para IdentificationValidator"); } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S2 public function validate(){ $number = $this->getValue(); $type = $this->getOption('type'); $valid = true; if($type=='any'||$type=='company'){ if(substr($number, 0, 3)=='ABZ'){ $valid = false; } } if($type=='any'||$type=='people'){ if(substr($number, 0, 3)!='XYZ'){ $valid = false; } } if(strlen($number)!=20){ $valid = false; } if(!$valid){ $this->appendMessage("El valor del campo '{$this- >getFieldName()}' debe ser una identificaci&oacute;n valida"); return false; } else { return true; } } } Paia aplicai el valiuauoi se invoca el métouo valiuate en la implementacion ue algún evento uel mouelo ue tipo 'valiuation': /0#123.5 Z123#1#$%,8 "$ #M#$%. -# M,3(-,+(:$ -# ,+"#8-. , 3, .2#8,+(:$ #0#+"%,-, protected function beforeValidationOnCreate(){ $this->validate("Identification", array(“field" => “number_iden", “type” => “any”)); if($this->validationHasFailed()==true){ return false; } } PbObeOd /M#$%.7 #$ 3, Y,3(-,+(:$ Los mouelos peimiten la implementacion ue eventos que se lanza cuanuo se efectúa una opeiacion ue inseicion o actualizacion y que tienen como objetivo uefinii logica ue valiuacion e integiiuau ue uatos en la aplicacion. A continuacion se nombian y explican los eventos sopoitauos asi como su oiuen ue ejecucion: T,93,5 T(2.7 -# #M#$%.7 -# M,3(-,+(:$ \ 7" .8-#$ -# #0#+"+(:$ [2#8,+(:$ 4.198# K"#-# +,$+#3,8 /H23(+,+(:$ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2SS .2#8,+(:$5 Inseicion y Actualizacion befoievaliuation SI Se ejecuta antes ue que se valiuen los campos no nulos y se ejecuten los valiuauoies ue integiiuau ue uatos. Inseicion befoievaliuation0nCieate SI Se ejecuta antes ue que se valiuen los campos no nulos y se ejecuten los valiuauoies ue integiiuau ue uatos, solo cuanuo se iealiza una inseicion sobie el mouelo. Actualizacion befoievaliuation0n0puate SI Se ejecuta antes ue que se valiuen los campos no nulos y se ejecuten los valiuauoies ue integiiuau ue uatos, solo cuanuo se iealiza una actulizacion uel mouelo Actualizacion o Inseicion onvaliuationFails SI (ya se ha ueteniuo) Se ejecuta uespués que un valiuauoi ue integiiuau falla. Inseicion afteivaliuation0nCieate SI Se ejecuta uespués ue que se valiuen los campos no nulos y se ejecuten los valiuauoies ue integiiuau ue uatos, LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S4 solo cuanuo se iealiza una inseicion sobie el mouelo. Actualizacion afteivaliuation0n0puate SI Se ejecuta uespués ue que se valiuen los campos no nulos y se ejecuten los valiuauoies ue integiiuau ue uatos, solo cuanuo se iealiza una actulizacion uel mouelo Inseicion y Actualizacion afteivaliuation SI Se ejecuta uespués ue que se valiuen los campos no nulos y se ejecuten los valiuauoies ue integiiuau ue uatos. Inseicion y Actualizacion befoieSave SI Se ejecuta antes ue iealizai la opeiacion iequeiiua sobie el gestoi ielacional. Actualizacion befoie0puate SI Se ejecuta antes ue iealizai la actualizacion en el gestoi ielacional. Inseicion befoieCieate SI Se ejecuta antes ue iealizai la inseicion en el gestoi ielacional. Actualizacion aftei0puate N0 Se ejecuta uespués ue iealizai la actualizacion en el gestoi ielacional. Inseicion afteiCieate N0 Se ejecuta uespués ue LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2SS iealizai la inseicion en el gestoi ielacional. Inseicion y Actualizacion afteiSave N0 Se ejecuta uespués ue iealizai la opeiacion iequeiiua sobie el gestoi ielacional. Eliminacion befoieBelete SI Se ejecuta antes ue eliminai el iegistio uel gestoi ielacional. Eliminacion afteiBelete N0 Se ejecuta uespués ue eliminai el iegistio uel gestoi ielacional. PbObeON Z123#1#$%,8 "$ #M#$%. -# M,3(-,+(:$ Cuanuo se ejecuta una opeiacion ue inseicion, actualizacion o eliminacion sobie el mouelo ActiveRecorJ veiifica si se han uefiniuo métouos con los nombies ue los eventos y en caso ue encontiailos los ejecuta en el oiuen mencionauo en la tabla anteiioi. Los eventos ue valiuacion ueben sei métouos piotegiuos iecomenuablemente paia evitai que la logica ue uatos que contienen se exponga públicamente. En el siguiente ejemplo se implementa un evento que valiua que la cantiuau a actualizai o inseitai sobie el mouelo sea mayoi a u según los iequeiimientos uel negocio: /0#123.5 Z123#1#$%,8 "$ #M#$%. -# M,3(-,+(:$ 2,8, 1.-#3.7 <?php class Products extends ActiveRecord { protected function beforeSave(){ if($this->quantity<0){ Flash::error("La cantidad no puede ser negativa"); return false; } } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S6 PbObeOe 6#%#$#8JI,$+#3,8 "$, .2#8,+(:$ Si uauas las conuiciones al ejecutai un evento ue valiuacion se iequieie uetenei o cancelai la opeiacion que se esta ejecutanuo se pueue iealizai si el evento lo peimite y asi evitai que se almacenen uatos incoiiectos favoiecienuo la integiiuau uel uominio ue uatos. En la tabla ue eventos ue valiuacion es posible veiificai si el evento peimite la cancelacion ue la opeiacion. 0n métouo que iequieia uetenei la opeiacion uebe uevolvei el valoi boleano folse, en este caso los métouos sove, creote y upJote también uevolveian folse inuicanuo que no se puuo efectuai la opeiacion. PbObeOa /7%,93#+#8 "$ #M#$%. +.$ "$ $.198# $. #7%U$-,8 Los eventos ue valiuacion también pueuen sei uefiniuos usanuo atiibutos piotegiuos en la clase uel mouelo. Be esta foima se pueuen uefinii uno o más eventos en foima uinámica flexibilizanuo la implementacion ue estos: /0#123.5 I,19(,8 #3 $.198# #7%U$-,8 -# "$ #M#$%. #$ "$ 1.-#3. <?php class Products extends ActiveRecord { protected $beforeSave = “myCustomEvent” protected function myCustomEvent(){ if($this->quantity<0){ Flash::error("La cantidad no puede ser negativa"); return false; } } } Si se iequieie ejecutai vaiios métouos paia un mismo evento se pueue inuicai un vectoi con la lista ue métouos en el oiuen ue ejecucion iequeiiuo. Si alguno falla los uemás no seián ejecutauos. /0#123.5 6#*($(8 1G3%(23#7 +,339,+S7 2,8, "$ 1(71. #M#$%. -# "$ 1.-#3. <?php class Products extends ActiveRecord { protected $beforeSave = array(“myFirstEvent”, “mySecondEvent”); protected function myFirstEvent(){ if($this->quantity<0){ Flash::error("La cantidad no puede ser negativa"); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S7 return false; } } protected function mySecondEvent(){ if($this->quantity>100){ Flash::error("La cantidad no puede ser mayor a 100"); return false; } } } Los eventos pueuen sei estableciuos uinámicamente uesue otios eventos o en el inicializauoi uel mouelo. Be esta foima se pueuen cieai potentes mouelos ue valiuacion ue la logica ue uatos en una aplicacion: /0#123.5 6#*($(8 #M#$%.7 -#3 1.-#3. -($U1(+,1#$%# 1#-(,$%# ,%8(9"%.7 <?php class Products extends ActiveRecord { protected $beforeSave; protected function beforeValidation(){ if($this->category==”Food”){ $this->beforeSave = “checkFoodQuantity”; } else { $this->beforeSave = “checkOtherQuantity”; } } protected function checkFoodQuantity(){ if($this->quantity>100){ Flash::error("La cantidad de alimentos no puede ser mayor a 100"); return false; } } protected function checkOtherQuantity(){ if($this->quantity>50){ Flash::error("La cantidad no puede ser mayor a 50"); return false; } } } PbObeO` /M#$%. +",$-. #3 28.+#7. -# M,3(-,+(:$ -#%(#$# 3, .2#8,+(:$ Las opeiaciones ejecutauas en el métouo sove pueuen fallai si al menos un valiuauoi falla en este caso uevelve el valoi booleano false inuicanuo este estauo. Es posible uefinii un evento llamauo 'onvoliJotionIoils' que es ejecutauo cuanuo el pioceso ue valiuacion uevuelve un iesultauo no satisfactoiio. En este evento se pueue uefinii elementos ue logging o infoimativos ue usuaiio paia inuicai el poiqué no se ha pouiuo iealizai la opeiacion iequeiiua. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S8 /0#123.5 6#*($(8 "$ #M#$%. , 3, #72#8, -# "$ *,33. #$ #3 28.+#7. -# M,3(-,+(:$ -# "$ 1.-#3. <?php class Products extends ActiveRecord { protected function onValidationFails(){ if($this->operationWasCreate()==true){ Flash::error(“La inserción falló”); } if($this->operationWasUpdate()==true){ Flash::error(“La actualización falló”); } foreach($this->getMessages() as $message()){ Flash::error($message->getMessage()); } } } PbObeOi 6#7C,9(3(%,8 #M#$%.7 -# M,3(-,+(:$ Los eventos ue valiuacion pueuen sei ueshabilitauos paia aumentai el ienuimiento en aplicaciones que no iequieien ue ellos o cuanuo se ejecutan piocesos ue manipulacion ue uatos que no iequieian ue esta caiacteiistica. El métouo ActiveRecorJ::JisobleFvents{bool $Jisoble) peimite cambiai este compoitamiento. 0n valoi booleano tiue los ueshabilita y un valoi false los habilita nuevamente. Esta funcionaliuau actúa en foima geneial paia cualquiei mouelo ue la aplicacion. 21.17 Llaves Foráneas Virtuales ActiveRecorJ peimite uefinii llaves piimaiias viituales que valiuen la integiiuau ielacional en las opeiaciones ue manipulacion ue uatos aseguianuo que los campos llave contengan valoies que existan en las entiuaues iefeienciauas. ventajas sobie el contiol convencional a nivel ue base uatos: • Es posible valiuai integiiuau ielacional sobie columnas con tipos ue uatos uifeientes • Se uisminuye la caiga uel motoi ue base ue uatos • Es posible contiolai la integiiuau sobie tablas en uifeientes motoies o uifeientes seiviuoies • Se pueue geneiai mensajes ue usuaiio peisonalizauos ue acueiuo al intento falliuo ue LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S9 efectuai una opeiacion poi violacion ue llave foiánea. • Se pueue valiuai la integiiuau en motoies que no sopoiten llaves foianeas (NyISAN en NySQL). • Se pueuen uefinii llaves foiáneas que valiuen la integiiuau en objetos ue la base ue uatos como vistas y sinonimos. • No se iequieien inuices en las tablas iefeienciauas (aunque es iecomenuauo que los tengan). Besventajas ue las llaves foiáneas viituales: • El ienuimiento no es tan optimo como el ue las auministiauas uiiectamente poi el motoi ue base ue uatos. • La integiiuau solo es valiuaua cuanuo las opeiaciones se iealizan meuiante eventos iealizauos a tiavés ue los mouelos. PbObaOb I8#,8 "$, 33,M# *.8U$#, M(8%",3 El métouo piotegiuo ue ActiveRecorJ llamauo oJJIoreiqnKey peimite la uefinicion ue llaves foiáneas viituales en el inicializauoi ue la clase mouelo. Neuiante convenciones se coloca solamente el nombie uel campo y ue esta foima la tabla y campo iefeienciauo se intuye noimalmente: /0#123.5 6#*($(8 "$, 33,M# *.8U$#, M(8%",3 2.8 +.$M#$+(:$ <?php class Products extends ActiveRecord { protected function initialize(){ $this->addForeignKey(“categories_id”); } } Sino se utiliza un mouelo entiuau-ielacion que use convenciones la foima ue inuicai las llaves foiáneas se iealiza ue esta maneia: /0#123.5 /7%,93#+#8 33,M#7 *.8U$#,7 -# ,+"#8-. ,3 1.-#3. #$%(-,- 8#3,+(:$ <?php LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 24u class Employees extends ActiveRecord { protected function initialize(){ //Un campo a un campo $this->addForeignKey(“code_cat”, “categories”, “code”); //Varios campos a varios campos $this->addForeignKey( array(“country_born“, “city_born”), “cities”, array(“country_code”, “city_code”) ); } } PbObaOP [2+(.$#7 -# 3,7 33,M#7 *.8U$#,7 El cuaito paiámetio ue oJJIoreiqnKey peimite establecei opciones auicionales como el mensaje a geneiai cuanuo se viole la integiiuau y las acciones a iealizai cuanuo se actualiza o boiia un iegistio y falla el pioceso ue valiuacion. /0#123.5 /7%,93#+#8 ,++(.$#7 -# "$, 33,M# *.8U$#, M(8%",3 #$ "$ 1.-#3. <?php class Employees extends ActiveRecord { protected function initialize(){ $this->addForeignKey(“office_id”, “office”, “id”, array( “message” => “La oficina %s no existe”, “on_delete” => ActiveRecord::ACTION_CASCADE, “on_update” => ActiveRecord::ACTION_RESTRICT )); } } T,93,5 [2+(.$#7 -# ,--!.8#()$h#\ [2+(:$ 6#7+8(2+(:$ message Nensaje uel valiuauoi cuanuo se viola la llave foiánea y la accion efectuaua uebe iestiingii la opeiacion. on_uelete Establece una accion a ejecutai cuanuo una llave foiánea es violaua al hacei una eliminacion ue uatos en la entiuau. El valoi es alguna ue las constantes ActiveRecoiu::ACTI0N_CASCABE o ActiveRecoiu::ACTI0N_RESTRICT. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 241 on_upuate Establece una accion a ejecutai cuanuo una llave foiánea es violaua al hacei una actualizacion ue uatos en la entiuau. El valoi es alguna ue las constantes ActiveRecoiu::ACTI0N_CASCABE o ActiveRecoiu::ACTI0N_RESTRICT. T,93,5 B++(.$#7 -#2#$-(#$-. -# 3, .2#8,+(:$ [2+(:$ 6#7+8(2+(:$ ActiveRecoiu::ACTI0N_CASCABE Cuanuo se iealiza una eliminacion ue uatos inuica que touas los uatos en llaves uepenuientes ueben sei eliminauos antes ue efectuai la opeiacion. Esto peimite que no queuen iegistios huéifanos. En una actualizacion se actualiza el nuevo valoi en las ielaciones uepenuientes. ActiveRecoiu::ACTI0N_RESTRICT Inuica que se uebe cancelai la opeiacion actual uebiuo a la violacion ue la llave foiánea. El objeto ActiveRecorJHessoqe es caigauo con el mensaje estableciuo en la opcion 'message'. 21.18 Entidades Temporales Auministiai uatos en una entiuau piopoiciona iecuisos impoitantes paia las aplicaciones ue negocios. En cieitas ocasiones se iequieie utilizai entiuaues paia almacenai uatos tempoiales que peimitan la ejecucion ue piocesos ue negocio sin que estas afecten el uominio ue uatos en foima notable. El componente ActiveRecorJ piopoiciona el subcomponente TempororyActiveRecorJ el cual peimite cieai mouelos que auministian sus uatos sobie entiuaues tempoiales en el gestoi ielacional. Este tipo ue entiuaues pueuen sei consiueiauas ue alto ienuimiento ya que no iequieien ue esciituia ue uisco auemás este tipo ue mouelos están optimizauos paia un piocesamiento más efectivo en memoiia. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 242 En estos casos la peisistencia es tempoial ya que touos los uatos que auministia el mouelo existen en memoiia mientias la conexion al gestoi ielacional esta activa. Como estas conexiones se iealizan en mouo no-peisistente los uatos en las entiuaues cieauas solo existen uuiante el tiempo que emplee la peticion en ejecutaise poi completo cieánuose y uestiuyénuose caua vez que se utilicen. PbOb`Ob I8#,8 "$ T#12.8,8\B+%(M#<#+.8- Lo siguiente se uebe hacei paia cieai un mouelo tempoial: • Se ciea un mouelo que extienua al subcomponente TempororyActiveRecorJ en el uiiectoiio ue mouelos. • Se uebe implementai un métouo piotegiuo que se uebe llamai _tobleBefinition es iequeiiuo paia obtenei la uefinicion ue la entiuau, esta constituye un aiiay asociativo con las llaves ottributes e inJexes. • La llave ottributes es obligatoiia y contiene un vectoi asociativo cuyas llaves coiiesponuen a los nombies ue los campos y cuyo valoi es una uesciipcion uel campo tal y como es aceptaua poi el métouo ue los auaptauoies uel componente Bb llamauo creoteToble. • Cuanuo se uefinan los atiibutos uel mouelo como piotegiuos se ueben uefinii con los mismos nombies utilizauos en la uefinicion uel métouo _tobleBefinition. • Si no se uefinen los atiibutos piotegiuos ActiveRecorJ los uefiniiá como públicos aunque esto no es iecomenuable. • Las entiuaues tempoiales también sopoitan ielaciones uniuiieccionales y biuiieccionales uefiniénuose como es usual en los mouelos peisistentes. PbOb`OP I.12.8%,1(#$%. -# "$ T#12.8,8\B+%(M#<#+.8- El siguiente compoitamiento uebe teneise en cuenta cuanuo se tiabaja con entiuaues tempoiales: • Al instanciaise poi piimeia vez la clase uel mouelo tempoial cuanuo el Facility es 0SER_LEvEL se ciea una tabla tempoial en la conexion poi uefecto al gestoi ielacional. • La tabla tempoial cieaua tiene el nombie ue la clase utilizaua las limitaciones uel gestoi ielacional en cuanto a los nombies ue tablas y que otias entiuaues no existan con este nombie ueben sei teniuas en cuenta. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 24S • Las sentencias ue cieacion ue la tabla tempoial no coiiesponuen a manipulacion ue uatos poi lo tanto las tiansacciones globales y locales no tienen en cuenta esta opeiacion. • Como la tabla es cieaua en caua peticion en uonue se haga uso uel mouelo los meta- uatos ue la tabla no son almacenauos asi que no es posible obtenei infoimacion ue esta usanuo ActiveRecorJHetoBoto. • La tabla es uestiuiua en cuanto se cieiia la conexion con el gestoi ielacional, si es iequeiiuo uestiuiila uesue la aplicacion se pueue usai el métouo uel auministiauoi ue entiuaues FntityHonoqer::JestroyTempororyFntity{strinq $nome) uonue $nome es el nombie uel mouelo, este métouo uestiuye la tabla tempoial en caua conexion al gestoi ielacional uonue fue cieaua. Si una nueva instancia uel la clase mouelo es invocaua o utilizaua la tabla tempoial se cieaiá nuevamente. PbOb`Oc T8,$7,++(.$#7 +.$ /$%(-,-#7 T#12.8,3#7 Las opeiaciones ue manipulacion ue uatos sobie las entiuaues tempoiales sopoitan tiansacciones en foima tianspaiente, aunque se uebe tenei en cuenta que no touos los gestoies ielacionales sopoitan tiansacciones en tablas tempoiales. Al cieai una tiansaccion ya sea uiiectamente con ActiveRecorJTronsoction o usanuo TronsoctionHonoqer se ciea una nueva conexion tempoial al gestoi ielacional y es posible que la tabla tempoial esté cieaua sobie la conexion no-tiansaccional poi uefecto. Cuanuo esto se uetecta, ActiveRecorJ ciea nuevamente la tabla en la conexion tiansaccional peio es seguio que los uatos que ya se hayan almacenauo usanuo los mouelos asociauos a la conexion no tiansaccional no esten uisponibles en la nueva. PbOb`Od ;7,8 "$ T#12.8,8\B+%(M#<#+.8- En el siguiente ejemplo se ilustia como implementai una entiuau tempoial y como utilizailo en un pioceso ue negocio. El mouelo tempoial moJels,proJuct_stoJistics.pbp queua asi: /0#123.5 I8#,8 "$, #$%(-,- %#12.8,3 <?php class ProductStadistics extends TemporaryActiveRecord { LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 244 protected $id; protected $product_id; protected $cantidad; public function getId(){ return $this->id; } public function getProductId(){ return $this->product_id; } public function getCantidad(){ return $this->cantidad; } public function setId($id){ $this->id = $id; } public function setProductId($product_id){ $this->product_id = $product_id; } public function setCantidad($cantidad){ $this->cantidad = $cantidad; } protected function _tableDefinition(){ return array( "attributes" => array( "id" => array( "type" => db::TYPE_INTEGER, "notNull" => true, "primary" => true, "auto" => true ), "product_id" => array( "type" => db::TYPE_INTEGER, "notNull" => true ), "cantidad" => array( "type" => db::TYPE_VARCHAR, "notNull" => true, "size" => 10 ) ), "indexes" => array("product_id") ); } protected function initialize(){ $this->belongsTo("product"); } } El mouelo anteiioi peimite ingiesai una seiie ue uatos y apiovechai las capaciuaues ue oiuenamiento y agiupamiento paia obtenei las estauisticas ue la venta ue unos piouuctos. Es necesaiio que las entiuaues ielacionauas al pioceso ue negocio esten asociauas a la tiansaccion uonue se manipulan los uatos ue la entiuau tempoial cuanuo se instancian uiiectamente ue la clase mouelo o se inyectan en el contiolauoi usanuo $tbis. /0#123.5 ;%(3(>,8 #$%(-,-#7 %#12.8,3#7 +.$ %8,$7,++(.$#7 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 24S try { $transaction = TransactionManager::getUserTransaction(); $this->Movement->setTransaction($transaction); $this->Cart->setTransaction($transaction); $conditions = "sellDate = '".Date::getCurrentDate()."'"; foreach($this->Movement->find($conditions) as $movement){ $productStadistic = new ProductStatistics(); $productStadistic->setTransaction($transaction); $productStadistic->setProductId($movement->getProductId()); $productStadistic->setCantidad($movement->getQuantity()); if($productStadistic->save()==false){ foreach($productStadistic->getMessages() as $message){ Flash::error($message->getMessage()); } $transaction->rollback(); } } $transaction->commit(); $productStadistic = $this->ProductStadistics->findFirst(); print "La cantidad total de productos es: "; print $productStadistic->sum("cantidad")."<br>"; print "La cantidad minima es: "; print $productStadistic->minimum("cantidad")."<br>"; print "La cantidad máxima es: "; print $productStadistic->maximum("cantidad")."<br>"; print "El promedio de cantidad es: "; print $productStadistic->average("cantidad")."<br>"; } catch(TransactionFailed $e){ Flash::error($e->getMessage()); } 21.19 ActiveRecordJoin El subcomponente ActiveRecorJ}oin peimite apiovechai las ielaciones estableciuas en el mouelo ue uatos paia geneiai consultas simples o con agiupamientos en más ue 2 entiuaues ielacionauas o no ielacionauas, pioponienuo una foima auicional ue utilizai el 0bject- Relotionol-Hoppinq (0RN). El constiuctoi ue la clase acepta un vectoi con las opciones ue la consulta. Be acueiuo al tipo (consulta simple, agiupacion ue conteo, sumatoiia, máximo, minimo) que se iequieia utilizai estos vaiian. En el ejemplo existen 4 entiuaues ProJucts ProJuctCoteqories, Customers, lnvoices e lnvoiceslines: CREATE TABLE `products_categories` ( `id` int(18) NOT NULL, `name` varchar(70) default NULL, PRIMARY KEY (`id`) ); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 246 CREATE TABLE `products` ( `id` int(18) NOT NULL, `name` varchar(100) default NULL, `products_categories_id` int(11) NOT NULL, `quantity` int(11) NOT NULL, `price` decimal(16,2) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `customers` ( `id` int(18) NOT NULL, `name` varchar(20) default NULL, PRIMARY KEY (`id`) ); CREATE TABLE `invoices` ( `id` int(18) NOT NULL, `customers_id` int(18) NOT NULL, `sell_date` date NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `invoices_lines` ( `id` int(18) NOT NULL, `invoices_id` int(18) NOT NULL, `products_id` int(18) NOT NULL, `quantity` int(11) NOT NULL, `price` decimal(16,2) NOT NULL, `taxes` decimal(16,2) NOT NULL, PRIMARY KEY (`id`) ); Los mouelos ue estas entiuaues son los siguientes, (a pioposito se omiten los getteis¡setteis): /0#123.5 6#*($(+(:$ -# 1.-#3.7 \ 7"7 8#3,+(.$#7 2,8, "7. +.$ B+%(M#<#+.8-].($ <?php // Modelo de Categorias de Productos class ProductsCategories extends ActiveRecord { public function initialize(){ // Relación 1-n con productos $this->hasMany("products"); } } // Modelo de Productos class Products extends ActiveRecord { public function initialize(){ // Relacion 1-1 inversa con categorias de productos $this->belongsTo("products_categories"); // Relacion 1-n con lineas de facturas $this->hasMany("invoices_lines"); } } // Modelo de Clientes class Customers extends ActiveRecord { public function initialize(){ // Relacion 1-n con facturas $this->hasMany("invoices"); } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 247 // Modelo de Facturas class Invoices extends ActiveRecord { public function initialize(){ // Relacion 1-1 inversa con clientes $this->belongsTo("customers"); } } // Modelo de Detalle de Facturas class InvoicesLines extends ActiveRecord { public function initialize(){ // Relacion 1-1 inversa con clientes $this->belongsTo("invoices"); // Relacion 1-1 inversa con productos $this->belongsTo("products"); } } 0na vez se uefinan las ielaciones entie las entiuaues uel uominio ue uatos es posible utilizailas tanto paia obtenei iegistios simples o colecciones meuiante ActiveRecor}oin: /0#123.5 L,+#8 "$ ].($ -# %8#7 #$%(-,-#7 //Listar los productos vendidos, su cantidad y la fecha en que se vendieron $query = new ActiveRecordJoin(array( "entities" => array("Invoices", "Products", "InvoicesLines"), "fields" => array( "{#Products}.name", "{#Invoices}.sell_date", "{#InvoicesLines}.quantity" ) )); Los iesultauos ue la consulta pueuen sei obteniuos meuiante el métouo qetResultSet{) uel objeto ActiveRecorJ}oin. El valoi ue caua columna ue la consulta pueue sei obteniuo usanuo un qetter viitual cieauo implicitamente en caua objeto iesultauo o meuiante el nombie ue la columna como una piopieuau pública. /0#123.5 [9%#$#8 3.7 8#)(7%8.7 )#$#8,-.7 #$ "$ ].($ +.$ B+%(M#<#+.8-].($ //Mediante getters foreach($query->getResultSet() as $result){ print $result->getName()." ". $result->getSellDate()." ". $result->getQuantity()."\n"; } //Mediante atributos públicos foreach($query->getResultSet() as $result){ print $result->name." ".$result->sell_date." ".$result->quantity."\n"; } La consulta inteina SQL SELECT pueue sei examinaua meuiante el métouo qetSµlµuery{) ActiveRecorJ}oin. La consulta anteiioi geneia la siguiente sentencia: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 248 /0#123.5 'fE )#$#8,-. 2.8 B+%(M#<#+.8-].($ SELECT products.name, invoices.sell_date, invoices_lines.quantity FROM invoices, products, invoices_lines WHERE products.id = invoices_lines.products_id AND invoices.id = invoices_lines.invoices_id ORDER BY 1 Notése como las ielaciones auecuauas hacen paite ue la sentencia SELECT en foima uinámica. PbObiOb B)8"2,1(#$%.7 +.$ B+%(M#<#+.8-].($ ActiveRecorJ}oin peimite cieai consultas avanzauas utilizanuo agiupamientos. Los agiupamientos sopoitauos son: sumatoiias, conteos, minimos, máximos y piomeuios. 0n agiupamiento se establece ue la siguiente foima: /0#123.5 B)8"2,1(#$%.7 -# -,%.7 +.$ B+%(M#<#+.8-].($ //Cuantos productos se han vendido por cada producto $query = new ActiveRecordJoin(array( "entities" => array("Invoices", "Products", "InvoicesLines"), "groupFields" => array("{#Products}.name"), "sumatory" => array("{#InvoicesLines}.quantity") )); // Cuantos productos se han vendido por cada producto, cuya cantidad vendida sea // mayor a 150 $query = new ActiveRecordJoin(array( "entities" => array("Invoices", "Products", "InvoicesLines"), "groupFields" => array("{#Products}.name"), "sumatory" => array("{#InvoicesLines}.quantity"), "having" => "quantity>10" )); //En promedio cuál ha sido el precio del producto durante el mes de octubre $query = new ActiveRecordJoin(array( "entities" => array("Invoices", "Products", "InvoicesLines"), "groupFields" => array("{#Products}.name"), "sumatory" => array("{#InvoicesLines}.price"), "conditions" => "MONTH({#Invoices}.sell_date) = 10" )); PbObiOP K,8U1#%8.7 -# B+%(M#<#+.8-].($ Los paiámetios sopoitauos poi ActiveRecoiu}oin son: T,93,5 K,8U1#%8.7 7.2.8%,-.7 2.8 B+%(M#<#+.8-].($ [2+(:$ 6#7+8(2+(:$ entities 0n vectoi que inuica los mouelos utilizauos paia iealizai el join. No se uebe utilizai el mismo nombie las tablas sino el nombie ue las clases usauas como mouelos paia acceuei a LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 249 ellas. conuitions 0n stiing con conuiciones auicionales uel join. No se uebe utilizai los nombies ue las tablas en las conuiciones sino la convencion †ŠNombieClase‡. (opcional) sumatoiy 0n vectoi con los campos en los cuales se uebe aplicai un agiupamiento ue sumatoiia. (opcional) aveiage 0n vectoi con los campos en los cuales se uebe aplicai un agiupamiento ue piomeuio. (opcional) count 0n vectoi con los campos en los cuales se uebe aplicai un agiupamiento ue conteo. (opcional) maximum 0n vectoi con los campos en los cuales se uebe aplicai un agiupamiento ue valoi máximo. (opcional) minimum 0n vectoi con los campos en los cuales se uebe aplicai un agiupamiento ue valoi minimo. (opcional) having 0n stiing con conuiciones paia el agiupamiento. (opcional). noRelations Con el valoi tiue inuica que no se ueben constiuii uinámicamente las ielaciones entie las entiuaues uel join. Poi uefecto su valoi es false. (opcional). 21.20 ActiveRecordUnion El objetivo uel subcomponente ActiveRecorJ0nion es unii uos o más objetos ActiveRecorJResultset o ActiveRecorJRow sin volcai a memoiia los iesultauos piouuciuos poi ellos consiguienuo una gestion ue los iecuisos ue la aplicacion más eficiente. 21.21 SessionRecord El subcomponente SessionRecorJ peimite auministiai entiuaues ue peisistencia ue sesion ue foima natuial como si fuesen entiuaues peio uestinauas a mantenei iegistios ue maneia inuepenuiente poi iu ue sesion. El estauo ue los objetos instanciauos es trosient ya que al teiminaise la sesion los uatos se vuelven inusables. Poi uefecto las entiuaues tipo SessionRecorJ localizan el campo siJ que ueben tenei un tamaño suficiente paia almacenai un valoi ue iuentificauoi ue sesion. El valoi ue la vaiiable ue configuiacion ue PBP session.bosb_function establece el tipo ue algoiitmo utilizauo paia LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2Su geneiai el iuentificauoi ue sesion, si su valoi es u inuica que se usa muS ue 128 bits (SS caiacteies) y cuanuo es 1 inuica que es sha1 ue 16u bits (4u caiacteies). La siguiente tabla contiene la estiuctuia necesaiia paia utilizai una entiuau con SessionRecorJ. CREATE TABLE `cart` ( `id` int(11) NOT NULL auto_increment, `sid` char(35) default NULL, `product_id` int(11) NOT NULL, `quantity` int(11) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8; La uefinicion ue la clase ue un mouelo ue este tipo es la noimal peio en vez ue heieuai ue ActiveRecorJ uebe heieuai ue la clase SessionRecorJ. Las opeiaciones sobie el mouelo se ejecutan noimalmente con la uifeiencia que los iegistios giabauos y uevueltos siempie haián iefeiencia a aquellos uonue el session_iu actual sea el uel campo siu ue la tabla. 21.22 PropertyAccessors y Mutators ActiveRecorJ acceue al valoi ue los atiibutos ue la tabla al iealizai una opeiacion meuiante los métouos reoJAttribute y writeAttribute heieuauos en cualquiei mouelo. El uesaiiollauoi pueue sobieesciibii estos atiibutos en la uefinicion uel mouelo y contiolai la foima en que obtienen¡establecen inteinamente los valoies ue los atiibutos ue la entiuau. /0#123.5 '.98##7+8(9(8 "$ K8.2#8%\B++#77.8 #$ "$ 1.-#3. <?php class Products extends ActiveRecord { protected function readAttribute($attributeName){ if($attributeName==”very_private_field”){ return null; } else { return $this->$attributeName; } } } 21.23 DynamicUpdate y DynamicInsert 0n mouelo tiene la piopieuau ue ahoiiai tiabajo al gestoi ielacional meuiante estas opciones. En el piimeio al iealizai una opeiacion ue actualizacion solo los campos que han cambiauo en la base ue uatos son actualizauos, en la segunua solo los campos que contienen valoies no nulos se inseitan en la opeiacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S1 Poi uefecto ambas piopieuaues estan uesactivauas paia cambiai su valoi se ueben usai los métouos piotegiuos setBynomic0pJote y setBynomiclnsert iespectivamente. Al activailas en contia piestacion poi ejemplo al actualizai caua iegistio uebe leeise antes ue iealizai la opeiacion y compaiaiai caua valoi ue los atiibutos con el uel objeto actual. /0#123.5 /7%,93#+#8 3, +8#,+(:$ -# 7#$%#$+(,7 -# ($7#8+(:$ \ ,+%",3(>,+(:$ 7.3. 2,8, 3.7 ,%8(9"%.7 -#3 1.-#3. ^"# C,$ +,19(,$-. <?php class Categories extends ActiveRecord { protected function initialize(){ $this->setDynamicUpdate(true); $this->setDynamicInsert(true); } } 21.24 Manejo de Excepciones Las siguientes excepciones son geneiauas y asociauas a opeiaciones con ActiveRecorJ: T,93,5 /H+#2+(.$#7 )#$#8,-,7 +",$-. 7# %8,9,0, +.$ B+%(M#<#+.8- /H+#2+(:$ I.12.$#$%# 6#7+8(2+(:$ BbException Bb Excepcion geneiica lanzaua poi auaptauoi ue conexion al gestoi ielacional utilizauo. BbLockAuquisitionException Bb Excepcion lanzaua cuanuo la tiansaccion actual en la conexion no pueue efectuai un bloqueo sobie algún iecuiso poi ejemplo una tabla o una seiie ue iegistios. BbSQLuiammaiException Bb Excepcion lanzaua cuanuo se envia una sentencia SQL mal foimaua o con eiioies ue sintaxis. BbInvaliuFoimatException Bb Excepcion lanzaua cuanuo se tiata ue asignai un valoi con un LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S2 foimato invaliuo al tipo ue uato ue la columna en una una entiuau. BbContiaintviolationException Bb Excepcion lanzaua cuanuo la opeiacion ue mouificacion o actualizacion viola un constiaint ue llave foiánea. ActiveRecoiuException ActiveRecoiu Excepcion geneiica ue ActiveRecoiu. PbOPdOb I,2%"8,8 #H+#2+(.$#7 -#$%8. -# 1.-#3.7 Si se iequieie tiatai las excepciones geneiauas uentio ue un mouelo en especifico se pueue sobieesciibii el métouo piotegiuo exceptions el cuál iecibe las excepciones geneiauas y poi uefecto las ie-lanza al contiolauoi o la vista uonue se invoco el mouelo. En el siguiente ejemplo se ilustia como efectuai un pioceuimiento que tiate las excepciones poi violacion ue llaves foiáneas paia un mouelo en paiticulai: /0#123.5 T8,%,8 #H+#2+(.$#7 2.8 M(.3,+(:$ -# 33,M# *.8U$#, <?php class Inventory extends ActiveRecord { protected function exceptions($e){ if($e instanceof DbConstraintViolationException){ //Algún procedimiento } else { throw $e; } } } PbOPdOP Z$*.81,+(:$ -# /H+#2+(.$#7 Las excepciones geneiauas poi el auaptauoi al motoi ue base ue uatos usualmente peimiten obtenei mayoi infoimacion sobie el entoino ue la excepcion agieganuo uatos como el couigo y uesciipcion ue bajo nivel geneiauas poi el RTP. En el capitulo uel componente Bb se explica como obtenei mayoi infoimacion sobie excepciones geneiauas en la base ue uatos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2SS 21.25 Plugins de Modelos Los Pluqins ue mouelos o capa ue uatos peimiten extenuei la funcionaliuau uel componente ActiveRecorJ y sus subcomponentes. La aiquitectuia ue plugins ue ActiveRecorJ peimite obseivai, extenuei y manipulai el compoitamiento ue los mouelos ue la aplicacion según las conuiciones lo exijan. Los plugins peimiten inteiceptai eventos ue los mouelos ue tal foima que estos sean obseivables y auemás ejecutáise uno tias otio ue maneia centializaua sin iequeiii iefactoiizacion o ieintegiacion en la aplicacion. PbOPNOb I8#,8 "$ K3")($ -# B+%(M#<#+.8- Los plugins ue ActiveRecoiu son clases que implementan eventos que son invocauos a meuiua que avanza la ejecucion uel pioceso ue acceso a la capa ue uatos en cualquiei peticion. Estas clases ueben cumplii con los siguientes iequeiimientos: ! Beben estai ubicauos en el uiiectoiio ue plugins usualmente opps,opp-nome,pluqins ! El nombie uel aichivo que implementa la clase uebe sei el nombie uel plugin ! El nombie ue la clase uebe tenei la extension Pluqin ! Los plugins ue contiolauoi ueben heieuai ue la clase HoJelPluqin o sei subclase ue ella Las clases pueuen implementai métouos públicos que iefeiencian los eventos ocuiiiuos en los contiolauoies, la lista ue ellos es la siguiente: T,93,5 /M#$%.7 ^"# 7# 2"#-#$ (123#1#$%,8 #$ 23")($7 -# B+%(M#<#+.8- 4.198# /M#$%. 6#7+8(2+(:$ afteiInitialize 0cuiie uespués ue inicializai un mouelo. Noimalmente los mouelos son inicializauos solo una vez en caua peticion. onException 0cuiie cuanuo se geneia una excepcion uentio ue un mouelo. 21.26 Organización de Modelos Los aichivos ue mouelos ueben estai ubicauos en el uiiectoiio moJels, o uonue la vaiiable ue configuiacion moJelsBir lo inuique. Cuanuo los mouelos se caigan en mouo auto-inicializauoi LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S4 es posible oiganizailos en subuiiectoiios ue tal foima que iepiesenten un giupo o categoiia logica al cual peitenezcan. 0n ejemplo ue una oiganizacion logica es el siguiente: /0#123.5 [8),$(>,+(:$ 3:)(+, -# 1.-#3.7 models/ base/ modelBase.php security/ roles.php users.php access_list.php inventory/ references.php kardex.php orders.php movement.php 21.27 Auto-inicialización de Modelos Los mouelos pueuen inicializaise ue 2 foimas, automáticamente o uinámicamente. Poi uefecto los mouelos son auto-inicializauos esto significa que en caua peticion touas las clases uel uiiectoiio ue mouelos son leiuas y se constiuyen las ielaciones y iestiicciones uefiniuas en ellos. El usai una foima o la otia uepenue uel tipo ue aplicacion que se tenga. Es iecomenuable usai auto-inicializacion cuanuo: • El seiviuoi uonue está instalaua la maquina tiene buenas piestaciones (uiscos uuios iápiuos, piocesauoies ue última geneiacion, etc). • Con ielacion a las piestaciones uel seiviuoi el númeio ue mouelos y su complejiuau en cuanto a ielaciones y iestiicciones es moueiauo o bajo. • La aplicacion iequieie fiecuentemente uel acceso a la mayoi paite ue los mouelos en la mayoi paite ue los piocesos ue negocio. Besventajas ue la auto-inicializacion: • Bepenuienuo ue las conuiciones, el acceso a uisco pueue elevaise consiueiablemente en caua peticion • Si los mouelos tienen muchas ielaciones y iestiicciones se pouiia aumentai el LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2SS consumo ue memoiia innecesaiiamente Se iecomienua utilizai inicializacion uinámica cuanuo: • El seiviuoi tiene bajas piestaciones o una concuiiencia elevaua • La aplicacion iequieie ue mouelos en foima selectiva sin que haya un pation uefiniuo ue acceso a ellos • El númeio ue mouelos ue la aplicacion es alto y hay muchas ielaciones y iestiicciones entie ellas. Besventajas ue la inicializacion uinámica: • Piocesos que iequieian vaiios mouelos simultaneamente pueue elevai los iecuisos ue piocesamiento solicitauos poi la aplicacion • Solo los mouelos inicializauos son llevauos a las vistas asociauas a la peticion PbOPaOb B+%(M,8 ($(+(,3(>,+(:$ -($U1(+, Paia activai la inicializacion uinámica se uebe agiegai la seccion entities con la vaiiable ue configuiacion outolnitiolize = 0ff al aichivo ue configuiacion confiq,confiq.ini ue la aplicacion. 0n aichivo ue configuiacion confiq.ini queua asi: /0#123.5 6#*($(8 ,"%.$(+(,3(>,+(:$ -# 1.-#3.7 #$ 3, +.$*()"8,+(:$ [application] mode = development name = "Project Name" interactive = On dbdate = YYYY-MM-DD debug = On [entities] autoInitialize = Off LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S6 22 Componente EntityManager 22.1 Introducción El componente FntityHonoqer es usauo inteinamente poi el fiamewoik y piincipalmente poi ActiveRecorJ y Controller paia auministiai las entiuaues, sus ielaciones ue asociacion, ielaciones ue integiiuau y geneiauoies ue tal foima que el acceso a ellas sea consistente y unifoime. La clase FntityHonoqer es una clase abstiacta en la que sus métouos solo pueuen sei invocauos estáticamente, ue esta foima se aseguia que los uatos ue entiuaues y sus ielaciones existan solo una vez poi pioceso ue negocio. 22.2 Obtener una nueva instancia de un Modelo Caua vez que se llama el constiuctoi ue una clase ue ActiveRecorJ se ejecutan pioceuimientos inteinos como la inicializacion uel mouelo, tals como la localizacion uel Joto source, la uefinicion ue las ielaciones con otios mouelos y en algunos casos se tiata ue volcai los meta- uatos ue la tabla si estos no se encuentian uisponibles paia la aplicacion. El componente FntityHonoqer piopoiciona el métouo qetFntitylnstonce{strinq $instonceNome) que peimite obtenei una instancia ue la entiuau ya inicializaua mejoianuo el ienuimiento ue un pioceso ue negocio. En el siguiente ejemplo se muestia como se ieemplaza el instanciamiento meuiante new poi el métouo ue obtenei instancias ya inicializauas en blanco: /0#123.5 [9%#$#8 ($7%,$+(,7 -# 1.-#3.7 #$ *.81, #*(+(#$%# <?php try { $transaction = TransactionManager::getUserTransaction(); $this->Movement->setTransaction($transaction); $this->Cart->setTransaction($transaction); $conditions = "sellDate = '".Date::getCurrentDate()."'"; foreach($this->Movement->find($conditions) as $movement){ $productSt = EntityManager::getEntityInstance(“ProductStatistics”); $productSt->setTransaction($transaction); $productSt->setProductId($movement->getProductId()); $productSt->setCantidad($movement->getQuantity()); if($productSt->save()==false){ foreach($productSt->getMessages() as $message){ Flash::error($message->getMessage()); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S7 } $transaction->rollback(); } } $transaction->commit(); } catch(TransactionFailed $e){ Flash::error($e->getMessage()); } 4.%,5 Pouiia obtenei un eiioi como "Fatal eiioi: Cannot ieueclaie class Piouucts in ¡path¡to¡application¡instance¡apps¡uefault¡mouels¡piouucts.php on line 2Su" si no establece el paiámetio ue qetFntitylnstonce usanuo el nombie ue la clase mouelo tal y como fué uefiniua en el aichivo uel mouelo. 22.3 API del Componente EntityManager El uesaiiollauoi no uebeiia inteiactuai uiiectamente con este componente ya que ActiveRecorJ y sus subcomponentes son los encaigauos ue utilizai este API paia auministiai las ielaciones y la infoimacion ue las entiuaues. La siguiente API es piesentaua buscanuo ayuuai a extenuei el coie uel fiamewoik o ieemplazai este componente. PPOcOb @_%.-.7 2,8, ($(+(,3(>,8 1.-#3.7 \ .9%#$#8 ($7%,$+(,7 -# #33.7 stotic function orroy qetFntities{) 0btiene un vectoi con touas las entiuaues inicializauas en la peticion actual. stotic function voiJ setAutolnitiolize{booleon $outolnitiolize) Establece si los mouelos son auto-inializauos o no. stotic function booleon qetAutolnitiolize{) Inuica si los mouelos están sienuo auto-inicializauos o no. stotic function voiJ setHoJelsBirectory{strinq $moJelsBir) Establece el uiiectoiio uesue uonue ueben sei caigauos los mouelos. stotic function mixeJ qetFntitylnstonce{strinq $entityNome, booleon $newlnstonce=true) 0btiene una instancia ue una clase ue un mouelo. Si se pasa false en el segunuo paiámetio se obtiene una instancia existente. stotic function voiJ initHoJelBose{strinq $moJelsBir) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S8 Caiga la clase ActiveRecoiu ubicaua en el uiiectoiio ue mouelos ue la aplicacion. stotic function voiJ initHoJels{strinq $moJelsBir) Inicializa el uiiectoiio ue mouelos caiganuolos e inicializanuolos. stotic function booleon isFntity{strinq $entityNome) Peimite consultai si existe un ueteiminauo mouelo en la peticion actual. stotic function booleon isHoJel{strinq $moJelNome) Es un alias uel métouo isEntity. stotic function strinq qetFntityNome{strinq $moJel) 0btiene el nombie ue una entiuau ue acueiuo a su oiigen ue uatos (tabla). stotic function voiJ oJJFntityByCloss{strinq $entityCloss) Inicializa un uinámicamente mouelo poi el nombie ue su clase. PPOcOP @_%.-.7 2,8, ,-1($(7%8,8 8#3,+(.$#7 -# 1"3%(23(+(-,- stotic function booleon existsBelonqsTo{strinq $entityNome, strinq $relotionRequesteJ) Peimite consultai si una entiuau está ielacionaua con otia meuiante una ielacion tipo belongsTo (muchos a 1) al menos uniuiieccionalmente. stotic function booleon existsEosHony{strinq $entityNome, strinq $relotionRequesteJ) Peimite consultai si una entiuau está ielacionaua con otia meuiante una ielacion tipo hasNany (1 a muchos) al menos uniuiieccionalmente. stotic function booleon existsEos0ne{strinq $entityNome, strinq $relotionRequesteJ) Peimite consultai si una entiuau está ielacionaua con otia meuiante una ielacion tipo has0ne (1 a 1) al menos uniuiieccionalmente. stotic function booleon qetBelonqsToRecorJs{strinq $entityNome, strinq $relotionRequesteJ, ActiveRecorJ $recorJ) 0btiene un iesultauo ue los iegistios ielacionauos meuiante una ielacion ue multipliciuau belongsTo. El paiámetio $iecoiu es la instancia ue un mouelo utilizaua paia efectuai la LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 2S9 opeiacion. stotic function booleon qetEos0neRecorJs{strinq $entityNome, strinq $relotionRequesteJ, ActiveRecorJ $recorJ) 0btiene un iesultauo ue los iegistios ielacionauos meuiante una ielacion ue multipliciuau has0ne. El paiámetio $iecoiu es la instancia ue un mouelo utilizaua paia efectuai la opeiacion. stotic function booleon qetEosHonyRecorJs{strinq $entityNome, strinq $relotionRequesteJ, ActiveRecorJ $recorJ) 0btiene un iesultauo ue los iegistios ielacionauos meuiante una ielacion ue multipliciuau hasNany. El paiámetio $iecoiu es la instancia ue un mouelo utilizaua paia efectuai la opeiacion. stotic function voiJ oJJBelonqsTo{strinq $entityNome, strinq $fielJs='', strinq $referenceToble='', strinq $referenceJIielJs='', strinq $relotionNome='') Agiega una ielacion belongsTo al auministiauoi ue entiuaues en foima piogiamacional. stotic function voiJ oJJEosHony{strinq $entityNome, mixeJ $fielJs='', strinq $referenceToble='', mixeJ $referenceJIielJs='') Agiega una ielacion belongsTo al auministiauoi ue entiuaues en foima piogiamacional. stotic function voiJ oJJEos0ne{strinq $entityNome, mixeJ $fielJs='', strinq $referenceToble='', mixeJ $referenceJIielJs='') Agiega una ielacion bos0ne al auministiauoi ue entiuaues en foima piogiamacional. stotic function voiJ oJJTrosientAttribute{strinq $entityNome, strinq $ottribute) Agiega un atiibuto ue una entiuau que no uebe sei peisistiuo. static function aiiay getRelations0f(stiing $entityName) 0btiene un aiiay con las ielaciones que han siuo uefiniuas paia una ueteiminaua entiuau. PPOcOc @_%.-.7 ,-1($(%8,8 2,8, /$%(-,-#7 T#12.8,3#7 stotic function booleon existsTempororyFntity{strinq $entityNome) Peimite consultai si una entiuau tempoial ya ha siuo uefiniua. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 26u stotic function voiJ oJJTempororyFntity{strinq $entityNome) Agiega una entiuau tempoial al auministiauoi ue entiuaues. stotic function voiJ JestroyTempororyFntity{strinq $entityNome) Bestiuye una entiuau tempoial uel auministiauoi ue entiuaues. stotic function booleon isCreoteJTempororyFntity{BbBose $connection, strinq $entityNome) Consulta si una entiuau tempoial ya ha siuo cieaua en una ueteiminaua conexion. PPOcOd [8()#$#7 -# -,%.7 stotic function strinq qetSourceNome{strinq $entityNome) 0btiene el oiigen ue uatos (tabla) ue una ueteiminaua entiuau PPOcON B-1($(7%8,8 )#$#8,-.8#7 -# #$%(-,-#7 static function voiu setEntityueneiatoi(stiing $entityName, stiing $auaptei, stiing $column, aiiay $options) Establece el geneiauoi ue una ueteiminaua entiuau. stotic function booleon bos6enerotor{strinq $entityNome) Inuica si una entiuau tiene uefiniuo algun geneiauoi. stotic function ActiveRecorJ6enerotor qetFntity6enerotor{strinq $entityNome) 0btiene el geneiauoi ue una ueteiminaua entiuau. stotic function orroy qetAllCreoteJ6enerotors{) 0btiene touos los geneiauoies uefiniuos en la peticion actual. PPOcOe EE,M#7 *.8U$#,7 M(8%",3#7 static function voiu auuFoieignKey(stiing $entityName, aiiay $fielus='', stiing $iefeienceTable='', aiiay $iefeienceuFielus='', aiiay $options=aiiay()) Establece una llave foiánea viitual en una entiuau. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 261 stotic function orroy qetIoreiqnKeys{strinq $entityNome) 0btiene las llaves foiáneas viituales uefiniuas paia una entiuau. stotic function booleon bosIoreiqnKeys{strinq $entityNome) Peimite consultai una entiuau tiene llaves foiáneas viituales uefiniuas. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 262 23 Componente TransactionManager 23.1 Introducción El objetivo ue este componente es auministiai las tiansacciones globales iequeiiuas poi los piocesos ue negocio ue una aplicacion. Su API es utilizaua paia acceuei a un gestoi ielacional en una uniuau ue tiabajo en paiticulai. Toua la aiquitectuia ue este componente piopoiciona a las aplicaciones uesaiiollauas en Kumbio Fnterprise un conteneuoi paia auministiacion ue tiansacciones en PBP como los usauos en }ava EE. Es iesponsable ue abiii y ceiiai tiansaciones mantenienuo uniuaues ue tiabajo en foima contiolaua. Las tiansacciones pueuen sei cieauas piogiamacionalmente o ueclaiativamente. 23.2 Contexto de Scope Persistente El TronsoctionHonoqer es el puente paia que objetos uel 0RN pueuan inteiactuai con su contexto peisistente auecuauo. Caua objeto que es ligauo a una tiansaccion auministiaua poi el conteneuoi es notificauo ue otias tiansacciones activas en el mismo contexto. Los objetos mantienen su estauo y este es ieplicauo cuanuo se abie o cieiia la tiansaccion infoimanuo el estauo ue la misma. 23.3 Event Listeners El componente TronsoctionHonoqer hace uso uel CommonFventlnfroestructure ue Kumbio Fnterprise paia notificai eventos a los objetos uepenuientes ue una tiansaccion y también entie ellos mismos. Los eventos sopoitauos son: T,93,5 /M#$% E(7%#$#87 -# T8,$7,+%(.$@,$,)#8 /M#$%. 6#7+8(2+(:$ uelete 0cuiie cuanuo un objeto es uestiuiuo cuanuo se ieplica el estauo uel mismo en la peisistencia. cieate 0cuiie cuanuo un objeto es cieauo. upuate 0cuiie cuanuo un objeto es actualizauo. pieInseit 0cuiie antes ue iealizai una inseicion ue un iegistio. pieBelete 0cuiie antes ue iealizai una eliminacion ue un iegistio. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 26S pieLoau 0cuiie al cieai un objeto instanciauo como iesultauo ue una consulta. postInseit 0cuiie uespués ue iealizai una inseicion. postBelete 0cuiie uespués ue iealizai una eliminacion. post0puate 0cuiie uespués ue iealizai una actualizacion. 23.4 Estados de las entidades Las entiuaues pueuen tenei los siguientes estauos cuanuo inteivienen en piocesos tiansaccionales: ! /7%,-. 4#R5 Cuanuo una entiuau es cieaua meuiante el opeiauoi new poi uefecto se encuentia ligaua a una conexion no tiansaccional y no iepiesenta ningun iegistio ue la base ue uatos. ! /7%,-. @,$,)#-5 Cuanuo una entiuau está asociaua a una tiansaccion cieaua poi el TronsoctionHonoqer se uice que se encuentia en estauo auministiauo. ! /7%,-. 6#%,+C#-5 Cuanuo la entiuau peitenecio a una tiansaccion auministiaua peio la tiansaccion ya fue ceiiaua o su contexto fue cambiauo a la conexion no tiansaccional. ! /7%,-. <#1.M#-5 Cuanuo la entiuau fue eliminaua ue la peisistencia y poi lo tanto no pueue estai asociaua a un contexto tiansaccional. 23.5 Asignar el objeto al estado administrado Los métouos ue ActiveRecorJ llamauos setTronsoction{) y JetocbTronsoction{) peimiten cambiai piogiamacionalmente el estauo tiansaccional ue un objeto. /0#123.5 I,19(,8 "$ .90#%. B+%(M#<#+.8- , "$ #7%,-. ,-1($(7%8,-. <?php $transaction = TransactionManager::getUserTransaction(); $customer = new Customer(); $customer->setTransaction($transaction); $customer->setName(“John”); $customer->setSurname(“Smith”); $customer->save(); $transaction->commit(); $customer->detachTransaction(); Cuanuo la tiansaccion es ceiiaua ya sea poi un iollback o commit los objetos no son automáticamente cambiauos al estauo JetocbeJ. Las tiansacciones ceiiauas ya no son usables peio la uniuau ue tiabajo mantiene su uepenuencia a la tiansaccion. El uesligamiento ue los LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 264 objetos ue la tiansaccion pueue iealizaise manualmente o llamai el métouo JetocbBepenJencies{) ue ActiveRecorJTronsoction. 23.6 API de TransactionManager stotic function ActiveRecorJTronsoction qet0serTronsoction{TronsoctionBefinition $Jefinition='') Ciea o obtiene una tiansaccion ActiveRecorJTronsoction. Si se uefine una uefinicion ue tiansaccion se ciea una nueva. stotic function voiJ initiolizeHonoqer{) Inicializa el auministiauoi ue tiansacciones. El uesaiiollauoi no uebe invocai este métouo ya que es automáticamente llamauo poi el conteneuoi ue aplicaciones al iniciai la peticion. stotic function voiJ rollbockPenJent{) Realiza un iollback sobie touas las tiansacciones auministiauas poi el TiansactionNanagei. Cuanuo ocuiie una excepcion no captuiaua el fiamewoik llama este métouo paia cancelai cualquiei opeiacion penuiente y asi cuiuai la integiiuau ue los uatos. stotic function voiJ commit{) Realiza un commit sobie touas las tiansacciones auministiauas poi el TiansactionNanagei. stotic function voiJ rollbock{) Realiza un iollback sobie touas las tiansacciones auministiauas poi el TiansactionNanagei. stotic function voiJ notifyRollbock{ActiveRecorJTronsoction $tronsoction) Peimite notificai a otias tiansacciones auministiauas poi el TiansactionNanagei que una tiansaccion iealizo un iollback buscanuo que las uemás también lo hagan. stotic function voiJ notifyCommit{ActiveRecorJTronsoction $tronsoction) Peimite notificai a otias tiansacciones auministiauas poi el TiansactionNanagei que una tiansaccion iealizo un commit buscanuo que las uemás también lo hagan. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 26S Paite 4: La capa ue piesentacion 24 Presentación 24.1 Introducción La capa ue piesentacion es la teiceia ue la aiquitectuia ue una aplicacion Web y peimite uefinii inteifaces y métouos paia inteiactuai con el usuaiio final asi como piesentaile infoimacion al mismo. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 266 25 Componente View 25.1 Introducción El componente view se encaiga ue auministiai la foima estánuai en la que se geneia la piesentacion al usuaiio final en su exploiauoi. La piesentacion estánuai en una aplicacion en Kumbio Fnterprise se basa en vaiios pationes ue uiseño que peimiten ieuucii la couificacion y hacei más mantenible esta paite uel uesaiiollo. El piimei pation utilizauo es Templote view el cuál habla ue utilizai tags peisonalizauos o maicas embebiuas en el conteniuo uinámico piopoicionanuo flexibiliuau y pouei paia cieai inteifaces web. El segunuo pation es el Two Stote view el cual peimite uefinii múltiples inteifaces ue acueiuo al uispositivo o cliente uesue el cuál se este se acceuienuo a la aplicacion. Este tipo ue implementacion favoiece piincipalmente aplicaciones que acceuan uesue un biowsei o un uispositivo movil como un telefono celulai, en uonue es necesaiio peisonalizai uetalles paia caua tipo ue inteifaz. La aiquitectuia NvC piesenta el concepto ue vista la cuál actúa como puente entie el usuaiio final y la logica ue uominio en los contiolauoies. 25.2 Jerarquía de vistas en la presentación 0na jeiaiquia ue aichivos con vistas imbebibles sopoitauas poi el componente view peimite ieuucii la couificacion cieanuo puntos ue piesentacion comunes paia la aplicacion, contiolauoies o meuiante la implementacion ue plantillas. Caua paite ue la piesentacion se ciea en un aichivo ubicauo en una estiuctuia conveniua ue uiiectoiios en el uiiectoiio ue la aplicacion llamauo views,. El componente view peimite uefinii la piesentacion en vaiios niveles, caua uno contiene al siguiente: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 267 T,93,5 4(M#3#7 -# 28#7#$%,+(:$ #$ #3 +.12.$#$%# Y(#R B8+C(M. : ;9(+,+(:$ 6#7+8(2+(:$ inuex.phtml Contiene la vista piincipal y encabezauo XBTNL ue touas las vistas. uiiectoiio-con-nombie-uel-contiolauoi Peimite establecei aichivos con vistas paia caua accion uel contiolauoi. uiiectoiio-con-nombie-uel- contiolauoi¡aichivo-con-nombie-ue-la- accion.phtml Peimite cieai una piesentacion paia la accion activa en el contiolauoi. layouts¡aichivo-con-nombie-uel- contiolauoi.phtml Peimite establecei una vista común paia touas las acciones uel contiolauoi. layouts¡nombie-template.phtml Peimite establecei una plantilla común paia vaiios contiolauoies. uiiectoiio-con-nombie-uel- contiolauoi¡_nombie-vista-paicial.phtml Peimite establecei vistas paiciales que se pueuen incluii en vaiias vistas ue acciones uel contiolauoi activo. paitials¡_nombie-vista-paicial.phtml Peimite establecei vistas paiciales que se pueuen incluii en cualquiei vista o template ue la aplicacion. El componente view no iequieie que exista caua componente ue piesentacion que se menciono anteiioimente, el único iequeiiuo es la vista piincipal. PNOPOb Y(7%, K8($+(2,3 En el uiiectoiio views, se pueue encontiai el aichivo inJex.pbtml que implementa el encabezauo XBTNL estánuai paia cualquiei vista ue la aplicacion: /0#123.5 Y(7%, 28($+(2,3 M(#R7J($-#HO2C%13 2.8 -#*#+%. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv='Content-type' content='text/html; charset=UTF-8' /> <title>Application Title</title> <?php Tag::stylesheetLink('style', true) ?> <?php echo Core::stylesheetLinkTags() ?> <?php echo Core::javascriptBase() ?> </head> <body> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 268 <?php echo View::getContent(); ?> </body> </html> Poi uefecto se utiliza un encabezauo XETHl 1.0 Strict el cuál piopenue poi aplicaciones basauas en estánuaies y que funcionan mejoi en los navegauoies más avanzauos uel meicauo. Los helpeis Core::stylesbeetlinkToqs{) y Core::jovoscriptBose{) incluyen aichivos }avaSciipt como fiamewoiks y utiliuaues auemás ue los CSS inciustauos en otias vistas activas. El XBTNL geneiauo poi la vista anteiioi es: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv='Content-type' content='text/html; charset=UTF-8' /> <title>Application Title</title> <link rel='stylesheet' type='text/css' href='/app- path/css.php?c=style&p=/app-path' /> <script type='text/javascript' src='/app- path/javascript/scriptaculous/protoculous.js'></script> <script type='text/javascript' src='/hfos/javascript/core/base.js'></script> <script type='text/javascript' src='/app- path/javascript/core/validations.js'></script> <script type='text/javascript' src='/app-path/javascript/core/main.php?app= &module=&path=%2Finstance-name%2F&controller=login&action=index&id='></script> </head> <body> </body> </html> Notese el llamauo a view::qetContent{), este impiime touo el conteniuo geneiauo en el layout o vistas activas en la aplicacion en el lugai que se inuique. PNOPOP <#^"#8(1(#$%.7 -# 3, Y(7%, K8($+(2,3 Es iecomenuable no eliminai los llamauos a los helpeis estánuai en la vista piincipal ya que esto pueue impactai el compoitamiento uel fiamewoik. En geneial los iequeiimientos uel conteniuo ue la vista piincipal son los siguientes: • Su nombie uebe sei inuex.phtml y manteneise en la iaiz ue views, • Incluii los aichivos }avaSciipt que se utilicen en caua peticion a la aplicacion • Incluii los aichivos CSS que se utilicen en caua peticion a la aplicacion • Incluii couigo XBTNL que sea común a caua contiolauoi y accion ue la aplicacion PNOPOc <#^"#8(1(#$%.7 Y(7%,7 , $(M#3 -# I.$%8.3,-.8 ueneialmente caua accion solicitaua piesenta o solicita infoimacion uifeiente al usuaiio ue tal LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 269 foima que el flujo ue la aplicacion sea consistente tanto paia el uesaiiollauoi como paia los usuaiios. Los iequeiimientos ue las vistas a nivel ue contiolauoi son: • Es necesaiio que exista un uiiectoiio con el nombie uel contiolauoi uonue se encuentie la accion • El nombie uel uiiectoiio uebe ii en minúsculas y sin el sufijo "Controller". • El aichivo ue la vista uebe tenei la extension .phtml y el nombie uebe sei el nombie ue la accion sin el sufijo "Action". PNOPOd <#^"#8(1(#$%.7 -# E,\."%7 -# I.$%8.3,-.8#7 Los loyouts ue contiolauoies son vistas que contienen fiagmentos comunes ue piesentacion que son valiuos paia cualquiei accion uel contiolauoi. Los iequeiimientos ue los loyouts ue contiolauoies son: • 0n aichivo con el nombie uel contiolauoi en el uiiectoiio views¡loyouts uebe existii. • El nombie uel aichivo uebe ii en minúsculas y sin el sufijo "Controller". • El aichivo uebe tenei extension .phtml. PNOPON <#^"#8(1(#$%.7 -# Y(7%,7 K,8+(,3#7 #$ I.$%8.3,-.8#7 En ocasiones fiagmentos ue piesentacion como menús, encabezauos, pie ue paginas, etc son comunes a vaiias acciones ue un contiolauoi peio no a touas, en estos casos se pueue implementai vistas paiciales. Los iequeiimientos ue las vistas paiciales en contiolauoies son: • Es necesaiio que exista un uiiectoiio con el nombie uel contiolauoi uonue se encuentie la vista paicial. • El nombie uel uiiectoiio uebe ii en minúsculas y sin el sufijo "Controller". • El aichivo ue la vista paicial uebe tenei la extension .phtml y el piefijo "_" (unueiscoie). PNOPOe <#^"#8(1(#$%.7 -# Y(7%,7 K,8+(,3#7 j#$#8,3#7 Al igual que las vistas paiciales ue contiolauoies las geneiales iealizan la misma taiea con la uifeiencia que estan uisponibles paia cualquiei layout, template o vista ue la aplicacion. Los iequeiimientos ue las vistas paiciales geneiales son: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 27u • La vista paicial uebe estai ubicaua en el uiiectoiio views,portiols. • El aichivo ue la vista paicial uebe tenei la extension .phtml y el piefijo "_" (unueiscoie). PNOPOa <#^"#8(1(#$%.7 -# K3,$%(33,7 : T#123,%#7 Las plantillas peimiten establecei múltiples fiagmentos ue piesentacion y aplicaisen antes o uespués uel layout uel contiolauoi. Los iequeiimientos ue las plantallas son: • Beben entas ubicauos en el uiiectoiio views,loyouts,. • La extension uel aichivo uebe sei ".phtml" 25.3 Inserción automática y manual de vistas El componente view utiliza convenciones paia inseitai automáticamente la piesentacion coiiesponuiente a un contiolauoi o una accion, otios componentes ue piesentacion iequieie que se establezca piogiamacionalmente su ielacion con la piesentacion uiseñaua. Si se iealiza una peticion a la aplicacion meuiante la 0RL: http://172.16.5.2/company/categories/create En uonue compony es el nombie ue la instancia uel fiamewoik, coteqories es el nombie uel contiolauoi y creote la accion iequeiiua. uiacias a la piesentacion poi convencion el componente view tiataiá ue cieai la piesentacion a paitii ue los aichivos: • Jefoult,views,coteqories,creote.pbtml • Jefoult,views,loyouts,coteqories.pbtml • Jefoult,views,inJex.pbtml Si alguno ue los aichivos mencionauos no existe se tiata ue ubicai el siguiente y asi sucesivamente. En este segunuo caso la 0RL solicitaua es: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 271 http://172.16.5.2/company/press/categories/ En uonue compony es el nombie ue la instancia uel fiamewoik, press es el nombie ue la aplicacion y coteqories es el nombie uel contiolauoi. El nombie ue la accion no se ha estableciuo poi lo que se asume que es inJex. Los aichivos ue piesentacion son los siguientes: • press,views,coteqories,inJex.pbtml • press,views,loyouts,coteqories.pbtml • Jefoult,views,inJex.pbtml 25.4 Implementar los tipos de vistas En el siguiente ejemplo se ilustia los tipos ue vistas y su integiacion en la piesentacion ue una aplicacion. El contiolauoi customers se inicializa con S templates: /0#123.5 B23(+,8 1"3%(23#7 %#123,%#7 , "$ 1(71. +.$%8.3,-.8 <?php class CustomersController extends ApplicationController { public function initialize(){ $this->setTemplateBefore("template1"); $this->setTemplateAfter(array("template2", "template3")); } public function createAction(){ } public function updateAction(){ } } Los métouos uel contiolauoi setTemplote y setTemploteAfter peimiten inseitai plantillas antes y uespués uel layout uel contiolauoi. Los templates como se menciono ueben estai ubicauos en views,loyouts. El aichivo ue plantilla views,loyouts,templote1.pbtml tiene: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 272 <div style='background:yellow;padding:10px'> <h2>Template 1</h2> <?php View::getContent(); ?> </div> El llamauo a view::qetContent{) inuica uonue se uebe inciustai el conteniuo ue otias vistas conteniuas poi el fiagmento ue piesentacion. El aichivo ue plantilla views,loyouts,templote2.pbtml tiene: <div style='background:#faca22;padding:10px'> <h2>Template 2</h2> <?php View::getContent(); ?> </div> El aichivo ue plantilla views,loyouts,temploteS.pbtml tiene: <div style='background:#ccccf2;padding:10px'> <h2>Template 3</h2> <?php View::getContent(); ?> </div> El aichivo ue layout uel contiolauoi views,loyout,customers.pbtml tiene: <?php View::renderPartial('header') ?> <div style='background:orange;padding:10px'> <h2>Layout de Customers</h2> <?php View::getContent(); ?> </div> <?php View::renderPartial('footer') ?> El métouo view::renJerPortiol inseita una vista paicial que esta ubicaua en el mismo uiiectoiio ue contiolauoi views,customers,. Notése que el piefijo "_" ue las vistas paiciales es omitiuo a pioposito al establecei el nombie ue esta. La vista paicial views,customers,_beoJer.pbtml tiene: <h4>Este es el encabezado</h4> La vista paicial views,customers,_footer.pbtml tiene: <h4>Este es el pie de página</h4> La vista ue la accion creote en el aichivo views,customers,_creote.pbtml tiene: <div style='background:#eac2ff;padding:10px'> <h3>Acción Create</h3> <?php View::getContent(); ?> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 27S </div> La vista ue la accion upJote en el aichivo views,customers,_upJote.pbtml tiene: <div style='background:#cceaff;padding:10px'> <h3>Acción Update</h3> <?php View::getContent(); ?> </div> El iesultauo obteniuo en el exploiauoi al invocai la accion creote es: El iesultauo obteniuo al invocai la accion upJote en customers es: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 274 Como se mostio touos los tipos ue fiagmentos ue piesentacion piopoicionan una poueiosa foima ue compaitii el couigo y constiuii inteifaces flexibles siguienuo un piincipio básico ue mantenibiliuau ue una aplicacion. 25.5 Transferir valores del controlador a la vista Existen 2 foimas ue tiansfeiii uatos uel contiolauoi a la piesentacion: PNONOb T8,$7*#8(8 1#-(,$%# ,%8(9"%.7 2G93(+.7 Si al piocesai una accion en un contiolauoi se iequieie piesentai infoimacion al cliente final esta uebe sei tiansfeiiua a las vistas asociauas paia su posteiioi tiatamiento. Poi uefecto los atiibutos públicos ue los contiolauoies son tiansfeiiuos automáticamente a la piesentacion en foima ue vaiiables locales. El siguiente contiolauoi tiene 2 atiibutos públicos que se visualizan al invocai la accion info: /0#123.5 ;%(3(>,8 ,%8(9"%.7 2G93(+.7 2,8, %8,$7*#8(8 M,3.8#7 , 3, 28#7#$%,+(:$ <?php class PressController extends ApplicationController { LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 27S public $code; public $name; public function indexAction(){ } public function infoAction(){ $this->code = 100; $this->name = “Este es un nombre”; } } Touas las vistas asociauas a la peticion tienen acceso a las vaiiables locales $coJe y $nome que pueuen sei usauas a conveniencia: El aichivo views,loyouts,press.pbtml tiene: <h1>El código es <?php echo $code ?></h1> El aichivo views,press,info.pbtml tiene: <p>El contenido de “name” es <?php echo $name ?></p> Lo que en conjunto piouuce en el exploiauoi: PNONOP T8,$7*#8(8 1#-(,$%# 7#%K,8,1T.Y(#R La segunua foima ue tiansfeiii valoies uesue las acciones uel contiolauoi es meuiante el uso uel métouo setPoromToview. Este métouo es especialmente útil cuanuo se iequieia tiansfeiii gianues cantiuaues ue uatos a las vistas o uatos poco ielevantes que no ameiiten la uefinicion ue un atiibuto público en el contiolauoi. También si se usan contiolauoies con el estauo peisistente activo es posible que también se quieia iestiingii la uefinicion ue atiibutos públicos a los estiictamente necesaiios. /0#123.5 T8,$7*#8(8 -,%.7 , 3, 28#7#$%,+(:$ 1#-(,$%# 7#%K,8,1T.Y(#R LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 276 <?php class PressController extends ApplicationController { public function indexAction(){ } public function showAllAction(){ $this->setParamToView(“editions”, $this->Editions- >find(“status=’A’”)); } } En la vista se ciea una vaiiable local llamaua $eJitions con el valoi asignauo en la accion. 25.6 Controlar Niveles de Renderización En ueteiminauas situaciones es posible que se iequieia contiolai el nivel ue piofunuiuau ue la visualizacion. El componente view peimite establecei el nivel ue ienueiizacion meuiante el métouo setRenJerlevel{int $level). Esté métouo pueue sei invocauo uesue el contiolauoi o uesue una capa ue visualizacion supeiioi paia evitai que otias sean piesentauas. T,93,5 4(M#3#7 -# 8#$-#8(>,+(:$ #$ Y(#R Y,3.8 I.$7%,$%# 6#7+8(2+(:$ u LEvEL_N0_RENBER Inuica que se uebe evitai geneiai cualquiei tipo ue piesentacion. 1 LEvEL_ACTI0N_vIEW ueneia la piesentacion hasta la vista asociaua a la accion. 2 LEvEL_BEF0RE_TENPLATE ueneia la piesentacion hasta las plantillas antes ue el layout uel contiolauoi. S LEvEL_LAY00T ueneia la piesentacion hasta el layout uel contiolauoi. 4 LEvEL_AFTER_TENPLATE ueneia la piesentacion hasta las plantillas uespués ue el layout uel contiolauoi. S LEvEL_NAIN_vIEW ueneia la piesentacion hasta la vista LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 277 piincipal. Aichivo views,inJex.pbtml 25.7 Utilizar modelos en la presentación Los mouelos ue la aplicacion siempie están uisponibles en la piesentacion. Si la opcion ue autoinicializacion ue mouelos está activa se cieaiá una iefeiencia ue touos los mouelos ue la aplicacion como vaiiables globales con el nombie uel mouelo, si no está activa solo los mouelos utilizauos en la peticion actual seián llevauos a la piesentacion. Bepenuienuo uel caso se pueue usai en foima natuial uentio ue cualquiei tipo ue vista los mouelos ue esta foima: /0#123.5 ;%(3(>,8 1.-#3.7 #$ 3, 28#7#$%,+(:$ +",$-. 7.$ ,"%.A($(+(,3(>,-.7 //Listar las ordenes de compra foreach($Orders->find() as $order){ print $order->getRecordedDate(); } Si los mouelos no son auto-inicializauos se pueue obtenei una instancia ue ellos usanuo el métouo ue FntityHonoqer llamauo qetFntitylnstonce: /0#123.5 ;7,8 1.-#3.7 #$ 3, 28#7#$%,+(:$ +",$-. $. 7.$ ,"%.A($(+(,3(>,-.7 $orders = EntityManager::getEntityInstance(‘Orders’); foreach($Orders->find() as $order){ print $order->getRecordedDate(); } 25.8 Plugins de View Los Pluqins ue piesentacion peimiten extenuei la funcionaliuau uel componente view. La aiquitectuia ue plugins ue view peimite obseivai, extenuei y manipulai el compoitamiento ue las vistas ue la aplicacion según las conuiciones lo exijan. Los plugins peimiten inteiceptai eventos en las vistas ue tal foima que estos sean obseivables y auemás ejecutáise uno tias otio ue maneia centializaua sin iequeiii iefactoiizacion o ieintegiacion en la aplicacion. PNO`Ob I8#,8 "$ K3")($ -# Y(#R Los plugins ue view son clases que implementan eventos que son invocauos a meuiua que avanza la ejecucion uel pioceso ue piesentacion en cualquiei peticion. Estas clases ueben LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 278 cumplii con los siguientes iequeiimientos: ! Beben estai ubicauos en el uiiectoiio ue plugins usualmente opps,opp-nome,pluqins ! El nombie uel aichivo que implementa la clase uebe sei el nombie uel plugin ! El nombie ue la clase uebe tenei la extension Pluqin ! Los plugins ue contiolauoi ueben heieuai ue la clase viewPluqin o sei subclase ue ella Las clases pueuen implementai métouos públicos que iefeiencian los eventos ocuiiiuos en los contiolauoies, la lista ue ellos es la siguiente: T,93,5 /M#$%.7 ^"# 7# 2"#-#$ (123#1#$%,8 #$ 23")($7 -# Y(#R 4.198# /M#$%. 6#7+8(2+(:$ befoieRenuei 0cuiie antes ue empezai el pioceso ue visualizacion ue las vistas asociauas a la peticion. El evento iecibe la instancia ue ControllerResponse actual afteiRenuei 0cuiie uespués ue teiminai el pioceso ue visualizacion ue las vistas asociauas a la piesentacion. 25.9 API del Componente View PNOiOb ]#8,8^"(, -# 8#$-#8(>,+(:$ stotic function strinq qetContent{booleon $returnContent=folse) El llamauo a este métouo le inuica al componente view uonue uebe inseitai el siguiente nivel ue la jeiaiquia ue ienueiizacion. Si se pasa tiue en $returnContent uevuelve el conteniuo uel buffei ue saliua hasta el momento. stotic function voiJ setRenJerlevel{int $level) Establece hasta que nivel ue ienueiizacion se uebe geneiai la piesentacion. Consulte la tabla ue niveles ue piesentacion paia obtenei más infoimacion sobie el uso ue este métouo. PNOiOP B-1($(7%8,8 28#7#$%,+(:$ stotic function voiJ bonJleviewRenJer{Controller $controller) Este métouo actua como el auministiauoi ue piesentacion pieueteiminauo iecibienuo como paiámetio el último contiolauoi eniutauo. No uebeiia sei invocauo uiiectamente poi el LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 279 uesaiiollauoi ya que es llamauo poi el conteneuoi ue aplicaciones. stotic function voiJ bonJleviewFxceptions{Fxception $e, Controller $controller) Este métouo actua como el auministiauoi ue piesentacion pieueteiminauo cuanuo no se captuia una excepcion iecibienuo como paiámetio el último contiolauoi eniutauo. No uebeiia sei invocauo uiiectamente poi el uesaiiollauoi ya que es llamauo poi el conteneuoi ue aplicaciones cuanuo esta situacion ocuiie. PNOiOc Y(7",3(>,8 M(7%,7 28.)8,1,+(.$,31#$%# stotic function voiJ renJerPortiol{strinq $_portiolview, strinq $_portiolvolue='') Peimite visualizai una vista paicial uentio ue otia vista. El segunuo paiámetio peimite tiansfeiii un valoi uesue la vista uonue se invoca este métouo al inteiioi ue la vista paicial. La vista paicial es ubicaua en el uiiectoiio ue vistas uel contiolauoi actual. El métouo se utiliza ue la siguiente foima: <?php View::renderPartial(“nombreVista”, “Un Valor”) ?> En el aichivo _nombievista.phtml el valoi tiansfeiiuo pueue sei usauo asi: <?php echo $nombreVista; ?> Si se iequieie visualizai una vista paicial en otio contiolauoi uifeiente al actual uebe usaise: <?php echo View::renderPartial(“nombreVista”, “controller: nombreControlador”); ?> stotic function voiJ renJerview{strinq $_view) Peimite visualizai una vista ue accion uentio ue otia vista. La vista ue accion es ubicaua en el uiiectoiio ue vistas uel contiolauoi actual. El métouo se utiliza ue la siguiente foima: <?php View::renderView(“nombreVista”) ?> Si se iequieie visualizai una vista paicial en otio contiolauoi uifeiente al actual uebe usaise: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 28u <?php echo View::renderView(“nombreVista”, “controller: nombreControlador”); ?> stotic function orroy qetvoliJotionHessoqes{) 0btiene uesue una vista los mensajes ue valiuacion piouuciuos poi el componente voliJotion o otio componente ue usuaiio. stotic function voiJ setContent{strinq $content) Establece piogiamacionalmente el conteniuo uel buffei ue saliua actual ue la piesentacion. stotic function voiJ setviewPorom{strinq $inJex, strinq $volue) Establece una vaiiable ue la vista que seiá cieaua en un ambito local como $inuex con el valoi $value. stotic function orroy qetviewPoroms{) 0btiene un aiiay con las vaiiables pasauas a la vista usanuo view::setviewPorom. stotic function voiJ setProxyProviJer{strinq $proxy, orroy $options) Establece un pioxy-pioviuei que auministie las peticiones ue piesentacion usanuo componentes ue teiceios. stotic function voiJ proxyEonJler{) Nétouo pieueteiminauo paia la auministiacion ue piesentacion cuanuo se usan componentes ue teiceios stotic function booleon existsActionview{strinq $nome, strinq $controllerNome='') Peimite consultai si una vista ue accion existe en el contiolauoi actual o en el uefiniuo en $contiolleiName. 25.10 Crear un componente de Presentación personalizado El uesaiiollauoi pueue cieai componentes ue aplicacion que ieemplacen al componente ue piesentacion view poi uefecto en Kumbio Fnterprise. Como los uemás componentes ue usuaiio estos ueben estai ubicauos en el uiiectoiio librory ue la aplicacion o uonue la vaiiable ue configuiacion libroryBir inuique. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 281 Los contiolauoies ueben establecei el auministiauoi ue piesentacion iequeiiuo sobiesciibienuo el métouo qetviewEonJler ue esta foima: /0#123.5 I,19(,8 #3 +.12.$#$%# ^"# ,-1($(7%8, 3, )#$#8,+(:$ -# 3, 28#7#$%,+(:$ <?php class CustomersController extends ApplicationController { public function getViewHandler(){ return array("MyView", "handleViewRender"); } } Be esta foima cuanuo se iequieia mostiai la piesentacion paia el contiolauoi se pasaiá el contiol a el componente Hyview invocanuo el métouo estático bonJleviewRenJer. Este métouo iecibe el objeto uel contiolauoi instanciauo (o el último que se utilizo uespués ue iealizai eniutamientos) en la peticion: /0#123.5 6#*($(8 "$ +.12.$#$%# -# "7",8(. ^"# ,-1($(7%#8 3, 28#7#$%,+(:$ <?php class MyView { static public function handleViewRender($controller){ //Realizar la presentación } } Se uebe tenei en cuenta toua la funcionaliuau mencionaua en el componente view no estaiá uisponible si se ieesciibe el componente ue piesentacion. Los seivicios ue los componentes Core (CoreConfiq, Corelocole, etc), Router y Bispotcber pueuen iesultai útiles en este punto. 25.11 Crear un componente de presentación de Excepciones no capturadas Al igual que la piesentacion noimal, la ue excepciones también pueue sei ieesciita siguienuo un pioceuimiento paieciuo al uel anteiioi. En este caso el métouo qetviewFxceptionEonJler uebe sei ieesciito en el contiolauoi. /]#123.5 6#*($(8 "$ +.12.$#$%# -# "7",8(. ^"# ,-1($(78# 3, 28#7#$%,+(:$ -# #H+#2+(.$#7 $. +,2%"8,-,7 <?php class CustomersController extends ApplicationController { public function getViewExceptionHandler(){ return array("MyView", "handleViewExceptionRender"); } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 282 } El métouo iecibe la excepcion y el último contiolauoi activo antes ue que se geneiaiá. El componente Hyview seiia: /0#123.5 6#*($(8 "$ +.12.$#$%# -# "7",8(. ^"# ,-1($(7%8# 3, 28#7#$%,+(:$ -# #H+#2+(.$#7 $. +,2%"8,-,7 <?php class MyView { static public function handleViewRender($controller){ //Realizar la presentación normal } static public function handleViewExceptions($e, $controller){ //Excepciones } } Consulte la iefeiencia ue CoreFxception y Fxception paia obtenei más infoimacion sobie las excepciones geneiauas que no han siuo captuiauas. 25.12 Integrar otros Engines de presentación Si el uesaiiollauoi iequieie, es posible integiai componentes ue geneiacion ue piesentacion ue teiceios (otios fiamewoiks o pioyectos). Con esto se apiovecha la funcionaliuau ue estos componentes sin peiuei el compoitamiento y potencia uel componente ue Kumbio Fnterprise view. PNObPOb I.12.8%,1(#$%. -# 3, ($%#)8,+(:$ La integiacion con los componentes ue teiceios tiene el siguiente compoitamiento: ! Las vaiiables públicas uel contiolauoi, uatos pasauos meuiante setviewPorom y mouelos utilizauos en la peticion (o touos si la autoinicializacion ue entiuaues está activa) son cieauos en el foimato auecuauo uel componente utilizauo. Poi ejemplo en ZenJ_view se uebe usai $this paia acceuei a estos valoies. ! Los nombies ue la extensiones ue aichivos ue vistas pueuen configuiaise como se iequieia y no se uebe usai ".phtml" como es noimal. ! La jeiaiquia ue inclusion "vista piincipal¡templates¡layouts¡vista¡paitials" se mantiene sin cambio alguno con la única uifeiencia que el iesultauo ue caua vista es piouuciuo poi el componente seleccionauo. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 28S ! Touo el fiamewoik aplicable pueue utilizaise en las vistas cieauas con otios engines sin iestiicciones. ! Los plugins ue view funcionan noimalmente PNObPOP I.12.$#$%#7 '.2.8%,-.7 Actualmente hay sopoite paia los componentes ue piesentacion Zenu_view ue Zenu Fiamewoik y Smaity. PNObPOPOb K8.H\ , o#$-pY(#R El componente ue ZenJ Iromework llamauo ZenJ_view ofiece la posibiliuau ue integiai helpeis, filtios y sciipts a las vistas geneiauas con este. Paia inuicai que se usaiá este componente se uebe cambiai el auministiauoi ue piesentacion en el contiolauoi asi: /0#123.5 /7%,93#+#8 "$ 28.H\ ,3 +.12.$#$%# -# 28#7#$%,+(:$ o#$-pY(#R <?php class MyController extends ApplicationController { public function getViewHandler(){ View::setProxyProvider('Zend', array( 'zendPath' => 'Library', 'class' => 'Zend_View', 'extension' => 'phtml', 'encoding' => 'UTF-8', 'strictVars' => false )); return array('View', 'proxyHandler'); } } El métouo view::setProxyProviJer establece que se usaiá el Pioxy a componentes teiceios 'Zenu'. El segunuo paiámetio peimite inuicai otias opciones opcionales ue la integiacion. T,93,5 K,8U1#%8.7 -#3 K8.H\K8.M(-#8 , o#$-pY(#R [2+(:$ 6#7+8(2+(:$ zenuPath La iuta a uonue está ubicauo el ZenJ Iromework. Si hace paite uel incluue_path ue PBP entonces no es necesaiio estableceila. class La clase utilizaua paia auministiai las vistas. Poi uefecto es ZenJ_view peio pueue estableceise cualquiei otia que implemente la inteifaz ZenJ_view_lnterfoce. extension La extension que tenuián las vistas. Poi uefecto es .phtml. encouing Esta opcion aplica al constiuctoi ue Zenu_view. stiictvais Esta opcion aplica al contiuctoi ue Zenu_view. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 284 Consulte la uocumentacion ue este fiamewoik en http://framework.zend.com/ . PNObPOPOP K8.H\ , '1,8%\ Este PioxyPioviuei peimite tiatai vistas usanuo el Smaity Engine. La foima en que se uebe inuicai que se usaiá este auaptauoi es la siguiente: /0#123.5 j#$#8,8 "$ 28.H\ -# 28#7#$%,+(:$ , '1,8%\ <?php class MyController extends ApplicationController { public function getViewHandler(){ View::setProxyProvider('Smarty', array( 'smartyPath' => 'Library', ‘extension’ => ‘tpl’ )); return array('View', 'proxyHandler'); } } 0pciones que iecibe el PioxyPioviuei: T,93,5 K,8U1#%8.7 -#3 K8.H\K8.M(-#8 , '1,8%\ [2+(:$ 6#7+8(2+(:$ smaityPath La iuta a uonue está ubicauo Smaity. Si hace paite uel incluue_path ue PBP entonces no es necesaiio estableceila. extension La extension que tenuián las vistas. Poi uefecto es .tpl LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 28S 26 Componente Tag 26.1 Introducción Este componente actua como una biblioteca ue etiquetas que peimite geneiai tags XBTNL en la piesentacion ue una aplicacion meuiante métouos estáticos PBP pieuefiniuos flexibles que integian tecnologia uel lauo uel cliente como CSS y }avasciipt. La ventaja ue utilizai estos helpeis en lugai ue XBTNL puio, es que aceleia el uesaiiollo y hace consistente el couigo XBTNL y otios aspectos como las 0RLs y el convencionalismo uel fiamewoik. Caua métouo estático iecibe sus opciones meuiante paiámetios poi nombie que se pueuen enviai en cualquiei oiuen al mismo. En los tag que geneian etiquetas es posible enviai paiámetios XBTNL o CSS con su iespectivo valoi asignanuose a la etiqueta geneiaua. 26.2 Establecer el valor de helpers creados con Tag 0na ue las ventajas más impoitantes ue cieai componentes ue inteifaz ue usuaiio con Toq es lo sencillo que se pueue asignai el valoi ue estos ue foima unifoime y contiolaua. Caua componente localiza el valoi que uebe piesentai meuiante las siguientes ieglas. Si alguna iegla se cumple las uemás no son valiuauas: ! veiifica si existe algún valoi paia él asignauo con Toq::JisployTo y lo tomo como volor ! veiifica si hay algún inuice en $_P0ST que coinciua con el atiibuto "iu" ue él y toma como valoi ! veifica si existe un atiibuto público en el último contiolauoi ejecutauo que coinciua con el atiibuto "iu" ue él y lo toma como valoi. Si a algún helpei se le asigna uiiectamente con el paiámetio "value" ninguna ue las ieglas anteiioies se tiene en cuenta. El siguiente ejemplo ilustia la asignacion ue un valoi a componente ue inteifaz ue usuaiio cieauo meuiante Toq: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 286 /0#123.5 @.7%8,8 "$ M,3.8 #$ "$ +.12.$#$%# M(7",3 -#7-# #3 +.$%8.3,-.8 1#-(,$%# T,)55-(723,\T. <?php class PeopleController extends ApplicationController { public function indexAction(){ Tag::displayTo('genero', 'F'); } } En la vista el como estático se visualizaiá con el valoi "F" seleccionauo: <?php $generos = array( 'M' => 'Masculino', 'F' => 'Femenino' ); echo Tag::selectStatic("genero", $generos); ?> El uesaiiollauoi uebe valiuai que no se asignen valoies con JisployTo cuanuo se ueba visualizai los valoies captuiauos poi el usuaiio en la peticion P0ST. 26.3 Comportamiento de helpers Touos los helpeis en el componente Tag uevuelven couigo BTNL geneiauo poi caua uno lo que peimite utilizai este paia utilizailo como paiámetio ue otios helpeis o usailo como se iequieia. <?php echo Tag::linkTo(“controlador/accion”, Tag::image(“foto.jpg”)) ?> Los helpeis pueuen iecibii paiámetios poi nombie o un aiiay asociativo cuyos inuices seán los nombies ue los paiámetios. <?php echo Tag::form(“controlador/accion”, “method: post”) ?> <?php echo Tag::form(array(“controlador/accion”, “method” => “post”)) ?> 26.4 API del Componente Tag A continuacion se piesenta el API uel componente: PeOdOb I8#,8 #$3,+#7 public stotic function linkTo{mixeJ $poroms) Peimite cieai un enlace a una punto ue la aplicacion utilizanuo las convenciones ue Kumbia Enteipiise„ este métouo geneia un tag A ue XBTNL con la posibiliuau ue implementai tanto LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 287 una confiimacion antes ue ejecutaise como ue aplicai cualquiei atiibuto que se uesee a este tag. El label ue la etiqueta pueue sei un texto o cualquiei otio tag como poi ejemplo una imagen. Las opciones extenuiuas uel componente son: T,93,5 K,8U1#%8.7 ^"# 8#+(9# 3($ST. 4.198# 6#7+8(2+(:$ confiim Peimite establecei que se piesente un cuauio ue uialogo ue piesentacion al usuaiio que confiime la peticion ue la 0RL en el tag A. text Es el texto que apaieceiá en el enlace. /0#123.5 ;7. -# 3($ST. <?php echo Tag::linkTo(“controlador/saludo”, ”Saludar”) ?> <?php echo Tag::linkTo(“controlador/saludo”,”SALUDAR”, ”class: css_saludo”, ”border: 0”, “confirm: Desea ir a Saludo?”) ?> ueneia el siguiente couigo XBTNL: <a onclick='if(!confirm("Desea ir a saludo?”)) return false;' border="0" class="css_saludo" href="/instancia/controlador/saludo">SALUDAR</a> public stotic function linkToAction{mixeJ $poroms) ueneia un enlace a una accion asociaua al contiolauoi actual. Al igual que linkTo es posible aplicai atiibutos BTNL pasanuolos como otios paiámetios. /0#123.5 ;7. -# 3($ST.B+%(.$ <?php echo Tag::linkTo(“cancelInvoice”, ”Cancelar”) ?> <?php echo Tag::linkTo(“cancelInvoice”, ”Cancelar”, ”class: css_saludo”, ”border: 0”, “confirm: Desea cancelar la factura?”); ?> 0pciones extenuiuas ue linkToAction: T,93,5 [2+(.$#7 #H%#$-(-,7 -# 3($ST.B+%(.$ 4.198# 6#7+8(2+(:$ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 288 confiim Peimite establecei que se piesente un cuauio ue uialogo ue piesentacion al usuaiio que confiime la peticion ue la 0RL en el tag A. text Es el texto que apaieceiá en el enlace. public stotic function linkToRemote{mixeJ $poroms) Caiga el conteniuo ue una accion en un conteneuoi BTNL uentio ue la piesentacion actual. La vista se obtiene meuiante A}AX poi lo que la página no es iecaigaua. En el siguiente ejemplo se caigaiá el conteniuo ue una accion en el uiv con iu 'the_menu': /0#123.5 ;7. -#3 C#32#8 3($ST.<#1.%# <div id='the_menu'></div> <?php echo Tag::linkToRemote('main/getMenu', 'Texto del Enlace', 'the_menu') ?> Como la piesentacion es paicial se uebe mouificai la saliua uel contiolauoi paia solo mostiai la vista asociaua y saltai los templates o layouts. <?php class MainController extends ApplicationController { public function indexAction(){ } public function getMenuAction(){ $this->setResponse('ajax'); } } También es posible implementai eventos A}AX a meuiua que se piocesa la peticion mejoianuo la expeiiencia ue usuaiio: <div id='the_menu'></div> <?php echo Tag::linkToRemote("main/getMenu", "Texto del Enlace", "the_menu", "onLoading: $('info').update('Cargando...')") ?> 0pciones ue linkToRemote: T,93,5 K,8U1#%8.7 ^"# 8#+(9# 3($ST.<#1.%# 4.198# 6#7+8(2+(:$ confiim Peimite establecei que se piesente un cuauio ue uialogo que confiime la LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 289 peticion ue la 0RL. text Es el texto que apaieceiá en el enlace. Si no se establece el segunuo paiámetio uel enlace es tomauo. upuate Es el conteneuoi BTNL uonue se piesentaiá el conteniuo ue la vista. onLoauing Couigo }avaSciipt a ejecutai antes ue iealizai la peticion BTTP inteina. onSuccess Couigo }avaSciipt a ejecutai cuanuo la peticion se completa con éxito. El objeto con la el iesultauo peticion pueue obteneise usanuo la vaiiable 'tianspoit'. onComplete Couigo }avaSciipt a ejecutai cuanuo la peticion se completa. El objeto con la el iesultauo peticion pueue obteneise usanuo la vaiiable 'tianspoit'. onFailuie Couigo }avaSciipt a ejecutai cuanuo la peticion falla o se geneia una excepcion. El objeto con la el iesultauo peticion pueue obteneise usanuo la vaiiable 'tianspoit'. En este mismo evento se caiga el conteniuo ue la piesentacion en el conteneuoi. asynchionous Peimite establecei si la peticion es asincionica o sincionica. Se uebe establecei un valoi booleano tiue o false. Poi uefecto es false. Auicional a lo anteiioi linkToRemote acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta A. PeOdOP I.12.$#$%#7 -# ($%#8*,> -# "7",8(. public stotic function textIielJ{mixeJ $poroms) Ciea una caja ue texto con los paiámetios estableciuos. <?php echo Tag::textField("nombre") ?> El couigo BTNL geneiauo es: <input type='text' id='nombre' value='' name='nombre' /> El helpei textIielJ acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta input type="text". public stotic function textAreo{mixeJ $poroms) Peimite cieai una aiea ue texto (textaiea) con los paiámetios estableciuos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 29u /0#123.5 ;7. -#3 C#32#8 T,)55%#H%B8#, <?php echo Tag::textArea("nombre", "cols: 120", "rows: 5") ?> Lo cúal geneia el siguiente couigo BTNL: <textarea id="nombre" name="nombre" cols="120" rows="5"></textarea> El helpei textAreo acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta textaiea. public stotic function numericIielJ{mixeJ $poroms) Ciea una caja ue texto con los paiámetios estableciuos valiuanuo que su entiaua sea solo valoies numéiicos. /0#123.5 ;7. -#3 C#32#8 T,)55$"1#8(+!(#3- <?php echo Tag::numericField("accountNumber") ?> El helpei numericIielJ acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta input type="text". public stotic function numericPossworJIielJ{mixeJ $poroms) Ciea una caja ue texto paia contiaseñas con los paiámetios estableciuos valiuanuo que su entiaua sea solo valoies numéiicos. Este componente uebe sei usauo en casos especiales ue confianza ya que su natuialeza ayuuaiia a un teiceio malintencionauo a conocei que el possworJ solicitauo es un algún valoi numéiico. /0#123.5 ;7. -#3 C#32#8 $"1#8(+K,77R.8-!(#3- <?php echo Tag::numericPasswordField("password") ?> El helpei numericPossworJIielJ acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta input type="passwoiu". PeOdOc I.12.$#$%#7 -# 3(7%,7J+.19.7 public stotic function selectStotic{mixeJ $poroms) Ciea un combo con valoies estáticos estableciuos en un vectoi. /0#123.5 ;7. -#3 C#32#8 T,)557#3#+%'%,%(+ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 291 <?php $estados = array( 'A' => 'ACTIVO', 'I' => 'INACTIVO' ); echo Tag::selectStatic("estados", $estados, 'useDummy: yes'); ?> Lo cuál geneia el siguiente BTNL: <select id='estados' name='estados'> <option value='@'>Seleccione...</option> <option value='A'>ACTIVO</option> <option value='I'>INACTIVO</option> </select> 0pciones ue selectStatic: T,93,5 K,8U1#%8.7 8#+(9(-.7 2.8 7#3#+%'%,%(+ 4.198# 6#7+8(2+(:$ useBummy Inuica que se uebe colocai una opcion auicional 'Seleccione‰' al piinicipio ue la lista. El valoi ue este es una 'Ç'. uummyvalue Peimite cambiai el valoi ue la opcion Bummy ue 'Ç' al valoi inuicauo. uummyText Peimite cambiai el texto ue la opcion Bummy ue 'Seleccione‰' al texto inuicauo. Auicional a lo anteiioi selectStotic acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta SFlFCT. public stotic function select{mixeJ $poroms) Peimite geneiai una lista uesplegable meuiante un aiiay, un ActiveRecorJResultset {resultoJo Je ActiveRecorJ) ó un ActiveRecorJRow {resultoJo Je ActiveRecorJ}oin): /0#123.5 ;7. -#3 C#32#8 T,)557#3#+% <?php echo Tag::select('userId', $Users->find('order: name'), 'using: id,name', 'useDummy: yes') ?> El piimei paiámetio ue este helpei es el iu¡name que tomaiá la lista. El segunuo son los uatos ue la lista. Cuanuo se usa un ActiveRecorJResultset o ActiveRecorJRow se uebe establecei el paiámetio using, el cuál es una paieja ue atiibutos que seiá utilizaua como valoi¡texto ue caua opcion ue la etiqueta SELECT geneiaua. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 292 0pciones ue select: T,93,5 K,8U1#%8.7 8#+(9(-.7 2.8 T,)557#3#+% 4.198# 6#7+8(2+(:$ useBummy Inuica que se uebe colocai una opcion auicional 'Seleccione‰' al piinicipio ue la lista. El valoi ue este es una 'Ç'. uummyvalue Peimite cambiai el valoi ue la opcion Bummy ue 'Ç' al valoi inuicauo. uummyText Peimite cambiai el texto ue la opcion Bummy ue 'Seleccione‰' al texto inuicauo. Auicional a lo anteiioi select acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta SFlFCT. public stotic function locoleSelect{) Es iuentico al helpei select peio en este se aplica una funcion ue localizacion a caua texto ue las opcion meuiante un objeto ue tiauuccion. El siguiente ejemplo muestia los iuiomas uisponibles basauo en un objeto ue tiauuccion: /0#123.5 ;7. -#3 C#32#8 T,)553.+,3#'#3#+% <?php echo Tag::localeSelect('languageId', $Languages->find('order: name'), $traslate, 'using: id,name', 'useDummy: yes') ?> public stotic function selectHixeJ{) Este métouo peimite cieai listas combinanuo aiiays ue valoies estáticos y iesultauos uinámicos. /0#123.5 ;7. -#3 C#32#8 T,)557#3#+%@(H#- <?php $dynamicData = $Categories->find(); $staticData = array( ‘N’ => ‘NINGUNO DE LOS ANTERIORES’ ); echo Tag::selectMixed('categoriesId', $dynamicData, $staticData, 'using: id,name', 'useDummy: yes') ?> Las opciones auicionales ue selectStotic y select también aplican a selectHixeJ. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 29S public stotic function submitlmoqe{$coption, $src) Peimite cieai un boton ue envio ue foimulaiio con una imagen en vez ue un texto. Recibe como paiámetios "caption" que contenuiá el texto que apaiece en caso ue que la imágen no pueua sei caigaua. "sic" especifica la iuta ue la imagen. /0#123.5 ;7. -#3 C#32#8 T,)557"91(%Z1,)# <?php echo Tag::submitImage('Enviar', Core::getInstancePath.'img/submit.png') ?> Auicionalmente este helpei acepta como paiámetio cualquiei atiibuto o piopieuau que pueua sei aplicable a la etiqueta input type='image'. public static function button() Peimite cieai un boton tipico ue BTNL sin ninguna accion poi uefecto. /0#123.5 ;7. -#3 C#32#8 T,)559"%%.$ <?php echo Tag::button('Actualizar','id: update','onclick: actualiza()') ?> Recibe auemás los cualquiei evento que pueua uefiniise paia el boton con su coiiesponuiente accion en javasciipt. public stotic function imoqe{$imq) Incluye una imagen en una vista tenienuo en cuenta el uiieccionamiento ue los uiiectoiios uel fiamewoik. El paiámetio "img" uefine el nombie ue la imagen que uebe estai incluiua uentio ue la caipeta 'img'. /0#123.5 ;7. -#3 C#32#8 T,)55(1,)# <?php echo Tag::image('imagen.png', 'alt: Imagen') ?> 0pciones ue image: T,93,5 K,8U1#%8.7 8#+(9(-.7 2.8 T,)55(1,)# 4.198# 6#7+8(2+(:$ alt Especifica un texto alteinativo paia la imagen. public stotic function formRemote{$poroms) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 294 Peimite geneiai un foimulaiio iemoto, que seiá enviauo con una peticion ue Ajax. El paiámetio "paiams" peimite ingiesai una seiie ue opciones paia el helpei.El piimei paiámetio ingiesauo es el que uefine el valoi ue la piopieuau action paia la etiqueta 'foim'. /0#123.5 ;7. -#3 C#32#8 T,)55*.81<#1.%# <?php echo Tag::formRemote('usuarios/buscar','update: findResults','required: name') ?> 0pciones ue foimRemote: T,93,5 K,8U1#%8.7 ^"# 8#+(9# *.81<#1.%# 4.198# 6#7+8(2+(:$ action valoi que tenuiá la piopieuau 'action' uel foimulaiio. complete Callback que contenuiá el couigo javasciipt que se ejecutaiá una vez se active el evento complete uel foimulaiio. befote Callback que contenuiá el couigo javasciipt que se ejecutaiá antes ue que el foimulaiio sea enviauo. success Callback que contenuiá el couigo javasciipt que se ejecutaiá una vez se active el evento success uel foimulaiio. iequiieu Coleccion ue campos que son iequeiiuos paia el foimulaiio, ocuiie una valiuacion ue uichos campos antes ue hacei el envio. upuate Iu ue la etiqueta que seiá actualizaua una vez se complete el envio. public stotic function submitRemote{$coption) Ciea un boton ue envio paia el foimulaiio iemoto actual. El paiámetio "caption" uefine el texto que se muestia en el boton. /0#123.5 ;7. -#3 C#32#8 T,)557"91(%<#1.%# <?php echo Tag::submitRemote('Buscar', 'update: findResults') ?> 0pciones ue submitRemote: T,93,5 K,8U1#%8.7 ^"# 8#+(9# T,)557"91(%<#1.%# LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 29S 4.198# 6#7+8(2+(:$ caption valoi que tenuiá la piopieuau 'value' uel boton. complete Callback que contenuiá el couigo javasciipt que se ejecutaiá una vez se active el evento complete uel foimulaiio. befoie Callback que contenuiá el couigo javasciipt que se ejecutaiá antes ue que el foimulaiio sea enviauo. success Callback que contenuiá el couigo javasciipt que se ejecutaiá una vez se active el evento success uel foimulaiio. upuate Iu ue la etiqueta que seiá actualizaua una vez se complete el envio. public stotic function form{$oction) Ciea una etiqueta ue apeituia ue un foimulaiio. El paiámetio "action" es el valoi ue la piopieuau 'action' uel foimulaiio. /0#123.5 ;7. -#3 C#32#8 T,)55*.81 <?php echo Tag::form('usuarios/buscar','id: formSearch') ?> 0pciones ue submitRemote: T,93,5 K,8U1#%8.7 ^"# 8#+(9# #3 C#32#8 T,)55*.81 4.198# 6#7+8(2+(:$ action valoi que tenuiá la piopieuau 'action' uel foimulaiio. methou Nétouo que seiá usauo paia el envio uel foimulaiio. confiim Si es ueclaiauo uefine el mensaje ue confiimacion paia el envio uel foimulaiio. onsubmit Callback que contenuiá el couigo javasciipt que se ejecutaiá una vez se active el evento submit uel foimulaiio. public stotic function enJIorm{) Etiqueta que finaliza el foimulaiio, coiiesponue al couigo ue cieiie ue uicha etiqueta. /0#123.5 ;7. -#3 C#32#8 T,)55#$-!.81VW <?php echo Tag::endForm() ?> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 296 ueneia el siguiente couigo XBTNL: </form> public stotic function submitButton{$coption) Peimite cieai un boton ue envio paia el foimulaiio actual. Ingiesa como paiámetio el valoi uel texto que seiá mostiauo en el boton. Auemás iecibe cualquiei atiibuto que pueua sei aplicable a una etiqueta input type='submit'. /0#123.5 ;7. -#3 C#32#8 T,)557"91(%k"%%.$ <?php echo Tag::submitButton('Buscar', 'id: submitSearch') ?> PeOdOd T8,%,1(#$%. -# #%(^"#%,7 @/TB public stotic function setHeto{strinq $nome, strinq $content) Caiga en memoiia una etiqueta Neta paia las cabeceias uel uocumento BTNL. Recibe el nombie ue la etiqueta y un conteniuo paia la misma. /0#123.5 ;7. -#3 C#32#8 T,)557#%@#%, <?php echo Tag::setMeta('description','Busqueda de usuarios.') ?> public stotic function qetHetos{) Impiime las etiquetas Neta que han siuo caigauas pieviamente. No iecibe paiámetios e impiime automáticamente el iesultauo en el uocumento BTNL. /0#123.5 ;7. -#3 C#32#8 T,)55)#%@#%,7VW <?php Tag::getMetas() ?> PeOdON T8,%,1(#$%. # Z$+3"7(:$ -# ,8+C(M.7 I'' public stotic function stylesbeetlink{strinq $src='', $usevoriobles=folse) Auiciona una etiqueta ue link que incluye un aichivo CSS tenienuo en cuenta las iutas que se uefinen en Kumbia Enteipiise. El piimei paiámetio constituye la iuta ue ubicacion uel aichivo CSS, el segunuo ueteimina si se usaiá un tiauuctoi ue las vaiiables globales que se pueuen especificai en los aichivos CSS. /0#123.5 ;7. -#3 C#32#8 T,)557%\3#'C##%E($S <?php echo Tag::stylesheetLink('calendar', true) ?> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 297 Las vaiiables CSS pueuen usaise paia ieemplazai iutas absolutas que ayuuen aseguiai que imagenes u otios iecuisos seian estableciuos coiiectamente. Las posibles vaiiables que se pueuen utilizai son: T,93,5 Y,8(,93#7 I'' ^"# 7.2.8%, #3 T,)557%\3#'C##%E($S Y,8(,93# 6#7+8(2+(:$ Çpath Ruta absoluta uel seiviuoi web hacia la instancia uel fiamewoik. Çimg_path Ruta absoluta uel seiviuoi web hacia el uiiectoiio img ue la instancia uel fiamewoik. Çcss_path Ruta absoluta uel seiviuoi web hacia el uiiectoiio css ue la instancia uel fiamewoik. En una clase CSS las vaiiables se utilizan asi: /0#123.5 ;7. -# M,8(,93#7 I'' +.$ T,)557%\3#7C##%E($S .header { background-image: url(“@path/img/site/bg-header.gif”); } Paia aumentai el ienuimiento uel ieemplazo ue vaiiables en aichivos CSS estos se cachean en el uiiectoiio temp¡ y se iefiescan cuanuo se uetecta cambios en ellos. public stotic function removeStylesbeets{) Remueve los tags ue css agiegauos. PeOdOe I.12.$#$%#7 2,8, *#+C,7 public stotic function JoteIielJ{mixeJ $poroms) Peimite valiuai que los uato captuiauo sea una fecha. Este helpei ciea S listas una paia los meses, uias y otia paia los años. Los nombies ue los meses se muestian en el iuioma ue la localizacion activa. El valoi captuiauo se almacena en un input oculto con el nombie uel JoteIielJ. /0#123.5 ;7. -# C#32#8 T,)55-,%#!(#3- <?php echo Tag::dateField("fechaInicial") ?> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 298 Poi uefecto JoteIielJ muestia la fecha 1 ue eneio uel año en cuiso, sin embaigo esta fecha no es váliua. 0pciones ue JoteIielJ: T,93,5 K,8U1#%8.7 ^"# ,+#2%, T,)55-,%#!(#3- 4.198# 6#7+8(2+(:$ staitYeai Inuica el año menoi que tenuiá la lista año. finalYeai Inuica el año mayoi que tenuiá la lista año. useBummy Inuica si se uebe foizai al usuaiio a seleccionai un valoi valiuo. Auicional a lo anteiioi JoteIielJ acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta toble. public stotic function locoleBoteIielJ{mixeJ $poroms, Troslote $troslote) Es iuentico a JoteIielJ peio los nombies ue los meses son tomauos ue la lista ue localizacion actual peimitienuo mostiailos vaiios iuiomas. /0#123.5 ;7. -#3 C#32#8 T,)553.+,3#6,%#!(#3- <?php echo Tag::localeDateField("fechaInicial", $traslate) ?> El helpei locoleBoteIielJ acepta como paiámetio cualquiei nombie ue atiibuto aplicable a la etiqueta toble. PeOdOa Z$+3"(8 8#+"87.7 ],M,7+8(2% public stotic function jovoscriptlncluJe{strinq $src='', booleon $cocbe=true) Peimite inseitai una etiqueta <sciipt• con la iefeiencia a un aichivo javasciipt ue la instancia actual. La extension .js uebe sei omitiua ya que el helpei la agiega automáticamente. /0#123.5 ;7. -#3 C#32#8 T,)550,M,7+8(2%Z$+3"-# <?php echo Tag::javascriptInclude(“lightbox”) ?> ueneia el couigo BTNL: <script type='text/javascript' src='/instance/javascript/lightbox.js'></script> Cuanuo se pasa false en el segunuo paiámetio se agiega a la 0RL uel BTNL geneiauo el LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 299 paiámetio uET nocache=valoi uonue valoi es un enteio aleatoiio entie u y 999999. Be esta foima se obliga al navegauoi a iecaigai el iecuiso javasciipt en caua peticion. /0#123.5 ;7. -#3 C#32#8 T,)550,M,7+8(2%Z$+3"-# +.$ +,+C# <?php echo Tag::javascriptInclude(“lightbox”, false) ?> ueneia el couigo BTNL: <script type='text/javascript' src='/instance/javascript/lightbox.js?nocache=18261'></script> Si se omite el nombie uel }avaSciipt se tiata ue inseitai un aichivo con el mismo nombie uel contiolauoi actual. public stotic function jovoscriptHinifieJlncluJe{strinq $src='') Peimite inseitai un javasciipt minimizauo con }sNin. El paiámetio $sic es la ubicacion uel aichivo en el seiviuoi una veision pública es geneiaua la cuál es iegeneiaua caua vez que se mouifica el aichivo oiiginal. Los aichivos javasciipt minimizauos consumen menoi ancho ue banua y pueuen aumentai la velociuau ue caiga ue la aplicacion en clientes con velociuaues ue conexion ieuuciuas. /0#123.5 ;7. -#3 C#32#8 T,)550,M,7+8(2%@($(*(#-Z$+3"-# <?php echo Tag::javascriptMinifiedInclude(“lightbox”) ?> ueneia el couigo BTNL: <script type='text/javascript' src='/instance/javascript/lightbox.min.js'></script> El uiiectoiio public¡javasciipt uebe tenei peimisos ue esciituia paia usai este helpei. PeOdO` Z$%#8,++(:$ +.$ 3, 28#7#$%,+(:$ stotic function voiJ JisployTo{strinq $iJ, strinq $volue) Establece el valoi paia un componente visual uel foimulaiio que se va a piesentai en la peticion actual. El valoi uefiniuo meuiante este helpei tiene mayoi piioiiuau cuanuo se tiata ue obtenei el valoi ue los componentes visuales. /0#123.5 ;7. -#3 C#32#8 T,)55-(723,\T. <?php Tag::displayTo(“nombre”, “Juanita Mendoza”); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Suu En la vista la caja "nombie" se muestia con el valoi estableciuo: <?php echo Tag::textField(“nombre”) ?> lo que piouuce: <input type=”text” id=”nombre” name=”nombre” value=”Juanita Mendoza” /> stotic function mixeJ qetvolueIromAction{strinq $nome) Peimite obtenei el valoi que seiá piesentauo en un componente visual como lo es una caja ue texto o una lista (combo). Touos los helpeis iealizan un llamauo inteino usanuo este métouo paia obtenei el valoi a piesentai uepenuienuo la natuialeza ue caua uno. Los valoies son obteniuos en este oiuen: ! Se veiifica si existe algún valoi paia él asignauo con Toq::JisployTo y lo tomo como volor ! Se veiifica si hay algún inuice en $_P0ST que coinciua con el atiibuto "iu" ue él y toma como valoi ! veifica si existe un atiibuto público en el último contiolauoi ejecutauo que coinciua con /0#123.5 ;7. -#3 C#32#8 T,)55)#%Y,3"#!8.1B+%(.$ <?php $nameValue = Tag::getValueFromAction(‘nameValue’); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su1 27 Helpers JavaScript 27.1 Introducción En este capitulo se uesciiben clases y funciones en }avaSciipt que piopoiciona el fiamewoik al uesaiiollauoi paia agilizai el pioceso ue cieacion ue captuias y piesentacion ue uatos e infoimacion al usuaiio final. 27.2 Clase Format Esta clase peimite uaile foimato a los uifeientes tipos ue uatos que pueuen sei incluiuos uentio ue una captuia ue uatos o una vista tal. Está enteiamente couificaua en javasciipt usanuo el fiamewoik Piototype. Tiene licencia ue uso y mouifcacion totalmente abieita y hace paite uel pioyecto ue Beiiamientas }avaSciipt ue uso común en Aplicaciones Web. PaOPOb Z$7%,$+(,$-. 3, +3,7# Paia iniciai el uso ue esta heiiamienta es necesaiio cieai un objeto que uefiniiá las piopieuaues que se usaián paia uaile foimato a los uatos. Esto se logia ue la siguiente maneia: /0#123.5 ;7. -#3 C#32#8 ],M,'+8(2% !.81,% <script type="text/javascript"> var format = new Format({ type: 'numeric', properties: { decimals: 2, letNegative: false, blankToZero: false } }, { type: 'percent', properties: { decimals: 3, complete: 2 } }, { type: 'money', properties: { decimals: 2, simbMon: 'US$', leftZeros: 1 } }); </script> Pueue notai que no touas estas piopieuaues ueben sei uefiniuas, touas poseen valoies poi uefecto que seián usauos en piincipio paia el foimato. Estas piopieuaues son ueteiminauas poi el tipo, con lo cual se usa la notacion type: 'nombie_tipo', piopeities: †piopieuaues‡. Los tipos ue uatos sopoitauos poi el Foimat son: numeiic, que uefine las piopieuaues paia los valoies que seián numéiicos, tanto enteios como punto flotante„ peicent, paia los valoies que tienen un foimato ue poicentaje„ money en el cual se establecen los atiibutos paia los uatos tipo moneua. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su2 0pciones uel constiuctoi ue Foimat: T,93,5 K,8U1#%8.7 ^"# 8#+(9# #3 C#32#8 0,M,7+8(2% !.81,% 4.198# Y,3.8 2.8 6#*#+%. B23(+,93# , 6#7+8(2+(:$ uecimals u touas Establece el númeio ue uecimales. puntoBec ',' touas Caiáctei paia el punto uecimal. sepNiles '.' touas Caiáctei paia el sepaiauoi ue Niles. simbPei '%' peicent Simbolo ue poicentaje. simbNon '$' money Simbolo ue moneua. letNegative tiue touas Establece si peimite negativos o no. blankToZeio tiue touas Befine si un valoi vacio es puesto como ceio. leftZeios u touas Númeio ue ceios que seián añauiuos a la izquieiua uel uato. complete u touas Tamaño obligatoiio que ueben tenei los uatos en su paite enteia. completeCaiactei 'u' touas Caiáctei que se usaiá paia completai los uatos. onCompleteTiuncate tiue touas Befine si se tiuncaiá un uato si este supeia el tamaño uefiniuo en complete. No aplica si complete es ceio. 0so uel Foimat: <div><input id="temp" type="text" /></div> Númeiico: <input type='boton' onclick='formatoNumerico()' /> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SuS <input type='boton' onclick='deFormatoNumerico()' /> <script type="text/javascript"> function formatoNumerico(){ $('temp').value = format.numeric($F('temp')); } function deFormatoNumerico(){ $('temp').value = format.deFormat($F('temp'),'numeric'); } </script> Notese que una vez que ha siuo cieauo el objeto foimat lo único que uebe haceise es usailo paia uai foimato a los uatos que se tengan, asimismo es posible ueshacei uicho foimato hacienuo uso ue la funcion ueFoimat. También es impoitante obseivai que touos los llamauos son uinámicos y uebe usaise un objeto uefiniuo paia ello es uecii, antes ue usai cualquiei funcion es necesaiio cieai un objeto como se inuica en el apaitauo Instancianuo la clase, y una vez hecho esto touas las funciones se ueben invocai con vaiiable.funcion(paiámetios). PaOPOP !"$+(.$#7 -# !.81,% numeric{number) Foimatea un númeio que es ingiesauo como paiámetio usanuo las piopieuaues uefiniuas paia los tipo numeiic al instanciai la clase o que hayan siuo estableciuas con el métouo changePiopeities. Retoina una cauena ue caiacteies que posee el foimato auecuauo. money{number) Foimatea un númeio que es ingiesauo como paiámetio usanuo las piopieuaues uefiniuas paia los tipo money al instanciai la clase o que hayan siuo estableciuas con el métouo changePiopeities. Retoina una cauena ue caiacteies que posee el foimato auecuauo, agieganuo el simbolo ue pesos iequeiiuo. percent{number) Foimatea un númeio que es ingiesauo como paiámetio usanuo las piopieuaues uefiniuas paia los tipo percent al instanciai la clase o que hayan siuo estableciuas con el métouo changePiopeities. Retoina una cauena ue caiacteies que posee el foimato auecuauo, agieganuo el simbolo poicentual uefiniuo. cbonqeProperties{) Cambia las piopieuaues uel tipo especificauo. Las piopieuaues que no sean incluiuas conseivan su valoi anteiioi. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su4 format.changeProperties({type: 'numeric', properties: { letNegative: false } }); JeIormot{str,type) Befoimatea una cauena ue caiacteies. Recibe como paiámetios "sti" que iepiesenta la cauena ue texto a piocesai„ "type" que uebe sei el tipo ue foimato al que fue sometiua uicha cauena. 27.3 Clase Validator Esta clase peimite iealizai valiuaciones a los uifeientes uatos que pueuen sei incluiuos uentio ue una captuia ue uatos o una vista tal. Está enteiamente couificaua en javasciipt usanuo el fiamewoik Piototype. Tiene licencia ue uso y mouifcacion totalmente abieita y hace paite uel pioyecto ue Beiiamientas }avaSciipt ue uso común en aplicaciones Web. PaOcOb Z$7%,$+(,$-. 3, +3,7# Antes ue hacei uso ue esta clase uebe instanciaise un objeto que contenuiá las piopieuaues paia las valiuaciones que se iequieian. El constiuctoi uel objeto acepta tipos pieuefiniuos y otios peisonalizauos que se uefinen uinámicamente. Tipos ue uato pieuefiniuos en valiuatoi: T,93,5 T(2.7 -# -,%.7 ^"# 8#+(9# #3 C#32#8 ],M,7+8(2% Y,3(-,%.8 4.198# 6#7+8(2+(:$ text Tipo que iepiesenta valoies textuales. numbei Se asocia a los númeios enteios. uecimal Se asocia a los númeios uecimales. uate Tipo uefiniuo paia las fechas. select Este tipo ue uato es usauo en los combos ue seleccion. email Tipo que se usa paia los campos que ueben contenei un email. foimat_numbei Se usa paia uefinii los foimatos numéiicos establecienuo una asociacion con algún objeto uel tipo foimat que seiá aplicauo sobie ese campo. foimat_uecimal Relaciona una vaiiable ue la clase Foimat con un campo que contenuiá valoies uecimales. foimat_money Relaciona una vaiiable ue la clase Foimat con un campo que LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SuS contenuiá valoies ue moneua. foimat_peicent Relaciona una vaiiable ue la clase Foimat con un campo que contenuiá valoies poicentaje. <script type="text/javascript"> var val = new Validator(); </script> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su6 28 Componente PDFDocument 28.1 Introducción El objetivo uel componente PBIBocument es la geneiacion ue uocumentos PBF. Está basauo en la estable libieiia FPBF peio auaptauo y mejoiauo paia sei integiauo como paite uel fiamewoik y haceilo paite ue su "gaiantia". Las mejoias con iespecto a FPBF son: ! Sopoite paia múltiples chaisets IS088S9-1, 0TF-8, etc. ! Faciliuaues paia uefinii coloies y estilos ! Sintaxis y API más iegulai acoiue al estánuai uel fiamewoik 28.2 Crear un documento PDF 0n uocumento PBF se ciea instancianuo la clase PufBocument. En el siguiente ejemplo se ciea agiega una página con un texto y se envia al navegauoi. /0#123.5 I8#,8 "$ -.+"1#$%. K6! +.$ K6!6.+"1#$% <?php class ReportsController extends ApplicationController { public function showAction(){ $pdf = new PdfDocument(); $pdf->addPage(); $black = PdfColor::fromName(PdfColor::COLOR_BLACK); $pdf->setTextColor($black); $pdf->setFont('helvetica', '', 18); $pdf->writeCell(40, 10, "Hello PDF"); $pdf->outputToBrowser(); } } 28.3 Agregar una tabla al documento PufBocument piopoiciona sopoite paia celuas y multi-celuas las cuales son útiles cuanuo se ciean uocumentos que van a visualizai tablas ue uatos. En el siguiente ejemplo se geneia un uocumento PBF con los uatos obteniuos ue un mouelo: /0#123.5 I8#,8 "$, %,93, +.$ -,%.7 #$ "$ -.+"1#$%. K6! <?php LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su7 class ReportsController extends ApplicationController { public function showAction(){ $pdf = new PdfDocument(); $pdf->addPage(); $black = PdfColor::fromName(PdfColor::COLOR_BLACK); $pdf->setTextColor($black); //Agregar el titulo $pdf->setFont('helvetica', '', 18); $pdf->writeCell(40, 7, "Reporte de Productos"); $pdf->lineFeed(); //La fecha del reporte $pdf->setFont('helvetica', '', 12); $pdf->writeCell(40, 7, "Fecha: ".Date::getCurrentDate()); $pdf->lineFeed(); foreach($this->Products->find('order: id') as $product){ $pdf->writeCell(20, 7, $product->getId()); $pdf->writeCell(70, 7, $product->getName()); $pdf->lineFeed(); } $pdf->outputToBrowser(); } } 0na veision más estilizaua uel iepoite¡listauo se pueue obtenei agieganuo boiues, encabezauos y coloies ue fonuo al uocumento: /0#123.5 I8#,8 "$ -.+"1#$%. K6! +.$ "$, %,93, -# -,%.7 1U7 #7%(3(>,-, <?php class ReportsController extends ApplicationController { public function showAction(){ $pdf = new PdfDocument(); $pdf->addPage(); //Los datos de entrada son UTF-8 $pdf->setEncoding(PdfDocument::ENC_UTF8); $black = PdfColor::fromName(PdfColor::COLOR_BLACK); $pdf->setTextColor($black); //Agregar el titulo $pdf->setFont('helvetica', '', 18); $pdf->writeCell(40, 7, "Reporte de Productos"); $pdf->lineFeed(); //La fecha del reporte $pdf->setFont('helvetica', '', 12); $pdf->writeCell(40, 7, "Fecha: ".Date::getCurrentDate()); $pdf->lineFeed(); //Encabezados con fondo gris $lightGray = PdfColor::fromGrayScale(0.75); $pdf->setFillColor($lightGray); $pdf->writeCell(20, 7, 'Código', 1, 0, PdfDocument::ALIGN_JUSTIFY, 1); $pdf->writeCell(90, 7, 'Nombre', 1, 0, PdfDocument::ALIGN_JUSTIFY, 1); $pdf->lineFeed(); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su8 //Volver al fondo blanco $white = PdfColor::fromName(PdfColor::COLOR_WHITE); $pdf->setFillColor($white); foreach($this->Products->find('order: id') as $product){ $pdf->writeCell(20, 7, $product->getId(), 1, 0, PdfDocument::ALIGN_JUSTIFY, 1); $pdf->writeCell(70, 7, $product->getName(), 1, 0, PdfDocument::ALIGN_JUSTIFY, 1);); $pdf->lineFeed(); } //Se envia el listado al navegador $pdf->outputToBrowser(); } } 28.4 Tipos de Papel Soportados PufBocument sopoita los siguientes tipos ue papel: T,93,5 T(2.7 -# 2,2#3 7.2.8%,-.7 2.8 K-*6.+"1#$% I.$7%,$%# T(2. K,2#3 6#7+8(2+(:$ PAPER_AS Tipo ue papel AS PAPER_A4 Tipo ue papel A4 PAPER_AS Tipo ue papel AS PAPER_LEuAL Tipo ue papel oficio PAPER_LETTER Tipo ue papel caita 28.5 API de PdfDocument function voiJ __construct{$orientotion=self::0Rl_P0RTRAlT, $unit=self::0NlT_HH, $formot=self::PAPFR_A4) Es el constiuctoi ue PufBocument. Poi uefecto se establece oiientacion veitical, meuiuas en milimetios y papel tipo A4. public function setFncoJinq{$encoJinq) Establece la couificacion uel texto ue entiaua a métouos como wiiteCell, wiiteText y wiiteNultiCell. Las couificaciones sopoitauas son: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia Su9 T,93,5 T(2.7 -# +.-(*(+,+(.$#7 7.2.8%,-,7 2.8 K-*6.+"1#$% I.$7%,$%# I.-(*(+,+(:$ 6#7+8(2+(:$ ENC_IS088S91 Couificacion IS0-88S9-1 o latin occiuental. ENC_0TF8 Couificacion 0nicoue 0TF-8 ENC_IS08u22}P Couificacion }aponesa IS0-8u22-}P function voiJ setBebuq{booleon $Jebuq) Establece si el uocumento se geneia en mouo uebug o no. Poi uefecto es false. Si se envia el uocumento al navegauoi en mouo uebug se visualiza el foimato inteino uel uocumento PBF. function voiJ setHorqins{inteqer $left, inteqer $top, inteqer $riqbt=-1) Peimite establecei las maigenes uel uocumento PBF. El piimei paiámetio es la maigen izquieiua, el segunuo la supeiioi y el teiceio la ueiecha. Si no se inuica el teicei paiámetio la maigen ueiecha queua igual a la izquieiua. function voiJ setleftHorqin{inteqer $morqin) Establece la maigen izquieiua uel uocumento PBF. function voiJ setTopHorqin{inteqer $morqin) Establece la maigen supeiioi uel uocumento PBF. function voiJ setRiqbtHorqin{inteqer $morqin) Establece la maigen ueiecha uel uocumento PBF. function voiJ setAutoPoqeBreok{booleon $outo, inteqer $morqin=0) Establece si se uebe agiegai una página automáticamente cuanuo se exceua el limite infeiioi al ii agieganuo iegistios. El paiámetio $maigin peimite establecei la maigen infeiioi uonue se exceue el limite ue caua página. El compoitamiento poi uefecto es que se haga el salto ue página automáticamente. function voiJ setBisployHoJe{int $zoom, strinq $loyout=1) Peimite establecei el tipo ue visualizacion uel uocumento que el softwaie ue visualizacion uebe tomai poi uefecto. Los posibles valoies son constantes ue la clase PufBocument: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S1u T,93,5 T(2.7 -# >..1 #$ -.+"1#$%.7 K6! I.$7%,$%# o..1 6#7+8(2+(:$ LAY00T_BEFA0LT Es el tipo ue zoom poi uefecto que tenga el softwaie ue visualizacion utilizauo pai vei el uocumento PBF. LAY00T_C0NTIN000S Inuica que no se uebe vei el páginauo sino que una página se visualiza una tias otia como si estuvieian uniuas. LAY00T_SINuLE Inuica que se uebe visualizai una página completa a la vez LAY00T_TW0 Inuica que se uebe visualizai uos páginas completas a la vez. function voiJ setCompression{booleon $compress) Inuica si el uocumento PBF uebe sei compiimiuo paia ieuucii su tamaño final. Paia usai la opcion ue compiesion es necesaiio que la extension ue php llamaua zlib esté habilitaua. function voiJ setTitle{strinq $title) Establece el titulo uel uocumento PBF. function voiJ setSubject{strinq $subject) Establece el asunto uel uocumento PBF. function voiu setAuthoi(stiing $authoi) Establece el autoi uel uocumento PBF. function voiJ setKeyworJs{strinq $keyworJs) Establece las palabias clave uel uocumento PBF. function voiJ setCreotor{strinq $creotor) Establece el cieauoi uel uocumento PBF. function voiu aliasNbPages(stiing $alias='†nb‡') Establece la cauena utilizaua paia ieemplazai el númeio ue página total ue un uocumento PBF en encabezauos y pie ue página. function voiJ open{) Abie el uocumento PBF. Es necesaiio hacei el llamauo a este métouo paia inicializai el LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S11 uocumento. function voiJ close{) Cieiia el uocumento PBF. function voiJ oJJPoqe{int $orientotion=PJfBocument::0R_P0RTRAlT) Agiega una página al uocumento PBF. La oiientacion poi uefecto es veitical. Las posibles oiientaciones son: T,93,5 T(2.7 -# .8(#$%,+(:$ -# 2U)($, 7.2.8%,-,7 2.8 K-*6.+"1#$% I.$7%,$%# [8(#$%,+(:$ 6#7+8(2+(:$ 0R_P0RTRAIT 0iientacion veitical. 0R_LANBSCAPE 0iientacion hoiizontal. Es posible utilizai uifeientes oiientaciones en un mismo uocumento PBF. function inteqer qetPoqeNumber{) 0btiene el númeio ue página actual. function voiJ setBrowColor{inteqer $reJ, inteqer $qreen=-1, inteqer $blue=-1) function voiJ setBrowColor{PJfColor $color) Establece el coloi con el que se uibujaián las lineas y boiues uel uocumento. Este métouo iecibe S paiámetios que coiiesponuen a los niveles RuB uel coloi ueseauo. Caua nivel es un enteio entie u y 2SS. Auicionalmente pueue iecibii un objeto PufColoi con el coloi a establecei. Si no se inuican valoies paia $gieen y $blue se utiliza el valoi uefiniuo en $ieu paia estos. function voiJ cbeckTTI{strinq $file) Consulta si un aichivo ue fuente TiueType peimite sei embebiuo en uocumentos PBF. function voiJ setIillColor{inteqer $reJ, inteqer $qreen=-1, inteqer $blue=-1) function voiJ setIillColor{PJfColor $color) Establece el coloi con el que se haiá el ielleno ue cuauios y celuas uel uocumento. Este métouo iecibe S paiámetios que coiiesponuen a los niveles RuB uel coloi ueseauo. Caua nivel LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S12 es un enteio entie u y 2SS. Auicionalmente pueue iecibii un objeto PufColoi con el coloi a establecei. Si no se inuican valoies paia $gieen y $blue se utiliza el valoi uefiniuo en $ieu paia estos. function voiJ setTextColor{inteqer $reJ, inteqer $qreen=-1, inteqer $blue=-1) function voiJ setIillColor{PJfColor $color) Establece el coloi ue los textos uel uocumento. Este métouo iecibe S paiámetios que coiiesponuen a los niveles RuB uel coloi ueseauo. Caua nivel es un enteio entie u y 2SS. Auicionalmente pueue iecibii un objeto PufColoi con el coloi a establecei. Si no se inuican valoies paia $gieen y $blue se utiliza el valoi uefiniuo en $ieu paia estos. function Jouble qetStrinqWiJtb{strinq $s) Peimite obtenei el tamaño ue una cauena ue caiácteies ue acueiuo a la fuente activa en el uocumento. function voiJ setlineWiJtb{inteqer $wiJtb) Establece el ancho ue linea ue la página activa uel uocumento. function voiJ Jrowline{inteqer $x1, inteqer $y1, inteqer $x2, inteqer $y2) Peimite uibujai una linea iecta en la página activa uel uocumento. function voiJ JrowRect{inteqer $x, inteqer $y, inteqer $w, inteqer $b, strinq $style='') Peimite uibujai un cuauiauo o iectángulo en la página activa uel uocumento. function voiJ oJJIont{strinq $fomily, strinq $style='', strinq $file='') Agiega una fuente que no haga paite ue las fuentes coie. Las fuentes coie son: Belvetica, aiial, times, symbol y zapfuingbats. function voiJ setIont{strinq $fomily, strinq $style='', inteqer $size=0) Establece la fuente activa en el uocumento. Si es una fuente coie pueue sei: Belvetica, aiial, times, symbol y zapfuingbats. Si es una fuente agiegaua con auuFont se uebe utilizai el mismo nombie paia $family utilizauo en ella. function voiJ setIontSize{inteqer $size) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S1S Establece el tamaño ue la fuente activa en puntos (pt). function voiJ link{inteqer $x, inteqer $y, inteqer $wiJtb, inteqer $beiqbt, strinq $link) Agiega un enlace al uocumento PBF en las posiciones inuicauas. function voiJ writeText{inteqer $x, inteqer $y, strinq $txt) Agiega un texto al uocumento PBF en las posiciones inuicauas. function booleon occeptPoqeBreok{) Inuica si el uocumento tiene el salto automático ue página al supeiai la maigen infeiioi ue una página. function voiJ writeCell{inteqer $w, inteqer $b=0, strinq $txt='', inteqer $borJer=0, inteqer $ln=0, strinq $oliqn='', inteqer $fill=0, strinq $link='') Bibuja una celua en el uocumento PBF con los paiámetios uefiniuos. El paiámetio $w inuica el ancho ue la celua, $h es el alto, $txt es el texto, $boiuei pueue sei 1 o u e inuica si la celua uebe tenei un boiue visible, $ln pueue sei 1 o u e inuica si el conteniuo ue la celua es un enlace, $fill pueue sei 1 o u e inuica si la celua uebe sei coloieaua, $link es el enlace y aplica solo cuanuo $ln es 1. function voiu wiiteNultiCell(integei $w, integei $h, stiing $txt, integei $boiuei=u, stiing $align=PufBocument::ALIuN_}0STIFY, integei $fill=u) function voiJ write{inteqer $b, strinq $txt, strinq $link='') Agiega un texto al uocumento PBF en las cooiuenauas actuales. function voiJ oJJlmoqe{strinq $file, inteqer $x, inteqer $y, inteqer $w=0, inteqer $b=0, strinq $type='', strinq $link='') function voiJ lineIeeJ{strinq $b='') Realiza un salto ue linea en el uocumento aumentanuo la cooiuenaua "y" y ieinicianuo "x" al valoi uel maigen izquieiuo. El tamaño opcional uel salto ue linea pueue inuicaise con $h. function integei getX() LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S14 Bevuelve el valoi ue la cooiuenaua en "x" (hoiizontal) uonue se piouuciiá la siguiente ienueiizacion ue texto o figuias uel uocumento. function voiu setX(integei $x) Establece la cooiuenaua en "x" (hoiizontal) uonue se piouuciiá la siguiente ienueiizacion ue texto o figuias uel uocumento. function floot qetY{) Bevuelve el valoi ue la cooiuenaua en "y" (veitical) uonue se piouuciiá la siguiente ienueiizacion ue texto o figuias uel uocumento. function voiJ setY{inteqer $y) Establece la cooiuenaua en "y" (veitical) uonue se piouuciiá la siguiente ienueiizacion ue texto o figuias uel uocumento. function voiJ setXY{inteqer $x, inteqer $y) Establece simultaneamente las cooiuenauas en "y" (veitical) y "x" (hoiizontal) uonue se piouuciiá la siguiente ienueiizacion ue texto o figuias uel uocumento. function strinq outputBocument{strinq $nome='', strinq $Jest='') function strinq outputToBrowser{) Envia el iepoite uiiectamente al navegauoi. El uesaiiollauoi uebe ceicioiaise que otios conteniuos no sean enviauos junto con la saliua ya que esto geneiaiá una excepcion. function int qetAvoilobleWiJtb{) function voiJ setIontPotb{strinq $potb) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S1S 29 Componente Report 29.1 Introducción El objetivo uel componente Report es cieai una capa ue abstiaccion consitente que peimita meuiante una misma API cieai listauos o iepoites a vaiios foimatos apiovechanuo las caiacteiisticas ue caua uno sin iequeiii esfueizo auicional. El alcance ue la funcionaliuau ue este componente es limitauo ya que caua muchas ue las caiacteiisticas ue un tipo ue foimato no son fácilmente iepiouucibles en otios y viceveisa. Repoites y listauos ue complejiuau meuia con iespecto a su piesentacion son la "auuiencia" espeiaua ue este componente. 29.2 Alcance del componente Las siguientes caiacteiisticas ue piesentacion están sopoitauas en los iepoites geneiauos: • Paginacion automática a tipo ue papel "caita" (lettei), A4 y oficio ("legal"). • Tablas con encabezauos • Foimato ue coloies, fuentes, sombieauo, subiayauo e italica a los textos • Boiues con o sin coloies en las tablas • Alineacion ue Texto Izquieiua, Centio y Beiecha Las siguientes caiacteiisticas funcionales estan sopoitauas en los iepoites geneiauos: • Encabezauos y pie ue página • Numeiacion ue páginas • Encabezauo ue tablas con columnas poi página • Sumatoiia ue campos poi página y al final uel iepoite • Conteo ue iegistios 29.3 Adaptadores de Report Los auaptauoies ue Repoit implementan una misma inteifaz a un tipo ue foimato especifico ue tal foima que la piesentacion ue un listauo a otio en otio foimato no vaiie consiueiablemente. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S16 Los auaptauoies se apoyan el libieiias exteinas estables paia geneiai uocumentos con las caiacteiisticas iequeiiuas poi el uesaiiollauoi. Los siguientes auaptauoies ue tipos ue foimato se encuentian uisponibles en el componente Repoit: T,93,5 B-,2%,-.8#7 -#3 +.12.$#$%# <#2.8% 4.198# Y#$%,0,7 6#7M#$%,0,7 E(98#8=, /H%#8$, Btml - Es poitable a cualquiei navegauoi - No iequieie ue plugins auicionales paia su visualizacion inmeuiata - Es iápiuo en la mayoiia ue casos - La paginacion ue los iesultauos no es muy confiable - Los uatos geneiauos no son euitables - Bepenuienuo uel navegauoi utilizauo la expoitacion a otias aplicaciones pueue sei compleja Ninguna Puf - Los iepoites geneiauos no son mouicables ƒ - La piesentacion es la misma en cualquiei platafoima - La paginacion ue los iesultauos es optima - Bepenuienuo ue la infoimacion geneiaua los uocumentos PBF pueuen sei gianues o muy gianues - Requieie ue aplicaciones o plug-ins extia - La infoimacion suele sei complicaua ue expoitai a otias aplicaciones paia su analisis PBFBocument ue Kumbia Enteipiise basauo en FPBF Excel - La infoimacion es euitable y ua libeitau al usuaiio ue ajustai los infoimes uespués ue geneiauos - Es posible analisai uatos y geneiai giáficas estauisticas - El foimato es piivativo y iequieie ue Niciosoft Excel paia su visualizacion o otia hoja ue calculo que pueua abiii este tipo ue aichivos Excel ue Kumbia Enteipiise basauo en PEAR LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S17 como 0pen0ffice - No es seguio que la infoimacion no sea alteiaua poi teiceios Spieausheet Excel_Wiitei CSv La infoimacion se pueue expoitai a otias aplicaciones ue teiceios o a una suite ofimatica No peimiten foimato a textos y no son fáciles ue leei poi un humano Ninguna 29.4 Paginación en reportes FALTA 29.5 Ejemplo de un listado usando Report /0#123.5 I8#,8 "$ 3(7%,-. "7,$-. <#2.8% <?php class ListingController extends ApplicationController { public function listReservationTypesAction(){ $this->getResponseInstance- >setResponseType(ControllerResponse::RESPONSE_NO_LAYOUT); ReportComponent::load(array("Text", "Style")); // Para PDF $report = new Report('Pdf'); // Para HTML $report = new Report('Html'); $numeroPagina = new ReportText("%pageNumber%", array( "fontSize" => 9, "textAlign" => "right" )); $titulo = new ReportText("REPORTE DE TIPOS DE RESERVA", array( "fontSize" => 16, "fontWeight" => "bold", "textAlign" => "center" )); $titulo2 = new ReportText("Fecha: ".date("Y-m-d H:i a"), array( "fontSize" => 11, "fontWeight" => "bold", "textAlign" => "center" )); $report->setHeader(array($numeroPagina, $titulo, $titulo2)); $report->setDocumentTitle("Reporte de Tipos de Reserva"); $report->setColumnHeaders(array("CODIGO", "DETALLE")); $report->setCellHeaderStyle(new ReportStyle(array( "textAlign" => "center", "backgroundColor" => "#eaeaea" LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S18 ))); $report->setColumnStyle(0, new ReportStyle(array("textAlign" => "center"))); $report->setColumnStyle(1, new ReportStyle(array("textAlign" => "center"))); foreach($this->ReservationType->find() as $tipoReserva){ $report->addRow(array($tipoReserva->getId(), $tipoReserva- >getDetail())); } $report->outputToBrowser(); } } 29.6 Modo Vista Previa Cuanuo un iepoite es geneiauo a foimato BTNL es posible geneiai una saliua ue vista pievia peimitienuole al usuaiio navegai poi el iepoite en foima más efectiva. Esta piesentacion no es apta paia impiesion ya que contiene coloies y no iepiesenta lo que iealmente iiá a la impiesoia. Paia activai este mouo ue visualizacion se invoca el métouo setBisployHoJe con el paiámetio Repoit::BISPLAY_PRINT_PREvIEW en el objeto Report ue esta foima: /0#123.5 /7%,93#+#8 1.-. -# M(7%, 28#M(, 2,8, 8#2.8%#7 LT@E <?php // Para HTML $report = new Report('Html'); $report->setDisplayMode(Report::DISPLAY_PRINT_PREVIEW); Esta opcion no tiene efecto en los iepoites en los uemás foimatos. 0n ejemplo ue la visualizacion ue este mouo es el siguiente: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S19 29.7 API de Report LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S2u 30 Componente Feed 30.1 Introducción El objetivo uel componente Feeu es la lectuia y geneiacion ue sinuicacion usanuo el foimato RSS. Los uocumentos RSS geneiauos siguen la especificacion RSS 2.u según el uocumento http://cyber.law.harvard.edu/rss/rss.html ue la univeisiuau ue Baivaiu y http://www.rssboard.org/rss-specification . 30.2 Leer/Importar documentos RSS El siguiente ejemplo muestia como leei un iss uesue un iecuiso iemoto, la iuta también pueue sei una aichivo local: /0#123.5 E##8JZ12.8%,8 -.+"1#$%.7 <'' <?php $feed = new Feed(); $feed->readRss('http://www.nytimes.com/services/xml/rss/nyt/World.xml'); foreach($feed->getItems() as $item){ print $feed->getTitle(); print $feed->getLink(); } 0na vez caigauos los uocumentos pueuen sei manipulauos o mouificauos ue acueiuo a lo que se iequieia. 30.3 Crear documentos RSS Este componente también peimite la cieacion uesue ceio y piesentailos como una saliua estánuai ue la peticion. /0#123.5 I8#,8 "$ -.+"1#$%. -# 7($-(+,+(:$ <'' <?php Class BlogController extends ApplicationController { public function rssAction(){ $this->setResponse('rss'); $feed = new Feed(); $feed->setTitle('Corporate Blog'); $feed->setDescription('This is our corporate blog'); $feed->setLink('http://www.examplecompany.com/blog'); $feed->setLanguage('en-us'); foreach($this->Posts->find('order: created_at DESC') as $post){ $item = new FeedItem(); $item->setTitle($post->getTitle()); $item->setLink($post->getPermaLink()); $item->setDescription($post->getBody()); $feed->addItem($item); } return $feed->getXMLFeed(); } } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S21 30.4 API de Feed http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S22 Núcleo e integiacion ue componentes uel fiamewoik 31 Componente Core 31.1 Introducción El componente Coie actúa como integiauoi y oiquestauoi ue touas las opeiaciones ejecutauas en el Fiamewoik, auemás piopoiciona infoimacion sobie el entoino ue ejecucion a múltiples componentes. 31.2 Jerarquía de Clases cbOPOb I3,7# [90#+% La mayoi paite ue las clases en Kumbio Fnterprise Iromework poseen una clase supeiioi llamaua 0bject. Esta clase implementa el pation Layei Supeitype el cual peimite implementai métouos que no pueuan sei uuplicauos a lo laigo ue toua la implementacion ue componentes en el Fiamewoik. La clase 0bject se encuentia en librory,Kumbio,0bject.pbp. cbOPOP I.8#I.$*() Se encaiga ue leei los aichivos ue configuiacion ue las aplicaciones e integiai las opciones uefiniuas en ellos a los componentes uel fiamewoik. cbOPOc I.8#E.+,3# Su objetivo es seivii ue puente entie los componentes ue la aplicacion y los componentes ue localizacion e inteinacionalizacion. Cuanuo se geneia una excepcion este componente obtiene los mensajes localizauos apiopiauos al uesaiiollauoi. cbOPOd I.8#I3,77K,%C Nantiene un uiiectoiio ue iutas a las clases uel fiamewoik ue tal foima que se pueua iealizai la inyeccion ue uepenuencia en la aplicacion cuanuo sean iequeiiuos. 31.3 Servicios del Componente Core cbOcOb [9%#$#8 #3 Z$7%,$+# 4,1# El nombie ue la instancia se iefieie al nombie logico uel giupo ue aplicaciones instalauas en una misma uistiibucion uel fiamewoik. Auicional a lo anteiioi también se iefieie al uiiectoiio uonue se encuentia instalauo el fiamewoik, este es impoitante es muchos aspectos. cbOcOP o.$, L.8,8(, -# 3,7 B23(+,+(.$#7 Kumbio Fnterprise Iromework peimite establecei un paiámetio ue zona hoiaiia geneial paia LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S2S touas las aplicaciones uentio ue una misma instancia. Este paiámetio se encuentia en la seccion core uel aichivo confiq,confiq.ini. /0#123.5 /7%,93#+#8 3, >.$, C.8,8(, #$ #3 ,8+C(M. +.$*()O($( [core] defaultApp = default timezone = "America/Bogota" locale = "es_CO" charset = “UTF-8” En el manual ue PBP pueue encontiai iuentificauoies valiuos paia la mayoi paite ue zonas hoiaiias ue la tieiia. En tiempo ue ejecucion pueue cambiai la zona hoiaiia usanuo el métouo estático Core::setTimeZone{strinq $timezone), si establece una zona invaliua se geneiaiá una excepcion CoreFxception. cbOcOc I,19(,8 #3 IC,87#% -# 3, ,23(+,+(:$ Poi uefecto una aplicacion en Kumbio Fnterprise piouuce saliuas usanuo couificacion 0nicoue 0TF-8. Paia que toua la aplicacion utilice un mismo chaiset se iequieie que multiples aspectos estén sincionizauos en este sentiuo. '#8M(-.8 ?#95 La saliua uel seiviuoi web en el caso ue Apache Web Seivei es estableciua uinámicamente en el aichivo public¡.htaccess con la opcion: AddDefaultCharset UTF-8 E, M(7%, 28($+(2,35 La vista piincipal ue la aplicacion piopoiciona el meta Content-Type que uebe sei estableciua ue la siguiente foima paia uefinii el chaiset: <meta http-equiv='Content-type' content='text/html; charset=UTF-8' /> B8+C(M.7 l@E5 La piimeia linea uel encabezauo ue un aichivo XNL también uebe sei cambiaua paia ieflejai el cambio uel chaiset. <?xml version="1.0" encoding="UTF-8" ?> k,7#7 -# -,%.75 Los motoies ue base ue uatos como NySQL o 0iacle peimiten establecei la couificacion en que se almacenan y uevuelven los uatos en las tablas. Consulte la LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S24 uocumentacion uel motoi utilizauo paia apienuei como mouificai la couificacion poi uefecto. ],M,'+8(2%5 Los aichivos javasciipt ueben estai guaiuauos con la couificacion coiiecta sin embaigo la etiqueta SCRIPT pueue sei estableciua ue la siguiente foima paia ayuuai al navegauoi a ueteiminai el chaiset coiiecto: <script src="/instante/javascript/menu.js" type="text/javascript" charset="utf- 8"></script> I''5 En los iecuisos CSS es posible usai establecei la couificacion uel aichivo también paia ayuuai al navegauoi a un majoi ieconocimiento ue la misma asi: @charset "utf-8"; cbOcOd I,19(,8 3, 3.+,3(>,+(:$ 2.8 -#*#+%. Es posible cambiai la localizacion poi uefecto usanuo el métouo locole::setBefoult esto afectaiá touas las opeiaciones iealizauas con los componentes ue inteinacionalizacion como lo son Bate, Tiaslate y Cuiiency. /0#123.5 I,19(,8 3, 3.+,3(>,+(:$ 2.8 -#*#+%. 28.)8,1,+(.$,31#$%# <?php Locale::setDefault(“es_ES”) ?> cbOcON [9%#$#8 3, M#87(:$ -#3 !8,1#R.8S La constante Core::IRAHFW0RK_vFRSl0N peimite obtenei la veision uel fiamewoik utilizauo. Pueue utilizai este valoi paia sepaiai la compatibiliuau ue sus aplicaciones cuanuo actualice el fiamewoik y se piesenten inconvenientes. /0#123.5 I.12,8,8 3, +.12,%(9(3(-,- -# "$, ,23(+,+(:$ "7,$-. 1-%$++2,!.345,6783,9:5; <?php if(version_compare(Core::FRAMEWORK_VERSION, "1.0", ">=")){ //La versión del framework es mayor ó igual a la 1.0 } 31.4 Subcomponente CoreConfig El subcomponente CoreConfiq peimite leei la configuiacion ue las aplicaciones y conveitiilas en valoies nativos ue PBP paia su uso en piocesos ue la aplicacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S2S CoreConfiq pueue leei en foima sencilla aichivos ue configuiacion ue la instancia, ue la aplicacion actualmente en ejecucion y ue otias aplicaciones. cbOdOb BKZ -#3 7"9+.12.$#$%# I.8#I.$*() stotic public Confiq function reoJ{strinq $potb) Lee un aichivo ue configuiacion meuiante su path. El path absoluto poi uefecto es el uiiectoiio iaiz ue la instancia uel fiamewoik. stotic public Confiq function reoJFnviroment{) Lee el aichivo environment.ini ue la aplicacion activa. Los valoies uel entoino actual pueuen sei acceuiuos uiiectamente en el objeto Confiq uevuelto, los uemás entoinos se acceuen meuiante una piopieuau uel objeto. public stotic Confiq function qetConfiqurotionIrom{strinq $opplicotionNome, strinq $file) Bevuelve la configuiacion en un aichivo ubicauo en una aplicacion especifica. Este aichivo uebe estai ubicauo en el uiiectoiio confiq, ue la aplicacion. public stotic function reoJIromActiveApplicotion{strinq $file) Lee un aichivo ubicauo el uiiectoiio confiq, ue la aplicacion que está actualmente en ejecucion. 31.5 Subcomponente CoreClassPath uian paite ue los componentes y subcomponentes en Kumbio Fnterprise son caigauos meuiante inyeccion ue uepenuencia usanuo outolooJ. uiacias a esto se ieuuce consiueiablemente la lectuia ue uisco obtenienuo lo que se iequieie en foima uinámica a meuiua que es solicitauo poi la aplicacion. El ClossPotb es un uiiectoiio inteino que almacena las ubicaciones ue las clases y componentes paia su posteiioi inyeccion cuanuo son iequeiiuos. Poi motivos ue ienuimiento no touos los componentes son inyectauos sobie touo los que funcionan como integiauoies y los que atienuen la peticion. En subcomponente CoreClossPotb ofiece una inteifaz ue aplicacion paia la auministiacion uel uiiectoiio ue clases peimitienuo agiegai, cambiai o eliminai entiauas facilitanuo la LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S26 mouificacion uel compoitamiento uel fiamewoik. cbONOb <##123,>,8 "$ +.12.$#$%# -#3 !8,1#R.8S Es posible ieemplazai un componente uel fiamewoik cambianuo la iuta uel uiiectoiio ue clases a la uel nuevo componente. La única iestiiccion es utilizai el mismo nombie ue la nueva clase en el componente utilizauo. En el siguiente ejemplo se muestia como ieemplazai el componente ue localizacion ue Kumbio Fnterprise poi uno ue la aplicacion. Notese que la extension .php uel aichivo es omitiua a pioposito: /0#123.5 <##123,>,8 3, 8"%, -# "$, +3,7# , .%8, -#*($(-, 2.8 #3 "7",8(. <?php CoreClassPath::replacePath('Locale', 'apps/my-app/library/Locale/Locale'); El path asignauo no es compiobauo poi el fiamewoik poi lo que uebe ceicioiaise que este exista y que el aichivo contenga la clase solicitaua. cbONOP BKZ -# I.8#I3,77K,%C stotic public function lookupCloss{strinq $clossNome) Peimite consultai si una clase existe en el uiiectoiio ue clases. stotic public function qetClossPotb{strinq $clossNome) Peimite consultai la iuta existente en el fiamewoik paia una ueteiminaua clase. stotic public function oJJToPotb{strinq $clossNome, strinq $potb) Agiega una nueva iuta al uiiectoiio ue clases. Si esta ya existe no se ieemplaza. stotic public function replocePotb{strinq $clossNome, strinq $potb) Reemplaza una entiaua en el uiiectoiio ue clases. 31.6 Subcomponente CoreType El subcomponente CoieType peimite iealizai aseiciones sobie los paiámetios iecibiuos en uifeientes componentes uel fiamewoik aseguianuo que se iecibe el tipo ue uato auecuauo. El tiabajo ue este subcomponente es funuamental paia aseguiai en gian meuiua piocesos más confiables y seguios. Cuanuo las aseiciones fallan se lanza una excepcion tipo LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S27 CoreTypeFxception. cbOeOb BKZ -# I.8#T\2# stotic function voiJ ossertNumeric{int $vor) Realiza una aseicion sobie un valoi numéiico stotic function voiJ ossertBool{bool $vor) Realiza una aseicion sobie un valoi booleano stotic function voiJ ossertStrinq{strinq $str) Realiza una aseicion sobie un valoi ue cauena ue caiacteies. stotic function voiJ ossertArroy{orroy $vor) Realiza una aseicion sobie un valoi aiiay. stotic function voiJ ossertResource{resource $vor) Realiza una aseicion sobie una vaiiable ue iecuiso. stotic function voiJ ossert0bject{object $vor) Realiza una aseicion sobie un objeto. 31.7 Crear Plugins de Aplicación La aiquitectuia ue plugins ue Aplicaciones peimite obseivai, extenuei y manipulai el compoitamiento ue la aplicacion según como las conuiciones lo exijan. Los plugins peimiten inteiceptai eventos ue la aplicacion ue tal foima que estos sean obseivables y auemás ejecutáise uno tias otio ue maneia centializaua sin iequeiii iefactoiizacion o ieintegiacion en la aplicacion. cbOaOb I8#,8 "$ K3")($ -# B23(+,+(:$ Los plugins son clases que implementan eventos geneiales que son invocauos a meuiua que el flujo ue viua ue una aplicacion avanza en una sesion ue usuaiio. Estas clases ueben cumplii con los siguientes iequeiimientos: ! Beben estai ubicauos en el uiiectoiio ue plugins usualmente opps,opp-nome,pluqins o LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S28 uonue la vaiiable pluqinsBir inuique. ! El nombie uel aichivo que implementa la clase uebe sei el nombie uel plugin ! El nombie ue la clase uebe tenei la extension Pluqin ! Los plugins ue contiolauoi ueben heieuai ue la clase ApplicotionPluqin o sei subclase ue ella Las clases pueuen implementai métouos públicos que iefeiencian los eventos ocuiiiuos en los contiolauoies, la lista ue ellos es la siguiente: T,93,5 /M#$%.7 ^"# 7# 2"#-#$ (123#1#$%,8 #$ 23")($7 -# B23(+,+(:$ 4.198# /M#$%. 6#7+8(2+(:$ befoieStaitApplication 0cuiie en la piimeia peticion a la aplicacion antes ue invocaise el métouo ue ControllerBose onStaitApplication afteiStaitApplication 0cuiie en la piimeia peticion a la aplicacion uespués ue invocaise el métouo ue ControllerBose onStaitApplication befoieChangeInstance 0cuiie cuanuo en una misma sesion ue usuaiio se cambia a otia instancia uel fiamewoik en el mismo seiviuoi ue aplicaciones. afteiChangeInstance 0cuiie uespués ue ejecutaise el métouo ue ControllerBose llamauo onCbonqelnstonce. befoieStaitRequest 0cuiie antes ue iniciai empezai a atenuei una peticion iealizaua a la aplicacion. befoieFinishRequest 0cuiie cuanuo se teimina ue atenuei la peticion iealizaua a la aplicacion. befoie0ncaughtException 0cuiie antes ue lanzaise una excepcion que no fue captuiaua poi la aplicacion. onContiolleiException 0cuiie cuanuo se geneia una excepcion uentio uel contiolauoi. Se ejecuta antes ue befoie0ncaughException LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S29 32 Componente PluginManager 32.1 Introducción Este componente peimite auministiai los plugins caigauos en una aplicacion facilitanuo el agiegai o quitai uinámicamente plug-ins. 32.2 Arquitectura de Plug-Ins Kumbia Enteipiise Fiamewoik piopoiciona una aiquitectuia ue Plug-Ins flexible que peimite notificai y iegistiai eventos uesue los uifeientes componentes uel fiamewoik. 32.3 Autoinicialización de Plug-Ins Poi uefecto los plug-ins encontiauos en el uiiectoiio ue plugins son caigauos automáticamente poi el auministiauoi ue plug-ins. Cuanuo hay muchos plug-ins o estos no son usauos fiecuentemente entie peticiones pueuen causai un ueteiioio en el ienuimiento ue la aplicacion. En el aichivo config¡config.ini es possible configuiai que los plug-ins no sean caigauos automáticamente sino que tengan que sei caigauos piogiamacionalmente asi: [plugins] autoInitialize = Off En este caso es necesaiio iegistiai los plugins que se vayan a utilizai en tiempo ue ejecucion. 32.4 API de PluginManager stotic function booleon initiolizePluqins{) Inicializa los plugins caigauos sepaianuolos ue acueiuo a su natuialeza: Be contiolauoi, mouelos, vistas y aplicacion. No uebeiia sei invocauo poi el uesaiiollauoi ya que es llamauo automáticamente poi el conteneuoi ue aplicaciones. stotic function orroy looJApplicotionPluqins{) Caiga los plugins almacenauos en el uiiectoiio plugins o el inuicauo en la vaiiable ue configuiacion pluqinsBir. stotic function orroy qetPluqins{) LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SSu 0btiene un aiiay con touas las instancias ue los plugins iegistiauos en la peticion actual. stotic function orroy qetControllerPluqins{) 0btiene un aiiay con touas las instancias ue los plugins ue contiolauoi iegistiauos en la peticion actual. stotic function orroy qetHoJelPluqins{) 0btiene un aiiay con touas las instancias ue los plugins ue mouelos iegistiauos en la peticion actual. stotic function orroy qetviewPluqins{) 0btiene un aiiay con touas las instancias ue los plugins ue piesentacion iegistiauos en la peticion actual. stotic function voiJ notifyIromApplicotion{strinq $event) Peimite notificai a los plug-ins ue aplicacion sobie un evento ueteiminauo $event. stotic function voiJ notifyIromController{strinq $event, Controller $controller) Peimite notificai a los plug-ins ue contiolauoi sobie un evento ueteiminauo $event. stotic function voiJ notifyIromview{strinq $event, ControllerResponse $controllerResponse) Peimite notificai a los plug-ins ue piesentacion sobie un evento ueteiminauo $event. stotic function voiJ notifyIrom{strinq $component, strinq $event, strinq $reference) Peimite notificai a los plug-ins ue componentes sobie un evento ueteiminauo $event. stotic function voiJ reqisterControllerPluqin{ControllerPluqin $pluqin) Peimite iegistiai un objeto como plugin ue contiolauoi. Solo los eventos piouuciuos uespues ue iealizai el iegistio uel plugin ue contiolauoi. stotic function voiJ reqisterApplicotionPluqin{ApplicotionPluqin $pluqin) Peimite iegistiai un objeto como plugin ue contiolauoi. Solo los eventos piouuciuos uespues ue iealizai el iegistio uel plugin ue aplicacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS1 stotic function voiJ reqisterviewPluqin{viewPluqin $pluqin) Peimite iegistiai un objeto como plugin ue piesentacion. Solo los eventos piouuciuos uespues ue iealizai el iegistio uel plugin ue piesentacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS2 Paite S: Inteinacionalizacion y Localizacion 33 Internacionalización y Localización 33.1 Introducción Las actuales infiaestiuctuias ue computacion ofiecen localizacion ue tal foima que un ueteiminauo usuaiio pueua efectuai opeiaciones ue negocio auecuauamente. Los objetivos ue la localizacion van mucho más allá ue que la piesentacion este tiauuciua a múltiples iuiomas, auemás ue esto se iequieie auaptai fechas, foimatos ue moneua, hoia, iespuestas, saluuos, etc. Los componentes Locale, Tiaslate, Bate y Cuiiency ofiecen la funcionaliuau necesaiia paia implementai aplicaciones ue negocio localizauas. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SSS 34 Componente Locale 34.1 Introducción El componente Locale peimite obtenei y establecei infoimacion ue localizacion en aplicaciones sobie uatos especificos geogiáficos, politicos, cultuiales o iegionales. Actualmente es posible obtenei infoimacion ue S81 localizaciones. 34.2 Definir la localización en una sesión de Usuario Kumbio Fnterprise peimite establecei la localizacion poi sesion, esta es uefiniua usanuo un iuentificauoi ue localizacion que sigue el foimato iuioma_REuI0N. Poi ejemplo es_C0 iepiesenta la localizacion paia iuioma español y pais Colombia. 0n listauo ue las cauenas ue localizacion pueue sei encontiauo en: http:¡¡unicoue.oig¡clui¡uata¡uiff¡supplemental¡languages_anu_teiiitoiies.html. El componente Locale utiliza localizacion inuepenuiente ue la platafoima y que es seguia cuanuo se usa en entoino multi-tbreoJ como lo son los seiviuoies web moueinos. El uso ue la funcion setlocole pouiia piouucii iesultauos inespeiauos si se usan aplicaciones con uifeientes localizaciones en un mismo pioceso uel seiviuoi ue aplicaciones. La localizacion geneial se establece usanuo el métouo estático locole::setlocole{strinq $locole) pasanuo como paiámetio un iuentificauoi: /0#123.5 I8#,8 "$ .90#%. E.+,3# "7,$-. "$, +,-#$, -# 3.+,3(>,+(:$ $locale = new Locale(‘es_CO’); En caso ue pasaise un iuenticauoi no valiuo, este es iecoitauo hasta que sea valiuo. Poi ejemplo: /0#123.5 [9%#$#8 "$, 3.+,3(>,+(:$ MU3(-, ,3 2,7,8 "$, +,-#$, ($+.88#+%, $locale = new Locale(‘es_XX’); //Es recortado a localización ‘es’ 0na instancia ue la clase Locale es uevuelta al uefinii la localizacion. cdOPOb [9%#$#8 3, 3.+,3(>,+(:$ ,-#+",-, La localizacion pueue sei obteniua ue S foimas, uel navegauoi uel cliente, uel aichivo ue configuiacion ue la aplicacion activa o uel entoino ue ejecucion ue la aplicacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS4 cdOPObOb E##8 3, 3.+,3(>,+(:$ -#3 $,M#),-.8 La localizacion es leiua ue la vaiiable ue la peticion BTTP_ACCEPT_LANu0AuE. La que tenga mayoi caliuau es la que se uevuelve: /0#123.5 E##8 3, +"3%"8, -#3 "7",8(. *($,3 7#)G$ #3 $,M#),-.8 $browserLocale = Locale::getBrowser(); Touas las localizaciones sopoitauas poi el cliente BTTP pueuen sei obteniuas usanuo locole::qetBrowserAll{). Caua localizacion incluye un vectoi con iuioma, iegion y caliuau. cdOPObOP E##8 3, 3.+,3(>,+(:$ -#3 #$%.8$. -# #0#+"+(:$ La localizacion es leiua uel valoi estableciuo poi la funcion setlocale en el mismo pioceso ue ejecucion actual. /0#123.5 [9%#$#8 3, 3.+,3(>,+(:$ 7#)G$ #3 #$%.8$. -# #0#+"+(:$ -# 3, ,23(+,+(:$ $environLocale = Locale::getEnvironment(); Touas las localizaciones uel entoino ue ejecucion pueuen sei obteniuas usanuo locole::qetFnviromentAll{). Caua localizacion incluye un vectoi con iuioma, iegion y caliuau. cdOPObOc E##8 3, 3.+,3(>,+(:$ -# 3, +.$*()"8,+(:$ -# 3, ,23(+,+(:$ La vaiiable ue configuiacion 'locale' pueue sei estableciua tanto en el aichivo config.ini ue la aplicacion como el ue la instancia: /0#123.5 [9%#$#8 3, 3.+,3(>,+(:$ 7#)G$ 3, +.$*()"8,+(:$ -# 3, ,23(+,+(:$ $applicationLocale = Locale::getApplication(); 34.3 Establecer la localización por defecto Cuanuo la localizacion no es estableciua bajo ninguno ue los paiámetios anteiioies se usa el valoi poi uefecto. El métouo ue locale setBefoult peimite establecei esto. /0#123.5 I,19(,8 3, 3.+,3(>,+(:$ 2.8 -#*#+%. #$ *.81, 28.)8,1,+(.$,3 // Localización por defecto para Español/Venezuela Locale::setDefault(‘es_VE’); 34.4 Obtener traducciones localizadas El objeto locole implementa tiauucciones localizauas paia uiveisos ciiteiios ue acueiuo al iuioma y pais. En el siguiente ejemplo se muestia como obtenei la tiauuccion paia 'SI' y 'N0' LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SSS en Fiancés y }apones: /0#123.5 [9%#$#8 %8,-"++(.$#7 3.+,3(>,-,7 2,8, -(*#8#$%#7 +"3%"8,7 <?php //Mostrar las traducciones de ‘SI’ y ‘NO’ en Francés $locale = new Locale('fr_FR'); print $locale->getYesString()."\n"; // Imprime “oui” print $locale->getNoString(); // Imprime “non” //Mostrar las traducciones de ‘SI’ y ‘NO’ en Japonés $locale = new Locale('ja_JP'); print $locale->getYesString()."\n"; // Imprime “はい print $locale->getNoString(); // Imprime “いいえ 34.5 API del Componente Locale FALTA 4.%,5 Es posible que el componente Locale haga conflicto con la extension Intl uel iepositoiio PECL asi que es ieconmenuable uesactivaila. El componente Locale ieemplaza y extenuienue funcionaliuau ue esta extension poi lo que no iequeiiiá ue ella. 34.6 Subcomponente LocaleMath FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS6 35 Componente Traslate 35.1 Introducción El componente Troslote peimite la cieacion ue aplicaciones multi-iuioma usanuo uifeientes auaptauoies paia obtenei las listas ue tiauuccion. La clase implementa el pation Pioxy paia acceuei a la funcionaliuau ue los auaptauoies ue maneia unifoime. 35.2 Adaptadores soportados por Traslate Los siguientes auaptauoies son sopoitauos poi este componente: T,93,5 T(2.7 -# ,-,2%,-.8#7 7.2.8%,-.7 2.8 T8,73,%# T(2. !.81,%. 6#7+8(2+(:$ Aiiay 0tiliza aiiays nativos ue PBP paia almacenai las listas ue tiauuccion. Las llaves son utilizauas paia acceuei al valoi tiauuciuo. CSv 0tiliza aichivos sepaiauos poi comas. El piimei campo iepiesenta la llave ue tiauuccion y el segunuo la tiauuccion en si. INI 0tiliza aichivos .ini. La tiauuccion se establece noimalmente como vaiiables y su valoi es la tiauuccion. Batabase 0tiliza una tabla paia almacenai el uiccionaiio ue tiauuccion. 35.3 Como funciona la traducción Inuepenuientemente uel auaptauoi utilizauo, el pioceso ue tiauuccion sigue estos piincipios: ! Los iecuisos ue tiauuccion ueben estai uisponibles y mantenei una estiuctuia consistente ue tal foima que sea posible caigai uno el otio uepenuienuo ue la localizacion activa. ! Los uiccionaiios ue tiauuccion ueben tenei una clave y un valoi, en uonue la clave es un couigo inteino o convencion que usa el uesaiiollauoi paia acceuei a los valoies ue tiauuccion. Las claves ueben sei las mismas paia caua uiccionaiio ue tiauuccion ue esta foima es posible obtenei los valoies consistentemente. ! El tipo ue iuioma a utilizai uebe sei caigauo poi el uesaiiollauoi. El componente locole peimite obtenei meuiante vaiios métouos el lenguaje más auecuauo uepenuienuo ue los iequeiimientos ue negocio ue la aplicacion. ! 0na vez completauos los pasos anteiioies se instancia la clase Troslote inuicanuo en el piimei paiámetio uel constiuctoi el tipo ue auaptauoi a usai, seguiuo ue este las opciones LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS7 uel mismo. ! El iecuiso caigauo en el objeto Troslote contiene las tiauucciones paia la sesion activa. El uso uel métouo $tiaslate-•_(stiing $key) peimite acceuei a los valoies ue tiauuccion sienuo $key la llave ue inuexacion uel uiccionaiio. ! El uesaiiollauoi uebe contiolai que el objeto tiaslate este cieauo y uisponible paia caua vista multi-iuioma en la aplicacion. 35.4 Utilizar traducciones El componente Troslote caiga los uatos ue tiauuccion uel auaptauoi inuicauo y luego peimite obtenei las tiauucciones. En el siguiente ejemplo se muestia como cieai el objeto ue tiauuccion en caua peticion a un contiolauoi: /0#123.5 I,8),8 3, 3(7%, -# %8,-"++(:$ 7#)G$ 3, +"3%"8, .9%#$(-, -#3 $,M#),-.8 <?php class NewsController extends ApplicationController { private function _loadTraslation(){ $locale = Locale::getBrowser(); $language = $locale->getLanguage(); $path = "apps/myapp/languages/$language/LC_MESSAGES/messages.php"; require $path; $traslate = new Traslate(‘Array’, $messages); $this->setParamToView("traslate", $traslate); } public function beforeFilter(){ $this->_loadTraslation(); } } En caua peticion al contiolauoi la vaiiable $tiaslate es tiansfeiiua a la piesentacion paia su uso: /0#123.5 [9%#$#8 3,7 %8,-"++(.$#7 1#-(,$%# 3,7 33,M#7 -#*($(-,7 <?php echo $traslate->_(“home”) ?> <?php echo $traslate->_(“exit”) ?> Si el aichivo "es¡LC_NESSAuES¡messages.php" tiene el siguiente uiccionaiio: <?php $messages = array(“home” => “Inicio”, “exit” => “Salir”) ?> y el aichivo "en¡LC_NESSAuES¡messages.php" tiene el siguiente uiccionaiio: <?php $messages = array(“home” => “Home”) ?> LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS8 Entonces se piouuce la saliua iespectiva paia los iuiomas español e inglés: "Inicio Salii" y "Bome exit". cNOdOb I.$7(-#8,+(.$#7 2,8, #3 ,-,2%,-.8 B88,\ Como se explico este auaptauoi utiliza aiiays nativos ue PBP paia almacenai los uiccionaiios ue tiauuccion. Se iecomienua el uso ue este auaptauoi ya que ofiece el mejoi ienuimiento en la mayoiia ue los casos. cNOdOP I.$7(-#8,+(.$#7 2,8, #3 ,-,2%,-.8 I7M El auaptauoi CSv peimite caigai las listas ue tiauuccion uesue aichivos CSv (sepeiauos poi comas) FALTA. cNOdOc I.$7(-#8,+(.$#7 2,8, #3 ,-,2%,-.8 Z$( El auaptauoi INI peimite caigai las listas ue tiauuccion uesue aichivos INI FALTA. cNOdOd I.$7(-#8,+(.$#7 2,8, #3 ,-,2%,-.8 6,%,9,7# El auaptauoi Batabase peimite caigai las listas ue tiauuccion uesue una tabla en la base ue uatos. FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS9 36 Componente Date 36.1 Introducción El componente Bate esta uiseñauo paia extenuei el lenguaje PBP agieganuo un tipo ue uato paia el manejo ue fechas ue foima oiientaua a objetos que peimita las opeiaciones entie estas, obtenei fiagmentos e infoimacion ue las piopieuaues uel tiempo tenienuo en cuenta la configuiacion ue localizacion iequeiiua poi la aplicacion. 36.2 Porque debe usar este componente Con Bate se pueuen efectuai opeiaciones usanuo fechas y fiagmentos ue fechas en cualquiei iango ue tiempo inuepenuientemente ue la platafoima utilizaua. El uso ue las funciones ue PBP gmmktime(), mktime(), uate(), stiftime() y otias tienen iestiicciones ue platafoima y conflictos cuanuo las fechas están fueia ue iango Fii, 1S Bec 19u1 2u:4S:S4 uNT a Tue, 19 }an 2uS8 uS:14:u7 uNT. Las iestiicciones se ueben a que gian paite ue las opeiaciones entie fechas y hoias se iealizan usanuo maicas ue tiempo que consisten en el númeio ue segunuos tianscuiiiuos antes o uespués uel 1 ue Eneio ue 197u, cuanuo este númeio es muy gianue el tipo ue uato floot ue PBP iesulta insuficiente paia almacenailo. La iefeiencia uel manual ue PBP uice "The size of a float is platfoim-uepenuent, although a maximum of ‹1.8eSu8 with a piecision of ioughly 14 uecimal uigits is a common value (that's 64 bit IEEE foimat).". Cuanuo los númeios ue maicas ue tiempo a almacenai son muy gianues es posible utilizai extensiones ue PBP que sopoitan piecision aibitiaiia como lo son bcmotb o qmp. El componente también sopoita los ajustes hoiaiios ue acueiuo al timezone ue la aplicacion y establece las coiiecciones necesaiias paia el calenuaiio giegoiiano. Igualmente si se tiabaja en un entoino localizauo Bote obtiene los nombies ue uias y meses ue acueiuo al estableciuo. 36.3 Timestamps ilimitados El componente Bote iealiza gian paite ue sus opeiaciones basauo en las maicas inteinas ue tiempo 0nix que se geneian apaitii ue la fecha uel objeto y conuiciones ue zona hoiaiia entie LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S4u otios. Cuanuo las aplicaciones iequieien sopoitai opeiaciones con fechas fueia uel iango ue Fii, 1S Bec 19u1 2u:4S:S4 uNT a Tue, 19 }an 2uS8 uS:14:u7 uNT es necesaiio que el componente Bote iealice sus opeiaciones utilizanuo matemática ue alta piecision meuiante el empleo ue la extension ue PBP bcmath. La extension bcmath piopoiciona una calculauoia binaiia que sopoia númeios ue piecision aibitiaiia iepiesentanuolos como cauenas ue caiacteies. Cuanuo la extension esta uisponible se pueue activai la integiacion con el componente Bote ejecutanuo el métouo uel subcomponente ue opeiaciones matemáticas localizauas locoleHotb llamauo enobleBcHotb. Be esta foima se pueue usai fechas en cualquiei iango y efectuai opeiaciones sobie ellas con tianquiliuau. 36.4 Establecer el Timezone Paia un coiiecto funcionamiento ue este componente es necesaiio establecei la zona hoiaiia uonue está ubicaua la aplicacion y ue uonue tomaiá la infoimacion paia iealizai los ajustes auecuauos a las fechas y hoias. Kumbio Fnterprise Iromework peimite configuiai el timezone en el aichivo confiq,confiq.ini en la seccion •kumbia€ usanuo un ClBR Timezone lJentifier que es aceptauo poi la funcion Jote_Jefoult_timezone_set{) ue PBP. Paia mayoi consistencia ue las aplicaciones uesaiiollauas en el fiamewoik se uebe usai el métouo estático Kumbio::setTimeZone{strinq $clJrlJentifier). Cuanuo se establece un timezone invaliuo se geneia una excepcion. /0#123.5 I,19(,8 #3 %(1#>.$# ,+%(M. -# *.81, 28.)8,1,+(.$,3 // Para establecer el timezone para Bogotá Colombia: Core::setTimezone(“America/Bogota”); // Para establecer el timezone para Londres Inglaterra: Core::setTimezone(“Europe/London”); Paia una lista completa ue las zonas hoiaiias sopoitauas visite: http:¡¡unicoue.oig¡clui¡uata¡uiff¡supplemental¡teiiitoiy_containment_un_m_49.html. 36.5 Obtener partes ó fragmentos de fechas Es posible cieai un objeto ue fecha instancianuo uiiectamente la clase Bote, el paiámetio que iecibe el constiuctoi es una fecha en foimato YYYY-NN-BB. Si no se establece este se utiliza la LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S41 fecha actual. Si el constiuctoi iecibe una fecha invaliua se geneia una excepcion BoteFxception. /0#123.5 [9%#$#8 *8,)1#$%.7 -# *#+C,7 //Crear Fecha $fecha = new Date("1986-02-17"); //Obtener el Número del Mes $fecha->getMonth(); // Devuelve 2 //Obtener el Año $fecha->getYear(); // Devuelve 1986 //Obtener el Año en formato corto $fecha->getShortYear(); // Devuelve 86 //Obtener el Número del Día $fecha->getDay(); // Devuelve 17 //Obtener el timestamp (marca de tiempo UNIX) $fecha->getTimestamp(); // Devuelve 509000400 //Obtener el nombre del mes abreviado según la localización actual $fecha->getAbrevMonthName(); // Devuelve Feb /Obtener el nombre del mes según la localización actual $fecha->getMonthName(); // Devuelve Febrero //Obtener el nombre del día según la localización actual $fecha->getDayOfWeek(); //Devuelve Lunes //Obtener el nombre del día según la localización actual en forma abreviada $fecha->getAbrevDayOfWeek(); //Devuelve Lun //Obtener el número del dia de la semana (Domingo=0 hasta Sábado=7) $fecha->getDayNumberOfWeek(); // Devuelve 1 //Obtener la fecha interna en el formato YYYY-MM-DD $fecha->getDate(); // Devuelve 1986-02-17 (string) $fecha; // Devuelve 1986-02-17 //Obtener la fecha de acuerdo a un formato establecido $fecha->getUsingFormat(“yy.dd.mm”); // Devuelve 86.17.02 //Obtener la fecha de acuerdo al formato de fecha en config.ini $fecha->getUsingDefaultFormat(); //Obtener el periodo de la fecha (YYYYMM) $fecha->getPeriod(); // Devuelve 198602 //Obtener la fecha en formato ISO-8601 $fecha->getISO8601Date(); // Devuelve 1986-02-17T00:00:00-05:00 //Obtener la fecha en formato RFC-2822 $fecha->getRFC2822Date(); // Devuelve Mon, 17 Feb 1986 00:00:00 -0500 36.6 Posición en el Tiempo 0n objeto Bote también pueue piopoicionai infoimacion sobie su posicion en el tiempo, las funciones que ieciben otias fechas aceptan stiings en el foimato YYYY-NN-BB o otios objetos ue fechas: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S42 /0#123.75 ;7. -# 1_%.-.7 -# 2.7(+(:$ -#3 %(#12. +.$ 6,%# //Indica si la fecha corresponde a la actual $fecha->isToday(); //Indica si la fecha corresponde a la fecha de mañana $fecha->isTomorrow(); //Indica si la fecha corresponde a la fecha de ayer $fecha->isYesterday(); //Indica si la fecha se encuentra en el mes actual $fecha->isThisMonth(); //Indica si la fecha se encuentra en el año actual $fecha->isThisYear(); //Indica si el año de la fecha es bisiesto $fecha->isLeapYear(); //Si la fecha está entre un rango $fecha = new Date(“1990-06-04”); $fecha->isBetween(“1980-01-01”, “2000-12-31“) // Devuelve true //Si la fecha NO está entre un rango $fecha = new Date(“1990-06-04”); $fecha->isNotBetween(“1980-01-01”, “2000-12-31“) // Devuelve false //Indica si está en el pasado $fecha->isPast(); //Indica si está en el futuro $fecha->isFuture(); //Indica si una fecha es menor que la otra Date::isEarlier(“2001-02-30”, “2003-04-21”) // Devuelve true //Indica si una fecha es mayor que la otra Date::isLater(“2001-02-30”, “2003-04-21”) // Devuelve false //Indica si una fecha es igual a la otra Date::isEquals(“2001-02-30”, “2003-04-21”) // Devuelve false // Compara dos fechas, si la primera es menor a la segunda devuelve -1, si son // iguales devuelve 0 y si la primera es mayor a la segunda devuelve 1 Date::compareDates(“2009-01-20”, “2009-02-14”); // Devuelve -1 Date::compareDates(“2009-01-20”, “2009-01-20”); // Devuelve 0 Date::compareDates(“2009-03-05”, “2009-02-14”); // Devuelve 1 36.7 Información de Fechas El componente Bote ofiece métouos paia obtenei la fecha y hoia actual, asi como fechas iniciales y finales ue años y meses: /0#123.5 @_%.-.7 2,8, .9%#$#8 ($*.81,+(:$ -# *#+C,7 // Obtiene el rango de fechas de la semana de Lunes a Domingo donde está // ubicada la fecha $fecha = new Date("2009-02-11"); print_r($fecha->getWeekRange()); //Array ([0] => 2009-02-09 [1] => 2009-02-15) //Obtener la fecha actual en formato YYYY-MM-DD Date::getCurrentDate(); //Obtener la hora actual en formato HH:MM:SS Date::getCurrentTime(); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S4S //Obtener la fecha y hora actual en formato “YYYY-MM-DD HH:MM:SS” Date::now(); //Obtener el primer dia del año actual Date::getFirstDayOfYear(); //Obtener el primer dia del año 1999 Date::getFirstDayOfYear(1999); //Devuelve 1999-12-31 //Obtener el último dia habil del año 2006 print Date::getLastNonWeekendDayOfYear(2006); //2006-12-29 //Obtener el primer dia del año 1980 Date::getFirstDayOfYear(1980); //Devuelve 1980-01-01 //Obtener el primer dia del mes de febrero del año 1980 Date::getFirstDayOfMonth(2, 1980); //Devuelve 1980-02-01 //Obtener el último dia del mes de febrero del año actual Date::getLastDayOfMonth(2); //Obtener el último dia del mes de febrero del año 2000 Date::getLastDayOfMonth(2, 2000); //Devuelve 2000-02-29 //Obtener el último dia habil del mes de julio del año 1983 print Date::getLastNonWeekendDayOfMonth(7, 1997); //1983-07-29 36.8 Cambiar fragmentos de la fecha Caua objeto ue fecha almacena caua paite ue la fecha y peimite cambiai caua paite mantenienuo la consistencia ue la misma: /0#123.5 @_%.-.7 2,8, 1,$(2"3,8 *8,)1#$%.7 -# *#+C,7 $fecha = new Date(“2008-11-30”); //Cambiar el mes a Marzo $fecha->setMonth(3); print $fecha; //Devuelve 2008-03-30 //Cambiar el mes a Febrero (se ajusta el día automáticamente) $fecha->setMonth(2); print $fecha; // Devuelve 2008-02-29 //Cambiar el año de un año bisiesto a uno no bisiesto $fecha->setYear(“2009”); print $fecha; // Devuelve 2009-02-28 //Cambiar el dia de la fecha $fecha->setDay(30); print $fecha; // Devuelve 2009-02-28 $fecha->setDay(12); print $fecha; // Devuelve 2009-02-12 //Cuando el mes es mayor a 12 ajusta al año ó años siguientes $fecha = new Date("2008-01-01"); $fecha->setMonth(13); print $fecha; //2009-01-01 $fecha = new Date("2009-01-30"); $fecha->setMonth(14); print $fecha; //2009-02-28 $fecha = new Date("2008-01-30"); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S44 $fecha->setMonth(-2); print $fecha; //2007-11-30 $fecha = new Date("2008-02-29"); $fecha->setMonth(-14); print $fecha; //2007-11-30 36.9 Operaciones con fechas Las opeiaciones con fechas se uiviuen en las que mouifican la fecha inteina uel objeto y las que uevuelven nuevos valoies: /0#123.5 <#,3(>,8 .2#8,+(.$#7 +.$ *#+C,7 //Agregar meses a la fecha $fecha = new Date("2008-08-10"); $fecha->addMonths(2); print $fecha; //2008-10-10 //Quitar meses a la fecha $fecha = new Date("2008-01-10"); $fecha->diffMonths(3); print $fecha; //2008-10-10 //Agregar dias $fecha = new Date("2008-02-29"); $fecha->addDays(5); print $fecha; //2008-03-05 //Quitar dias $fecha = new Date("2008-01-02"); $fecha->diffDays(5); print $fecha; //2007-12-28 //Agregar años $fecha = new Date("2008-01-02"); $fecha->addYears(3); print $fecha; //2011-01-02 //Quitar años $fecha = new Date("2008-01-02"); $fecha->diffYears(3); print $fecha; //2005-01-02 // Restar una fecha y devolver dias de diferencia, la fecha interna no se // modifica $fecha = new Date("2008-01-02"); print $fecha->diffDate(“2008-01-10”); //Devuelve -8 $fecha = new Date("2008-01-30"); print $fecha->diffDate(“2008-01-25”); //Devuelve 5 El métouo auuInteival y uiffInteival iealiza sumas y iestas ue inteivalos iespectivamente a otias fechas, la funcion siempie suma o iesta poi lo cual pasai númeios negativos como segunuo paiámetio geneia el mismo iesultauo. Las opeiaciones tienen en cuenta años bisiestos, coiiecciones giegoiianas, zonas hoiaiias y iangos ue fecha ue cualquiei longituu. T,93,5 T(2.7 -# ($%#8M,3.7 7.2.8%,-.7 2.8 6,%#55,--Z$%#8M,3 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S4S I.$7%,$%# 6#7+8(2+(:$ INTERvAL_BAY Establece un inteivalo ue uias uel calenuaiio giegoiiano INTERvAL_WEEK Establece un inteivalo ue semanas INTERvAL_N0NTB Establece un inteivalo ue meses uel calenuaiio giegoiiano INTERvAL_YEAR Establece un inteivalo ue años uel calenuaiio giegoiiano /0#123.5 ;7. -# ,--Z$%#8M,3 2,8, 7"1,8 ($%#8M,3.7 , *#+C,7 //Devuelve un objeto de fecha apartir de sumarle un intervalo a otra fecha Date::addInterval(“1980-05-11”, 10, Date::INTERVAL_DAY); //1980-05-21 Date::addInterval(“1981-02-27”, 7, Date::INTERVAL_DAY); //1980-03-06 Date::addInterval(“1980-05-11”, 2, Date::INTERVAL_MONTH); //1980-07-11 Date::addInterval(“1980-05-11”, 5, Date::INTERVAL_YEAR); //1985-05-21 //Devuelve un objeto de fecha apartir de sumarle un intervalo a otra fecha Date::diffInterval(“1980-05-11”, 10, Date::INTERVAL_DAY); //1980-05-01 36.10 Localización de Fechas Poi uefecto los nombies ue meses, uias, eias y foimatos ue fechas son uevueltos usanuo la localizacion ue la aplicacion en confiq.ini. Es posible mouificai la localizacion ue un objeto fecha usanuo el métouo setLocale() que acepta un objeto locole: /0#123.5 I,19(,8 3, 3.+,3(>,+(:$ -# 3.7 .90#%.7 -# *#+C, <?php $date = new Date('1986-02-02'); //Fecha en Inglés $date->setLocale(new Locale('en_US')); print $date->getLocaleDate(); //Fecha en Francés $date->setLocale(new Locale('fr_FR')); print $date->getLocaleDate(); //Fecha en Español $date->setLocale(new Locale('es_AR')); print $date->getLocaleDate(); //Fecha en Chino $date->setLocale(new Locale('zh_CN')); print $date->getLocaleDate(); Lo anteiioi geneia la siguiente saliua: Sunday, February 2, 1986 Dimanche 2 Février 1986 Domingo 2 de Febrero de 1986 1986年2月2日星期日 El métouo qetlocoleBote obtiene una fecha apta poi la cultuia estableciua usanuo uifeientes LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S46 tipos ue foimatos. El métouo acepta un paiámetio inuicanuo el tipo ue foimato ue fecha a obtenei: T,93,5 T(2.7 -# *.81,%.7 3.+,3(>,-.7 ^"# 7.2.8%, 6,%# T(2. !.81,%. 6#7+8(2+(:$ full 0btiene una fecha apta paia la localizacion en foimato completo o extenuiuo. Es el foimato pieueteiminauo uel métouo qetlocoleBote{). long Foimato laigo peio mas coito que 'full'. meuium Foimato ue fecha meuio, útil en iepoites o listauos. shoit Foimato ue fecha coito. El siguiente ejemplo ilustia las fechas obteniuas ue acueiuo a caua tipo ue foimato localizauo. Las vaiiaciones incluso ue paises ue la misma lengua son teniuas en cuenta: /0#123.5 [9%#$#8 *#+C,7 #$ *.81,%.7 3.+,3(>,-.7 -# ,+"#8-. , 3, +"3%"8, <?php $date = new Date('1985-11-01'); //Tipos de formatos en español de Mexico $date->setLocale(new Locale('es_MX')); print $date->getLocaleDate('full'); print $date->getLocaleDate('long'); print $date->getLocaleDate('medium'); print $date->getLocaleDate('short'); //Tipos de formatos en español de Colombia $date->setLocale(new Locale('es_CO')); print $date->getLocaleDate('full'); print $date->getLocaleDate('long'); print $date->getLocaleDate('medium'); print $date->getLocaleDate('short'); ueneianuo la siguiente saliua: Viernes 1 de Noviembre de 1985 1 de Noviembre de 1985 01/11/1985 01/11/85 Viernes 1 de Noviembre de 1985 1 de Noviembre de 1985 1/11/1985 1/11/85 36.11 Establecer el formato de la fecha Los foimatos ue fecha uevueltos poi qetlocoleBote iepiesentan el estánuai inteinacional ue acueiuo a la 0nicoue paia caua localizacion (iuioma y teiiitoiio). Auemás ue estos es posible LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S47 obtenei una fecha en un foimato peisonalizauo usanuo el métouo qet0sinqIormot{). Los foimatos son aplicauos poi el componente y se evita el uso ue funciones PBP como uate o stiftime ue esta foima pueue que algunos foimatos uisponibles en ellas no se encuentien piesentes. Los mouificauoies ue tipos ue foimato aceptauos poi este son los siguientes: T,93,5 T(2.7 -# 1.-(*(+,-.8#7 -# *.81,%.7 -# *#+C, ,+#2%,-.7 2.8 6,%#55)#%;7($)!.81,% T(2. @.-(*(+,-.8 6#7+8(2+(:$ uuuu Nombie ue la eia ue la fecha. Antes ue ciisto o uespués ue ciisto según la localizacion. uuu uu u Nombie abieviauo ue la eia. a.c. y u.c. yy Año abieviauo. El año 1997 seiia 97. yyyy y Año completo. uu Bia uel mes usanuo un ceio al inicio cuanuo el uia es menoi a 1u. u Bia uel mes. EEEE Nombie uel uia ue la semana. EEE Nombie uel uia ue la semana abieviauo. NNNN Nombie uel mes. NNN Nombie uel mes abieviauo. NN Numeio uel mes usanuo un ceio al inicio cuanuo es menoi a 1u. N Númeio uel mes. i Fecha en foimato RFC-2822 c Fecha IS0 86u1 z Bia uel año. o Númeio uel año IS0-86u1. L Nuestia un 1 cuanuo es año biciesto y ceio ue lo contiaiio. W Númeio ue la semana en el año. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S48 N Repiesentacion númeiica ue la fecha t Timestamp 0nix e Iuenticauoi ue Zona Boiaiia 0n ejemplo ue uso ue los mouificauoies ue foimato es: /0#123.5 [9%#$#8 3, *#+C, +.$ "$ *.81,%. 2#87.$,3(>,-. \ "$, 3.+,3(>,+(:$ #7%,93#+(-,- $d = new Date('1999-10-18'); $d->setLocale(new Locale('en_US')); print $d->getUsingFormat('yyyy.MM.dd, DD EEEE r MMMM L c t'); 36.12 Obtener la fecha y hora mundial Cuanuo se uesaiiollan aplicaciones que seián implementauas en uifeientes paises y¡o continentes y el seiviuoi ue aplicaciones iesiue en un punto cential el componente Bote piopoiciona uatos ue fecha y hoia que peimiten logiai esto apaitii ue la zona hoiaiia. La infoimacion ue zona hoiaiia uepenue ue la platafoima en la que está instalaua la aplicacion y ue la veision ue PBP, pueue instalai una veision actualizaua ue la extension pbp_timezone uisponible en PECL paia obtenei los últimos uatos ue zona hoiaiia. /0#123.5 [9%#$#8 3, *#+C, ,+%",3 7(1"3%,$#,1#$%# -# ,+"#8-. , -(*#8#$%#7 >.$,7 C.8,8(,7 print Date::getNowFromTimezone("Arctic/Longyearbyen"); // 2009-02-12 03:20:52 print Date::now(); // 2009-02-11 21:20:52 print Date::getNowFromTimezone("America/Caracas"); // 2009-02-11 21:50:52 print Date::getNowFromTimezone("Europe/Amsterdam"); // 2009-02-12 03:20:52 print Date::getNowFromTimezone("Europe/Berlin"); // 2009-02-12 03:20:52 print Date::getNowFromTimezone("Europe/Stockholm"); // 2009-02-12 03:20:52 print Date::getNowFromTimezone("Africa/Cairo"); // 2009-02-12 04:20:52 print Date::getNowFromTimezone("Asia/Jerusalem"); // 2009-02-12 04:20:52 print Date::getNowFromTimezone("Asia/Tokyo"); // 2009-02-12 11:20:52 print Date::getNowFromTimezone("Australia/Sydney"); // 2009-02-12 13:20:52 print Date::getNowFromTimezone("Antarctica/South_Pole"); // 2009-02-12 15:20:52 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S49 37 Componente Currency 37.1 Introducción El objetivo ue este componente es piopoicionai faciliuaues al uesaiiollauoi paia tiabajai con cantiuaues numéiicas ielacionauas con uineio y moneuas, su iepiesentacion ue acueiuo a la localizacion activa y la geneiacion ue montos en letias en uifeientes iuiomas. El componente sopoita uatos monetaiios paia más ue 9u localizaciones. 37.2 Cantidades usando el formato adecuado El componente Currency peimite aplicai el foimato coiiecto a cantiuaues ue acueiuo a la localizacion activa o la que se establezca. Be esta foima es posible utilizai los sepaiauoies ue uecimales y miles auecuauos paia caua teiiitoiio, el nombie ue la moneua y el simbolo ue uineio auecuauos. Currency pueue sei usauo meuiante métouos estáticos o cieanuo instancias ue esta cuanuo se iequieie utilizai múltiples localizaciones en un mismo pioceso. El sepaiauoi ue comas y agiupamiento pueue cambiai ue una localizacion a otia: /0#123.5 Z128(1(8 +,$%(-,-#7 1.$#%,8(,7 "7,$-. -(*#8#$%#7 3.+,3(>,+(.$#7 <?php $currency = new Currency(new Locale('en_US')); print $currency->getMoney(10000); //10,000.00 $currency->setLocale(new Locale('es_CO')); print $currency->getMoney(10000); //10.000,00 37.3 Simbolo y nombre de la moneda utilizada El componente Currency pueue combinai la conveision al foimato numéiico coiiecto y el nombie ue la moneua incluso cuanuo es uifeiente a la localizacion actual. El métouo getNoney también acepta un foimato con tipos ue iuentificauoies paia inuicai uatos auicionales ue la saliua monetaiia: /0#123.5 Z128(1(8 "$, +,$%(-,- 1.$#%,8(, "7,$-. "$ *.81,%. 2#87.$,3(>,-. <?php $currency = new Currency(new Locale('en_US')); print $currency->getMoney(10000, '%symbol%%name% %quantity% (%displayName%)'); $currency->setLocale(new Locale('es_CO')); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SSu print $currency->getMoney(10000, '%symbol%%name% %quantity% (%displayName%)'); ueneianuo la saliua: $USD 10,000.00 (US Dollar) $COP 10.000,00 (Peso de Colombia) Los tipos ue iuentificauoies sopoitauos son: T,93,5 T(2.7 -# 1.-(*(+,-.8#7 -# *.81,%. 7.2.8%,-.7 2.8 I"88#$+\ T(2. @.-(*(+,-.8 6#7+8(2+(:$ %symbol% Simbolo pieueteiminauo ue la moneua utilizaua. %name% Couigo IS0 S166 ue la moneua %uisplayName% Nombie ue la moneua en la localizacion activa. %quantity 0bicacion ue la cantiuau a foimateai. Si se iequiie se pueue pasai un teicei paiámetio a qetHoney inuicanuo la moneua en la que está la cantiuau peio sin cambiai la localizacion: /0#123.5 Z$-(+,8 #3 %(2. -# 1.$#-, "7,-. 7#)G$ 3, 3.+,3(>,+(:$ #$ I"88#$+\ $currency->setLocale(new Locale('es_CO')); print $currency->getMoney(100, '%symbol%%name% %quantity% (%displayName%)', ‘USD’); El ejemplo anteiioi impiime: USD 100.00 (dólar estadounidense) 37.4 Versiones escritas de cantidades 0na ue las capaciuaues impoitantes ue Currency es la posibiliuau ue geneiai veisiones en texto ue cantiuaues monetaiias. El componente se apoya en locoleHotb paia geneiai veisiones esciitas ue cantiuaues supeiioies a billones: //CUATROMIL QUINIENTOS BOLíVARES FUERTES VENEZOLANOS $currency = new Currency(new Locale('es_VE')); print $currency->getMoneyAsText(4500); //UN MILLON DOSCIENTOS CINCUENTAMIL PESOS COLOMBIANOS $currency = new Currency(new Locale('es_CO')); print $currency->getMoneyAsText(1250000); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS1 //UN MILLON DE PESOS COLOMBIANOS $currency = new Currency(new Locale('es_CO')); print $currency->getMoneyAsText(1250000); //CIEN PESOS COLOMBIANOS CON CINCUENTA CENTAVOS $currency = new Currency(new Locale('es_CO')); print $currency->getMoneyAsText(100.50); //UN PESO ARGENTINO $currency = new Currency(new Locale('es_AR')); print $currency->getMoneyAsText(1); //DOSCIENTOS CINCUENTA PESOS URUGUAYOS $currency = new Currency(new Locale('es_UY')); print $currency->getMoneyAsText(250); //OMITIR LA MONEDA $currency = new Currency(new Locale('es_UY')); print $currency->getMoneyAsText(250, false); El métouo qetHoneyAsText iecibe una cantiuau y segunuo paiámetio opcional que inuica si se uebe agiegai la moneua. Este métouo iealiza una coiiecta pluializacion uel texto ue acueiuo a la cantiuau y agiega las cantiuaues en centavos si aplica. 37.5 API del Componente Currency FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS2 Paite 6: Nonitoiizacion ue Aplicaciones 38 Componente ApplicationMonitor 38.1 Introducción Kumbio Fnterprise Iromework ofiece caiacteiisticas paia el monitoieo ue aplicaciones y sus componentes ue tal foima que pueua mejoiai las taieas ue auministiacion como sintonizacion o ueteiminacion ue pioblemas. El componente ApplicotionHonitor está integiauo con el louJer KFI lnstonce AJministrotion Console peimitienuo que peisonal no-especialista en áieas ue uesaiiollo pueua monitoiizai las aplicaciones ue una ueteiminaua instancia uel fiamewoik. Al obseivai el flujo ue ejecucion ue una aplicacion es posible contiolai que un pioceso ue negocio geneie los iesultauos espeiauos. uiacias a los capaciuaues uel fiamewoik ue ejecucion hoiizontal, ApplicotionHonitor pueue iecoiiei caua componente en ejecucion y tomai los uatos necesaiios paia hacei seguimiento a una peticion. 38.2 Infraestructura de Eventos comunes La infiaestiuctuia ue eventos comunes es una tecnologia embebible que piopoiciona seivicios básicos ue auministiacion ue seivicios a aplicaciones que iequieien monitoiizacion. Esta infiaestiuctuia ofiece un punto ue consoliuacion y peisistencia paia eventos uesue múltiples fuentes asi como su uistiibucion a los consumiuoies ue eventos. Caua evento es uefiniuo usanuo una estiuctuia XNL que uefine la uesciipcion uel mismo. Esta aiquitectuia ue eventos peimite que uiveisos piouuctos que no están fueitemente acoplauos los unos con los otios pueuan integiai eventos ue auministiacion piopoicionanuo una vista final a los iecuisos empiesaiiales existentes. Esta infiaestiuctuia ue eventos piopoiciona faciliuaues paia la geneiacion, piopagacion, peisistencia y consumo ue eventos sin uefinii los eventos en si mismos. El uesaiiollauoi pueue uefinii tipos ue eventos, giupos, filtios y ielaciones entie ellos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SSS 38.3 Componentes de la Infraestructura de Eventos La infiaestiuctuia ue común ue eventos consta ue los siguientes componentes: c`OcOb I.11.$k,7#/M#$% Peimite la cieacion ue eventos y acceso a sus uatos. Los iecuisos ue eventos utilizan la API ue CommonBoseFvent paia cieai nuevos eventos en base al mouelo ue aplicacion. Los consumiuoies ue eventos utilizan su API paia leei la infoimacion en ellos. Aplicaciones ue teiceios pueuen conveitii los objetos en iepiesentaciones en XNL paia inteicambiai los uatos. c`OcOP /11(%#8 El emisoi peimite el envio ue eventos poi un canal ue comunicacion BTTP. Bespués ue que un evento se alimenta ue uatos es tiansfeiiuo al emisoi. Este pueue opcionalmente completai uatos uel evento y haceilos paite ue la peticion. Los eventos son enviauos meuiante S0AP o SCA. c`OcOc /M#$% '#8M(+# El seivicio ue eventos iecibe los mensajes enviauos poi el Emmitei, los almacena en un almacen ue uatos peisistente y luego los uistiibuye asincionicamente a otios consumiuoies ue eventos. 38.4 ¿Porque usar monitorización? Los seivicios ue monitoieo ue Kumbia Enteipiise Fiamewoik peimiten evaluai ienuimiento, encontiai pioblemas y evaluai el piocesamiento noimal ue un conjunto ue aplicaciones en una instancia. Bay ties iazones piincipales poi las que se uebe monitoiizai: c`OdOb 6#%#81($,+(:$ -# 28.93#1,7 Es posible uiagnosticai eiioies paiticulaies usanuo las capaciuaues ue logging y tiaza que ofiece el fiamewoik. Poi ejemplo si un ueteiminaua aplicacion no está piouucienuo los iesultauos espeiauos es posible activai un log que iealice segumiento a los piocesos ue la misma y asi uetectai las iazones uel fallo. c`OdOP '($%.$(>,+(:$ -#3 <#$-(1(#$%. El componente ApplicotionHonitor también pueue obtenei estauisticas ue ienuimiento ue ueteiminauos piocesos y asi pouei encontiai cuellos ue botella geneianuo las sintonizaciones coiiesponuientes que mejoien el ienuimiento. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS4 c`OdOc I.$*(,9(3-,- -# 3, [2#8,+(:$ La monitoiizacion continua ue las aplicaciones ayuua a estabilizai en foima más eficiente una aplicacion geneianuo iespuestas continuas a pioblemas tanto funcionales como ue ienuimiento. 38.5 ¿Qué se puede monitorear? El monitoieo se iealiza con base a eventos piocesauos poi el fiamewoik. Estos eventos se lanzan en ueteiminauos puntos ue la ejecucion en una peticion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SSS 39 Componente CommonEvent 39.1 Introducción FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS6 Paite 8: Auministiacion e Infoimacion ue Aplicaciones 40 Componentes de Propósito General 40.1 Introducción A continuacion se piesenta la iefeiencia ue los componentes uel fiamewoik que aplican a cualquiei pioyecto ue softwaie. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS7 41 Componente Config 41.1 Introducción FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS8 42 Componente Extensions 42.1 Introducción El componente Fxtensions se encaiga ue auministiai las extensiones caigauas en una aplicacion ya sea ue foima uinámica o estática. 0na extension es un componente uel fiamewoik que no se caiga poi uefecto y tampoco es inyectauo al iequeiiise en un pioceso ue negocio. 42.2 Cargar una extensión dinámicamente La caiga uinámica ue extensiones peimite caigai componentes uel fiamewoik o ue usuaiio en el momento en el que se necesiten y poi consiguiente ieuucii ligeiamente la caiga ue lectuia ue uisco. /0#123.5 I,8),8 "$, #H%#$7(.$ -($U1(+,1#$%# "7,$-. #3 +.12.$#$%# /H%#$7(.$7 <?php class PressController extends ApplicationController { public function indexAction(){ //Cargar extensión de Localización Extensions::loadExtension("Kumbia.Locale"); } } 42.3 Cargar una extensión estáticamente Los extensiones que se usen ampliamente en la aplicacion pueuen caigaise meuiante el aichivo ue configuiacion ue las aplicaciones llamauo confiq,boot.ini. La estiuctuia uel aichivo es la siguiente: /0#123.5 I,8),8 "$, #H%#$7(.$ #7%U%(+,1#$%# "7,$-. 9..%O($( ; Cargar extensiones [modules] extensions = Kumbia.Acl,User.MyComponent,Mail.Phpmailer La seccion mouules tiene la opcion ue configuiacion extensions en la cual se pueue uefinii las extensiones a caigai sepaianuolas poi comas. Las extensiones que están en el namespace Kumbio hacen paite ue la biblioteca ue componentes ue fiamewoik, las que empiezan poi 0ser son componentes que el uesaiiollauoi a cieauo y están ubicauas en el uiiectoiio librory LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia SS9 ue la aplicacion, poi último, la extension se localiza en el uiiectoiio piincipal librory ue la instancia como es el caso ue PbpHoiler. dPOcOb I,8),8 +.12.$#$%#7 -# o#$- !8,1#R.8S Componentes especificos ue ZenJ Iromework pueuen sei caigauos estáticamente o uinámicamente usanuo la convencion "Zenu.Componente". Paia caigai una extension uinámicamente se usa: /0#123.5 I,8),8 +.12.$#$%#7 -# o#$- !8,1#R.8S Load::extension(“Zend.Dojo”) Paia caigailas en confiq,boot.ini se usa: [modules] extensions = Zend.Amf 42.4 Obtener información de extensiones cargadas Los siguientes métouos ue clase Fxtensions piopoicionan infoimacion sobie las extensiones caigauas: public booleon stotic islooJeJ{strinq $extensionNome) Bevuelve tiue si la extension ya ha siuo caigaua en la peticion actual, false ue lo contiaiio. public orroy stotic qetlooJeJFxtensions{) Bevuelve un aiieglo con los nombies ue las extensiones caigauas en la peticion actual. 42.5 Inyección de componentes Kumbio Fnterprise Iromework utiliza inyeccion ue uepenuencia paia caigai los componentes justo cuanuo son iequeiiuos. Si un componente es usauo fiecuentemente poi la aplicacion es piobable que caigailo estáticamente mejoie el ienuimiento en los uemás casos es iecomenuable peimitii que sean inyectauos uuiante la ejecucion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S6u 43 Componente Logger 43.1 Introducción El componente loqqer es un componente cuyo pioposito es el cieai logs usanuo uifeientes backenus meuiante auaptauoies, opciones ue geneiacion como foimatos y filtios e implementacion ue tiansacciones. Este componente acceue a sus auaptauoies usanuo el pation virtuol Proxy, es uecii, el objeto loqqer solo actúa como un Proxy al objeto ieal instanciauo que coiiesponue al tipo ue auaptauoi utilizauo poi el mismo. La clase loqqer uelega touas las taieas al auaptauoi que poi uefecto es el subcomponente Iileloqqer, el cual iealiza el almacenamiento en aichivos planos uel seiviuoi. 43.2 Adaptadores de Logger Touos los auaptauoies implementan la inteiface loqqerlnterfoce que uefine los métouos que caua auaptauoi uebe implementai. La inteiface tiene la siguiente estiuctuia: interface LoggerInterface { public function begin(); public function rollback(); public function commit(); public function close(); public function log($message, $type); } Los auaptauoies uisponibles son los siguientes: T,93,5 B-,2%,-.8#7 -(72.$(93#7 #$ #3 +.12.$#$%# E.))#8 B-,2%,-.8 6#7+8(2+(:$ FileLoggei Peimite esciibii logs a aichivos ue texto plano en el seiviuoi local. NailLoggei Peimite enviai un log a un coiieo electionico automáticamente en cuanto es cieauo. SANLoggei Peimite enviai logs como mensajes ue un seiviuoi ue mensajeiia Simple Asynchionous Nessaging (SAN). BatabaseLoggei Peimite giabai los logs en una tabla en la base ue uatos. CompiesseuLoggei Peimite esciibii logs a aichivos ue texto plano compiimiuos usanuo LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S61 ZLib en el seiviuoi local. StieamLoggei Peimite esciibii logs a envoltuias y piotocolos ue PBP que sopoiten esciituia. SocketLoggei Peimite esciibii logs a pueitos TCP¡0BP que tengan seiviuoies que acepten cauenas ue texto. El uesaiiollauoi pueue implementai sus piopios logs implementanuo la inteiface loqqerlnterfoce. 0n ejemplo uel uso uel componente Loggei es el siguiente: /0#123.5 I8#,+(:$ -# 3.)7 "7,$-. #3 +.12.$#$%# E.))#8 <?php class TestController extends ApplicationController { public function testAction(){ $logger = new Logger(); $logger->log("Esto es una prueba"); } } Se ha cieauo una instancia ue la clase loqqer y se ha logueauo el texto "Esto es una piueba". El piimei paiámetio que iecibe el constiuctoi ue loqqer es el nombie uel auaptauoi y el segunuo el nombie uel aichivo, en este caso se ha asumiuo que el auaptauoi es 'Iile' y el nombie uel log la convencion logYYYYNNBB.txt. Los logs se almacenan poi uefecto en el uiiectoiio 'logs' ue la aplicacion, sin embaigo esto pueue mouificaise usanuo el métouo setPotb(). Los mensajes ue los logs se ciean en mouo "oppenJ" es uecii, que agiegai nuevos logs sobie un aichivo ya existe inseita al final uel aichivo. El conteniuo iesultante uel aichivo es el siguiente: [Sun, 31 Aug 08 20:12:31 -0400][DEBUG] Esto es una prueba Poi uefecto el foimato uel log es •%uate%€•%type%€ %message%. En el siguiente ejemplo se cambia el foimato ue fecha y hoia y ue la linea uel log en geneial, auemás se cambia el nombie uel log: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S62 <?php class TestController extends ApplicationController { public function testAction(){ $logger = new Logger("File", "my_app.log"); $logger->setFormat("> %type% > %controller%/%action% on %application% at %date% with message: %message%"); $logger->log("Esto es una prueba"); $logger->log("Esto es otra prueba"); } } El foimato uel log ha siuo mouificauo usanuo el métouo setFoimat, el cual iecibe una cauena con mouificauoies que son ieemplazauos poi su valoi coiiesponuiente en el momento en que se geneia el log: > DEBUG > test/test on default at Sun, 31 Aug 08 20:00:00 -0400 with message: Esto es una prueba > DEBUG > test/test on default at Sun, 31 Aug 08 20:00:00 -0400 with message: Esto es otra prueba Los mouificauoies que acepta él métouo setFoimat son: T,93,5 @.-(*(+,-.8#7 ^"# 8#+(9# #3 1_%.-. 7#%!.81,% @.-(*(+,-.8 6#7+8(2+(:$ %type% Inuica el tipo ue evento logueauo. Consulte la tabla ue tipos ue eventos paia más infoimacion. %message% Es el mensaje logueauo como tal. %uate% Es la fecha en que ocuiie el evento. Poi uefecto utiliza el foimato que esta asignauo al mouificauoi ue la funcion Jote{´r´) que coiiesponue al foimato RFC 2822. %contiollei% El contiolauoi actual en el que se llama el log. %action% La accion actual en la que se llama el log. %piioiity% La piioiiuau con iespecto al contexto y el tipo ue evento. %facility% Inuica el contexto en el se piouuce el log. %uil% La 0RL completa pasaua al eniutauoi antes ue llamai al log. %application% La aplicacion actual en la que se geneia el log. El foimato ue fecha se pueue mouificai usanuo el métouo setFoimatBate: /0#123.5 I,19(,8 #3 *.81,%. -# *#+C, -# "$ 3.) "7,$-. 7#%!.81,%6,%# <?php class TestController extends ApplicationController { public function testAction(){ LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S6S $logger = new Logger("File", "my_app.log"); $logger->setFormat("> %type% > %controller%/%action% on %application% at %date% with message: %message%"); $logger->setDateFormat("Y.m.d H:i"); $logger->log("Esto es una prueba"); } } ?> El log geneiauo es el siguiente: > DEBUG > test/test on default at 2008.10.21 00:14 with message: Esto es una prueba 43.3 Tipos de Eventos en Logs El componente loqqer piopoiciona una seiie ue tipos ue eventos que peimiten clasificai caua uno ue acueiuo a una giaveuau o piioiiuau en algunos contextos. Paia uefinii el tipo ue evento en una linea uel log se pasa como segunuo paiámetio al métouo log una constante uel componente loggei asi: $logger->log("La memoria usada por la aplicación es ".memory_get_usage(), Logger::INFO); Los valoies ue las constantes coinciuen con las seveiiuaues usauas poi syslog y estanuaiizauas en el RFC S164 : The BSB syslog Piotocol (http://tools.ietf.org/html/rfc3164) . Auicionales a los estánuai, Loggei agiega los eventos C0ST0N y SPECIAL con menoi seveiiuau que los uemás peio que se utilizan en contextos menos ciiticos. Los tipos ue eventos sopoitauos son: T,93,5 /M#$%.7 \ 7" -#7+8(2+(:$ T(2. -# /M#$%. '#M#8(-,- 6#7+8(2+(:$ ENERuENCY u Emeigencia: El sistema esta inutilizable. ALERT 1 Aleita: Nensajes ue aleita. CRITICAL 2 Ciitico: Piopenue a la que se tomen acciones ue inmeuiato ERR0R S Eiioies: Eiioies o excepciones ue la aplicacion WARNINu 4 Auveitencias: Conuiciones ue Auveitencia N0TICE S Nensajes que ocuiien en conuicion noimal. INF0 6 Nensajes ue infoimacion. BEB0u 7 Nensajes ue uebug. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S64 C0ST0N 8 Nensajes sin clasificai geneianuos poi el usuaiio final. SPECIAL 9 Conuiciones especiales fueia ue un contexto ue ciiticiuau. Como poi ejemplo llevai un iegistio ue los usuaiios que ingiesan a la aplicacion. Nétouos uel mismo nombie son piopoicionauos en la clase loqqer y iealizan la misma taiea que log: /0#123.5 ;7,8 1_%.-.7 ,3(,7 2,8, ($-(+,8 3, 7#M#8(-,- -# "$ 1#$7,0# $logger->log("Esto es una Advertencia!”, Logger::WARNING); $logger->warning("Esto es una Advertencia!”); El tipo ue evento poi uefecto es Loggei::BEB0u. 43.4 Logger Facilities Kumbio Fnterprise Iromework mantiene sepaiauos los espacios ue memoiia y ejecucion uesue el Sistema 0peiativo hasta el Nivel ue 0suaiio esta infoimacion peimite evaluai en que contexto se piouucen los mensajes ue log. Los Facility son los siguientes: T,93,5 4.198#7 \ -#7+8(2+(:$ -# !,+(3(%(#7 I:-(). 4.198# 6#7+8(2+(:$ u S0 ueneiaua en el contexto ue sistema opeiativo. 0sualmente se ielaciona con pioblemas con peimisos o aleitas uel S0. 1 BARBWARE Relacionauo con activiuaues 2 NETW0RK Es el contexto ue comunicaciones e infiaestiuctuia ue ieu. S FRANEW0RK_C0RE Contexto uel núcleo uel Fiamewoik. 4 FRANEW0RK_C0NP0NENTS Contexto ue Componentes uel Fiamewoik (bunuleu) S SEC0RITY Contexto ue Seguiiuau S A0BIT Contexto ue Auuitoiia LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S6S 6 0SER_LEvEL Pioblemas ocuiiiuos a nivel ue usuaiio y aplicaciones. Paia obtenei el couigo numéiico uel Facility Actual se utiliza el métouo estático Iocility::qetIocility{). Poi meuio uel facility es posible ueteiminai el contexto en el que se oiigino un log. El tipo ue evento visto como seveiiuau y el facility como el contexto en el que se geneio, peimiten calculai la "Piioiiuau". ˆsta es el iesultauo ue multiplicai los couigos ue ambos, la seveiiuau y el facility. 43.5 Transacciones con Logs Caua auaptauoi iealiza una implementacion piopia ue tiansacciones según su natuialeza. Las tiansacciones peimiten al uesaiiollauoi ueciuii si los mensajes ue log acumulauos uuiante un pioceso ue negocio es necesaiio almacenailos en los backenu o anulai la opeiacion. Los métouos begin, commit y iollback familiaies en un ambiente ue base ue uatos pueuen sei usauos en el aichivo ue log paia auministiai el estauo ue la tiansaccion. En el siguiente se ejemplo se ilustia meuiante una tiansaccion ue negocio como el log es cieauo peio solo se guaiua si se cumplen cieitas conuiciones uel pioceuimiento: /0#123.5 I8#,8 "$, %8,$7,++(:$ #$ "$ 3.) <?php class PricesController extends WebServiceController { public function enterpriseProcedureAction(){ $logger = new Logger("File", "procedure.log"); $logger->begin(); $customer = new Customer(); $movements = $customer->getMovement(); if(count($movement)==0){ $logger->log("No hay movimiento para el cliente '{$customer- >getId()}'"); } $firstDay = Date::getFirstDayOfYear(); $lastDay = Date::getLastDayOfYear(); $totalPrice = 0; foreach($movements as $movement){ if(Date::between($movement->getDate(), $firstDay, $lastDay)==true){ $logger->log("El movimiento {$movement->getId()} es de este año"); if($movement->getStatus()!="F"){ $movement->setStatus("F"); $movement->save(); $totalPrice+=$movement->getPrice(); } } else { if($movement->getStatus()!="H"){ $movement->moveToHistorical(); } LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S66 } } if($totalPrice>=$cutomer->getMaxPrice()){ $logger->log("El cliente '{$customer->getId()}' ha sobrepasado su crédito"); $logger->commit(); } $logger->rollback(); } } ?> 43.6 API de FileLogger public voiJ setPotb{strinq $potb) Peimite establecei el Path uonue se almacenaian los logs. public voiJ setIormot{strinq $formot) Establece el foimato en el que se piouuciiá caua linea uel log. public voiJ setBoteIormot{strinq $formot) Establece el foimato ue fecha con los mouificauoies ue las funcion uate() paia piouucii las fechas en las lineas uel log. public $potb qetPotb{) 0btiene el path actual uonue se están almacenanuo los logs. public voiJ loq{mixeJ $msq, $type=loqqer::BFB06) Agiega una line al log ue tipo $type. public voiJ beqin{) Inicia una tiansaccion en el log. public voiJ rollbock{) Cancela una tiansaccion en el log. public voiJ commit{) Acepta una tiansaccion en el log almacenanuo las lineas penuientes. public voiJ close{) Cierro el loq. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S67 43.7 Uso de MailLogger El componente loqqer sopoita un auaptauoi especial que peimite que este al ceiiaise se envie automáticamente a un coiieo electionico. La extension hace uso ue la libieiia ue envio ue coiieo electionico Swift que se uistiibuye con el fiamewoik. El auaptauoi está uiseñauo paia iealizai el envio ue e-mails usanuo el piotocolo SNTP sin uepenuei ue la funcion moil{) ue PBP o ue la heiiamienta senJmoil. Touas los iegistios uel log que son agiegauos se almacenan en memoiia hasta que se cieiia el log, se invoca el métouo commit o se uestiuye el objeto. Bebiuo a lo anteiioi es iecomenuable no almacenai logs muy gianues ya que pueuen consumii uemasiaua memoiia y geneiai una saliua fatal poi paite ue la aplicacion. Los iegistios solo se pueuen agiegai cuanuo se activa una tiansaccion en el log, poi uefecto una es iniciaua automáticamente. También se pueue usai el métouo beqin{) paia iniciaila. Es necesaiio que el seiviuoi pueua establecei conexiones salientes a pueitos seguios (46S) e inseguios (2S) y que el seiviuoi SNTP esté uisponible al tiatai ue iealizai el envio uel log pues ue lo contiaiio se geneiaiá una excepcion. La extension ue PBP php_openssl uebe estai caigaua paia hacei uso ue este auaptauoi. El siguiente es un ejemplo uel uso ue Hoilloqqer envianuo un mensaje uesue una cuenta ue umail: /0#123.5 I8#,8 "$ @,(3E.))#8 ^"# #$M(, 3.7 1#$7,0#7 , "$ +.88#. -# j1,(3 $log = new Logger("Mail", "[email protected]", array( "server" => "smtp.gmail.com", "secureConnection" => true, "username" => "[email protected]", "password" => "98j2ue12", "subject" => "Problema en la aplicación" )); $log->log("Un Message de Error", Logger::ERROR); $log->log("Un Message Critico", Logger::CRITICAL); $log->close(); Al ceiiai el log se envia un mail con los 2 mensajes acumulauos inteinamente en el log. Paia iealizai conexiones seguias poi TLS se uebe establecei el paiámetio "secureConnection" a LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S68 tiue. Cuanuo no se establece el asunto uel mensaje NailLoggei utiliza el siguiente foimato: Hoilloq: nombreAplicocion - Iecbo usonJo formoto RIC2822 Si se uesea enviai el log a vaiios e-mails se pueue pasai un aiiay como segunuo paiámetio al instanciai el log: /0#123.5 /$M(,$-. 3.7 1#$7,0#7 -#3 @,(3E.))#8 , M,8(.7 +.88#.7 #3#+%8.$(+.7 $log = new Logger("Mail", array( "Soporte al Cliente" => "[email protected]", "Soporte Tecnico" => "[email protected]", "[email protected]" ), array( "server" => "smtp.gmail.com", "secureConnection" => true, "username" => "[email protected]", "password" => "98j2ue12", "subject" => "Problema en la aplicación" )); $log->log("Un Message de Error", Logger::ERROR); $log->log("Un Message Critico", Logger::CRITICAL); $log->close(); 43.8 Uso de DatabaseLogger FALTA 43.9 Uso de CompressedLogger El auaptauoi CompresseJloqqer peimite esciibii logs a aichivos ue texto plano compiimiuos usanuo zlib en el seiviuoi local. La extension ue PBP zlib uebe estai caigaua paia hacei uso ue este auaptauoi. La ventaja ue el uso ue este tipo ue logs es que ahoiian sustancialmente espacio ue uisco aunque iequieien ue mayoies iequeiimientos ue piocesamiento. /0#123.5 I8#,8 "$ 3.) +.128(1(-. +.$ E.))#8 $logger = new Logger("Compressed", "my_app.log.gz"); $logger->log(“Esta cadena será comprimida en el log”); $logger->close(); Al igual que Iileloqqer los iegistio se agiegan en mouo appenu es uecii que nuevos mensajes se agiegan al final uel aichivo. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S69 public voiJ setPotb{strinq $potb) Peimite establecei el Path uonue se almacenaian los logs. public voiJ setIormot{strinq $formot) Establece el foimato en el que se piouuciiá caua linea uel log. public voiJ setBoteIormot{strinq $formot) Establece el foimato ue fecha con los mouificauoies ue las funcion uate() paia piouucii las fechas en las lineas uel log. public $potb qetPotb{) 0btiene el path actual uonue se están almacenanuo los logs. public voiJ loq{mixeJ $msq, $type=loqqer::BFB06) Agiega una line al log ue tipo $type. public voiJ beqin{) Inicia una tiansaccion en el log. public voiJ rollbock{) Cancela una tiansaccion en el log. public voiJ commit{) Acepta una tiansaccion en el log almacenanuo las lineas penuientes. public voiJ close{) Cierro el loq. 43.10 Uso de SAMLogger El auaptauoi SANLoggei peimite enviai logs a un seivicio ue mensajes que sopoiten Simple Asynchionous Nessaging como el IBN WebSpheie NQSeiies. Este auaptauoi iequieie ue a extension SAN que peimite el envio ue mensajes ue logs a aplicaciones basauas en el WebSpheie Application Seivei que usen el piotocolo ue mensajes WebSpheie Platfoim LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S7u Nessaging (WPN). La extension pueue sei uescaigaua ue PECL. /0#123.5 /$M(,8 1#$7,0#7 -# 3.) , ?#9'2C#8# @#77,)($) '#8M#8 //Conectarse a un servidor SAM con WebSphere Messaging Server $logger = new Logger("SAM", null, array( ‘host => ‘192.168.10.100’, ‘port’ => 1506’, ‘broker’ => ‘webspherebroker’ )); $logger->log(“Esto es una alerta”, Logger::ALERT); //Conectarse a un servidor SAM de una aplicación en WebSphere Application Server $logger = new Logger("SAM", null, array( ‘endpoints => ‘192.168.10.100:7278:MyMessagingBoostrap’, ‘bus’ => Bus1’, ‘targetchain’ => ‘InboundMessaging’ )); $logger->log(“Esto es una alerta”, Logger::ALERT); 43.11 Uso de StreamLogger Este auaptauoi es el más flexible y potente ue los auaptauoies ue loqqer ya que peimite esciibii logs a uifeientes iecuisos cuya esciituia poi stieam este sopoitaua poi PBP. En los siguientes ejemplos se ilustia el uso ue este auaptauoi: /0#123.5 /$M(,8 1#$7,0#7 -# E.) "7,$-. #3 ,-,2%,-.8 '%8#,1E.))#8 //Este log será enviado a un archivo $logger = new Logger("Stream", “file://mylog.txt"); $logger->log(“Un log de ejemplo”); $logger->close(); //Este log será enviado a un archivo comprimido con gzip $logger = new Logger("Stream", “compress.zlib://mylog.txt.gz"); //Este log será enviado a un archivo comprimido con bzip2 $logger = new Logger("Stream", “compress.bzip2://mylog.txt.gz"); //Este log será enviado a un archivo comprimido con bzip2 $logger = new Logger("Stream", “compress.bzip2://mylog.txt.bz2"); //Este log será enviado a un archivo mediante SSH $logger = new Logger("Stream", ‘ssh2.sftp://user:[email protected]:22/path/to/file.txt"); //Este log será enviado a un archivo mediante FTP $logger = new Logger("Stream", ”ftp://user:[email protected]/path/to/file.txt"); //Este log será enviado a un archivo mediante FTP seguro $logger = new Logger("Stream", "ftps://user:[email protected]/path/to/file.txt"); //Este log será enviado a la salida estándar $logger = new Logger("Stream", “php://stdout"); //Este log será enviado a la salida de errores LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S71 $logger = new Logger("Stream", “php://stderr"); //Este log será enviado a memoria $logger = new Logger("Stream", “php://memory"); //Este log será enviado a memoria, en caso que los datos tengan un tamaño superior a 2MB serán escritos a disco $logger = new Logger("Stream", “php://temp"); //Cambiar limite a 10MB – 1073741824 bytes $logger = new Logger("Stream", “php://temp/maxmemory:1073741824"); En las opciones uel Stieam pueue estableceise el mouo ue esciituia que tenuiá en Log ue esta foima: $logger = new Logger("Stream", “file://my_log.txt", array( “mode” => “a” )); Los posibles mouos ue esciituia son: T,93,5 @.-.7 -# #7+8(%"8, -# 3.)7 "7,$-. '%8#,1E.))#8 @.-. 6#7+8(2+(:$ a Agiega logs al final uel aichivo existente. Si no existe lo ciea. ab Agiega logs al final uel aichivo existe. La esciituia es binaiia. Este es el mouo pieueteiminauo paia StieamLoggei, FileLoggei y CompiesseuLoggei. w Esciibe logs en el aichivo. Lo tiunca si existe y lo ciea si no existe. wb Esciibe logs en el aichivo. Lo tiunca si existe y lo ciea si no existe. La esciituia es binaiia. x Esciibe logs en el aichivo. Si ya existe geneia una excepcion. 43.12 Uso de SocketLogger Peimite esciibii logs a pueitos TCP¡0BP que tengan seiviuoies o seivicios que acepten cauenas ue texto. Los seiviuoies ue sockets pueuen ieplicai logs a otios seiviuoies meuiante caiácteiisticas ue bajo nivel. /0#123.5 /$M(,8 1#$7,0#7 -# 3.)7 "7,$-. 7.+S#%7 TIKJ;6K //Escribir a un servidor TCP en el puerto 1589 $logger = new Logger("Socket", “tcp://192.168.0.10:1589"); //Escribir a un servidor TCP en el puerto 1589 usando una conexión segura $logger = new Logger("Socket", “ssl://192.168.0.10:1589"); //Escribir a un servidor UDP en el puerto 111 $logger = new Logger("Socket", “udp://192.168.0.10:111"); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S72 44 Componente Utils 44.1 Introducción 0tils es un componente que piincipalmente es utilizauo poi el fiamewoik paia centializai funciones auxiliaies ue pioposito geneial, su funcionaliuau también está uisponible al uesaiiollauoi. 44.2 API de Utils stotic function orroy orroyHerqe0verwrite{orroy $o1, orroy $o2) Este métouo peimite combinai 2 aiiays asociativos multiuimencionales uevolvienuo el iesultauo. stotic function voiJ orroylnsert{orroy $form, mixeJ $inJex, mixeJ $volue, mixeJ $key=null) Este métouo peimite inseitai un valoi en una ueteiminaua posicion ue un aiiay movienuo los elementos a su posicion siguiente. stotic function orroy sconJirRecursive{strinq $pockoqe_Jir, orroy $files=orroy{)) Bevuelve un vectoi con touos los aichivos que haya una iuta. Este métouo iecoiie iecuisivamente los uiiectoiios encontiauos. stotic function orroy qetPoroms{orroy $poroms, int $numberArqs) Convieite los paiámetios poi nombie iecibiuos en una funcion y los convieite a un aiiay asociativo. El piimei paiámetio noimalmente es un aiiay uevuelto poi la funcion func_get_aigs() y el segunuo el valoi uevuelto poi func_num_aigs(). stotic function orroy qetPorom{strinq $porom) Bevuelve un aiiay asociativo con el iesultauo ue un paiámetio poi nombie. La llave uel item es el nombie uel paiámetio y su valoi iespectivo. stotic function strinq comelize{strinq $str) Bevuelve una cauena ue caiácteies en notacion camelizaua. stotic function strinq uncomelize{strinq $str) Bevuelve una cauena ue caiácteies en noticacion unuei scoie (guion bajo). LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S7S stotic function strinq lcfirst{strinq $s) Convieite la piimeia letia ue una palabia a minúsculas. stotic function strinq qetKumbio0rl{strinq $url) 0btiene una iuta valiua según el entoino ue ejecucion ue la aplicacion. Esta 0RL uevuelta peimitiiá acceuei a la aplicacion usanuo un iecuiso exteino. stotic function orroy qetµuoteJArroy{orroy $toµuoteArroy, strinq $quoteCbor=''') Agiega comillas a caua elemento ue un aiiay. El caiáctei ue comillas se establece con $quoteChai. stotic function strinq ucworJs{strinq $worJs) Convieite la piimeia letia ue caua palabia ue $woius a mayúscula iespetanuo el chaiset en el que se encuentia el valoi ue entiaua. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S74 Paite 8: Renuimiento y 0ptimizacion 45 Rendimiento y Optimización 45.1 Introducción En este capitulo se iefeiencian los componentes y piácticas que ayuuan a mejoiai el ienuimiento ue aplicacion uesaiiollaua en Kumbio Fnterprise. 45.2 Consideraciones de Rendimiento En los siguientes apaitauos se iecomienuan piácticas que mejoian el ienuimiento ue una aplicacion. dNOPOb ;%(3(>,+(:$ -# 2,8U1#%8.7 2.8 $.198# Nuchos ue los componentes ue fiamewoik como ActiveRecorJ, Router y Toq sopoitan paiámetios poi nombie. Estos peimiten inuicai los valoies ue los paiámetios iequeiiuos en cualquiei oiuen solventanuo una limitacion uel lenguaje PBP. Cuanuo se tiata ue mejoiai el ienuimiento ue una aplicacion es iecomenuable ieemplazai los llamauos a métouos que utilicen paiámetios poi nombie poi aiiays cuyos inuices iepiesenten los nombies ue estos. Be esta foima se elimina el oveiheau que iequieie evaluai meuiante expiesiones iegulaies los paiámetios poi nombie y asi optimiza la ejecucion ue la aplicacion. dNOPOP Z$7%,3,8 "$ I,+C# -# [2I.-# 0na ue las mejoies piácticas paia mejoiai el ienuimiento ue aplicaciones en Kumbio Fnteprise en fase ue piouuccion es instalai un cacheauoi ue couigo inteimeuio. Bebiuo a que en esta fase aichivos que contienen couigo PBP usualmente no se mouifican, un softwaie especializauo pueue cacheai el couigo inteimeuio (couigo PBP que se ha ievisauo su sintaxis y se ha eliminauo fiagmentos innecesaiios paia la ejecucion como comentaiios y otias paites) ue esta foima caua vez que se caiga un aichivo PBP en el compilauoi paite uel tiabajo ue inteipietacion ya está hecho. Noimalmente los caches ue couigo inteimeuio leen uatos ue los aichivos PBP como el inouo y el uispositivo uonue esta almacenauo paia cieai un iuentificauoi único paia el mismo y asi evitai que un mismo aichivo sea leiuo vaiias veces en una misma peticion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S7S La eliminacion ue la etapa ue paiseo uel couigo inteimeuio PBP no es la única mejoia que iealiza un cacheauoi. 0tias mejoias incluyen un consumo ieuuciuo ue iecuisos ue uisco uuio y optimizaciones al couigo inteimeuio. Las aplicaciones que noimalmente iealicen peticiones coitas con una inclusion moueiaua ue otios aichivos en la misma pueuen obtenei mejoias hasta uel 2uu% y Suu%. Paia piocesos laigos la optimizacion pueue sei uel Su% al 4u%. En cualquiei caso la mejoia siempie es consiueiable. La mayoi ventaja ue los cacheauoies ue couigo inteimeuio es que no iequiien que la aplicacion sea uesaiiollaua bajo ningún tipo ue estanuai o con algún iequeiimiento especial. La única limitacion es que PBP uebe estai instalauo como un mouulo uel seiviuoi o usanuo FastCuI, esto se uebe a que los uatos uel couigo inteimeuio se almacenan en memoiia compaitiua y ésta no está uisponible paia mouulos cgi. dNOPOPOb I,+C#,-.8#7 -# I:-(). Z$%#1#8-(. 6(72.$(93#7 Existen implementaciones ue cacheauoies tanto abieitas como ceiiauas. En las ue couigo abieito se encuentia la extension PECL Alteinative PBP Cache (APC) http://pecl.php.net/package/APC y Tuick NNCache http://turck- mmcache.sourceforge.net/index_old.html. En las opciones ue couigo ceiiauo está Zenu 0ptimizei http://www.zend.com/store/products/zend-platform/ y phpAcceleiatoi http://freshmeat.net/projects/phpa/. Las velociuaues ue touas las implementaciones son en piomeuio muy paieciuas. La opcion APC no implementa optimizaciones ue couigo intemeiuio poi lo que en algunas situaciones en ienuimiento pueue sei menoi. dNOPOc '($%.$(>,+(:$ -#3 '#8M(-.8 ?#9 Algunas optimizaciones iefeientes a aplicaciones uesaiiollauas en Kumbio Fnterprise pueuen sei iealizauas a nivel uel Web Seivei. A continuacion se piesentan las que aplican paia Apache Web Seivei o otios basauos en él, como 0rocle ETTP Server y ZenJ Applicotion Server. dNOPOcOb /3(1($,8 #$+,9#>,-.7 ($$#+#7,8(.7 El encabezauo BTTP que contiene el tipo ue seiviuoi usauo es enviauo en caua iespuesta que geneia el seiviuoi Web. En la mayoi paite ue los casos este encabezauo no tiene uso aplicable y poi lo tanto hace algo más gianue la iespuesta uel seiviuoi sin necesiuau alguna. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S76 Server: Apache/2.0.59 (Unix) PHP/5.2.9 DAV/2 Server at localhost Port 80 Este encabezauo pueue eliminaise cambianuo en la configuicion ue Apache la opcion SeiveiSignatuie a 0ff. Be esta foima se pueue ahoiiai más ue 1uB ue ancho ue banua paia una aplicacion en piouuccion uuiante un mes. dNOPOd '($%.$(>,+(:$ -# KLK FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S77 46 Componente Cache 46.1 Introducción Las aplicaciones ue alta uisponibiliuau iequieien uepenuienuo ue las conuiciones uel negocio sistemas ue cache que ofiezcan la posibiliuau ue implementai tiansacciones, contiol ue concuiiencia y clusteiizacion. louJerTecbnoloqy piopoiciona louJerCocbe un pioyecto inuepenuiente peio totalmente integiable al fiamewoik el cual ha siuo uesaiiollauo pensanuo en estas caiacteiisticas empiesaiiales. Cuanuo se iequieie mejoiai el ienuimiento y optimizai una aplicacion meuiante taieas más sencillas como cacheai fiagmentos ue vistas, uatos y iegistios Kumbio Fnterprise fromework piopoiciona el componente Cache. FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S78 47 Componente Compiler 47.1 Introducción Kumbio Fnterprise Iromework utiliza inyeccion ue uepenuencias paia instanciai cualquiei componete a meuiua que se va iequiiienuo. Esto iesulta iueal ya que evita que uecenas ue aichivos sean caigauos en una peticion sin que sean iequeiiuos encontiauo la meuia peifecta ue iequeiimientos ue uepenuencias paia caua pioceso ue negocio. Algunos componentes como Router, Bispotcber, Core, etc., no iequieien ue inyeccion ya que uebiuo a la aiquitectuia uel fiamewoik son iequeiiuos siempie en caua peticion y ue está foima se mejoia el ienuimiento ue una aplicacion. 0tios componentes son iequeiiuos usualmente peio uepenuienuo ue los objetivos ue la aplicacion se pueue uecii que son utilizauos 'fiecuentemente'. El uesaiiollauoi pueue contai cuantos aichivos son leiuos en una ueteiminaua peticion ue esta foima: <?php echo print_r(get_required_files()); ?> Si el númeio ue aichivos es muy elevauo, la aplicacion pouiia estai consumienuo iecuisos ue lectuia ue uisco altos hacienuo que el ienuimiento ue una aplicacion se uisminuya. El componente Compiler iesuelve estas situacion geneianuo un solo aichivo con touos los componentes y aichivos uel fiamewoik en una veision 'optimizaua' que son utilizauos en una peticion iegulai y uejánuole el iesto uel tiabajo al inyectoi ue uepenuencias. El uso ue este componente pueue aumentai el ienuimiento uel fiamewoik ue 4 a S veces. Si se cuenta o no se cuenta con un optimizauoi y cacheauoi ue couigo inteimeuio este componente siempie pueue sei ue gian ayuua paia el mejoiamiento uel ienuimiento ue una aplicacion. Poi sei una solucion basaua 1uu% en PBP pueue tenei un papel vital cuanuo no se cuenta con contiol uel haiuwaie uonue se implementa la aplicacion. 4.%,5 Compiler solo uebe sei usauo cuanuo la aplicacion haya cumpliuo en gian meuiua con las fases ue uesaiiollo y testeo ya que algunos componentes ue la aplicacion son incluiuos en la compilacion con lo cuál no se pouiia iealizai cambios a estos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S79 47.2 Teoria de optimización avanzada En este apaitauo se tiata ue explicai las teoiias que en louJerTecbnoloqy se han investigauo paia tiatai ue búscai una ejecucion más optima ue aplicaciones en PBP. Las investigaciones se basan en benchmaiks a uifeientes tipos ue piocesos. daOPOb [2%(1(>,+(:$ -# +(+3.7 daOPObOb [2%(1(>,+(:$ 2.8 8##123,>. -# *"$+(.$#7 Si paia un conjunto X' ue instiucciones iepetitivas se evalua n veces una misma funcion f{x) -~ y´, en JonJe x es un volor estótico poro este contexto entonces pouiia ueciise que hay una uegiauacion uel ienuimiento ya que el valoi y´ es evaluauo al menos n veces. La funcion entonces pueue sei tiauuciua a f{x) -~ z´ ieemplazanuo z' -• y' en el conjunto X'. daOPOP [2%(1(>,+(:$ 2.8 #M,3",+(:$ -# %#81($.7 #7%U%(+.7 6#*($(+(:$ b5 Si paia una evaluacion ue la expiesion ue compilacion f : X -• Y, los valoies ue x iesultan ue opeiaciones polimoificas ueuucibles entonces se pueue uecii que f : z' -• Y piouuciiá el mismo iesultauo en ejecucion. 6#*($(+(:$ P5 Si paia una evaluacion ue la expiesion ue compilacion f : X -• Y, los valoies ue x iesultan ue ieemplazai constantes ueuucibles entonces se pueue uecii que f : z' -• Y piouuciiá el mismo iesultauo en ejecucion. 47.3 Comportamiento de Compiler El componente geneia un único aichivo con touos los componentes y clases utilizauos en una peticion iegulai a una aplicacion. 0tios componentes pueuen sei agiegauos a este aichivo paia hacei más efectivo el objetivo espeiauo. daOcOb [2%(1(>,+(.$#7 9U7(+,7 -# 3, +.12(3,+(:$ El aichivo geneiauo es piouuciuo iealizanuo las siguientes optmizaciones que pueuen mejoiai en meuiua menoi o meuia el ienuimiento ue una peticion: • Touos los comentaiios ue linea sencilla y multi-linea son eliminauos • Espacios, tabulaciones y saltos ue linea son eliminauos. • Aichivos que sean incluiuos en otios aichivos ya incluiuos son omitiuos • Las constantes __FILE__ y __LINE__ mantienen su valoi oiiginal LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S8u daOcOP [2%(1(>,+(.$#7 ,M,$>,-,7 -# 3, +.12(3,+(:$ Con base al funcionamiento inteino uel compilauoi ue PBP es posible ueteiminai que piácticas ue piogiamacion son más ieconmenuables paia obtenei mejoias en velociuau y ienuimiento. Compiler ofiece una fase ue compilacion uenominaua avanzaua en la que iealiza las siguientes optimizaciones: • Touos los stiings ue uoble comilla que no contengan sustituciones ue vaiiables o caiacteies ue baiia inveitiua son conveitiuos a stiings ue comilla sencilla, excepto los que son multi-linea, ue esta foima se evita que el analizauoi léxico uel inteipiete PBP búsque innecesaiiamente expiesiones iegulaies que no van a sei encontiauas. • Las sentencias 'foi' son optimizauas cuanuo iealizan conteos sucesivos en su evaluacion. El couigo es mouificauo hacienuo que el conteo se ejecute una sola vez: /0#123.5 [2%(1(>,+(:$ 2.8 #3(1($,+(:$ -# +,3+"3.7 8#-"$-,$%#7 <?php $unArrayGrande = range(1, 10000); for($i=0;$i<=count($unArrayGrande)-1;$i++){ print $unArrayGrande[$i]; } Es mouificauo a: <?php $unArrayGrande = range(1, 10000); $_sp=count($unArrayGrande)-1; for($i=0;$i<=$_sp;$i++){ print $unArrayGrande[$i]; } • Cuanuo alguna ue las vaiiables ue la evaluacion es mouificaua entonces la sentencia 'foi' se mantiene intacta: <?php $unaPalabra = "esto es un texto"; for($i=0;$i<=strlen($unaPalabra)-1;$i++){ if($i%2==0){ $unaPalabra.="x"; } if($i>10){ break; } } • Las asignaciones que no se hagan con el opeiauoi ue inciemento o ueciemento son LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S81 conveitiuas a esta foima, poi lo tanto $x = $x ‚1 se lleva a $x‚‚ y $x = $x ‚ $y se convieite en $x‚=$y„ El uesaiiollauoi pueue tenei en cuenta las optimizaciones anteiioies e implementailas como buenas piácticas ue uesaiiollo. 47.4 Generar una Compilación Como se menciono anteiioimente el objetivo ue la compilacion es ieunii touos aquellos componentes y iecuisos que constituyen una meuia ue lectuia ue uisco optimizanuolos y asi mejoiai el ienuimiento ue la aplicacion. En el pioceso seleccionauo poi el uesaiiollauoi se invoca el métouo compileIromework uel componente Compiler: <?php Compiler::compileFramework() ?> 47.5 Limitaciones de Compiler El componente Compiler tiene las siguientes limitaciones: FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S82 48 Componente GarbageCollector 48.1 Introducción El componente 6orboqeCollector peimite ue maneia contiolaua compiimii o eliminai uatos uel estauo ue peisistencia y meta-uatos ue entiuaues almacenauos en el auministiauoi ue sesion. 48.2 ¿Porque usar este componente? Los contiolauoies que implementan el estauo ue peisistencia piopoicionan un potente métouo paia mantenei contextos ue sesion que mejoian la expeiiencia ue usuaiio en un ueteiminanuo componente ue la aplicacion. El uso excesivo ue múltiples contextos (múltiples contiolauoies con estauo ue peisitencia) pouiia sobiecaigai la aplicacion ya que touos los uatos ue peisistencia son paicialmente caigauos en caua peticion. Este componente pueue uetectai que contextos han expiiauo y libeiai la memoiia peisistente utilizaua aumentanuo el ienuimiento ue la aplicacion. 48.3 Como funciona el GarbageCollector El componente piopoiciona el métouo 6orboqeCollector::stortCollect{) que con base a una piobabiliuau pieuefiniua invoca una iutina en busca ue uatos uel estauo ue peisistencia o meta-uatos ue entiuaues que se consiueien en ues-uso o expiiauos. La iutina uel colectoi se ejecuta en 2 fases: d`OcOb !,7# -# I.128#7(:$ Piimeio se localizan uatos que no se hayan usauo en un tiempo pieuefiniuo y se compiimen los uatos usanuo zlib en nivel ue compiesion S (noimal). En este caso no se actúa piopiamente como iecolectoi ue uatos en uesuso peio ua la opoituniuau ue ie-utilizai los uatos ahoiianuo espacio al mismo tiempo. d`OcOP !,7# -# /3(1($,+(:$ Cuanuo los uatos han supeiauo un tiempo ue uesuso pionunciauo se pioceue a su eliminacion. En el caso ue los contiolauoies peisistentes básicamente se piouuce el efecto ue ieinicio ue sus atiibutos y en el ue los meta-uatos ue entiuaues se obliga a un nuevo volcauo poi paite ue ActiveRecorJHetoBoto. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S8S 48.4 Activar el GarbageCollector Poi uefecto el gaibage collectoi se encuentia uesactivauo paia cualquiei aplicacion, su activacion pueue sei piogiamacional o ueclaiativa. d`OdOb B+%(M,+(:$ -# 1,$#8, 28.)8,1,+(.$,3 La iutina ue iecoleccion pueue sei invocaua piogiamacionalmente al finalizai una peticion. 0n plugin ue aplicacion iesulta iueal paia invocai el qorboqe collector. Se iecomienua que la iecoleccion se haga siempie al finalizai las peticiones ya que en este punto se aseguia que los uatos a libeiai iealmente esten en uesuso o expiiauos. /0#123.5 /7%,93#+#8 3,7 .2+(.$#7 -#3 +.33#+%.8 28.)8,1,+(.$,31#$%# <?php class MyCollectorPlugin extends ApplicationPlugin { public function beforeFinishRequest(){ //Expirar objetos que tengan más de una hora en desuso GarbageCollector::setCollectTime(3600); GarbageCollector::startCollect(); } } d`OdOP B+%(M,+(:$ -# 1,$#8, -#+3,8,%(M, En el aichivo confiq,confiq.ini es posible activai ue foima ueclaiativa el iecolectoi meuiante la siguiente configuiacion: /0#123.5 B+%(M,8 #3 +.33#+%.8 -#7-# #3 ,8+C(M. -# +.$*()"8,+(:$ +.$*()O($( [application] mode = development name = "APPLICATION NAME" debug = On [collector] probability = 100 compressionTime = 900 compressionLevel = 5 collectTime = 1800 La uefinicion ue la seccion collector activa el componente 6orboqeCollector y su iutina ue libeiacion ue iecuisos es ejecutaua al final ue caua peticion a la aplicacion. 48.5 Parámetros del Collector Los siguientes paiámetios ueteiminan el compoitamiento uel componente: T,93,5 K,8U1#%8.7 -#3 +.12.$#$%# j,89,)#I.33#+%.8 LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S84 K,8U1#%8. 6#7+8(2+(:$ piobability Es un númeio enteio positivo que ueteimina la piobabiliuau que la iutina ue iecoleccion se ejecute. El collectoi se ejecuta cuanuo un númeio aleatoiio geneiauo entie 1 y probobility ua exactamente en su mitau enteia. 0n númeio alto ieuuce la piobabiliuau y uno bajo la aumenta. compiessionTime Es el tiempo que un objeto uebe supeiai paia que el colectoi lo compiima paia ahoiiai espacio. Poi uefecto es 9uu segunuos (1S minutos). compiessionLevel Es el nivel ue compiession que se utilizaia en la piimeia fase uel colectoi. Es un enteio entie u paia ceio compiesion y 9 paia máxima. 0n númeio elevauo aumenta los iecuisos utilizauos paia efectuai la opeiacion peio ieuuce más espacio. La compiesion se iealiza usanuo el foimato Zlib (ZLIB Compiesseu Bata Foimat Specification veision S.S). Se iequieie que la extension ue PBP zlib este uisponible. Poi uefecto es S. collectTime Es el tiempo que uebe pasai un objeto en uesuso paia maicaise como expiiauo y iealizai su posteiioi eliminacion. Poi uefecto es 18uu segunuos (Su minutos). LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S8S Paite 9: Contexto y Auministiacion ue Sesiones 49 Componente Session 49.1 Introducción El componente Session ofiece piincipalmente un métouo oiientauo a objetos paia la auministiacion ue peisistencia ue una aplicacion Web. Con una aiquitectuia basaua en auaptauoies es posible ue maneia flexible uefinii uifeientes backenu ue almacenamiento ue sesion a caua aplicacion. Es altamente iecomenuable utilizai el componente Session paia almacenai uatos ue sesion en vez ue utilizai la supeiglobal $_SESSI0N. Los métouos estáticos Session::set y Session::qet auministian la memoiia ue las aplicaciones ue tal foima que los uatos ue sesion sean completamente inuepenuientes a otias aplicaciones que coiian en el mismo seiviuoi y sobie el mismo cliente. Esta inuepenuencia elimina posibles pioblemas ue seguiiuau asociauos a la utilizacion ue aplicaciones con una estiuctuia ue autenticacion y valiuacion ue cieuenciales iuéntica. En el siguiente ejemplo se visualiza como Session sepaia la peisistencia en caua aplicacion. Tenemos 2 instancias uel Fiamewoik en el uocument ioot uel seiviuoi web, la piimeia paia la intianet y la segunua paia la intianet. Caua instancia tiene una seiie ue aplicaciones asociauas a caua una junto con un backenu ue sesion uifeiente. /0#123.5 /7%8"+%"8, -# ,23(+,+(.$#7 +.$ -(*#8#$%#7 9,+S#$- -# '#7(:$ intranet/ apps/ default/ | memcached produccion/ | files compras/ | Database:MySQL extranet/ apps/ default/ | files reservas/ | Database:Sqlite informacion/ | memcached produccion/ | files En la aplicacion existe una vaiiable ue sesion llamaua "auth", esta vaiiable contiola que el usuaiio final esté autenticauo en una aplicacion. Noimalmente utilizaiiamos esta vaiiable usanuo la supeiglobal $_SFSSl0N[´outb´]. Sin embaigo el valoi ue esta vaiiable estaiia LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S86 asociauo a nuestio 'session iu' y si acceuemos a otia aplicacion también estaiiamos autenticauos. Si las ieglas uel negocio lo peimiten esto estaiia coiiecto, peio en la mayoiia ue casos caua aplicacion auministia uifeientes mouelos ue seguiiuau y valiuacion. El componente Session hace que la misma vaiiable "auth" sea uifeiente en caua aplicacion ue foima inuepenuiente y en foima tianspaiente paia el uesaiiollauoi. En el ejemplo también se visualiza que la aplicacion 'piouuccion' existe tanto en 'intianet' como en 'extianet' sin embaigo su finaliuau es uifeiente. El componente Session sepaia la peisistencia ue sesion tomanuo en cuenta que se encuentia en uifeientes instancias uel Iromework asi el nombie ue la aplicacion sea el mismo. 49.2 Adaptadores de Sesión Caua aplicacion pueue utilizai un backenu uifeiente uesacueiuo a las necesiuaues ue la aplicacion. El componente Session implementa el pation 6otewoy actuanuo como pueita ue enlace al auaptauoi iequeiiuo cuanuo se efectúan opeiaciones sobie el estauo ue la sesion. 0na uesciipcion ue los backenu uisponibles es: T,93,5 B-,2%,-.8#7 -#3 +.12.$#$%# '#77(.$ B-,2%,-.8 6#7+8(2+(:$ Nemcache 0fiece mayoi velociuau y ienuimiento que los uemás backenu. El almacenamiento se iealiza en memoiia RAN poi lo que se evita la intensiva lectuia¡esciituia ue uisco ue los uemás backenu. Su escalabiliuau es mayoi igualmente. Batabase Peimite iealizai el usanuo una tabla en una base ue uatos. En el caso ue NySQL junto con NBB Clustei pueue aumentai la escalabiliuau, aunque esto uebe sei evaluauo ue acueiuo a las ieglas uel negocio. Este tipo ue implementacion ue sesiones aplica el pation Batabase Session State. Files Es el meuio ue almacenamiento poi uefecto ue PBP que utiliza el sistema ue aichivos paia guaiuai los uatos ue sesion. 0ptimizaciones al sistema ue aichivo pouiian mejoiai el ienuimiento. LouueiCache 0tiliza el Louuei Cache como backenu paia almacenai los uatos ue sesion. Be esta foima se pueue conseguii un sistema escalable y ue alta uisponibiliuau paia almacenai el estauo ue sesion ue una aplicacion. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S87 Los auaptauoies ue sesion implementan la inteiface Sessionlnterfoce: interface SessionInterface { public function getSaveHandler(); public function initialize(); } diOPOb B-,2%,-.8 -# '#7(:$ @#1+,+C# Paia activai el auaptauoi Hemcocbe se uebe agiegai a la seccion opplicotion uel aichivo confiq.ini ue la aplicacion lo siguiente: /0#123.5 /7%,93#+#8 #3 ,-,2%,-.8 -# 7#7(:$ , @#1+,+C#- sessionAdapter = memcache sessionSavePath = "tcp://127.0.0.1:11211?persistent=1&weight=2&timeout=2" diOPOP B-,2%,-.8 -# '#7(:$ 6,%,9,7# Paia usai el auaptauoi ue sesiones usanuo una tabla ue la bases ue uatos se uebe agiegai a la seccion opplicotion uel aichivo confiq.ini ue la aplicacion lo siguiente: /0#123.5 /7%,93#+#8 #3 ,-,2%,-.8 -# 7#7(:$ , 6,%,9,7# sessionAdapter = database sessionSavePath = "mysql:host=127.0.0.1;username=root;password=mypass;name=mydb" En la base ue uatos seleccionaua se uebe cieai la siguiente tabla: CREATE TABLE `session_data` ( `id` int(18) NOT NULL auto_increment, `session_id` varchar(35) NOT NULL, `data` text, `timelife` int(15) default NULL, PRIMARY KEY (`id`), KEY `session_id` (`session_id`) ); 0n collectoi ue uatos ue sesion no utilizauos es implementauo en este auaptauoi paia los uatos ue sesion que hayan expiiauo. Sesiones que tengan más ue 24 hoias ue expiiacion seián eliminauas ue la tabla session_Joto. diOPOc B-,2%,-.8 -# 7#7(:$ !(3#7 Es el auaptauoi poi uefecto y no es necesaiio iealizai configuiaciones auicionales paia estableceilo. La iuta ue almacenamiento ue aichivos pueue mouificaise buscanuo apiovechai optimizaciones uel sistema ue aichivos. /0#123.5 /7%,93#+#8 #3 ,-,2%,-.8 -# 7#7(:$ , *(3#7 sessionAdapter = files sessionSavePath = "/path/to/session/data" LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S88 Sistemas ue aichivos como ReiserIS en linux pueuen mejoiai el ienuimiento ya que estos auministian mejoi aichivos pequeños. diOPOd B-,2%,-.8 -# 7#7(:$ E."-#8 I,+C# Paia usai este auaptauoi louJerCocbe uebe estai instalauo como una libieiia en la instancia uel fiamewoik. 49.3 Comportamiento de Sesiones Las sesiones Kumbio Fnterprise Iromework son inicializauas en un manageu enviionment (entoino auministiauo) con lo que el punto ue inicializacion y finalizacion ue sesiones no uebe sei un pioblema paia el uesaiiollauoi. Los uatos en el entoino ue peisistencia son seiializauos¡ueseiializauos exactamente cuanuo es necesaiio, un mal manejo ue esto pouiia geneiai peiuiua ue uatos si se iealizase manualmente, especialmente cuanuo se almacenan objetos o se tiabaja con Web seivices. El Fiamewoik implementa el pation Server Session Stote paia conceptualmente auministiai el estauo ue peisistencia ue la aplicacion. Las sesiones se inicializan justo uespués ue caigai la clase contiolauoia, cualquiei pioceuimiento pievio a esto en uonue se inteiactúe con sesiones pueue piouucii iesultauos confusos. Los plugins ue contiolauoi que implementen el métouo Pluqin::beforeBispotcbloop{) son un ejemplo ue esto. 49.4 Consideraciones de Seguridad Las sesiones son un blanco ue ataques infoimáticos entie ellos estan los Bijacking o Fixation. 0na aplicacion Web mal uiseñaua pueue sei blanco ue ello, inuepenuiente uel Fiamewoik utilizauo paia su uesaiiollo. 0na ue las mejoies foimas ue evitai esto es usai sessiones basauas en cookies usanuo la uiiectiva ue configuiacion ue php session.use_cookies = 1 y auemás session.use_only_cookies = 1. 0na buena piactica auicional a lo anteiioi es ocasionalmente valiuai el tipo ue uato ue los valoies que piovengan ue sesiones usanuo el componente Iilter en casos en los que los valoies ue sesion vayan a sei utilizauos paia inseitai uatos en la base ue uatos: /0#123.5 !(3%8,8 3.7 -,%.7 -# 7#77(.$ 2,8, #M(%,8 C(0,+S($) <?php class CustomerController extends ApplicationController { LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S89 public function beforeFilter(){ $valor = Session::get(“valor”, “int”); $nombre = Session::get(“nombre”, “alpha”); } } 49.5 Variables de sesión El componente Session peimite la auministiacion ue vaiiables ue sesion que coiiesponuen a valoies simples que se iefeiencia meuiante un inuice o nombie clave. Las vaiiables ue sesion se almacenan en espacios ue memoiia inuepenuientes poi aplicacion con lo que se evita situaciones confusas al utilizai inuices comunes en uifeientes aplicaciones que se usen en una mismo contexto ue sesion con un usuaiio. diONOb BKZ -#3 I.12.$#$%# '#77(.$ public stotic voiJ initSessionBoto{) Inicializa los uatos ue sesion es uecii los ueseiializa y ciea un vectoi inteino listo paia usai. 0sualmente este métouo no es invocaua poi el uesaiiollauoi y es implicitamente llamauo al usai getBata o setBata. public stotic voiJ storeSessionBoto{) Este métouo es llamauo como un reqister_sbutJown_function y seiializa los uatos ue sesion. public stotic voiJ setBoto{strinq $inJex, mixeJ $volue) Peimite establecei un valoi ue sesion $value meuiante la llave $inuex. public stotic mixeJ qetBoto{strinq $inJex) Peimite obtenei un valoi ue sesion ue un valoi estableciuo con la llave $inuex. public stotic voiJ set{strinq $inJex, mixeJ $volue) Establece el valoi ue una vaiiable ue sesion usanuo la clave $inuex y el valoi $value. public stotic mixeJ qet{strinq $inJex) 0btenei el valoi ue una vaiiable ue sesion usanuo la clave $inuex. public stotic voiJ unsetBoto{strinq $inJex) Eliminai un vaiiable ue sesion usanuo la clave $inuex LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S9u public stotic mixeJ issetBoto{strinq $inJex) Peimite conocei si una vaiiable ue sesion ya existe. Este métouo uevuelve un valoi booleano true cuanuo ya existe y folse en el caso contiaiio. public stotic voiJ islockeJ{) Peimite sabei si la sesion esta bloqueaua paia esciituia. public stotic booleon isStorteJ{) Peimite sabei si ya se ha inicializauo el auaptauoi ue sesion y touo el contexto ue sesion como tal. public stotic voiJ stortSession{) Inicia el contexto ue sesion incluyenuo el auaptauoi ue auministiacion ue sesiones. 49.6 SessionNamespace La clase SessionNomespoce es un subcomponente ue Session el cual peimite la utilizacion ue uatos ue sesion ue maneia oiientaua a objetos y mantenienuo la inuepenuizacion ue la memoiia peisistente ue las aplicaciones uesaiiollauas. Al cieai un Nomespoce se asigna un nombie único que peimite iuentificai el espacio ue nombies en toua la aplicacion. Los iuentificauoies ue los Nomespoces ueben sei Stiings, estos no tienen conflicto con los nombies utilizauos en los métouos Session::set y Session::qet. Los objetos ue sesion cieauos en los SessionNomespoce son objetos auministiables que son automáticamente seiializauos¡ueseiializauos al guaiuaise en el backenu ue sesion. Auemás, estos objetos tienen la piopieuau ue poueise bloqueai¡uesbloqueai paia evitai que su valoi sea mouificauo poi eiioi o poi componentes ue teiceios. En el siguiente ejemplo se muestia un SessionNomespoce paia almacenai la infoimacion ielevante a los uatos uel usuaiio al inicio ue una sesion. Como se ilustia, no es necesaiio ejecutai ningún pioceuimiento paia almacenai los cambios uel Namespace, el nombie 0serBoto es usauo posteiioimente paia iecupeiai la infoimacion uel mismo. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S91 /0#123.5 ;%(3(>,+(:$ -# '#77(.$4,1#72,+# <?php class LoginController extends ApplicationController { public function processLoginAction(){ $userData = SessionNamespace::add('UserData', 'name', 'John Smith'); $userData->setRole("Administrator"); $userData->setLogin("j.smith"); } public function anotherAction(){ $userData = SessionNamespace::get('UserData'); if($userData->getRole()=="Administrator"){ Flash::notice("Bienvenido, su login es ".$userData- >getLogin()); } SessionNamespace::lock('UserData'); } public function theLastAction(){ $userData = SessionNamespace::get('UserData'); try { $userData->setRole("Public"); } catch(SessionException $e){ Flash::error("Error: La sesi&oacute;n esta bloqueada"); } } } Paia obtenei¡establecei los valoies uel namespace se uebe utilizai getteis¡setteis implicitos en el objeto uevuelto poi SessionNomespoce::oJJ o SessionNomespoce::qet. Estos utilizan notacion camelizaua y la utilizacion uel mismo ayuua a que el compoitamiento ue este sea el espeiauo. Los objetos cieauos son instancias ue NomespoceContoiner quien auemás piopoiciona los métouos setvolue y qetvolue que peimiten obtenei¡establecei los valoies uel namespace uinámicamente meuiante claves. diOeOb BKZ -# '#77(.$4,1#'2,+# public stotic NomespoceContoiner oJJ{strinq $nomespoce, strinq $property=null, mixeJ $volue=null) Ciea un nuevo SessionNamespace o uevuelve uno existe. Es posible establecei un piimei valoi usanuo el paiámetio $piopeity y $value. public stotic voiJ lock{strinq $nomespoce) Bloquea el SessionNamespace paia evitai cambios en sus uatos inteinos. public stotic voiJ unlock{strinq $nomespoce) Besbloquea el SessionNamespace peimitienuo cambios en sus uatos inteinos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S92 public stotic NomespoceContoiner qet{strinq $nomespoce) 0btiene un SessionNamespace existente. public stotic booleon exists{strinq $nomespoce) Inuica si un SessionNamespace ya existe o no. public stotic voiJ reset{strinq $nomespoce) Elimina los uatos uel SessionNamespace. public stotic voiJ Jrop{strinq $nomespoce) Elimina el SessionNamespace. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S9S Paite 1u: Beiiamientas uel Besaiiollauoi 50 Herramientas del Desarrollador 50.1 Introducción En este capitulo se explican compoitamientos ue las aplicaciones uesaiiollauas en Kumbia Enteiipiise que siivan ue guia al uesaiiollauoi. Auemás se piesentan componentes que ofiecen faciliuaues paia el testeo o el ropiJ Jevelopment como la geneiacion ue couigo aceleianuo piocesos ue uesaiiollo en una aplicacion ue negocios. 51 Errores y Excepciones 51.1 Introducción Kumbio Fnteprise es un fiamewoik uiseñauo paia sostenei e implementai aplicaciones ciiticas cuyos piocesos esten excesivamente testeauos y cuanuo se lleven a piouuccion tengan una mauuiez consiueiablemente buena. Paia logiai esto se ha uiseñauo el fiamewoik paia auoptai en cieito nivel compoitamientos como los ue los lenguajes compilauos o semi- compilauos. Las aplicaciones en PBP noimalmente iealizan acciones que uepenuienuo ue la situacion conllevan a que piocesos aboiten o no se ejecuten coiiectamente uebiuo a malas piácticas ue uesaiiollo. Estas piácticas van uesue cieai uinámicamente atiibutos en objetos, obtenei valoies ue inuices que no se han uefiniuo en aiiays, pasai aigumentos uel tipo incoiiecto a métouos y funciones y hasta no implementai el mouo E_STRICT. Cuanuo usteu uesaiiolla en Kumbio Fnterprise el fiamewoik le ayuua a uetectai cualquiei mala piáctica ue uesaiiollo o situaciones ue baja ciiticiuauau que muchas veces se pasan poi alto obliganuo a que se tome un coiiectivo apiopiauo. El caiáctei inteipietauo ue PBP uificulta que se encuentien eiioies o inconvenientes ue tipos en una piimeia fase ue compilacion ya que esta es inexistente. Poi esto es necesaiio hacei testeos a touos los piocesos en múltiples escenaiios paia uetectai pioblemas y coiiegiilos. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S94 51.2 Modo SUPER_STRICT Touas las situaciones ue eiioi, auveitencia e infoimacion que se geneian uesue PBP y como paite uel pioceso ue valiuacion iiguioso implementauo en una aplicacion se iepoitan al uesaiiollauoi en foima ue excepciones. Algunas situaciones que geneian excepciones: • Llamauos a métouos y funciones envianuo tipos ue uatos incoiiectos. Funciones que ieciban aiiays o instancias pieuefiniuas ue objetos. • Llamauos a métouos y funciones con un númeio incoiiecto ue paiámetios • Leei una piopieuau ue un objeto que no haya uefiniuo pieviamente • Esciibii una piopieuau ue un objeto que no se haya uefiniuo pieviamente • Leei una vaiiable que no se haya uefiniuo • Leei un valoi ue un inuice ue un aiiay que no se haya uefiniuo • Leei con incluue un aichivo que no exista • Invocai un métouo en foima estática sin que este uefiniuo como tal • Realizai una uivision poi ceio • Realizai una opeiacion cuyos opeianuos no esten sopoiauos poi los opeiauoies • Beseiializai un objeto incompleto • Asignai una iefeiencia a un objeto instanciauo con new • Inuexai un vectoi usanuo una constante no uefiniua • Tiatai ue conveitii un objeto (sin __toStiing()) uefiniuo en un valoi escalai (enteio, flotante) • Tiatai ue conveitii un objeto stuClass en una cauena vaiiables ue configuiacion que geneian excepciones (pueuen sei uesactivauas): • Tenei iegistei_globals activauo • Tenei session.use_only_cookies = u 51.3 Capturar excepciones de gravedad leve Algunos uesaiiollauoies pueuen consiueiai que ueteiminauos componentes son susceptibles a excepciones leves y poi lo tanto estas ueban contiolaise auecuauamente. Las excepciones poi notificaciones, auveitencias y otias son geneiauas con un couigo que peimite LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S9S iuentificailas: /0#123.5 I,2%"8,8 "$, #H+#2+(:$ -# )8,M#-,- 3#M# <? try { //Imprimir una variable que no existe print $value; } catch(CoreException $e){ //Si es una excepción leve la re-lanza if($e->getMessage()!=-8){ throw $e; } } Los couigos ue las excepciones leves son las siguientes: T,93,5 I:-().7 2,8, (-#$%(*(+,8 #H+#2+(.$#7 3#M#7 I:-(). T(2. 6#7+8(2+(:$ -8 Notificaciones Inuica que se ha encontiauo situaciones que pouiian inuicai un posible eiioi o inconsistencia. -2 Auveitencias Inuica situaciones que inuica que no se ha pouiuo completai una opeiacion espeiaua peio que peimiten que se continue con la ejecucion ue la aplicacion. -16 Auveitencias ue PBP Son situaciones ue auveitencia geneiauas poi PBP como poi ejemplo el no pouei caigai una extension. -2u48 Nouo Stiict ueneia excepciones que pievienen que el couigo no se vuelva obsoleto a tiavés uel tiempo y sea fácilmente poitable a nuevas veisiones ue PBP. Existen otios tipos ue excepciones, sus couigos coinciuen con los valoies ue las constantes E_0SER_ERR0R, E_0SER_WARNINu, E_0SER_N0TICE, E_BEPRECATEB y otias. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S96 52 Componente Debug 52.1 Introducción El componente Bebuq ofiece al uesaiiollauoi la posibiliuau ue iealizai seguimiento y obtenei infoimacion extenuiua en piocesos ue negocio ue foima tiauicional meuiante la inseicion ue banueias en el couigo paia conocei el valoi y estauo en un ueteiminauo punto uel mismo. Es una buena piáctica iealizai pieviamente test ue uniuau a los piocesos ue negocio paia automatizai los piocesos ue testeo mejoianuo la estabiliuau ue estos. 52.2 Seguimiento al estado de variables El componente Bebug piopoiciona el métouo oJJ{mixeJ $volue, $sbowTroce=folse) que peimite agiegai una vaiiable a la lista ue seguimiento. Los valoies ue seguimiento solo se agiegan si el pioceuimiento tiazauo ejecuta la linea uonue se encuentia el llamauo. En el siguiente ejemplo se envia al seguimiento 2 valoies en ueteiminauos puntos uel pioceso. El piimeio visualiza el conteniuo ue la vaiiable $customeiIu y el segunuo el conteniuo uel vectoi $customeiAccounts„ /0#123.5 <#,3(>,8 "$ 6#9") , "$ 28.+#7. -# $#).+(. <?php class BankingController extends ApplicationController { public function getSelectedActivityAction(){ $selectedAccountsIds = $this->getPostParam("cuenta"); $customerAccounts = array(); if(is_array($selectedAccountsIds)){ $userData = SessionNamespace::get('UserData'); $customerId = $userData->getCustomer(); //Que hay en la variable $customerId? Debug::add($customerId); foreach($selectedAccountsIds as $accountId){ $accountId = $this->filter($accountId, "int"); $existsAccount = $this->Account->count("customer_id = '$customerId' AND id='$accountId' AND status='A'"); if($existsAccount==true){ $customerAccounts[] = $accountId; } else { Flash::error("Cuentas invalidas en la peticion"); return; } } } else { Flash::error("Datos invalidos en la peticion"); return; } //Que hay en customerAccounts? Debug::add($customerAccounts); $movements = $this->Movement->find("account_id IN (".join(", ", $customerAccounts).")", "order: created_at DESC"); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S97 $this->setParamToView("movements", $movements); new DebugException(“Visualizar el Debug”); } } Siempie se iequieie que se lance una excepcion sin captuiai. El componente Bebuq visualiza el seguimiento sin impoitai el tipo ue excepcion geneiaua. En el ejemplo no se piouuce ninguna excepcion poi lo que a pioposito se lanza un BebuqFxception. En la pantalla ue excepciones ahoia se muestia el cuauio llamauo "Batos ue Bebug" como el siguiente: La piimeia columna es el oiuen en el que se agiegaion al seguimiento los valoies, la segunua es el valoi que se paso al métouo oJJ{), luego la clase y el métouo en uonue se agiego el uebug, la linea, el aichivo y poi último el tiempo tianscuiiiuo entie un seguimiento y otio. 52.3 Visualizar la traza del seguimiento de un valor Paia cieitos casos pueue que sea impoitante veiificai que métouos se ejecutaion paia que un uato se haya agiegauo al seguimiento. El segunuo paiámetio ue oJJ peimite que se muestie la tiaza asociaua al valoi ue seguimiento. Los valoies iesaltauos en iosauo inuican que tienen una tiaza asociaua que apaiece a continuacion en giis. En la tiaza es posible visualizai que paiámetios iecibio caua métouo ejecutauo y en que aichivo se encuentia. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S98 52.4 Detener un proceso mediante Aserciones En un pioceso ue seguimiento también pueue sei útil uetenei el pioceso cuanuo se cumpla una ueteiminaua conuicion. Tomanuo la iuea ue los test ue uniuau es posible inseitai aseiciones en el pioceso. Las aseiciones evaluan conuiciones y en caso ue cumpliise lanzan una excepcion ue tipo BebuqFxception uetenienuo el pioceso y mostianuo el segumiento hasta ese punto. Touas las aseiciones que no se cumplieion también se muestian en el seguimiento. Las aseiciones uisponibles son: T,93,5 B7#8+(.$#7 7.2.8%,-,7 #$ 6#9") @_%.-. 6#7+8(2+(:$ asseitEquals(mixeu $val1, mixeu $val2, $showTiace=false) Aseicion si el valoi $val1 es igual a $val2. asseitNotEquals(mixeu $val1, mixeu $val2, $showTiace=false) Aseicion si el valoi $val1 no es igual a $val2. asseitNull(mixeu $val1, $showTiace=false) Aseicion si $val1 es nulo. asseitAiiay(mixeu $val1, $showTiace=false) Aseicion si $val1 es un aiiay. assetTiue(mixeu $val1, $showTiace=false) Aseicion si $val1 es veiuaueio. asseitFalse(mixeu $val1, $showTiace=false) Aseicion si $val1 es falso. El uso ue las aseiciones es el siguiente: /0#123.5 ;7. -# ,7#8+(.$#7 #$ 6#9") <?php $v = 100; Debug::assertEquals(“1”, $v); //No se lanza la excepción Debug::assertNotEquals(“1”, $v); //Se lanza la excepción Debug::assertTrue(100==$v); //Se lanza la excepción $employees = $this->Employees->find(“status=’A’”); Debug::assertEquals(count($employees), 10); //Se lanza si hay 10 trabajadores Tomanuo el ejemplo anteiioi, el cuauio ue uebug se visualiza el tipo ue aseicion y los valoies uel mismo: LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia S99 52.5 Establecer una acción a ejecutar al finalizar el proceso de debug El componente Bebuq pueue apiovechai las capaciuaues paia piogiamai eventos uel fiamewoik paia efectuai opeiaciones al teiminai la piocesai una ueteiminaua peticion. Las acciones que se pueuen piogiamai son geneiai una excepcion que visualice el conteniuo uel seguimiento o almacenailos en un aichivo ue log: Paia uetenei la ejecucion al finalizai la peticion se uebe hacei el llamauo a: /0#123.5 /7%,93#+#8 #3 3,$>,1(#$%. -# "$, #H+#2+(:$ +",$-. *($,3(+# 3, 2#%(+(:$ Debug::setActionOnFinish(Debug::ACTION_HALT); 0tilizai un loggei paia almacenai el seguimiento: /0#123.5 B31,+#$,8 #3 7#)"(1(#$%. "7,$-. "$ E.))#8 $logger = new Logger(“File”, “debug.txt”); Debug::setActionOnFinish(Debug::ACTION_LOG, $logger); LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4uu 53 Test de Unidad 53.1 Introducción El testeo unitaiio peimite a uesaiiollauoies e ingenieios ue piuebas compiobai que caua uniuau ue couigo fuente en el softwaie funciona como se espeia. Se pueue uecii que una uniuau es la paite más pequeña ue una aplicacion que se pueue piobai. Los test ue uniuau ayuuan a oiganizaciones a geneiai mejoies aplicaciones más iápiuo, lo que les geneia ventajas competitivas impoitantes. Kumbio Fnterprise Iromework posee su piopio componente paia el uesaiiollo y ejecucion ue piuebas unitaiias tanto paia aplicaciones, como paia piobaise a si mismo. Los ingenieios ue louJerTecbnoloqy han uesaiiollauo más ue 1Suu test unitaiios paia piobai en piofunuiuau, caua funcionaliuau uel fiamewoik y mejoiai el componente en si mismo. 53.2 Tests para Componentes Componentes ue usuaiio pueuen sei piobauos usanuo test ue uniuau. Estos ueben iesiuii en un ambiente exteino paia compiobai que la misma natuialeza ue su uso es la espeiaua. FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4u1 54 Componente Script 54.1 Introducción Este componente peimite la cieacion ue sciipts tipo shell que ayuuen al uesaiiollauoi a optimizai taieas. FALTA LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4u2 55 Apendices 55.1 Estándares de Codificación En este apenuice se explica los estánuaies que fueion seguiuos paia couificai el fiamewoik y que ueben sei seguiuos poi colaboiauoies y empleauos ue louJerTecbnoloqy. NNObOb [90#%(M.7 Auto-uocumentai el fiamewoik ue tal maneia que las caiacteiisticas ue auto-completauo ue couigo que tienen los IBEs ue uesaiiollo NNObOP !.81,%. -# B8+C(M.7 KLK ! La etiqueta ue cieiie ".•" no está peimitiua paia los aichivos que contienen solo couigo PBP. ! La inuentacion ue los aichivos uebe haceise con 4 espacios sin caiacteies tabulauoies. ! La couificacion ue los aichivos uebe sei 0TF-8 ! En aichivos no-compiimiuos, caua linea uebe tenei máximo 8u caiacteies. ! En aichivos compiimiuos caua linea uebe tenei máximo 2u48 caiacteies o 7uu constiucciones uel lenguaje ! La teiminacion ue linea uebe iealizaise con el caiáctei LF, ASCII 1u coiiesponuiente a aichivos 0nix. NNObOc I3,7#7 ! Las clases coiiesponuientes al fiamewoik ueben estai ubicauas en el uiiectoiio "Kumbia¡". ! Los nombies ue las clases ueben estai camelizauos y contenei solo caiacteies alfanuméiicos. ! Solo es peimitiuo una clase poi aichivo ! El nombie uel aichivo coiiesponue al nombie ue la clase en él más la extension ".php". NNObOd Z$%#8*,+#7 ! Las inteifaces ueben estai uefiniuas en un aichivo llamauo Inteiface.php en el uiiectoiio uel paquete o subpaquete uonue aplique su uso. ! Las inteifaces ueben tenei el sufijo Inteiface. NNObON @_%.-.7 ! Los nombies ue los métouos ueben tenei nomenclatuia camelizaua, es uecii no se peimiten unueiscoies "_" y siempie ueben empezai poi un caiáctei en minúsculas. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4uS NNObOe Y,8(,93#7 ! Las vaiiables ueben tenei solo caiacteies alfanuméiicos. Cuanuo son piopieuaues piivauas o piotegiuas ue clases ueben empezai poi un unueiscoie "_". ! La visibiliuau ue las piopieuaues ue las clases uebe sei piincipalmente piivaua o piotegiua. ! Los nombies ue las vaiiables ueben sei lo más humanizauas posible ue tal foima que se entienua el objetivo ue la vaiiable. vaiiables que almacenan valoies auxiliaies en ciclos pueuen tenei nombies como $j o $i. NNObOa I.$7%,$%#7 ! Solo está peimitiuo uefinii constantes ue clase. Estas ueben estai en mayúsculas y caua palabia uebe estai sepaiaua poi unueiscoie "_". NNObO` k.3#,$.7 \ M,3.8#7 $"3.7 ! Los valoies tiue, false y null siempie ueben ii en minúsculas. NNObOi E(%#8,3#7 -# I,-#$,7 -# I,8,+%#8#7 ! Las cauenas ue caiacteies siempie ueben ii enceiiauas usanuo comillas simples (') a menos que contengan substituciones o otias comillas sencillas. ! $cauena = 'Esto es una cauena'„ NNObObQ '"97%(%"+(.$#7 -# M,8(,93#7 Se iecomienua evitai las substituciones ue vaiiables poi expiesiones ue concatenacion. FALTA 55.2 Licencia de este Documento NNOPOb I8#,%(M# I.11.$7 B%%8(9"%(.$ cOQ TBE W0RK (AS BEFINEB BEL0W) IS PR0vIBEB 0NBER TBE TERNS 0F TBIS CREATIvE C0NN0NS P0BLIC LICENSE (…CCPL… 0R …LICENSE…). TBE W0RK IS PR0TECTEB BY C0PYRIuBT ANB¡0R 0TBER APPLICABLE LAW. ANY 0SE 0F TBE W0RK 0TBER TBAN AS A0TB0RIZEB 0NBER TBIS LICENSE 0R C0PYRIuBT LAW IS PR0BIBITEB. BY EXERCISINu ANY RIuBTS T0 TBE W0RK PR0vIBEB BERE, Y00 ACCEPT ANB AuREE T0 BE B00NB BY TBE TERNS 0F TBIS LICENSE. T0 TBE EXTENT TBIS LICENSE NAY BE C0NSIBEREB T0 BE A C0NTRACT, TBE LICENS0R uRANTS Y00 TBE RIuBTS C0NTAINEB BERE IN C0NSIBERATI0N 0F Y00R ACCEPTANCE 0F S0CB TERNS ANB C0NBITI0NS. LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4u4 bO 6#*($(%(.$7 …Auaptation… means a woik baseu upon the Woik, oi upon the Woik anu othei pie-existing woiks, such as a tianslation, auaptation, ueiivative woik, aiiangement of music oi othei alteiations of a liteiaiy oi aitistic woik, oi phonogiam oi peifoimance anu incluues cinematogiaphic auaptations oi any othei foim in which the Woik may be iecast, tiansfoimeu, oi auapteu incluuing in any foim iecognizably ueiiveu fiom the oiiginal, except that a woik that constitutes a Collection will not be consiueieu an Auaptation foi the puipose of this License. Foi the avoiuance of uoubt, wheie the Woik is a musical woik, peifoimance oi phonogiam, the synchionization of the Woik in timeu-ielation with a moving image (…synching…) will be consiueieu an Auaptation foi the puipose of this License. …Collection… means a collection of liteiaiy oi aitistic woiks, such as encyclopeuias anu anthologies, oi peifoimances, phonogiams oi bioaucasts, oi othei woiks oi subject mattei othei than woiks listeu in Section 1(f) below, which, by ieason of the selection anu aiiangement of theii contents, constitute intellectual cieations, in which the Woik is incluueu in its entiiety in unmouifieu foim along with one oi moie othei contiibutions, each constituting sepaiate anu inuepenuent woiks in themselves, which togethei aie assembleu into a collective whole. A woik that constitutes a Collection will not be consiueieu an Auaptation (as uefineu above) foi the puiposes of this License. …Bistiibute… means to make available to the public the oiiginal anu copies of the Woik oi Auaptation, as appiopiiate, thiough sale oi othei tiansfei of owneiship. …Licensoi… means the inuiviuual, inuiviuuals, entity oi entities that offei(s) the Woik unuei the teims of this License. …Woik… means the liteiaiy anu¡oi aitistic woik offeieu unuei the teims of this License incluuing without limitation any piouuction in the liteiaiy, scientific anu aitistic uomain, whatevei may be the moue oi foim of its expiession incluuing uigital foim, such as a book, pamphlet anu othei wiiting„ a lectuie, auuiess, seimon oi othei woik of the same natuie„ a uiamatic oi uiamatico-musical woik„ a choieogiaphic woik oi enteitainment in uumb show„ a musical composition with oi without woius„ a cinematogiaphic woik to which aie assimilateu woiks expiesseu by a piocess analogous to cinematogiaphy„ a woik of uiawing, LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4uS painting, aichitectuie, sculptuie, engiaving oi lithogiaphy„ a photogiaphic woik to which aie assimilateu woiks expiesseu by a piocess analogous to photogiaphy„ a woik of applieu ait„ an illustiation, map, plan, sketch oi thiee-uimensional woik ielative to geogiaphy, topogiaphy, aichitectuie oi science„ a peifoimance„ a bioaucast„ a phonogiam„ a compilation of uata to the extent it is piotecteu as a copyiightable woik„ oi a woik peifoimeu by a vaiiety oi ciicus peifoimei to the extent it is not otheiwise consiueieu a liteiaiy oi aitistic woik. …You… means an inuiviuual oi entity exeicising iights unuei this License who has not pieviously violateu the teims of this License with iespect to the Woik, oi who has ieceiveu expiess peimission fiom the Licensoi to exeicise iights unuei this License uespite a pievious violation. …Publicly Peifoim… means to peifoim public iecitations of the Woik anu to communicate to the public those public iecitations, by any means oi piocess, incluuing by wiie oi wiieless means oi public uigital peifoimances„ to make available to the public Woiks in such a way that membeis of the public may access these Woiks fiom a place anu at a place inuiviuually chosen by them„ to peifoim the Woik to the public by any means oi piocess anu the communication to the public of the peifoimances of the Woik, incluuing by public uigital peifoimance„ to bioaucast anu iebioaucast the Woik by any means incluuing signs, sounus oi images. …Repiouuce… means to make copies of the Woik by any means incluuing without limitation by sounu oi visual iecoiuings anu the iight of fixation anu iepiouucing fixations of the Woik, incluuing stoiage of a piotecteu peifoimance oi phonogiam in uigital foim oi othei electionic meuium. PO !,(8 6#,3($) <()C%7. Nothing in this License is intenueu to ieuuce, limit, oi iestiict any uses fiee fiom copyiight oi iights aiising fiom limitations oi exceptions that aie pioviueu foi in connection with the copyiight piotection unuei copyiight law oi othei applicable laws. cO E(+#$7# j8,$%O Subject to the teims anu conuitions of this License, Licensoi heieby giants You a woiluwiue, ioyalty-fiee, non-exclusive, peipetual (foi the uuiation of the applicable copyiight) license to exeicise the iights in the Woik as stateu below: to Repiouuce the Woik, to incoipoiate the Woik into one oi moie Collections, anu to LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4u6 Repiouuce the Woik as incoipoiateu in the Collections„ to cieate anu Repiouuce Auaptations pioviueu that any such Auaptation, incluuing any tianslation in any meuium, takes ieasonable steps to cleaily label, uemaicate oi otheiwise iuentify that changes weie maue to the oiiginal Woik. Foi example, a tianslation coulu be maikeu …The oiiginal woik was tianslateu fiom English to Spanish,… oi a mouification coulu inuicate …The oiiginal woik has been mouifieu.…„ to Bistiibute anu Publicly Peifoim the Woik incluuing as incoipoiateu in Collections„ anu, to Bistiibute anu Publicly Peifoim Auaptations. !.8 %C# ,M.(-,$+# .* -."9%5 Non-waivable Compulsoiy License Schemes. In those juiisuictions in which the iight to collect ioyalties thiough any statutoiy oi compulsoiy licensing scheme cannot be waiveu, the Licensoi ieseives the exclusive iight to collect such ioyalties foi any exeicise by You of the iights gianteu unuei this License„ Waivable Compulsoiy License Schemes. In those juiisuictions in which the iight to collect ioyalties thiough any statutoiy oi compulsoiy licensing scheme can be waiveu, the Licensoi waives the exclusive iight to collect such ioyalties foi any exeicise by You of the iights gianteu unuei this License„ anu, voluntaiy License Schemes. The Licensoi waives the iight to collect ioyalties, whethei inuiviuually oi, in the event that the Licensoi is a membei of a collecting society that auministeis voluntaiy licensing schemes, via that society, fiom any exeicise by You of the iights gianteu unuei this License. The above iights may be exeiciseu in all meuia anu foimats whethei now known oi heieaftei ueviseu. The above iights incluue the iight to make such mouifications as aie technically necessaiy to exeicise the iights in othei meuia anu foimats. Subject to Section 8(f), all iights not expiessly gianteu by Licensoi aie heieby ieseiveu. dO <#7%8(+%(.$7O The license gianteu in Section S above is expiessly maue subject to anu limiteu by the following iestiictions: You may Bistiibute oi Publicly Peifoim the Woik only unuei the teims of this License. You must incluue a copy of, oi the 0nifoim Resouice Iuentifiei (0RI) foi, this License with eveiy copy of the Woik You Bistiibute oi Publicly Peifoim. You may not offei oi impose any teims on the Woik that iestiict the teims of this License oi the ability of the iecipient of the Woik to exeicise the iights gianteu to that iecipient unuei the teims of the License. You may not LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4u7 sublicense the Woik. You must keep intact all notices that iefei to this License anu to the uisclaimei of waiianties with eveiy copy of the Woik You Bistiibute oi Publicly Peifoim. When You Bistiibute oi Publicly Peifoim the Woik, You may not impose any effective technological measuies on the Woik that iestiict the ability of a iecipient of the Woik fiom You to exeicise the iights gianteu to that iecipient unuei the teims of the License. This Section 4(a) applies to the Woik as incoipoiateu in a Collection, but this uoes not iequiie the Collection apait fiom the Woik itself to be maue subject to the teims of this License. If You cieate a Collection, upon notice fiom any Licensoi You must, to the extent piacticable, iemove fiom the Collection any cieuit as iequiieu by Section 4(b), as iequesteu. If You cieate an Auaptation, upon notice fiom any Licensoi You must, to the extent piacticable, iemove fiom the Auaptation any cieuit as iequiieu by Section 4(b), as iequesteu. If You Bistiibute, oi Publicly Peifoim the Woik oi any Auaptations oi Collections, You must, unless a iequest has been maue puisuant to Section 4(a), keep intact all copyiight notices foi the Woik anu pioviue, ieasonable to the meuium oi means You aie utilizing: (i) the name of the 0iiginal Authoi (oi pseuuonym, if applicable) if supplieu, anu¡oi if the 0iiginal Authoi anu¡oi Licensoi uesignate anothei paity oi paities (e.g., a sponsoi institute, publishing entity, jouinal) foi attiibution (…Attiibution Paities…) in Licensoi's copyiight notice, teims of seivice oi by othei ieasonable means, the name of such paity oi paities„ (ii) the title of the Woik if supplieu„ (iii) to the extent ieasonably piacticable, the 0RI, if any, that Licensoi specifies to be associateu with the Woik, unless such 0RI uoes not iefei to the copyiight notice oi licensing infoimation foi the Woik„ anu (iv) , consistent with Section S(b), in the case of an Auaptation, a cieuit iuentifying the use of the Woik in the Auaptation (e.g., …Fiench tianslation of the Woik by 0iiginal Authoi,… oi …Scieenplay baseu on oiiginal Woik by 0iiginal Authoi…). The cieuit iequiieu by this Section 4 (b) may be implementeu in any ieasonable mannei„ pioviueu, howevei, that in the case of a Auaptation oi Collection, at a minimum such cieuit will appeai, if a cieuit foi all contiibuting authois of the Auaptation oi Collection appeais, then as pait of these cieuits anu in a mannei at least as piominent as the cieuits foi the othei contiibuting authois. Foi the avoiuance of uoubt, You may only use the cieuit iequiieu by this Section foi the puipose of attiibution in the mannei set out above anu, by exeicising Youi iights unuei this License, You may not implicitly oi explicitly asseit oi imply any connection with, sponsoiship oi enuoisement by the 0iiginal Authoi, Licensoi anu¡oi Attiibution Paities, as appiopiiate, of You oi Youi use of the Woik, without the sepaiate, expiess piioi wiitten peimission of the 0iiginal Authoi, Licensoi anu¡oi Attiibution Paities. Except as otheiwise agieeu in wiiting by the Licensoi oi as may be otheiwise peimitteu by LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4u8 applicable law, if You Repiouuce, Bistiibute oi Publicly Peifoim the Woik eithei by itself oi as pait of any Auaptations oi Collections, You must not uistoit, mutilate, mouify oi take othei ueiogatoiy action in ielation to the Woik which woulu be piejuuicial to the 0iiginal Authoi's honoi oi ieputation. Licensoi agiees that in those juiisuictions (e.g. }apan), in which any exeicise of the iight gianteu in Section S(b) of this License (the iight to make Auaptations) woulu be ueemeu to be a uistoition, mutilation, mouification oi othei ueiogatoiy action piejuuicial to the 0iiginal Authoi's honoi anu ieputation, the Licensoi will waive oi not asseit, as appiopiiate, this Section, to the fullest extent peimitteu by the applicable national law, to enable You to ieasonably exeicise Youi iight unuei Section S(b) of this License (iight to make Auaptations) but not otheiwise. NO <#28#7#$%,%(.$7m ?,88,$%(#7 ,$- 6(7+3,(1#8 0NLESS 0TBERWISE N0T0ALLY AuREEB T0 BY TBE PARTIES IN WRITINu, LICENS0R 0FFERS TBE W0RK AS-IS ANB NAKES N0 REPRESENTATI0NS 0R WARRANTIES 0F ANY KINB C0NCERNINu TBE W0RK, EXPRESS, INPLIEB, STAT0T0RY 0R 0TBERWISE, INCL0BINu, WITB00T LINITATI0N, WARRANTIES 0F TITLE, NERCBANTIBILITY, FITNESS F0R A PARTIC0LAR P0RP0SE, N0NINFRINuENENT, 0R TBE ABSENCE 0F LATENT 0R 0TBER BEFECTS, ACC0RACY, 0R TBE PRESENCE 0F ABSENCE 0F ERR0RS, WBETBER 0R N0T BISC0vERABLE. S0NE }0RISBICTI0NS B0 N0T ALL0W TBE EXCL0SI0N 0F INPLIEB WARRANTIES, S0 S0CB EXCL0SI0N NAY N0T APPLY T0 Y00. 6. Limitation on Liability. EXCEPT T0 TBE EXTENT REQ0IREB BY APPLICABLE LAW, IN N0 EvENT WILL LICENS0R BE LIABLE T0 Y00 0N ANY LEuAL TBE0RY F0R ANY SPECIAL, INCIBENTAL, C0NSEQ0ENTIAL, P0NITIvE 0R EXENPLARY BANAuES ARISINu 00T 0F TBIS LICENSE 0R TBE 0SE 0F TBE W0RK, EvEN IF LICENS0R BAS BEEN ABvISEB 0F TBE P0SSIBILITY 0F S0CB BANAuES. aO T#81($,%(.$O This License anu the iights gianteu heieunuei will teiminate automatically upon any bieach by You of the teims of this License. Inuiviuuals oi entities who have ieceiveu Auaptations oi Collections fiom You unuei this License, howevei, will not have theii licenses teiminateu pioviueu such inuiviuuals oi entities iemain in full compliance with those licenses. Sections 1, 2, S, 6, 7, anu 8 will suivive any teimination of this License. Subject to the above teims anu conuitions, the license gianteu heie is peipetual (foi the uuiation of the applicable copyiight in the Woik). Notwithstanuing the above, Licensoi ieseives the iight to ielease the Woik unuei uiffeient license teims oi to stop uistiibuting the Woik at any time„ pioviueu, howevei that any such election will not seive to withuiaw this LouueiTechnology¡Kumbia Enteipiise Fiamewoik - Nanual ue Refeiencia 4u9 License (oi any othei license that has been, oi is iequiieu to be, gianteu unuei the teims of this License), anu this License will continue in full foice anu effect unless teiminateu as stateu above. `O @(7+#33,$#."7 Each time You Bistiibute oi Publicly Peifoim the Woik oi a Collection, the Licensoi offeis to the iecipient a license to the Woik on the same teims anu conuitions as the license gianteu to You unuei this License. Each time You Bistiibute oi Publicly Peifoim an Auaptation, Licensoi offeis to the iecipient a license to the oiiginal Woik on the same teims anu conuitions as the license gianteu to You unuei this License. If any piovision of this License is invaliu oi unenfoiceable unuei applicable law, it shall not affect the valiuity oi enfoiceability of the iemainuei of the teims of this License, anu without fuithei action by the paities to this agieement, such piovision shall be iefoimeu to the minimum extent necessaiy to make such piovision valiu anu enfoiceable. No teim oi piovision of this License shall be ueemeu waiveu anu no bieach consenteu to unless such waivei oi consent shall be in wiiting anu signeu by the paity to be chaigeu with such waivei oi consent This License constitutes the entiie agieement between the paities with iespect to the Woik licenseu heie. Theie aie no unueistanuings, agieements oi iepiesentations with iespect to the Woik not specifieu heie. Licensoi shall not be bounu by any auuitional piovisions that may appeai in any communication fiom You. This License may not be mouifieu without the mutual wiitten agieement of the Licensoi anu You. The iights gianteu unuei, anu the subject mattei iefeienceu, in this License weie uiafteu utilizing the teiminology of the Beine Convention foi the Piotection of Liteiaiy anu Aitistic Woiks (as amenueu on Septembei 28, 1979), the Rome Convention of 1961, the WIP0 Copyiight Tieaty of 1996, the WIP0 Peifoimances anu Phonogiams Tieaty of 1996 anu the 0niveisal Copyiight Convention (as ieviseu on }uly 24, 1971). These iights anu subject mattei take effect in the ielevant juiisuiction in which the License teims aie sought to be enfoiceu accoiuing to the coiiesponuing piovisions of the implementation of those tieaty piovisions in the applicable national law. If the stanuaiu suite of iights gianteu unuei applicable copyiight law incluues auuitional iights not gianteu unuei this License, such auuitional iights aie ueemeu to be incluueu in the License„ this License is not intenueu to iestiict the license of any iights unuei applicable law.
Copyright © 2024 DOKUMEN.SITE Inc.