Sunteți pe pagina 1din 107

SinousamosheadingsnotendremosTOC!!!(TOC=tabladecontenidoondice) Losnombresdearchivoymtodosenitlica. Elcdigoenunatabla.(Nohemosencontradomejorsolucin),porahorasecoloreacon http://codepad.orgyfuenteC o u r i e r N e w . EltextoyheadingsenArial.

ManualdeKumbiaPHPFramework Versin1.0Spirit
Borradorparalabeta2Final
12dejuniode2013

www.kumbiaphp.com

ndicegeneral
(notocar,secreaautomticoconlosheadings)
1Introduccin 1.1.Agradecimientos 1.2.Prefacio 1.2.1. Sobreestelibro 1.2.2. SobreKumbiaPHP 1.2.3. Sobrelacomunidad 1.2.4. PorqueusarKumbiaPHPFramework? 1.2.5. QuaportaKumbiaPHP? 1.2.6. Modelo,Vista,Controlador(MVC) 1.2.6.1.QueesMVC? 1.2.6.2.ComoKumbiaPHPaplicaelMVC? 1.2.6.3.Msinformacin 1.2.6.4.Casoprctico(CAMBIAREJEMPLO) 2EmpezandoconKumbiaPHP 2.1. InstalarKumbiaPHP 2.1.1.Requisitos 2.1.2. ConfigurarServidorWeb 2.1.2.1.Habitandomod_rewritedeApacheenGNU/Linux(Debian,Ubuntuy Derivados) 2.1.2.2.PorquesimportanteelModRewrite? 2.1.3. MiPrimeraAplicacinconKumbiaPHP 2.1.3.1.Hola,KumbiaPHP! 2.1.3.2.ElControlador 2.1.3.3.LaVista 2.1.3.4.KumbiaPHPysusURLs 2.1.3.5.Agregandomscontenido Paraagregarlecalidezalasunto,lepreguntaremosalusuariosunombreva 2.1.3.6.RepitiendolaHistoria 3ElControlador 3.1. ControladorFrontal 3.1.1. DestripandoelFrontController 3.1.2. FrontControllerpordefecto 3.1.3. ConstantesdeKumbiaPHP 3.1.3.1.APP_PATH 3.1.3.2.CORE_PATH 3.1.3.3.PUBLIC_PATH 3.2. LasAcciones 3.2.1. Lasaccionesylasvistas 3.2.2. Obtenervaloresdesdeunaaccin 3.3.ConvencionesyCreacindeunControlador 3.3.1.Convenciones 3.3.2.CreacindeunControlador

3.3.3. ClaseAppController 3.3.4. AccionesyControladorespordefecto 3.4.Filtros 3.4.1.FiltrosdeControladores 3.4.1.1.initialize() 3.4.1.2.finalize() 3.4.2.FiltrosdeAcciones 3.4.2.1.before_filter() 3.4.2.2.after_filter() 4LaVista 4.1Pasandodatosalavista 4.2Bufferdesalida 4.3Template 4.3.1ComocrearunTemplate? 4.3.2Comoutilizaruntemplate? 4.3.3Pasandodatosaltemplate 4.4Partial 4.4.1Comocrearunpartial? 4.4.2Cmoutilizarunpartial? 4.4.3Pasandodatosalospartials 4.5Agrupandoendirectorios 4.5.1Ejemplodeagrupacindevista 4.5.2Ejemplodeagrupacindepartial 4.5.3Ejemplodeagrupacindetemplate 4.6Tiposderespuestas 4.7Usodecacheenlasvistas 4.7.1Cachedevistas 4.7.1.1Gruposdevistasencache 4.7.2Cachedetemplates 4.7.3Cachedepartials 4.8Helpers 4.8.1ClaseHtml Html::img() Html::link() Html::lists() Html::gravatar() Html::includeCss() Html::meta() Html::includeMetatags() Html::headLink() Html::headLinkAction() Html::headLinkResource() Html::includeHeadLinks() 4.8.2.ClaseTag Tag::css() Tag::js()

IncluyeunarchivoJavaScriptalavista,partialotemplate 4.8.3.ClaseForm Form::open() Form::openMultipart() Form::close() Form::input() Form::text() Form::pass() Form::textarea() Form::label() Form::hidden() Form::dbSelect() Form::select() Form::file() Form::button() Form::submitImage() Form::submit() Form::reset() Form::check() Form::radio() Js Js::link() Js::linkAction() Js::submit() Js::submitImage() Ajax Ajax::link() Ajax::linkAction() 5Modelos 5.1ActiveRecord 5.2EjemplosinActiveRecord 5.3Cmousarlosmodelos 5.4ActiveRecordAPI 5.4.1Consultas 5.4.1.1distinct() 5.4.1.2find_all_by_sql(string$sql) 5.4.1.3find_by_sql(string$sql) 5.4.1.4find_first(string$sql) 5.4.1.5find() 5.4.1.6select_one(string$select_query)(static) 5.4.1.7exists() 5.4.1.8find_all_by() 5.4.1.9find_by_*campo*() 5.4.1.10find_all_by_*campo*() 5.4.2Conteosysumatorias 5.4.2.1count()

5.4.2.2sum() 5.4.2.3count_by_sql() 6Scaffold Introduccin Concepto Objetivo PrimerosPasos Controlador Ventajas Desventaja Viewsparaelscaffold 7Clasespadre 7.1AppController 7.2ActiveRecord 7.2.1. VentajasdelActiveRecord 7.2.2. CrearunModeloenKumbiaPHPFramework 7.2.3. ColumnasyAtributos 7.2.4. LlavesPrimariasyelusodeIDs 7.2.5. ConvencionesenActiveRecord View 8LibsdeKumbiaPHP Cach driver($driver=null) get($id,$group='default') save($value,$lifetime=null,$id=false,$group='default') start($lifetime,$id,$group='default') end($save=true) Logger Logger::warning($msg) Logger::error($msg) Logger::debug($msg) Logger::alert($msg) Logger::critical($msg) Logger::notice($msg) Logger::info($msg) Logger::emergence($msg) Logger::custom($type='CUSTOM',$msg) Flash Flash::error($text) Flash::valid($text) Flash::info($text) Flash::warning($text) Flash::show($name,$text) Session Session::set($index,$value,$namespace='default') Session::get($index,$namespace='default')

Session::delete($index,$namespace='default') Session::has($index,$namespace='default') Load Load::coreLib($lib) Load::lib($lib) Load::model($model) Auth2 Solicitandounadaptador Adaptadorpredeterminado Comotrabajalaautenticacin AdaptadorModel setModel() identify() logout() setFields() setSessionNamespace() isValid() getError() setAlgos() setKey() setCheckSession() setPass() setLogin() Obtenerloscamposcargadosensesin Ejemplo 9Usarclasesexternas 10LaConsola Introduccin ComoutilizarlaConsola ConsolasdeKumbiaPHP Cache clean[group][driver] Permitelimpiarlacache. Argumentossecuenciales: Argumentosconnombre: Ejemplo: php../../core/console/kumbia.phpcacheclean remove[id][group] Model create[model] delete[model] Controller create[controller] delete[controller] DesarrollandotusConsolas Console::input

Apndices IntegracindejQueryyKumbiaPHP KDebug CRUD Introduccin Configurandodatabase.ini Modelo Controller Vistas ProbandoelCRUD Aplicacinenproduccin Partialsdepaginacin Classic Digg Extended Punbb Simple Ejemplodeuso Auth Beta1aBeta2 Deprecated Mtodosyclasesqueseusabanenversionesanterioresyqueaunfuncionan.Peroque quedandesaconsejadasyquenofuncionaranenelfuturo(prximabetaoversinfinal): Listadecambiosentreversiones:sinoseespecificabeta1esqueescompatibleen amboscasos Cambioenlasrutasentreversiones: Glosario

1Introduccin
1.1.Agradecimientos
Estemanualesparaagradeceralosqueconsutiempoyapoyo,engranoenpocamedida,han ayudadoaqueesteframeworkseacadadamejor.Atodalacomunidadquerodeaa KumbiaPHP,consuspreguntas,notificacionesdeerrores(Bugs),aportes,crticas,etc.,atodos ellosGracias!.

1.2.Prefacio
1.2.1. Sobreestelibro
EllibrodeKumbiaPHPintentacomunicar,todoloqueesteframeworkpuedeayudarensutrabajo diariocomodesarrollador.LepermitedescubrirtodoslosaspectosdeKumbiaPHPyaprender porqueKumbiaPHPpuedeserlaherramienta,queestabaesperandoparaempezaradesarrollar suproyecto.Estelibroseencuentraenetapadecontinuodesarrollo,diseogrfico,revisin ortogrficaygramtica,contenidos,etc.Talcomosucedeconelframework,porlocualse aconsejasiempredisponerdelaltimaversin. Estaversindelmanualhacambiadomuchodelaanterior.Graciasalacomunidadsehan reflejadocuestionesqueserepetanengrupo,foroeIRC.Tambinsedetectoelmalusodel MVC,ynoseaprovechabanlasfacilidadesdelPOO.Sehaintentadomejoraresospuntos recurrentesdeconsulta,ascomomejorarelentendimientodeuso,paraquecreenmejoresy msmanteniblesaplicaciones.

1.2.2.

SobreKumbiaPHP

KumbiaPHPesunproductolatinoparaelmundo.Programardebesertanbuenocomobailary KumbiaPHPesunbaile,unbaileparaprogramar.KumbiaPHPesunframeworkdelibreusobajo licencianewBSD.Porlotanto,puedesusarKumbiaPHPparatusproyectossiempreycuando tengasencuentalalicencia.Teaconsejamosquesiempreusesversionesestablesyloms recientesposibles,yaqueseincluyencorrecciones,nuevasfuncionalidadesyotrasmejoras interesantes.

1.2.3.

Sobrelacomunidad

LacomunidaddeKumbiaPHPestaformadaensugranmayoraporgentehispanolatina,dela cualnaceunframeworkcompletamenteenespaol.Ydonderadicasumayordiferencia respectoaotrosframeworksqueson,deformanativa,anglosajones.Porotraparteseha intentado,coneltiempo,aportarnuevossistemasdecomunicacin,asquesecuentaconuna listadecorreo,elforo,canaldeIRCyunaWiKi.Esperamosquetodoestohagaquela comunidadseaunaparteimportanteyvitalparaenriquecerymejorarKumbiaPHP. Puedesencontrarmsinformacinenwww.kumbiaphp.com

1.2.4.

PorqueusarKumbiaPHPFramework?

Muchagentepreguntacmoesesteframework?,otroms?,serfcil?qutanpotente es?etc.PuesaqualgunasrazonesparautilizarKumbiaPHP: 1. Esmuyfcildeusar(ZeroConfig).EmpezarconKumbiaPHPesdemasiadofcil,essolo descomprimiryempezaratrabajar,estafilosofatambinesconocidacomoConvencin sobreConfiguracin. 2. AgilizaelTrabajo,crearunaaplicacinmuyfuncionalconKumbiaPHPescuestinde horasominutos,asquepodemosdarlegustoanuestrosclientessinqueafectenuestro tiempo.Graciasalasmltiplesherramientasqueproporcionaelframeworkparaagilizar eltrabajopodemoshacermsenmenostiempo. 3. SepararlaLgicadelaPresentacin,unadelasmejoresprcticasdedesarrollo orientadoalaWebessepararlalgicadelosdatosylapresentacin,conKumbiaPHP essencilloaplicarelpatrnMVC(Modelo,Vista,Controlador)yhacernuestras aplicacionesmsfcilesdemantenerydeescalar. 4. ReduccindelusodeotrosLenguajes,graciasalosHelpersyaotrospatronescomo ActiveRecordevitamoselusodelenguajesHTMLySQL(enmenorporcentaje). KumbiaPHPhaceestopornosotros,conestologramoscdigomasclaro,naturalycon menoserrores. 5. HablaEspaol!Ladocumentacin,mensajesdeerror,archivosdeconfiguracin, comunidad,desarrolladoreshablanespaol!,conestonotenemosqueentendera medias,comoconotrosframeworksquenostocaquedarnoscruzadosdemanosporque nopodemospedirayuda. 6. LaCurvadeAprendizajedeKumbiaPHPesmuycorta,ysiaestoleagregamos experienciaenelmanejodeProgramacinOrientadaaObjetos,sermasrpida. 7. Pareceunjuego,sindarnoscuentaaplicamoslospatronesdediseolospatronesde diseosonherramientasquefacilitaneltrabajorealizandoabstraccin,reduciendocdigo ohaciendomsfcildeentenderlaaplicacin.CuandotrabajasconKumbiaPHPaplicas muchospatronesyalfinaltedascuentaqueeranmsfcilesdeusardeloquese piensa. 8. SoftwareLibre,Notienesquepreocuparteporlicenciarnada,KumbiaPHPpromuevelas comunidadesdeaprendizaje,elconocimientoesdetodosycadaunosabecomo aprovecharlomejor. 9. AplicacionesRobustas,nosabaquetenauna?.Lasaplicacionesdehoydarequieren arquitecturasrobustas.KumbiaPHPproporcionaunaarquitecturafcildeaprenderyde implementar,sincomplicarnosconconceptosysinsacrificarcalidad.

1.2.5.

QuaportaKumbiaPHP?

KumbiaPHPesunesfuerzoporproducirunframeworkqueayudeareducireltiempode desarrollodeunaaplicacinwebsinproducirefectossobrelosprogramadores,basndonosen principiosclaves,quesiemprerecordamos. KISSMantenlosimple,estpido(KeepItSimple,Stupid). DRYNoterepitas,eninglsDontRepeatYourself,tambinconocidocomoUnavezy

slouna. Convencinsobreconfiguracin. Velocidad. AdemsKumbiaPHPestafundamentadoenlassiguientespremisas: Fcildeaprender. Fcildeinstalaryconfigurar. Compatibleconmuchasplataformas. Listoparaaplicacionescomerciales. Simpleenlamayorpartedecasosperoflexibleparaadaptarseacasosmscomplejos. SoportarmuchascaractersticasdeaplicacionesWebactuales. Soportarlasprcticasypatronesdeprogramacinmsproductivosyeficientes. Produciraplicacionesfcilesdemantener. BasadoenSoftwareLibre.

Loprincipalesproduciraplicacionesqueseanprcticasparaelusuariofinalynosloparael programador.Lamayorpartedetareasquelequitentiempoaldesarrolladordeberanser automatizadasporKumbiaPHP,paraquepuedaenfocarseenlalgicadenegociodesu aplicacin.Nodeberamosreinventarlaruedacadavezqueseafronteunnuevoproyectode software. ParasatisfacerestosobjetivosKumbiaPHPestescritoenPHP5.Ademshasidoprobadoen aplicacionesrealesquetrabajanendiversasreasconvariedaddedemandayfuncionalidad.Es compatibleconlasbasesdedatosdisponiblesactualesmasusadas: MySQL. PostgreSQL. Oracle. SQLite.

ElmodelodeobjetosdeKumbiaPHPesutilizadoenlassiguientescapas: Abstraccindelabasededatos. MapeoObjetoRelacional. ModeloMVC(Modelo,Vista,Controlador).

CaractersticascomunesdeaplicacionesWebquesonautomatizadasporKumbiaPHP: Plantillas(TemplateView). ValidacinyPersistenciadeFormularios. AdministracindeCach. Scaffolding. FrontController. InteraccinAJAX. GeneracindeFormularios.

Seguridad.

1.2.6.

Modelo,Vista,Controlador(MVC)

1.2.6.1.QueesMVC?
En1979,TrygveReenskaugdesarrollunaarquitecturaparadesarrollaraplicaciones interactivas.Enestediseoexistantrespartes:modelos,vistasycontroladores.ElmodeloMVC permitehacerlaseparacindelascapasdeinterfaz,modeloylgicadecontroldesta.La programacinporcapas,esunestilodeprogramacinenlaqueelobjetivoprimordialesla separacindelalgicadenegociosdelalgicadediseo,unejemplobsicodeestoesseparar lacapadedatosdelacapadepresentacinalusuario. Laventajaprincipaldeesteestilo,esqueeldesarrollosepuedellevaracaboenvariosnivelesy encasodealgncambiosloseatacaalnivelrequeridosintenerquerevisarentrecdigo mezclado.Ademspermitedistribuireltrabajodecreacindeunaaplicacinporniveles,deeste modo,cadagrupodetrabajoesttotalmenteabstradodelrestodeniveles,simplementees necesarioconocerlaAPI(InterfazdeAplicacin)queexisteentreniveles.Ladivisinencapas reducelacomplejidad,facilitalareutilizacinyaceleraelprocesodeensamblarodesensamblar algunacapa,osustituirlaporotradistinta(peroconlamismaresponsabilidad). EnunaaplicacinWebunapeticinserealizausandoHTTPyesenviadoalcontrolador.El controladorpuedeinteractuardemuchasformasconelmodelo,luegolprimerollamaala respectivavistalacualobtieneelestadodelmodeloqueesenviadodesdeelcontroladorylo muestraalusuario.

1.2.6.2.ComoKumbiaPHPaplicaelMVC?
KumbiaPHPFrameworkaprovechalosmejorespatronesdeprogramacinorientadaalaWeben especialelpatrnMVC(Modelos,Vistas,Controladores).Acontinuacinsedescribeel funcionamientogeneraldeesteparadigmaenKumbiaPHP. Elobjetivodeestepatrneselrealizarymantenerlaseparacinentrelalgicadenuestra aplicacin,losdatosylapresentacin.Estaseparacintienealgunasventajasimportantes, comopoderidentificarmsfcilmenteenqucapaseestproduciendounproblemaconslo conocersunaturaleza.Podemoscrearvariaspresentacionessinnecesidaddeescribirvarias veceslamismalgicadeaplicacin.Cadapartefuncionaindependienteycualquiercambio centralizaelefectosobrelasdems,asquepodemosestarsegurosqueunamodificacinenun componenterealizarbienlastareasencualquierpartedelaaplicacin.

1.2.6.3.Msinformacin
LabasedeKumbiaPHPeselMVCyPOO,untradicionalpatrndediseoquefuncionaentres capas: Modelos:Representanlainformacinsobrelacuallaaplicacinopera,sulgicade negocio. Vistas:VisualizanelmodelousandopginasWebeinteractuandoconlosusuarios(en principio)destas,unavistapuedeestarrepresentadaporcualquierformatosalida,nos referimosaunxml,pdf,json,svg,png,etc.todoestosonvistas.

Controladores:Respondenaaccionesdeusuarioeinvocancambiosenlasvistasoen losmodelossegnseanecesario.

EnKumbiaPHPloscontroladoresestnseparadosenpartes,llamadasfrontcontrolleryenun conjuntodeacciones.Cadaaccinsabecmoreaccionaranteundeterminadotipodepeticin. Lasvistasestnseparadasentemplates,viewsypartials. Elmodeloofreceunacapadeabstraccindelabasededatos,ademsdafuncionalidad agregadaadatosdesesinyvalidacindeintegridadrelacional.Estemodeloayudaasepararel trabajoenlgicadenegocios(Modelos)ylapresentacin(Vistas). Porejemplo,siustedtieneunaaplicacinquecorratantoenequiposdeescritorioyen dispositivosmvilesentoncespodracreardosvistasdiferentescompartiendolasmismas accionesenelcontroladorylalgicadelmodelo.Elcontroladorayudaaocultarlosdetallesde protocoloutilizadosenlapeticin(HTTP,modoconsola,etc.)paraelmodeloylavista. Finalmente,elmodeloabstraelalgicadedatos,quehacealosmodelosindependientesdelas vistas.Laimplementacindeestemodeloesmuylivianamediantepequeasconvencionesse puedelograrmuchopoderyfuncionalidad.

1.2.6.4.Casoprctico(CAMBIAREJEMPLO)
Paraentendermejor,veamosunejemplodecmounaarquitecturaMVCtrabajaparaaadiral carrito.Primero,elusuariointeractaconlainterfazseleccionandounproductoypresionandoun botn,estoprobablementevalidaunformularioyenvaunapeticinalservidor. 1. ElFrontControllerrecibelanotificacindeunaaccindeusuario,yluegodeejecutar algunastareas(enrutamiento,seguridad,etc.),entiendequedebeejecutarlaaccinde agregarenelcontrolador. 2. Laaccindeagregaraccedealmodeloyactualizaelobjetodelcarritoenlasesinde usuario. 3. Silamodificacinesalmacenadacorrectamente,laaccinpreparaelcontenidoqueser devueltoenlarespuestaconfirmacindelaadicinyunalistacompletadelos productosqueestnactualmenteenelcarrito.Lavistaensamblalarespuestadela accinenelcuerpodelaaplicacinparaproducirlapginadelcarritodecompras. 4. FinalmenteestransferidaalservidorWebquelaenvaalusuario,quienpuedeleerlae interactuarconelladenuevo.

2EmpezandoconKumbiaPHP
2.1. InstalarKumbiaPHP
Enestaseccin,seexplicanlospasosaseguir,paraponerafuncionarelframeworkennuestro ambientededesarrollo.

2.1.1.Requisitos
ComosemencionarribaKumbiaPHPesmuyfcilyenestesentidolosrequerimientospara hacerfuncionarelframeworksonmnimos,acontinuacinselistan: IntrpretePHP(versin5.2.2osuperior). ServidorWebconsoportedereescrituradeURL(Apache,Cherokee,Lighttpd,Internet InformationServer(IIS)). ManejadordebasededatossoportadoporKumbiaPHP. ParainstalarKumbiaPHPFramework,sedebedescargarsuarchivocomprimidodesdela seccindedescargahttp://www.kumbiaphp.com/blog/manualesydescargas/paraobtenerla versinmsrecientedelframework.Unavezdescargadoelarchivo,esesencialasegurarseque tienelaextensin.tgzparausuariosLinuxy.zipparausuariosdeWindows,yaquedeotromodo nosedescomprimircorrectamente. Acontinuacinsedescomprimesucontenidoeneldirectoriorazdelservidorweb (DocumentRoot).Paraasegurarciertauniformidadeneldocumento,enestecaptulosesupone quesehadescomprimidoelpaquetedelframeworkeneldirectoriokumbiaphp/.Teniendouna estructuracomolasiguiente: `1.0 |core |default |app |index.php |.htaccess `public

2.1.2.

ConfigurarServidorWeb

KumbiaPHPFrameworkutilizaunmduloparalareescrituradeURLshacindolasms comprensiblesyfcilesderecordarennuestrasaplicaciones.Poresto,elmdulodebeser configuradoeinstalado,enestesentidodebechequearqueelmduloesthabilitado,enlas siguientesseccionesseexplicacomohacer.

2.1.2.1.Habitandomod_rewritedeApacheenGNU/Linux(Debian,Ubuntuy Derivados)
Nosaseguramosdeactivarelmod_rewritedeestamaneraycomousuarioadministradordesde laconsola. #a2enmodrewrite Enablingmodulerewrite. Run'/etc/init.d/apache2restart'toactivatenewconfiguration! Loanteriorindicaquesehahabilitadoelmod_rewritedeApache,peroaunfaltaindicarlea Apachequeinterpretelosarchivos.htaccessquesonlosencargadosdehacerusodelrewritey asuveztienenlasreglasdereescrituradelasURLs. Comousuarioadministradoreditamoselsiguientearchivo. #vi/etc/apache2/sitesenabled/000default <Directory"/to/document/root"> OptionsIndexesFollowSymLinks AllowOverrideNone Orderallow,deny Allowfromall </Directory> Paraquelos.htaccesstenganefectos,sehadesustituirAllowOverrideNoneporAllowOverride All,deestamaneraApachepodrinterpretarestosarchivos. Hechoesto,quedareiniciarelserviciodeapache. #/etc/init.d/apache2restart Acontinuacin,sepruebatodaslasconfiguracionesrealizadasmediantelasiguienteURL. http://localhost/kumbiaphp/ Sitodohaidobien,deberasverunapginadebienvenidacomolaquesemuestraenlafigura 2.1,conloquelainstalacinrpidasepuededarporconcluida.

Figura2.1:InstalacinExitosadeKumbiaPHP EstoesunentornodepruebaselcualestpensadoparaquepractiquesconKumbiaPHPenun servidorlocal,noparadesarrollaraplicacionescomplejasqueterminansiendopublicadasenla web.

2.1.2.2.PorquesimportanteelModRewrite?
ReWriteesunmdulodeapachequepermitereescribirlasurlsquehanutilizadonuestros usuarios.KumbiaPHPFrameworkencapsulaestacomplejidadpermitindonosusarURLs bonitasolimpiascomolasquevemosenblogsoenmuchossitiosdondenoaparecenlos?,los &nilasextensionesdelservidor(.php,.asp,.aspx,etc). Ademsdeesto,conmodrewriteKumbiaPHPpuedeprotegernuestrasaplicacionesantela posibilidaddequelosusuariospuedanverlosdirectoriosdelproyectoypuedanaccedera archivosdeclases,modelos,lgica,etc.,sinqueseanautorizados. Conmodrewriteelnicodirectorioquepuedenverlosusuarioseselcontenidodeldirectorio pblico(public)delservidorweb,elrestopermaneceocultoyslopuedeservisualizadocuando harealizadounapeticinenformacorrectaytambinescorrectosegnnuestralgicade aplicacin.CuandoescribesdireccionesutilizandoestetipodeURLs,estsayudandotambina losmotoresdebsquedaaindexarmejortuinformacin.

2.1.3.

MiPrimeraAplicacinconKumbiaPHP

LuegoqueexplicamoslospasosparaconfigurarKumbiaPHPyversupantalladebienvenida,se vienehacerelprimerejemploelcualtienecomoobjetivoentenderelementosbsicosal momentodeutilizarelframeworkqueservirparaentenderlaarquitecturaMVC (ModeloVistaControlador).

2.1.3.1.Hola,KumbiaPHP!

Ahoraescribiremoselfamoso"Hola,Mundo!"peroconunpequeocambio:Diremos"Hola, KumbiaPHP!".Pensandoenesto,recordemoselmodeloMVC,segnesto,KumbiaPHPdebera aceptarunapeticin,quebuscaraencontroladory,enste,unaaccinqueatenderalapeticin. Luego,KumbiaPHPutilizarestainformacindecontroladoryaccinparabuscarlavista asociadaalapeticin. Paraescribirelcdigodenuestro"Hola,KumbiaPHP!"nonecesitamossinouncontroladoryuna vista.Nonecesitamosmodelos,yaquenoestamostrabajandoconinformacindeunabasede datos. Nosubicamoseneldirectorio/path/to/kumbiaphp/app/controllers/.Aquestarnnuestros controladores(Paramsdetalles,leeladocumentacinsobreeldirectorioapp).Paracrearun controlador,esimportantetenerencuentalasconvencionesdenombrequeutilizaelFramework. llamaremosanuestrocontroladorsaludo_controller.php.Nteseelsufijo_controller.phpesto formapartedelaconvencindenombres,yhacequeKumbiaPHPidentifiqueesearchivocomo uncontrolador.

2.1.3.2.ElControlador
Ahoraagregamoscontenidoalcontroladorapp/controllers/saludo_controller.php < ? p h p / * * * C o n t r o l l e r S a l u d o * / c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n h o l a ( ) { } } EnelcdigotenemosladefinicindelaclassSaludoController,Ntesequetambinestaelsufijo Controlleralfinaldeladeclaracindelaclase,estolaidentificacomounaclasecontroladora,y stahereda(extends)delasuperclaseAppController,conloqueadquierelaspropiedadesde unaclasecontroladora,ademsexisteelmtodohola().

2.1.3.3.LaVista
Parapoderverlasalidaqueenvaelcontrolador,esnecesariocrearlavistaasociadaalaaccin. Primero,creamosundirectorioconelmismonombredenuestrocontrolador(enestecaso deberallamarsesaludo),ydentrodeesteestarntodaslasvistasasociadasalasaccionesque necesitenmostraralgunainformacin.Ennuestroejemplollamamosaunaaccinllamadahola porlotanto,creamosunarchivollamadoapp/views/saludo/hola.phtml.Unavezcreadoeste archivo,leagregamosunpocodecontenido: <h1>Hola,KumbiaPHP!</h1>

AcontinuacinsepruebaalaccederalasiguienteURL:http://localhost/kumbiaphp/saludo/hola/y elresultadodebesercomomuestralafigura2.2.

Figura2.2:Contenidodelavistahola.phtml

2.1.3.4.KumbiaPHPysusURLs
ParaentenderelfuncionamientodelframeworkesimportanteentendersusURLs,lafigura 2.3muestraunaURLtpicaenKumbiaPHP.

Figura2.3:URLenKumbiaPHP EnKumbiaPHPnoexistenlasextensiones.phpestoporqueenprimerainstanciahayreescritura deURLsyademscuentaconunfrontcontrollerencargadoderecibirtodaslaspeticiones(ms adelanteseexplicarendetalle). CualquierotrainformacinpasadaporURLestomadacomoparmetrodelaaccin,apropsito denuestraaplicacincomomuestralafigura2.4.

Figura2.4:URLconparmetros EstoestilparaevitarquetenerestarenviandoparmetrosGETdelaforma ?var=valor&var2=valor2(estoes,delaformatradicionalcomosevieneutilizandoPHP),lacual revelainformacinsobrelaarquitecturadesoftwarequesedisponeenelservidor.Adems, hacenquenuestraURLseveamal.

2.1.3.5.Agregandomscontenido
Agregaremosalgodecontenidodinmicoanuestroproyecto,paraquenoseatanaburrido. Mostraremoslahoraylafecha,usandolafuncindate(). Cambiamosunpocoelcontroladorapp/controllers/saludo_controller.php < ? p h p / * * * C o n t r o l l e r S a l u d o * / c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { / * * * m t o d o p a r a s a l u d a r * / p u b l i c f u n c t i o n h o l a ( ) { $ t h i s > f e c h a = d a t e ( " Y m d H : i " ) } } KumbiaPHPimplementalasvariablesdeinstancialoquesignificaquetodosatributosdefinidos enelcontroller,pasarautomticamentealavista,enelcdigoanteriortenemoselatributo $this>fechaestepasaralavistacomounavariablellamada$fecha.

Enlavistaquesecreoenlaseccin2.1.3.3yagregamos. < h 1 > H o l a , K u m b i a P H P ! < / h 1 > < ? p h p e c h o $ f e c h a ? > Ahora,sivolvemosahttp://localhost/kumbiaphp/saludo/hola/,obtendremoslahorayfechadel momentoenquesehagalapeticin,comosemuestraenlafigura2.5.

Figura2.5:Horayfechadepeticin Paraagregarlecalidezalasunto,lepreguntaremosalusuariosunombreva parmetro2.1.3.4,volvemosaeditarelcontroladorsaludo_controller.php... < ? p h p / * * * C o n t r o l l e r S a l u d o * / c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { / * * * m t o d o p a r a s a l u d a r * @ p a r a m s t r i n g $ n o m b r e * / p u b l i c f u n c t i o n h o l a ( $ n o m b r e ) { $ t h i s > f e c h a = d a t e ( " Y m d H : i " ) $ t h i s > n o m b r e = $ n o m b r e } } Editamoslavistaapp/views/saludo/hola.phtml

< h 1 > H o l a < ? p h p e c h o $ n o m b r e ? > , Q u l i n d o e s u t i l i z a r K u m b i a P H P ! c i e r t o ? < / h 1 > < ? p h p e c h o $ f e c h a ? > Siahoraentramosahttp://localhost/kumbiaphp/saludo/CaChi/,nosmostrarenelnavegador webelsaludojuntoconelnombrecolocadoylafechaactual,comosemuestraenlafigura2.6.

Figura2.6:SaludandoalUsuario

2.1.3.6.RepitiendolaHistoria
Ahoravamosotraaccinllamadaadios()ycomosunombreindicaharemoselprocesoinversoa saludar,esdecirdespediralosusuarios. < ? p h p / * * * C o n t r o l l e r S a l u d o * / c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { / * * * m t o d o p a r a s a l u d a r * @ p a r a m s t r i n g $ n o m b r e * / p u b l i c f u n c t i o n h o l a ( $ n o m b r e ) { $ t h i s > f e c h a = d a t e ( " Y m d H : i " ) $ t h i s > n o m b r e = $ n o m b r e } / * * * m t o d o p a r a d e s p e d i r * / p u b l i c f u n c t i o n a d i o s ( ) { } }

Agregamosunanuevavistaparapresentarelcontenidodelaaccinadios()ysirecordamoslo queseexplicenlaseccin2.1.3.3deberamoscrearunavistaapp/views/saludo/adios.phtml conelsiguientecontenido. < h 1 > O p s ! s e h a i d o : ( < / h 1 > < ? p h p e c h o H t m l : : l i n k ( ' s a l u d o / h o l a / C a C h i / ' , ' V o l v e r a S a l u d a r ' ) ? > Siingresaalsiguienteenlacehttp://localhost/kumbiaphp/saludo/adios/severunnuevotexto,y unvnculoalaaccinhola(),comosemuestraenlafigura2.7.

Figura2.7:Vistadeadisalusuario. Html::link(),esunodelostantoshelperqueofreceKumbiaPHPparafacilitaralmomentode programarenlasvistas.PodramosescribirelcdigoHTMLdirectamente,colocando<a href="kumbiaphp/saludo/hola/CaChi/">VolveraSaludar</a>,peroestopuedeconllevaraun problema,imaginequequisieracambiardenombreasuproyectodekumbiaphpademo, tendramosquemodificartodoslosvnculos,loshelpersdeKumbiaPHPresuelvenestos problemas.

3ElControlador
EnKumbiaPHPFramework,lacapadelcontrolador,contieneelcdigoqueligalalgicade negocioconlapresentacin,estdivididaenvarioscomponentesqueseutilizanparadiversos propsitos: Elcontroladorfrontal(frontcontroller)eselnicopuntodeentradaalaaplicacin.Carga laconfiguracinydeterminalaaccinaejecutarse. Lasaccionesverificanlaintegridaddelaspeticionesypreparanlosdatosrequeridospor lacapadepresentacin. LasclasesInputySessiondanaccesoalosparmetrosdelapeticinyalosdatos persistentesdelusuario.Seutilizanmuyamenudoenlacapadelcontrolador. Losfiltrossontrozosdecdigoejecutadosparacadapeticin,antesy/odespusdeun controladorinclusoantesy/odespusdeunaaccin.Porejemplo,losfiltrosdeseguridad yvalidacinsoncomnmenteutilizadosenaplicacionesweb. , Estecaptulodescribetodosestoscomponentes.Paraunapginabsica,esprobablequesolo necesitesescribiralgunaslneasdecdigoenlaclasedelaaccin,yesoestodo.Losotros componentesdelcontroladorsolamenteseutilizanensituacionesespecficas.

3.1. ControladorFrontal
TodaslaspeticioneswebsonmanejadasporunsoloControladorFrontal(frontcontroller),que eselpuntodeentradanicodetodalaaplicacin. Cuandoelfrontcontrollerrecibelapeticin,utilizaelsistemadeenrutamientodeKumbiaPHP paraasociarelnombredeuncontroladoryeldelaaccinmediantelaURLescritaporelcliente (usuariouotraaplicacin). VeamoslasiguienteURL,stallamaalscriptindex.php(queeselfrontcontroller)yser entendidocomollamadaaunaaccin. http://localhost/kumbiaphp/micontroller/miaccion/ DebidoalareescrituradeURLnuncasehaceunllamadodeformaexplcitaalindex.php,slose colocaelcontrolador,accinyparmetros.InternamenteporlasreglasreescrituradeURLes llamadoelfrontcontroller.VerseccinporquesimportanteelModRewrite?

3.1.1.

DestripandoelFrontController

ElfrontcontrollerdeKumbiaPHPseencargadedespacharlaspeticiones,loqueimplicaalgo msquedetectarlaaccinqueseejecuta.Dehecho,ejecutaelcdigocomnatodaslas acciones,incluyendo: 1. Definelasconstantesdelncleodelaaplicacin(APP_PATH,CORE_PATHy

PUBLIC_PATH). 2. Cargaeinicializalasclasesdelncleodelframework(bootstrap). 3. Cargalaconfiguracin(Config). 4. DecodificalaURLdelapeticinparadeterminarlaaccinaejecutarylosparmetrosde lapeticin(Router). 5. Silaaccinnoexiste,redireccionaralaaccindelerror404(Router). 6. Activalosfiltros(porejemplo,silapeticinnecesitaautenticacin)(Router). 7. Ejecutalosfiltros,primerapasada(before).(Router) 8. Ejecutalaaccin(Router). 9. Ejecutalosfiltros,segundapasada(after)(Router). 10. Ejecutalavistaymuestralarespuesta(View). Engranderasgossteeselprocesodelfrontcontroller,estoestodoquenecesitassabersobre estecomponenteelcualesimprescindibledelaarquitecturaMVCdentrodeKumbiaPHP

3.1.2.

FrontControllerpordefecto

Elfrontcontrollerpordefecto,llamadoindex.phpyubicadoeneldirectoriopublic/delproyecto,es unsimplescript,comoelsiguiente: . . . e r r o r _ r e p o r t i n g ( E _ A L L ^ E _ S T R I C T ) . . . / / d e f i n e ( ' P R O D U C T I O N ' , T R U E ) . . . d e f i n e ( ' S T A R T _ T I M E ' , m i c r o t i m e ( 1 ) ) . . . d e f i n e ( ' A P P _ P A T H ' , d i r n a m e ( d i r n a m e ( _ _ F I L E _ _ ) ) . ' / a p p / ' ) . . . d e f i n e ( ' C O R E _ P A T H ' , d i r n a m e ( d i r n a m e ( A P P _ P A T H ) ) . ' / c o r e / ' ) . . . i f ( $ _ S E R V E R [ ' Q U E R Y _ S T R I N G ' ] ) { d e f i n e ( ' P U B L I C _ P A T H ' , s u b s t r ( u r l d e c o d e ( $ _ S E R V E R [ ' R E Q U E S T _ U R I ' ] ) , 0 , s t r l e n ( $ _ S E R V E R [ ' Q U E R Y _ S T R I N G ' ] ) + 6 ) ) } e l s e { d e f i n e ( ' P U B L I C _ P A T H ' , $ _ S E R V E R [ ' R E Q U E S T _ U R I ' ] ) } . . . $ u r l = i s s e t ( $ _ G E T [ ' _ u r l ' ] ) ? $ _ G E T [ ' _ u r l ' ] : ' / ' . . . r e q u i r e C O R E _ P A T H . ' k u m b i a / b o o t s t r a p . p h p ' Ladefinicindelasconstantescorrespondealprimerpasodescritoenlaseccinanterior. Despuselcontroladorfrontalincluyeelbootstrap.phpdelaaplicacin,queseocupadelos pasos2a5.InternamenteelcoredeKumbiaPHPconsuscomponenteRouteryViewejecutan todoslospasossubsiguientes.

TodaslasconstantessonvalorespordefectodelainstalacindeKumbiaPHPenunambiente local.

3.1.3.

ConstantesdeKumbiaPHP

Cadaconstantecumpleunobjetivoespecificoconelfindebrindarmayorflexibilidadalmomento decrearrutas(paths)enelframework.

3.1.3.1.APP_PATH
Constantequecontienelarutaabsolutaaldirectoriodondeseencuentralaaplicacin(app),por ejemplo: e c h o A P P _ P A T H / / l a s a l i d a e s : / v a r / w w w / k u m b i a p h p / d e f a u l t / a p p / Conestaconstanteesposibleutilizarlaparaincluirarchivosqueseencuentrebajoelrbolde directoriodelaaplicacin,porejemplosiquiereincluirunarchivoqueestaeneldirectorio app/libs/test.phplaformadehacerlosera. i n c l u d e _ o n c e A P P _ P A T H . ' l i b s / t e s t . p h p '

3.1.3.2.CORE_PATH
ConstantequecontienelarutaabsolutaaldirectoriodondeseencuentraelcoredeKumbiaPHP. porejemplo: e c h o C O R E _ P A T H / / l a s a l i d a e s : / v a r / w w w / k u m b i a p h p / c o r e / Paraincluirarchivos,queseencuentrebajoesterboldedirectorios,eselmismoprocedimiento queseexplicparalaconstanteAPP_PATH.

3.1.3.3.PUBLIC_PATH
ConstantequecontienelaURLparaelnavegador(browser)yapuntaaldirectoriopublic/para enlazarimgenes,CSS,JavaScriptytodoloquesearutaparabrowser. / / G e n e r a u n l i n k q u e i r a a l / / c o n t r o l l e r : c o n t r o l l e r y a c t i o n : a c t i o n < a h r e f = " < ? p h p e c h o P U B L I C _ P A T H ? > c o n t r o l l e r / a c t i o n / " t i t l e = " M i L i n k " > M i L i n k < / a > / / E n l a z a u n a i m a g e n q u e e s t a e n p u b l i c / i m g / i m a g e n . j p g < i m g s r c = " < ? p h p e c h o P U B L I C _ P A T H ? > i m g / i m a g e n . j p g " a l t = " U n a I m a g e n "

/ > / / E n l a z a e l a r c h i v o C S S e n p u b l i c / c s s / s t y l e . c s s < l i n k r e l = " s t y l e s h e e t " t y p e = " t e x t / c s s " h r e f = " < ? p h p e c h o P U B L I C _ P A T H ? > c s s / s t y l e . c s s " / >

3.2. LasAcciones
Lasaccionessonlapartefundamentalenlaaplicacin,puestoquecontienenelflujoenquela aplicacinactuaranteciertaspeticiones.Lasaccionesutilizanelmodeloydefinenvariables paralavista.CuandoserealizaunapeticinwebenunaaplicacinKumbiaPHP,laURLdefine unaaccinylosparmetrosdelapeticin.Verseccin2.1.3.4 LasaccionessonmtodosdeunaclasecontroladorallamadaClassControllerqueheredadela claseAppControllerypuedenonoseragrupadasenmdulos.

3.2.1.

Lasaccionesylasvistas

CadavezqueseejecutaunaaccinKumbiaPHPbuscarentoncesunavista(view)conel mismonombredelaaccin.Estecomportamientosehadefinidopordefecto.Normalmentelas peticionesdebendarunarespuestaalclientequelahasolicitado,entoncessitenemosuna accinllamadasaludo()deberaexistirunavistaasociadaaestaaccinllamadasaludo.phtml. HabruncaptulomasextensodedicadoalaexplicacindelasvistasenKumbiaPHP.

3.2.2.

Obtenervaloresdesdeunaaccin

LasURLsdeKumbiaPHPestncaracterizadasportenervariaspartes,cadaunadeellascon unafuncinconocida.ParaobtenerdesdeuncontroladorlosvaloresquevienenenlaURL podemosusaralgunaspropiedadesdefinidasenelcontrolador. TomemoslaURL: http://www.dominio.com/noticias/ver/12/ ElControlador:noticias Laaccin:ver Parmetros:12

< ? p h p / * * * C o n t r o l l e r N o t i c i a * / c l a s s N o t i c i a s C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { / * * * m t o d o p a r a v e r l a n o t i c i a

* @ p a r a m i n t $ i d * / p u b l i c f u n c t i o n v e r ( $ i d ) { e c h o $ t h i s > c o n t r o l l e r _ n a m e / / n o t i c i a s e c h o $ t h i s > a c t i o n _ n a m e / / v e r / / U n a r r a y c o n t o d o s l o s p a r m e t r o s e n v i a d o s a l a a c c i n v a r _ d u m p ( $ t h i s > p a r a m e t e r s ) } } EsimportantenotarlarelacinqueguardanlosparmetrosenviadosporURLconlaaccin.En estesentidoKumbiaPHPtieneunacaracterstica,quehaceseguroelprocesodeejecutarlas accionesyesqueselimitaelenvodeparmetrostalcomosedefineenlamtodo(accin).Lo queindicaquetodoslosparmetrosenviadosporURLsonargumentosquerecibelaaccin.ver seccin2.1.3.4 Enelejemploanteriorsedefinienlaaccinver($id)unsoloparmetro,estoquieredecirquesi noseenvaeseparmetrooseintentanenviarmsparmetrosadicionalesKumbiaPHPlanzar unaexception(enproduccinmostrarunerror404).Estecomportamientoespordefectoenel frameworkysepuedecambiarparadeterminadosescenariossegnelpropsitodenuestra aplicacinparalaejecucindeunaaccin. TomandoelejemploHolaMundopongaenprcticaloantesexplicadoyloharenviando parmetrosadicionalesalmtodohola($nombre)elcualslorecibeunsloparmetro(el nombre)http://localhost/kumbiaphp/saludo/hola/CaChi/adicional,enlafigura3.1verlaexcepcin generadaporKumbiaPHP.

Figura3.1:ExcepcindeParmetroserrneos. Siguiendoenelmismoejemploimaginemosquerequerimosquelaejecucindelaaccinhola() obvielacantidaddeparmetrosenviadosporURL,paraestosolotenemosqueindicarlea KumbiaPHPmedianteelatributo$limit_paramsquedescarteelnmerodeparmetrosquese pasanporURL.

< ? p h p / * * * C o n t r o l l e r S a l u d o * / c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { / * * * L i m i t a l a c a n t i d a d c o r r e c t a d e * p a r m e t r o s d e u n a a c t i o n * / p u b l i c $ l i m i t _ p a r a m s = F A L S E . . . m t o d o s . . . } CuandotieneelvalorFALSEcomoseexplicantes,descartalacantidaddeparmetrosdela accin.IngresaalasiguienteURLhttp://localhost/kumbiaphp/saludo/hola/CaChi/param2/param3/ yvercomoyanoestalaexcepcindelafigura3.1ypodrverlavistadelaaccincomo muestralafigura3.2.

Figura3.2:Descartandolacantidaddeparmetrosdelaaccin.

3.3.ConvencionesyCreacindeunControlador
3.3.1.Convenciones
LoscontroladoresenKumbiaPHPdebenllevarlassiguientesconvencionesycaractersticas: Elarchivodebecreadosloeneldirectorioapp/controllers/.Elarchivodebetenerelnombredel controladorylaterminacin_controller.php,porejemplosaludo_controller.php. Elarchivodebecontenerlaclasecontroladoraconelmismonombredelarchivoennotacin CamelCase.Retomandoelejemploanteriorelnombredelaclasecontroladorasera SaludoController. */ public$limit_params=FALSE ...mtodos...

3.3.2.CreacindeunControlador
Ahorasepondrenprcticalovistoanteriormenteycrearemosuncontrolador(controller) llamadosaludo. < ? p h p / * * * C o n t r o l l e r S a l u d o * / c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { }

3.3.3.

ClaseAppController

EsimportanterecordarqueKumbiaPHPesunframeworkMVCyPOO.Enestesentidoexiste AppControlleryeslasuperclasedeloscontroladores,todosdebenheredar(extends)deesta claseparatenerlaspropiedades(atributos)ymtodosquefacilitanlainteraccinentrelacapa delmodeloypresentacin. LaclaseAppControllerestadefinidaenapp/libs/app_controller.phpesunaclasemuysencillade usaryesclavedentrodelMVC.

3.3.4.

AccionesyControladorespordefecto

3.4.Filtros
LoscontroladoresenKumbiaPHPposeenunosmtodostilesquepermitenrealizar comprobacionesantesydespusdeejecutaruncontroladoryunaaccin,losfiltrospuedenser entendidocomounmecanismodeseguridadenloscualessepuedecambiarelprocesamiento delapeticinsegnserequiera(porejemploverificarsiunusuariosseencuentraautenticadoen elsistema). KumbiaPHPcorrelosfiltrosenunordenlgico,paramanipularcomprobaciones,aniveldetoda laaplicacinobienenparticularidadesdeuncontrolador.

3.4.1.FiltrosdeControladores
Losfiltrosdecontroladoresseejecutanantesydespusdeuncontroladorsontilespara comprobacionesaniveldeaplicacin,comoporejemploverificarelmduloqueseesta intentandoacceder,sesionesdeusuarios,etc.Igualmentesepuedeusarparaprotegernuestro controladordeinformacininadecuada. Losfiltrossonmtodosloscualessobreescribimos(caractersticaPOO)paradarleel

comportamientodeseado.

3.4.1.1.initialize()
KumbiaPHPllamaalmtodoinitialize()antesdeejecutarelcontroladoryseencuentradefinido paraserusadoenlaclaseAppController(verseccin3.3.3).

3.4.1.2.finalize()
KumbiaPHPllamaalmtodofinalize()despusdeejecutarelcontroladoryseencuentradefinido paraserusadoenlaclaseAppController(verseccin3.3.3).

3.4.2.FiltrosdeAcciones
Losfiltrosdeaccionesseejecutanantesydespusdeunaaccinsontilespara comprobacionesaniveldecontroller,comoporejemploverificarqueunapeticinesasncrona, cambiartiposderespuesta,etc.Igualmentesepuedeusarparaprotegernuestraaccinde informacininadecuadaqueseaenviadaaellos.

3.4.2.1.before_filter()
KumbiaPHPllamaalmtodobefore_filter()antesdeejecutarlaaccindelcontroladoryestil paraverificarsiunapeticinesasncronaentreotros.

3.4.2.2.after_filter()
KumbiaPHPllamaalmtodoafter_filter()despusdeejecutarlaaccindelcontroladoryestil paracambiarvaloresdesesinentreotros.

4LaVista
KumbiaPHPposeeunsistemadepresentacinbasadoenVistas(Views)quevienesiendoel tercercomponentedelsistemaMVCcomosevienlaseccinModelo,Vista,Controlador,en estesentidolasvistassonplantillasdecdigoreutilizablequesirvenparamostrarlosdatosal usuarioyseencuentranubicadaseneldirectorioapp/views/. EsbuenaprcticadedesarrolloquelasvistascontenganunacantidadmnimadecdigoenPHP paraqueseasuficientementeentendibleparaundiseadorWebyadems,paradejaralas vistassololastareasdevisualizarlosresultadosgeneradosporloscontroladoresypresentarlas capturasdedatosparausuarios. Elmanejadordevistasimplementaelpatrndediseodevistaendospasos,elcualconsisteen dividirelprocesodemostrarunavistaendospartes:laprimeraparteesutilizarunavistao viewasociadaaunaaccindelcontroladorparaconvertirlosdatosquevienendelmodeloen lgicadepresentacinsinespecificarningnformatoespecficoylasegundaesestablecerel formatodepresentacinatravsdeunaplantillaotemplate. Asimismotantolasvistasdeaccincomolasplantillaspuedenutilizarvistasparcialeso partials.Estasvistasparcialessonfragmentosdevistasquesoncompartidaspordistintas vistas,demaneraqueconstituyenlgicadepresentacinreutilizableenlaaplicacin.Ejemplos: mens,cabeceras,piesdepgina,entreotros. KumbiaPHPfavoreciendosiemprelosconveniosasumelossiguientesrespectoalasvistas: Todoslosarchivosdevistasdebentenerlaextensin.phtml. Cadacontroladortieneundirectoriodevistasasociadocuyonombrecoincideconel nombredelcontroladorennotacinsmallcase.Porejemplo:siposeesuncontrolador cuyaclasesedenominaPersonalTecnicoControllerestaporconveniotieneun directoriodevistaspersonal_tecnico. Cadavezqueseejecutaunaaccinseintentacargarunavistacuyonombreeselmismo queeldelaaccinejecutada. Lostemplatesdebenubicarseeneldirectorioviews/_shared/templates. Lospartialsdebenubicarseeneldirectorioviews/_shared/partials. Pordefectoseutilizaeltemplatedefaultparamostrarlasvistasdeaccin.

Paraindicarunavistadiferentealaasumidaporconvencinsedebeutilizarelmtodo View::select()enelcontrolador.Porejemplo: < ? p h p c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n s a l u d o ( ) { V i e w : : s e l e c t ( ' h o l a ' )

} } Deestamaneraluegodequeseejecutelaaccinsaludosemostrarlavista saludo/hola.phtmlutilizandoeltemplatedefault. Encasodequenodeseemostrarunavista,solamentedebepasarNULLcomoargumentode View::select(). < ? p h p c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n i n d e x ( ) { V i e w : : s e l e c t ( N U L L ) } } Parafinalizaresteapartadocabedestacarquetantolasvistasdeaccin,lostemplatesylos partialssonvistas,peroporcomodidadsesuelereferiralavistadeaccinsencillamentebajoel nombredevista.

4.1Pasandodatosalavista
Parapasardatosalavistaestosdebencargarsecomoatributospblicosdelcontroladoryluego dequeseejecutelaaccin,elmanejadordevistascargarlosatributospblicosdelcontrolador comovariablesdembitolocalenlavista.Ejemplo: Elcontrolador:controllers/saludo_controller.php < ? p h p c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n h o l a ( ) { $ t h i s > u s u a r i o = ' M u n d o ' } } Lavista:views/saludo/hola.phtml H o l a < ? p h p e c h o $ u s u a r i o ? >

4.2Bufferdesalida
ParamostrarelcontenidodelbufferdesalidasehaceusodelmtodoView::content(),dondeel contenidodelbufferdesalidaloconstituyeprincipalmentelosechooprintqueefectuelusuario yasimismolosmensajesFlash.AlinvocarView::content()semuestraelcontenidodelbufferde salidaenellugardondefueinvocado.

Elcontrolador:saludo_controller.php < ? p h p c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n h o l a ( ) { F l a s h : : v a l i d ( ' H o l a M u n d o ' ) } } Lavista:hola.phtml S a l u d o r e a l i z a d o : < ? p h p V i e w : : c o n t e n t ( ) ? >

4.3Template
Lostemplatesconstituyenlacapamasexternadelavistaquesemostrarluegodeejecutaruna accindelcontrolador,demaneraquepermiteestablecerelformatodepresentacinapropiado paralavista. Cuandosehabladeformatonoserefierenicamentealtipodedocumento,sinotambina elementoscomocabecerasymenus.Porendeeltemplateestacompuestoporaquellos elementosqueenconjuntosonutilizadosparalapresentacindediversasvistas,dandodeesta maneraunformatodepresentacinreutilizable.

4.3.1ComocrearunTemplate?
Paraconstruirunnuevotemplatesedebecrearunarchivoconextensin.phtmleneldirectorio views/_shared/templates/elcualdebecorresponderconelnombredeltemplate. ComoseexplicanteriormentealiniciodelcaptuloLaVista,elmanejadordevistasutilizael patrndediseodevistaendospasos.Enelprimerpaso,seprocesalavistadeaccin, luegolavistadeaccinprocesadasealmacenaenelbufferdesalidayenelsegundopasose procesaeltemplate. Enconsecuencia,comolavistadeaccinprocesadaseacumulaenelbufferdesalidaes necesarioinvocarelmtodoView::content()enellugardondesedeseamostrarlavista,talcomo seindicenlaseccin4.2. Ejemplo: views/_shared/templates/ejemplo.phtml

< ! D O C T Y P E h t m l > < h t m l > < h e a d > < t i t l e > T e m p l a t e d e E j e m p l o < / t i t l e > < / h e a d > < b o d y > < h 1 > T e m p l a t e d e E j e m p l o < / h 1 > < ? p h p V i e w : : c o n t e n t ( ) ? > < / b o d y > < / h t m l >

4.3.2Comoutilizaruntemplate?
ParaseleccionareltemplateautilizarsedebeinvocarelmtodoView::template()pasandocomo argumentoeltemplateautilizar.Ejemplo: Enelcontrolador: < ? p h p c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n h o l a ( ) { / / S e l e c c i o n a e l t e m p l a t e ' m i _ t e m p l a t e . p h t m l ' V i e w : : t e m p l a t e ( ' m i _ t e m p l a t e ' ) } } Asimismoesposibleindicaralmanejadordevistasquenoutiliceningntemplateyporlotanto muestresolamentelavista,paraestosedebepasarNULLcomoargumentoaView::template(). < ? p h p c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n h o l a ( ) { / / N o u t i l i z a r t e m p l a t e V i e w : : t e m p l a t e ( N U L L ) } }

4.3.3Pasandodatosaltemplate
ComosevioenlaseccinPasandodatosalavista,losatributospblicosdelcontroladorse cargancomovariablesdembitolocalenlavista,comomostrareltemplate,constituyeel

segundopasoparamostrarlavistacompleta,losatributospblicosdelcontroladorestarnde igualmaneracargadoscomovariablesdembitolocaleneltemplate.Ejemplo: Enelcontroladorsaludo_controller.php < ? p h p c l a s s S a l u d o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n h o l a ( ) { F l a s h : : v a l i d ( ' H o l a M u n d o ' ) / / P a s a n d o e l t i t u l o p a r a l a p g i n a $ t h i s > t i t u l o = ' S a l u d a n d o a l M u n d o ' / * N o s e u t i l i z a r v i s t a , p o r l o t a n t o l a s a l i d a s e r d e l b u f f e r y t e m p l a t e * / V i e w : : s e l e c t ( N U L L , ' s a l u d o ' ) } } Eneltemplatesaludo.phtml < ! D O C T Y P E h t m l > < h t m l > < h e a d > < t i t l e > < ? p h p e c h o $ t i t u l o ? > < / t i t l e > < / h e a d > < b o d y > < h 1 > T e m p l a t e d e S a l u d o < / h 1 > < ? p h p V i e w : : c o n t e n t ( ) ? > < / b o d y > < / h t m l >

4.4Partial
Lospartialsovistasparcialessonfragmentosdevistasquesoncompartidaspordistintas vistas,demaneraqueconstituyenlgicadepresentacinreutilizableenlaaplicacin.Porlo generallospartialssonelementoscomo:mens,cabecera,piedepgina,formularios,entre otros.

4.4.1Comocrearunpartial?
Paraconstruirunnuevopartialsedebecrearunarchivoconextensin.phtmleneldirectorio

views/_shared/partials/elcualdebecorresponderconelnombredelpartial. Ejemplo: views/_shared/partials/cabecera.phtml < h 1 > T e m p l a t e d e S a l u d o < / h 1 >

4.4.2Comoutilizarunpartial?
ParautilizarunpartialsedebeinvocarelmtodoView::partial()indicandocomoargumentoel partialdeseadoylavistaparcialsemostrarenellugardondeseinvoc. Ejemploutilizandounpartialenuntemplate: < ! D O C T Y P E h t m l > < h t m l > < h e a d > < t i t l e > E j e m p l o < / t i t l e > < / h e a d > < b o d y > < ? p h p V i e w : : p a r t i a l ( ' c a b e c e r a ' ) ? > < ? p h p V i e w : : c o n t e n t ( ) ? > < / b o d y > < / h t m l > Cabedestacarquelospartialsepuedenutilizartantoenvistasdeaccin,templateseincluso dentrodeotrospartials.

4.4.3Pasandodatosalospartials
Parapasardatosaunpartial,estossedebenindicarenunarrayasociativodondecadaclave consucorrespondientevalorsecargarncomovariablesenelmbitolocaldelpartial. Ejemplo: views/partials/cabecera.phtml < h 1 > T t u l o : < ? p h p e c h o $ t i t u l o ? > < / h 1 > views/ejemplo/index.phtml < ? p h p V i e w : : p a r t i a l ( ' c a b e c e r a ' , F A L S E , a r r a y ( ' t i t u l o ' = > ' E j e m p l o ' ) )

? > < p > E s t e e s u n e j e m p l o < / p >

4.5Agrupandoendirectorios
EnKumbiaPHPtantolasvistas,lospartialsylostemplatespuedenagruparseendirectorios, utilizandoelseparador/enlaruta.

4.5.1Ejemplodeagrupacindevista
Lavistaviews/usuario/clasificado/fomulario.phtml,seutilizadelasiguientemaneraenel controlador: < ? p h p c l a s s U s u a r i o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n n u e v o ( ) { / / S e l e c c i o n a l a v i s t a V i e w : : s e l e c t ( ' c l a s i f i c a d o / f o r m u l a r i o ' ) } }

4.5.2Ejemplodeagrupacindepartial
Elpartialviews/_shared/partials/usuario/formulario.phtml,seutilizadelasiguientemanerayasea envistaoentemplate: < h 1 > N u e v o U s u a r i o < / h 1 > < ? p h p V i e w : : p a r t i a l ( ' u s u a r i o / f o r m u l a r i o ' ) ? >

4.5.3Ejemplodeagrupacindetemplate
Eltemplateviews/_shared/templates/usuario/administrador.phtml,seutilizadelasiguiente maneraenelcontrolador:

< ? p h p c l a s s A d m i n i s t r a d o r C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p r o t e c t e d f u n c t i o n b e f o r e _ f i l t e r ( ) { / / S e l e c c i o n a e l t e m p l a t e V i e w : : t e m p l a t e ( ' u s u a r i o / a d m i n i s t r a d o r ' ) } }

4.6Tiposderespuestas
Lostiposderespuestassonutilizadosparaestablecerdistintosformatosdelavista.Por ejemplo:xml,jsonypdf. ParaestableceruntipoderespuestasedebeinvocarelmtodoView::response()indicandola respuestadeseada,unavezqueseindicaeltipoderespuestaesteesautomticamente colocadocomoextensindelarchivodevista.Enconsecuenciautilizarlostiposderespuestas enconjuntoalostemplateconstituyenunapotenteherramientaparageneracindevistas completasparaelusuario. Ejemplo: < ? p h p c l a s s U s u a r i o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n i n d e x ( ) { / / E s t a b l e c e e l t i p o d e r e s p u e s t a V i e w : : r e s p o n s e ( ' j s o n ' ) } } Enesteejemplosemostrarlavistaindex.json.phtml.

4.7Usodecacheenlasvistas
Elmanejadordevistasproporcionamecanismosatravsdeloscualeslasvistas,lospartialsy lostemplatessepuedencachear,elusuarioindicaeltiempoduranteelcualestosestarn almacenadosenlacachedemaneraqueelmanejadordevistascargarestoselementossin necesidaddeprocesarlos,aumentandoelrendimientodelaaplicacin. Enestesentidoparaindicareltiempodecachesesigueelformatodelafuncinstrtotimede PHP.Ejemplo:'+1week'

4.7.1Cachedevistas
ParacachearunavistaseutilizaelmtodoView::cache()enelcontrolador. < ? p h p c l a s s U s u a r i o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n i n d e x ( ) { / / I n d i c a e l t i e m p o d e c a c h e d e l a v i s t a V i e w : : c a c h e ( ' + 2 0 d a y s ' ) } } Cabedestacarquelaaccinenelcontroladorseejecuta,debidoaquelosdatospasadosala vistapuedendeigualmaneraserrequeridoseneltemplate.

4.7.1.1Gruposdevistasencache
Lasvistascacheadassepuedenalmacenarengrupos.Losgrupossonmuyinteresantes,yaque sepuedeborrarlacacheporgrupostambin.Ejemplo:guardarcachedepostsenungrupo,al crear,editaroborrarunpost,podemosborrarlacachedeesegrupo,paraqueseregenerela cache. EnestecasoesnecesarioindicarenelmtodoView::cache()quesecachearunavistaenun grupoespecfico. < ? p h p c l a s s U s u a r i o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n i n d e x ( ) { / / I n d i c a e l t i e m p o d e c a c h e d e l a v i s t a V i e w : : c a c h e ( ' + 2 0 d a y s ' , ' v i e w ' , ' m i G r u p o ' ) } }

4.7.2Cachedetemplates
Cachearuntemplateconsisteencachearenconjuntotantolavistaytemplateparaunaurl especfica.ParacachearuntemplateseusaelmtodoView::cache()enelcontroladorindicando eltiempoduranteelcualestarcacheadoeltemplate. < ? p h p

c l a s s U s u a r i o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n i n d e x ( ) { / / I n d i c a e l t i e m p o d e c a c h e d e t e m p l a t e V i e w : : c a c h e ( ' + 2 0 d a y s ' , ' t e m p l a t e ' ) } } Cabedestacarqueparaaumentarelrendimientonoseejecutalaaccinenelcontrolador, debidoaquemostrareltemplateeselltimopasoquerealizaelmanejadordevistaspara mostrarlavistaalusuarioyenestepasoyatodoslosdatosenviadosalavistaytemplatehan sidoutilizados.

4.7.3Cachedepartials
ParacachearpartialssedebeindicarcomosegundoargumentoalinvocarView::partial()el tiempoduranteelcualsecachear. < ? p h p V i e w : : p a r t i a l ( ' u s u a r i o ' , ' + 1 d a y ' ) ? >

< ? p h p V i e w : : p a r t i a l ( ' u s u a r i o ' , ' + 1 d a y ' , a r r a y ( ' n o m b r e ' = > ' p e p e ' ) ) ? >

4.8Helpers
Loshelpers(ayudas)seusanenlosviews.Encapsulancdigoenmtodosparasufcilreuso. KumbiaPHPyavieneconhelperscreados. Perolorealmentetil,esquelosusuariossepuedencrearsuspropioshelpersycolocarlosen app/extensions/helpers/.Ydespususarlostranquilamenteensusviews,KumbiaPHPse encargadecargartransparentementesushelpersascomolosuses.

4.8.1ClaseHtml
ClaseconmtodosestticosconlaquepodemoscrearetiquetasHTMLoptimizadasrespetando lasconvencionesdeKumbiaPHP.

Html::img()
Permiteincluirunaimagen

$ s r c r u t a d e l a i m a g e n $ a l t a t r i b u t o a l t p a r a l a i m a g e n $ a t t r s a t r i b u t o s a d i c i o n a l e s i m g ( $ s r c , $ a l t = N U L L , $ a t t r s = N U L L )

/ * E j e m p l o * / e c h o H t m l : : i m g ( ' s p i n . g i f ' , ' u n a i m a g e n ' ) / / s e m u e s t r a l a i m a g e n s p i n . g i f q u e s e e n c u e n t r a d e n t r o d e " / p u b l i c / i m g / " / / c o n e l a r t i b u t o a l t ' u n a i m a g e n '

Html::link()
Permiteincluirunlink $ a c t i o n r u t a a l a a c c i n $ t e x t t e x t o a m o s t r a r $ a t t r s a t r i b u t o s a d i c i o n a l e s H t m l : : l i n k ( $ a c t i o n , $ t e x t , $ a t t r s = N U L L )

/ * E j e m p l o * / e c h o H t m l : : l i n k ( ' p a g e s / s h o w / k u m b i a / s t a t u s ' , ' C o n f i g u r a c i n ' ) / / s e m u e s t r a u n l i n k c o n e l t e x t o ' C o n f i g u r a c i n '

Html::lists()
Creaunalistahtmlapartirdeunarray $ a r r a y c o n t e n i d o d e l a l i s t a $ t y p e p o r d e f e c t o u l , y s i n o o l $ a t t r s a t r i b u t o s a d i c i o n a l e s H t m l : : l i s t s ( $ a r r a y , $ t y p e = ' u l ' , $ a t t r s = N U L L )

/ * E j e m p l o * / $ a r = a r r a y ( ' A b d o m e n ' = > ' A b d o m e n ' , ' B r a z o s ' = > ' B r a z o s ' , ' C a b e z a ' = > ' C a b e z a ' , ' C u e l l o ' = > ' C u e l l o ' ,

' G e n i t a l e s ' = > ' G e n i t a l e s ' , ' P i e r n a s ' = > ' P i e r n a s ' , ' T r a x ' = > ' T r a x ' , ' O t r o s ' = > ' O t r o s ' ) / / $ a r e l a r r a y q u e c o n t i e n e l o s i t e m s d e l a l i s t a e c h o H t m l : : l i s t s ( $ a r , $ t y p e = ' o l ' ) / / M u e s t r a u n a l i s t a < o l > < / o l > $ a r 2 = a r r a y ( ' A b d o m e n ' , ' B r a z o s ' , ' C a b e z a ' , ' C u e l l o ' , ' G e n i t a l e s ' , ' P i e r n a s ' , ' T r a x ' , ' O t r o s ' ) e c h o H t m l : : l i s t s ( $ a r 2 , $ t y p e = ' o l ' ) / / M u e s t r a u n a l i s t a < o l > < / o l >

Html::gravatar()
Incluyeimgenesdegravatar.com $ e m a i l C o r r e o p a r a c o n s e g u i r s u g r a v a t a r $ a l t T e x t o a l t e r n a t i v o d e l a i m a g e n . P o r d e f e c t o : g r a v a t a r $ s i z e T a m a o d e l g r a v a t a r . U n n u m e r o d e 1 a 5 1 2 . P o r d e f e c t o : 4 0 $ d e f a u l t U R L g r a v a t a r p o r d e f e c t o s i n o e x i s t e , o u n d e f a u l t d e g r a v a t a r . P o r d e f e c t o : m m H t m l : : g r a v a t a r ( $ e m a i l , $ a l t = ' g r a v a t a r ' , $ s i z e = 4 0 , $ d e f a u l t = ' m m ' )

e c h o H t m l : : g r a v a t a r ( $ e m a i l ) / / S i m p l e e c h o H t m l : : l i n k ( H t m l : : g r a v a t a r ( $ e m a i l ) , $ u r l ) / / U n g r a v a t a r q u e e s u n l i n k e c h o H t m l : : g r a v a t a r ( $ e m a i l , $ n a m e , 2 0 , ' h t t p : / / w w w . e x a m p l e . c o m / d e f a u l t . j p g ' ) / / C o m p l e t o

Html::includeCss()
IncluyelosarchivosCSSquepreviamentefueroncargadosalalistamedianteTag::css() T a g : : c s s ( ' b i e n v e n i d a ' ) / / P o n e e n l i s t a u n C S S ( a p p / p u b l i c / c s s / b i e n v e n i d a . c s s ) e c h o H t m l : : i n c l u d e C s s ( ) / / A d i c i o n a l o s r e c u r s o s e n l a z a d o s d e l a c l a s e e n e l p r o y e c t o

Html::meta()
Creaunmetatagyloagregaaunalistaestticaqueseraadidamsadelnatemediante

Html::includeMetatags() $ c o n t e n t c o n t e n i d o d e l m e t a t a g $ a t t r s a t r i b u t o s a d i c i o n a l e s d e l t a g H t m l : : m e t a ( $ c o n t e n t , $ a t t r s = N U L L )

H t m l : : m e t a ( ' K u m b i a p h p t e a m ' , " n a m e = ' A u t h o r ' " ) / / A g r e g a : < m e t a c o n t e n t = " K u m b i a p h p t e a m " n a m e = ' A u t h o r ' / > H t m l : : m e t a ( ' t e x t / h t m l c h a r s e t = U T F 8 ' , " h t t p e q u i v = ' C o n t e n t t y p e ' " ) / / A g r e g a : < m e t a c o n t e n t = " t e x t / h t m l c h a r s e t = U T F 8 " h t t p e q u i v = ' C o n t e n t t y p e ' / >

Html::includeMetatags()
Agregalosmetatagquepreviamentesehabanagregado H t m l : : m e t a ( ' K u m b i a p h p t e a m ' , " n a m e = ' A u t h o r ' " ) H t m l : : m e t a ( ' t e x t / h t m l c h a r s e t = U T F 8 ' , " h t t p e q u i v = ' C o n t e n t t y p e ' " ) e c h o H t m l : : i n c l u d e M e t a t a g s ( ) / / V i s u a l i z a < m e t a c o n t e n t = " K u m b i a p h p t e a m " n a m e = ' A u t h o r ' / >

Html::headLink()
Agregaunelementodevinculoexternodetipo<link>alacoladeenlaces(parapoderser visualizadoserequieredeHtml::includeHeadLinks()demodosimilarqueHtml::includeCss()) $ h r e f d i r e c c i n u r l d e l r e c u r s o a e n l a z a r $ a t t r s a t r i b u t o s a d i c i o n a l e s H t m l : : h e a d L i n k ( $ h r e f , $ a t t r s = N U L L )

H t m l : : h e a d l i n k ( ' h t t p : / / w w w . k u m b i a p h p . c o m / p u b l i c / s t y l e . c s s ' , " r e l = ' s t y l e s h e e t ' , t y p e = ' t e x t / c s s ' m e d i a = ' s c r e e n ' " ) / / S e a g r e g a a l a c o l a d e l i n k s e l e n l a c e a u n r e c u r s o e x t e r n o , e n e s t e c a s o l a h o j a d e e s t i l o u b i c a d a e n " h t t p : / / w w w . k u m b i a p h p . c o m / p u b l i c / s t y l e . c s s " / * A g r e g a a l a c o l a d e l i n k s " < l i n k r e l = " a l t e r n a t e " t y p e = " a p p l i c a t i o n / r s s + x m l " t i t l e = " K u m b i a P H P F r a m e w o r k R S S F e e d " h r e f = " h t t p : / / w w w . k u m b i a p h p . c o m / b l o g / f e e d / " / > " c o n l o c u a l p o d e m o s

i n c l u i r u n f e e d s i n u s a r l a s c o n v e n c i o n e s d e k u m b i a p h p * / H t m l : : h e a d l i n k ( ' h t t p : / / w w w . k u m b i a p h p . c o m / b l o g / f e e d / ' , " r e l = ' a l t e r n a t e ' t y p e = ' a p p l i c a t i o n / r s s + x m l ' t i t l e = ' K u m b i a P H P F r a m e w o r k R S S F e e d ' " ) H t m l : : h e a d l i n k ( ' h t t p : / / w w w . k u m b i a p h p . c o m / f a v i c o n . i c o ' , " r e l = ' s h o r t c u t i c o n ' , t y p e = ' i m a g e / x i c o n ' " ) / / A g r e g a l a e t i q u e t a < l i n k > p a r a u s a r u n f a v i c o n e x t e r n o e c h o H t m l : : i n c l u d e H e a d L i n k s ( ) / / M u e s t r a l o s l i n k s q u e c o n t i e n e l a c o l a

Html::headLinkAction()
Agregaunelementodevinculointernodetipo<link>alacoladeenlaces(parapoderser visualizadoserequieredeHtml::includeHeadLinks()demodosimilarqueHtml::includeCss()) respetandolasconvencionesdeKumbiaPHP. $ h r e f d i r e c c i n u r l d e l r e c u r s o a e n l a z a r $ a t t r s a t r i b u t o s a d i c i o n a l e s H t m l : : h e a d L i n k A c t i o n ( $ a c t i o n , $ a t t r s = N U L L )

/ * A g r e g a a l a c o l a d e l i n k s " < l i n k r e l = " a l t e r n a t e " t y p e = " a p p l i c a t i o n / r s s + x m l " t i t l e = " K u m b i a P H P F r a m e w o r k R S S F e e d " h r e f = " h t t p : / / w w w . k u m b i a p h p . c o m / b l o g / f e e d / " / > " c o n l o c u a l p o d e m o s i n c l u i r u n f e e d u s a n d o l a s c o n v e n c i o n e s d e K u m b i a P H P . S i e n d o ' a r t i c u l o s / f e e d ' e l n o m b r e d e l a v i s t a c o n e l c o n t e n i d o d e l f e e d * / H t m l : : h e a d L i n k A c t i o n ( ' a r t i c u l o s / f e e d ' , " r e l = ' a l t e r n a t e ' t y p e = ' a p p l i c a t i o n / r s s + x m l ' t i t l e = ' K u m b i a P H P F r a m e w o r k R S S F e e d ' " ) e c h o H t m l : : i n c l u d e H e a d L i n k s ( ) / / M u e s t r a l o s l i n k s q u e c o n t i e n e l a c o l a

Html::headLinkResource()
Agregaunelementodevinculoaunrecursointernoconlaetiqueta<link>alacoladeenlaces (parapoderservisualizadoserequieredeHtml::includeHeadLinks()) $ r e s o u r c e u b i c a c i n d e l r e c u r s o e n p u b l i c $ a t t r s a t r i b u t o s a d i c i o n a l e s

H t m l : : h e a d L i n k R e s o u r c e ( $ r e s o u r c e , $ a t t r s = N U L L )

H t m l : : h e a d L i n k R e s o u r c e ( ' f a v i c o n . i c o ' , " r e l = ' s h o r t c u t i c o n ' , t y p e = ' i m a g e / x i c o n ' " ) / / A g r e g a l a e t i q u e t a < l i n k > p a r a u s a r u n f a v i c o n i n t e r n o u b i c a d o e n e l d i r e c t o r i o ' / p u b l i c / ' e c h o H t m l : : i n c l u d e H e a d L i n k s ( ) / / M u e s t r a l o s l i n k s q u e c o n t i e n e l a c o l a

Html::includeHeadLinks()
Incluyeloslinksquepreviamentesepusieronencola H t m l : : h e a d l i n k ( ' h t t p : / / w w w . k u m b i a p h p . c o m / f a v i c o n . i c o ' , " r e l = ' s h o r t c u t i c o n ' , t y p e = ' i m a g e / x i c o n ' " ) / / A g r e g a l a e t i q u e t a < l i n k > p a r a u s a r u n f a v i c o n e x t e r n o H t m l : : h e a d L i n k A c t i o n ( ' a r t i c u l o s / f e e d ' , " r e l = ' a l t e r n a t e ' t y p e = ' a p p l i c a t i o n / r s s + x m l ' t i t l e = ' K u m b i a P H P F r a m e w o r k R S S F e e d ' " ) e c h o H t m l : : i n c l u d e H e a d L i n k s ( )

4.8.2.ClaseTag
EstaclasenosvaapermitiradicionararchivosJSyCSSanuestroproyecto,bienseanarchivos queseencuentrenennuestroservidoroenunservidorexterno.Tambinvamosapoderhacer Lasfuncionesdeestaclasesondetipostticas,loquenospermiteusarlasdirectamentedela formacomosepresentanacontinuacin.

Tag::css()
IncluyeunarchivoCSSalalista T a g : : c s s ( ' b i e n v e n i d a ' ) / / P o n e e n l i s t a u n C S S ( a p p / p u b l i c / c s s / b i e n v e n i d a . c s s ) e c h o H t m l : : i n c l u d e C s s ( ) / / A d i c i o n a l o s r e c u r s o s e n l a z a d o s d e l a c l a s e e n e l p r o y e c t o

Tag::js()
IncluyeunarchivoJavaScriptalavista,partialotemplate

< ? p h p e c h o T a g : : j s ( ' j q u e r y / j q u e r y . k u m b i a p h p ' ) / / A d i c i o n a u n a r c h i v o j a v a s c r i p t ( / a p p / p u b l i c / j a v a s c r i p t / j q u e r y / j q u e r y . k u m b i a p h p . j s ) ? >

4.8.3.ClaseForm
Claseparaelmanejoylacreacindeformularios

Form::open()
Creaunaetiquetadeformulario $ a c t i o n a c c i n a l a q u e e n v a l o s d a t o s , p o r d e f e c t o l l a m a l a m i s m a a c c i n d e d o n d e p r o v i e n e $ m e t h o d ' P O S T ' , ' G E T ' , ' D E L E T E ' , ' H E A D ' , ' P U T ' . P o r d e f e c t o s e t i e n e e n ' P O S T ' $ a t t r s a t r i b u t o s a d i c i o n a l e s F o r m : : o p e n ( $ a c t i o n = N U L L , $ m e t h o d = ' P O S T ' , $ a t t r s = N U L L )

/ * E j e m p l o * / < ? p h p e c h o F o r m : : o p e n ( ) ? > / / i n i c i a u n f o r m u l a r i o q u e e n v i a r a l o s d a t o s a l a a c c i n q u e c o r r e s p o n d e a l c o n t r o l l e r a c t u a l < ? p h p e c h o F o r m : : o p e n ( ' u s u a r i o s / n u e v o ' ) ? > / / i n i c i a u n f o r m u l a r i o q u e e n v i a r a l o s d a t o s a l c o n t r o l l e r ' u s u a r i o s ' y l a a c c i n ' n u e v o '

Form::openMultipart()
Creaunaetiquetadeformulariomultipart,esteesidealparaformulariosquecontienencampos desubidadearchivos $ a c t i o n a c c i n a l a q u e e n v a l o s d a t o s , p o r d e f e c t o l l a m a l a m i s m a a c c i n d e d o n d e p r o v i e n e $ a t t r s a t r i b u t o s a d i c i o n a l e s F o r m : : o p e n M u l t i p a r t ( $ a c t i o n = N U L L , $ a t t r s = N U L L )

/ * E j e m p l o * / e c h o F o r m : : o p e n M u l t i p a r t ( ) / / i n i c i a u n f o r m u l a r i o m u l t i p a r t q u e e n v i a r a l o s d a t o s a l a a c c i n q u e c o r r e s p o n d e a l a v i s t a a c t u a l e c h o F o r m : : o p e n M u l t i p a r t ( ' u s u a r i o s / n u e v o ' ) / / i n i c i a u n f o r m u l a r i o

m u l t i p a r t q u e e n v i a r a l o s d a t o s a l c o n t r o l l e r ' u s u a r i o ' y l a a c c i n ' n u e v o '

Form::close()
Creaunaetiquetadecierredeformulario / * E j e m p l o * / e c h o F o r m : : c l o s e ( ) / / c r e a u n a e t i q u e t a d e c i e r r e d e f o r m u l a r i o < / f o r m >

Form::input()
Creauncampodetipoinput $ a t t r s a t r i b u t o s p a r a e l t a g $ c o n t e n t c o n t e n i d o i n t e r n o F o r m : : i n p u t ( $ a t t r s = N U L L , $ c o n t e n t = N U L L )

/ * E j e m p l o * / e c h o F o r m : : i n p u t ( ' n o m b r e ' )

Form::text()
Creauncampodetipoinput Siemprequeseledaelparmetronamedelaformamodel.campo,esdecirunnombreque contengaunpuntodentrodelstring,secreaelcampodetextoconelname="model[campo]"yel id="model_campo". $ f i e l d N o m b r e d e c a m p o $ a t t r s a t r i b u t o s d e c a m p o $ v a l u e v a l o r i n i c i a l p a r a e l i n p u t F o r m : : t e x t ( $ f i e l d , $ a t t r s = N U L L , $ v a l u e = N U L L )

/ * E j e m p l o * / e c h o F o r m : : t e x t ( ' n o m b r e ' ) / / c r e a u n c a m p o d e t i p o t e x t o c o n e l p a r m e t r o n a m e = " n o m b r e " , i d = " n o m b r e " e c h o F o r m : : t e x t ( ' u s u a r i o . n o m b r e ' ) / / c r e a u n c a m p o d e t i p o t e x t o c o n

e l p a r m e t r o n a m e = " u s u a r i o [ n o m b r e ] " , i d = " u s u a r i o . n o m b r e " e c h o F o r m : : t e x t ( ' n o m b r e ' , " c l a s s = ' c a j a ' " , ' 5 5 ' ) / / c r e a u n c a m p o d e t i p o t e x t o c o n e l p a r m e t r o n a m e = " n o m b r e " , i d = " n o m b r e " , c l a s s = " c a j a " , v a l u e = " 5 5 "

Form::pass()
CreauncampodetipoPassword $ f i e l d n o m b r e d e c a m p o $ a t t r s a t r i b u t o s d e c a m p o $ v a l u e v a l o r i n i c i a l p a r a e l c a m p o F o r m : : p a s s ( $ f i e l d , $ a t t r s = N U L L , $ v a l u e = N U L L )

/ * E j e m p l o * / e c h o F o r m : : p a s s ( ' p a s s w o r d ' ) / / c r e a u n c a m p o d e t i p o p a s s w o r d c o n e l p a r m e t r o n a m e = " p a s s w o r d "

Form::textarea()
Creauntextarea $ f i e l d n o m b r e d e c a m p o $ a t t r s a t r i b u t o s d e c a m p o $ v a l u e v a l o r i n i c i a l p a r a e l t e x t a r e a F o r m : : t e x t a r e a ( $ f i e l d , $ a t t r s = N U L L , $ v a l u e = N U L L )

e c h o F o r m : : t e x t a r e a ( ' d e t a l l e s ' ) / / C r e a u n t e x t a r e a

Form::label()
Creaunlabelyloasociaauncampo $ t e x t t e x t o a m o s t r a r $ f i e l d c a m p o a l q u e h a c e r e f e r e n c i a $ a t t r s a r r a y d e a t r i b u t o s o p c i o n a l e s F o r m : : l a b e l ( $ t e x t , $ f i e l d , $ a t t r s = N U L L )

e c h o F o r m : : l a b e l ( ' n o m b r e d e u s u a r i o : ' , ' n o m b r e ' ) / / C r e a u n l a b e l p a r a e l c a m p o n o m b r e c o n e l t e x t o ' n o m b r e d e u s u a r i o : ' e c h o F o r m : : t e x t ( ' n o m b r e ' )

Form::hidden()
Creauncampohidden(campooculto) $ f i e l d n o m b r e d e c a m p o $ a t t r s a t r i b u t o s a d i c i o n a l e s d e c a m p o $ v a l u e v a l o r i n i c i a l p a r a e l c a m p o o c u l t o F o r m : : h i d d e n ( $ f i e l d , $ a t t r s = N U L L , $ v a l u e = N U L L )

e c h o F o r m : : h i d d e n ( ' i d ' , N U L L , 1 2 ) / / C r e a u n c a m p o o c u l t o c o n e l n a m e = " i d " y e l v a l u e = " 1 2 "

Form::dbSelect()
CreacampoSelectquetomalosvaloresdeobjetosdeActiveRecord,paraestaversindel frameworkelusodeestehelperhasidosimplificado.Yanoesnecesarioinstanciarelmodelo. $ f i e l d n o m b r e d e l m o d e l o y c a m p o p k ( b a j o l a c o n v e n c i n m o d e l o . c a m p o _ i d ) $ s h o w c a m p o q u e s e m o s t r a r $ d a t a a r r a y d e v a l o r e s , a r r a y ( ' m o d e l o ' , ' m t o d o ' , ' p a r a m ' ) $ b l a n k c a m p o e n b l a n c o $ a t t r s a t r i b u t o s d e c a m p o $ v a l u e v a l o r i n i c i a l p a r a e l c a m p o

F o r m : : d b S e l e c t ( $ f i e l d , $ s h o w = N U L L , $ d a t a = N U L L , $ b l a n k = N U L L , $ a t t r s = N U L L , $ v a l u e = N U L L ) Vista e c h o F o r m : : d b S e l e c t ( ' u s u a r i o s . c a m p o _ i d ' ) / / l a f o r m a m s f c i l , c a r g a e l m o d e l o ( c a m p o ) y m u e s t r a e l p r i m e r c a m p o d e s p u s d e l p k ( i d ) e c h o F o r m : : d b S e l e c t ( ' u s u a r i o s . c a m p o _ i d ' , ' c a m p o ' ) / / m u e s t r a e l c a m p o y l o o r d e n a a s c e n d e n t e m e n t e

Form::select()
CreauncampoSelect(uncombobox) $ f i e l d n o m b r e d e c a m p o $ d a t a a r r a y d e v a l o r e s p a r a l a l i s t a d e s p l e g a b l e $ a t t r s a t r i b u t o s d e c a m p o $ v a l u e v a l o r i n i c i a l p a r a e l c a m p o F o r m : : s e l e c t ( $ f i e l d , $ d a t a , $ a t t r s = N U L L , $ v a l u e = N U L L )

$ a r 2 = a r r a y ( ' A b d o m e n ' , ' B r a z o s ' , ' C a b e z a ' , ' C u e l l o ' , ' G e n i t a l e s ' , ' P i e r n a s ' , ' T r a x ' , ' O t r o s ' ) e c h o F o r m : : S e l e c t ( ' r e g i o n ' , $ a r 2 , N U L L , ' C u e l l o ' ) / / C r e a u n c a m p o S e l e c t ( u n c o m b o b o x ) c o n e l n o m b r e ' r e g i o n ' y t e n i e n d o p r e s e l e c c i o n a d o ' C u e l l o ' Resultado: < s e l e c t i d = " r e g i o n " n a m e = " r e g i o n " > < o p t i o n v a l u e = " 0 " > A b d o m e n < / o p t i o n > < o p t i o n v a l u e = " 1 " > B r a z o s < / o p t i o n > [ . . . ] < / s e l e c t > OtraPosibilidad: $ a r 2 = a r r a y ( ' A b d o m e n ' = > ' A b d o m e n ' , ' B r a z o s ' = > ' B r a z o s ' , ' C a b e z a ' = > ' C a b e z a ' , ' C u e l l o ' = > ' C u e l l o ' , ' G e n i t a l e s ' = > ' G e n i t a l e s ' , ' P i e r n a s ' = > ' P i e r n a s ' , ' T r a x ' = > ' T r a x ' , ' O t r o s ' = > ' O t r o s ' ) e c h o F o r m : : S e l e c t ( ' r e g i o n ' , $ a r 2 , N U L L , ' C u e l l o ' ) Resultado: < s e l e c t i d = " r e g i o n " n a m e = " r e g i o n " > < o p t i o n v a l u e = " A b d o m e n " > A b d o m e n < / o p t i o n > < o p t i o n v a l u e = " B r a z o s " > B r a z o s < / o p t i o n > [ . . . ] < / s e l e c t >

Form::file()
CreacampoFileparasubirarchivos,elformulariosedebeabrirconForm::openMultipart()

$ f i e l d n o m b r e d e c a m p o $ a t t r s a t r i b u t o s d e c a m p o F o r m : : f i l e ( $ f i e l d , $ a t t r s = N U L L )

e c h o F o r m : : o p e n M u l t i p a r t ( ) / / A b r e e l f o r m u l a r i o m u l t i p a r t e c h o F o r m : : f i l e ( ' s u b i r ' ) c r e a r e l c a m p o p a r a s u b i r a r c h i v o s e c h o F o r m : : c l o s e ( ) / / C i e r r a e l f o r m u l a r i o

Form::button()
Creaunbotn $ t e x t t e x t o d e l b o t n $ a t t r s a t r i b u t o s d e l b o t n F o r m : : b u t t o n ( $ t e x t , $ a t t r s = N U L L )

e c h o F o r m : : b u t t o n ( ' c a l c u l a r ' ) / / C r e a u n b o t n c o n e l t e x t o ' c a l c u l a r '

Form::submitImage()
CreaunbotndetipoimagensiguiendolasconvencionesdeKumbiaPHP,laimagendeber estardentrodeldirectorio'/public/img/' $ i m g r u t a d e l a i m a g e n q u e u s a e l b o t n $ a t t r s a t r i b u t o s d e l b o t n F o r m : : s u b m i t I m a g e ( $ i m g , $ a t t r s = N U L L )

e c h o F o r m : : s u b m i t I m a g e ( ' b o t o n e s / e d i t . g i f ' ) / / C r e a u n b o t n c o n l a i m a g e n ' b o t o n e s / e d i t . g i f '

Form::submit()
Creaunbotndesubmitparaelformularioactual $ t e x t t e x t o d e l b o t n $ a t t r s a t r i b u t o s d e l b o t n

F o r m : : s u b m i t ( $ t e x t , $ a t t r s = N U L L )

e c h o F o r m : : s u b m i t ( ' e n v i a r ' ) / / C r e a u n b o t n c o n e l t e x t o ' e n v i a r '

Form::reset()
Creaunbotnresetparaelformularioactual $ t e x t t e x t o d e l b o t n $ a t t r s a t r i b u t o s d e l b o t n F o r m : : r e s e t ( $ t e x t , $ a t t r s = N U L L )

e c h o F o r m : : r e s e t ( ' r e i n i c i a r ' ) / / C r e a u n b o t n c o n e l t e x t o ' r e i n i c i a r '

Form::check()
Creauncheckbox $ f i e l d n o m b r e d e c a m p o $ v a l u e v a l o r e n e l c h e c k b o x $ a t t r s a t r i b u t o s d e c a m p o $ c h e c k e d i n d i c a s i s e m a r c a e l c a m p o F o r m : : c h e c k ( $ f i e l d , $ v a l u e , $ a t t r s = N U L L , $ c h e c k e d = N U L L )

e c h o F o r m : : c h e c k ( ' r e c u e r d a m e ' , ' 1 ' , ' ' , t r u e ) / / C r e a u n c h e c k s e l e c c i o n a d o c o n i d = " r e c u e r d a m e " , n a m e = " r e c u e r d a m e " y v a l u e = " 1 " e c h o F o r m : : c h e c k ( ' r e c u e r d a m e ' , ' 1 ' , ' ' , f a l s e ) / / C r e a u n c h e c k N O s e l e c c i o n a d o c o n i d = " r e c u e r d a m e " , n a m e = " r e c u e r d a m e " y v a l u e = " 1 "

Form::radio()
Creaunradiobutton $ f i e l d n o m b r e d e c a m p o $ v a l u e v a l o r e n e l r a d i o $ a t t r s a t r i b u t o s d e c a m p o

$ c h e c k e d i n d i c a s i s e m a r c a e l c a m p o F o r m : : r a d i o ( $ f i e l d , $ v a l u e , $ a t t r s = N U L L , $ c h e c k e d = N U L L )

$ o n = ' m a s c u l i n o ' e c h o F o r m : : r a d i o ( " r d o " , ' m a s c u l i n o ' , N U L L , T R U E ) / / < i n p u t i d = " r d o 1 " n a m e = " r d o " t y p e = " r a d i o " v a l u e = " m a s c u l i n o " c h e c k e d = " c h e c k e d " > e c h o F o r m : : r a d i o ( " r d o " , ' f e m e n i n o ' ) / / < i n p u t i d = " r d o 2 " n a m e = " r d o " t y p e = " r a d i o " v a l u e = " f e m e n i n o " >

Js
Estehelperofrecealgunasimplementacionesqueutilizanjavascriptsimple.

Js::link()
Creaunenlacequealpulsarmuestraundialogodeconfirmacinpararedireccionamientoala rutaindicada. $actionrutaalaaccion $texttextoamostrar $confirmmensajedeconfirmacion $classclasesadicionalesparaellink $attrs$attrsatributosadicionales Js::link($action,$text,$confirm='EstSeguro?',$class=NULL,$attrs=NULL) <?phpechoJs::link(usuario/eliminar/5,Eliminar)?> Sideseaaplicarunaclasedeestiloalenlacedebeindicarloenelargumento$class. <?phpechoJs::link(usuario/eliminar/5,Eliminar,Estsegurodeestaoperacin?, b_eliminar)?>

Js::linkAction()
Creaunenlacequealpulsarmuestraundialogodeconfirmacinpararedireccionamientoala accinindicada. $actionacciondecontrolador $texttextoamostrar

$confirmmensajedeconfirmacion $classclasesadicionalesparaellink $attrs$attrsatributosadicionales Js::linkAction($action,$text,$confirm='EstSeguro?',$class=NULL,$attrs=NULL)

<?phpechoJs::linkAction(eliminar/5,Eliminar)?> Sideseaaplicarunaclasedeestiloalenlacedebeindicarloenelargumento$class. <?phpechoJs::linkAction(eliminar/5,Eliminar,Estsegurodeestaoperacin?, b_eliminar)?>

Js::submit()
Creaunbotonsubmitquealpulsarmuestraundialogodeconfirmacin. $texttextoamostrar $confirmmensajedeconfirmacion $classclasesadicionalesparaellink $attrsatributosadicionales Js::submit($text,$confirm='EstSeguro?',$class=NULL,$attrs=NULL) <?phpechoJs::submit(Guardar)?> Sideseaaplicarunaclasedeestiloalbotndebeindicarloenelargumento$class. <?phpechoJs::submit(Guardar,EstSeguro?,boton_guardar)?>

Js::submitImage()
Creaunbotntipoimagequealpulsarmuestraundialogodeconfirmacin. $imgrutaalaimagen $confirmmensajedeconfirmacion $classclasesadicionalesparaellink $attrsatributosadicionales Js::submitImage($img$confirm='EstSeguro?',$class=NULL,$attrs=NULL)

<?phpechoJs::submitImage(botones/guardar.png)?> Sideseaaplicarunaclasedeestiloalbotndebeindicarloenelargumento$class. <?phpechoJs::submitImage(botones/guardar,EstSeguro?,boton_guardar)?>

Ajax
EstehelperofreceimplementacionesparafacilitarlaintegracinconAJAX.

Ajax::link()
Creaunenlacequeactualizalacapaindicadaconelcontenidoproductodelapeticinweb. $actionrutaalaaccion $texttextoamostrar $updatecapaaactualizar $classclasesadicionales $attrsatributosadicionales Ajax::link($action,$text,$update,$class=NULL,$attrs=NULL) Como ejemplo, crea un enlace que al pulsar emita un saludo. Con el fin anterior se tienen las siguientesvistasycontroladores: controllers/saludo_controller.php <?php classSaludoControllerextendsAppController { publicfunctionindex() {} publicfunctionhola() { View::template(NULL) } } views/saludo/hola.phtml Hola

views/saludo/index.phtml <divid="capa_saludo"></div> <?php echoAjax::link('saludo/hola','MostrarSaludo','capa_saludo') echoTag::js('jquery/jquery+kumbiaphp.min') ?> Alaccederalaaccinindexdelcontroladorsaludosetiene:

Luegodepulsarelenlacesecolocaelresultadodelapeticinajaxenlacapa.

Ajax::linkAction()
Crea un enlace a una accin del controlador actual que actualiza la capa indicada con el contenidoproductodelapeticinweb. $actionaccion $texttextoamostrar $updatecapaaactualizar $classclasesadicionales $attrsatributosadicionales Ajax::linkAction($action,$text,$update,$class=NULL,$attrs=NULL) <?phpechoAjax::linkAction(hola,MostrarSaludo,capa_saludo)?>

Porsupuesto...aunfaltaaestadocumentacin,porelmomentolesrecomiendoquerevisenel CRUDdelaversin1.0beta2allpodrnverotroscambios,estossedocumentaranmuypronto CRUDBeta2KumbiaPHP

5Modelos
EnlosModelosresidelalgicadenegocio(odelaaplicacin).Equivocadamente,muchagente creequelosmodelossonsloparatrabajarconlasbasesdedatos. Losmodelospuedesserdemuchostipos: Crearminiaturasdeimgenes Consumiryusarwebservices CrearpasarelasScaffolddepago UsarLDAP Enviarmailsoconsultarservidoresdecorreo InteractuarconelsistemadeficheroslocaloviaFTP,ocualquierotroprotocolo etcetc

5.1ActiveRecord 5.2EjemplosinActiveRecord 5.3Comousarlosmodelos


LosModelosrepresentanlalgicadelaaplicacin,ysonpartefundamentalparaelmomentoque sedesarrollaunaaplicacin,unbuenusodeestosnosproporcionaungranpoderalmomento quesenecesitaescalar,manteneryreusarcdigoenunaaplicacin. Porlogeneralunmalusodelosmodelosessolodejarelarchivoconladeclaracindelaclasey todalalgicasegeneraenelcontrolador.Estaprcticatraecomoconsecuenciaqueenprimer lugarelcontroladorseadificilmenteentendibleporalguienqueintenteagregary/omodificaralgo enesafuncionalidad,ensegundolugarlopocoquepuedesrehusarelcdigoenotros controladoresyloquehaceesrepetirseelcdigoquehacelomismoenotrocontrolador. PartiendodeesteprincipioloscontroladoresNOdeberancontenerningntipodelgicasolose encargandeatenderlaspeticionesdelusuariosysolicitardichainformacinalosmodeloscon estogarantizamosunbuenusodelMVC.

5.1ElModeloextiendeelActiveRecord
KumbiaPHPusaPOO(Programacinorientadaaobjetos),asqueActiveRecordesuna clasequeyallevamtodoslistosparausar.Estosmtodosfacilitanalusuarioelmanejode lastablasdelasbasesdedatosentreellosestnlossiguientes:find,find_all,save, update,etc. ElModeloextiendelaclaseActiveRecordparaqueelusuariopuedaaadirsuspropios

mtodos,yasiencapsularlalgica.

5.2ElModeloextiendeelActiveRecord
KumbiaPHPusaPOO(Programacinorientadaaobjetos),asqueActiveRecordesunaclase queyallevamtodoslistosparausar.Estosmtodosfacilitanalusuarioelmanejodelastablas delasbasesdedatosentreellosestnlossiguientes:find,find_all,save,update,etc. ElModeloextiendelaclaseActiveRecordparaqueelusuariopuedaaadirsuspropiosmtodos, yasiencapsularlalgica.

5.4ActiveRecordAPI
AcontinuacinveremosunareferenciadelosmtodosqueposeelaclaseActiveRecordysu funcionalidadrespectiva.stosseencuentranorganizadosalfabticamente:

5.4.1Consultas
Mtodosparahacerconsultaderegistros:

5.4.1.1distinct()
Estemtodoejecutaunaconsultadedistincinnicaenlaentidad,funcionaigualqueunselect uniquecampovindolodesdelaperspectivadelSQL.Elobjetivoesdevolverunarrayconlos valoresnicosdelcampoespecificadocomoparmetro. Sintaxis d i s t i n c t ( [ s t r i n g $ a t r i b u t o _ e n t i d a d ] , [ " c o n d i t i o n s : " ] , [ " o r d e r : " ] , [ " l i m i t : " ] , [ " c o l u m n : " ] )

Ejemplo $ u n i c o s = L o a d : : m o d e l ( ' u s u a r i o ' ) > d i s t i n c t ( " e s t a d o " ) # a r r a y ( ' A ' , ' I ' , ' N ' ) Losparmetrosconditions,orderylimitfuncionanidnticamentequeenlafuncinfindypermiten modificarlaformaolosmismosvaloresderetornodevueltosporsta.

5.4.1.2find_all_by_sql(string$sql)
EstemtodonospermitehacerunaconsultapormediodeunSQLyelresultadodevueltoesun arraydeobjetosdelamismaclaseconlosvaloresdelosregistrosenestos.Laideaesqueel usodeestemtodonodeberasercomnennuestrasaplicacionesyaqueActiveRecordse

encargadeeliminarelusodelSQLengranporcentaje,perohaymomentosenqueesnecesario queseamosmsespecficosytengamosquerecurriralusodeeste. Ejemplo $ u s u a r i o s = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ a l l _ b y _ s q l ( " s e l e c t * f r o m u s u a r i o s w h e r e c o d i g o n o t i n ( s e l e c t c o d i g o f r o m i n g r e s o ) " ) Enesteejemploconsultamostodoslosusuariosconunasentenciawhereespecial.Laideaes quelosusuariosconsultadosnopuedenestarenlaentidadingreso.

5.4.1.3find_by_sql(string$sql)
EstemtodonospermitehacerunaconsultapormediodeunSQLyelresultadodevueltoesun objetoquerepresentaelresultadoencontrado.Laideaesqueelusodeestemtodonodebera sercomnennuestrasaplicacionesyaqueActiveRecordseencargadeeliminarelusodelSQL engranporcentaje,perohaymomentosenqueesnecesarioqueseamosmsespecficosy tengamosquerecurriralusodeeste. Ejemplo $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ b y _ s q l ( " s e l e c t * f r o m u s u a r i o s w h e r e c o d i g o n o t i n ( s e l e c t c o d i g o f r o m i n g r e s o ) l i m i t 1 " ) Esteejemploconsultamostodoslosusuariosconunasentenciawhereespecialeimprimimos susnombres.Laideaesqueelusuarioconsultadonopuedeestarenlaentidadingreso.

5.4.1.4find_first(string$sql)
Sintaxis f i n d _ f i r s t ( [ i n t e g e r $ i d ] , [ " c o n d i t i o n s : " ] , [ " o r d e r : " ] , [ " l i m i t : " ] , [ " c o l u m n s : " ] ) Elmtodofind_firstdevuelveelprimerregistrodeunaentidadolaprimeraocurrenciade acuerdoaunoscriteriosdebsquedauordenamiento.Losparmetrossontodosopcionalesy suordennoesrelevante,cuandoseinvocasinparmetrosdevuelveelprimerregistroinsertado enlaentidad.Estemtodoesmuyflexibleypuedeserusadodemuchasformas: Ejemplo $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ f i r s t ( " c o n d i t i o n s : e s t a d o = ' A ' " , " o r d e r : f e c h a d e s c " )

EnesteejemplobuscamoselprimerregistrocuyoestadoseaigualaAyordenado descendentemente,elresultadodeste,secargaalavariable$Usuarioseigualmentedevuelve unainstanciadelmismoobjetoActiveRecordencasodexitoofalseencasocontrario. Conelmtodofind_firstpodemosbuscarunregistroenparticularapartirdesuiddeestaforma: $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ f i r s t ( 1 2 3 ) Asobtenemoselregistro123eigualmentedevuelveunainstanciadelmismoobjeto. ActiveRecordencasodexitoofalseencasocontrario.Kumbiageneraunaadvertenciacuando loscriteriosdebsquedaparafind_firstdevuelvenmsdeunregistro,paraestopodemosforzar quesedevuelvasolamenteuno,medianteelparmetrolimit,deestaforma: $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ f i r s t ( " c o n d i t i o n s : e s t a d o = ' A ' " , " l i m i t : 1 " ) Cuandoqueremosconsultarsloalgunosdelosatributosdelaentidadpodemosutilizarel parmetrocolumnsas: $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ f i r s t ( " c o l u m n s : n o m b r e , e s t a d o " ) Cuandoespecificamoselprimerparmetrodetipostring,ActiveRecordasumirquesonlas condicionesdebsquedaparafind_first,as: $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ f i r s t ( " e s t a d o = A " ) Deestaformapodemostambindeducirqueestas2sentenciasarrojaranelmismoresultado: $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ f i r s t ( " i d = 1 2 3 " )

$ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d _ f i r s t ( 1 2 3 )

5.4.1.5find()
Sintaxis f i n d ( [ i n t e g e r $ i d ] , [ " c o n d i t i o n s : " ] , [ " o r d e r : " ] , [ " l i m i t : ] , [ " c o l u m n s : " ] )

Elmtodo"find"eselprincipalmtododebsquedadeActiveRecord,devuelvetodaslos registrosdeunaentidadoelconjuntodeocurrenciasdeacuerdoaunoscriteriosdebsqueda. Losparmetrossontodosopcionalesysuordennoesrelevante,inclusopuedenser combinadosuomitidossiesnecesario.Cuandoseinvocasinparmetrosdevuelvetodoslos registrosenlaentidad. Nohayqueolvidarsedeincluirunespaciodespusdelosdospuntos(:)encadaparmetro. Ejemplo $ u s u a r i o s = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d ( " c o n d i t i o n s : e s t a d o = A " , " o r d e r : f e c h a d e s c " ) Enesteejemplobuscamostodoslosregistroscuyoestadoseaiguala"A"ydevuelvastos ordenadosdescendentemente,elresultadodeesteesunarraydeobjetosdelamismaclasecon losvaloresdelosregistroscargadosenellos,encasodenohayanregistrosdevuelveunarray vaco. Conelmtodofindpodemosbuscarunregistroenparticularapartirdesuiddeestaforma: $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d ( 1 2 3 ) Asobtenemoselregistro123eigualmentedevuelveunainstanciadelmismoobjeto ActiveRecordencasodexitoofalseencasocontrario.Comoesunsoloregistronodevuelve unarray,sinoquelosvaloresdestesecarganenlamismavariablesiexisteelregistro. Paralimitarelnmeroderegistrosdevueltos,podemosusarelparmetrolimit,as: $ u s u a r i o s = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d ( " c o n d i t i o n s : e s t a d o = A " , l i m i t : 5 , o f f s e t : 1 ) Cuandoqueremosconsultarsloalgunosdelosatributosdelaentidadpodemosutilizarel parmetrocolumnsas: $ u s u a r i o s = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d ( " c o l u m n s : n o m b r e , e s t a d o " ) Cuandoespecificamoselprimerparmetrodetipostring,ActiveRecordasumirquesonlas condicionesdebsquedaparafind,as: $ u s u a r i o s = L o a d : : m o d e l ( ' u s u a r i o ' ) > f i n d ( " e s t a d o = A " ) Sepuedeutilizarlapropiedadcountparasabercuntosregistrosfuerondevueltosenla bsqueda.

Nota:Noesnecesariousarf i n d ( ' i d : $ i d ' ) paraelfind,seusadirectamentf i n d ( $ i d )

5.4.1.5select_one(string$select_query)
Estemtodonospermitehacerciertasconsultascomoejecutarfuncionesenelmotordebase dedatossabiendoquestasdevuelvenunsoloregistro. $ c u r r e n t _ t i m e = L o a d : : m o d e l ( ' u s u a r i o ' ) > s e l e c t _ o n e ( " c u r r e n t _ t i m e " ) EnelejemploqueremossaberlahoraactualdelservidordevueltadesdeMySQLasque podemosusarestemtodoparaesto.

5.4.1.6select_one(string$select_query)(static)
Estemtodonospermitehacerciertasconsultascomoejecutarfuncionesenelmotordebase dedatos,sabiendoquestasdevuelvenunsoloregistro.Estemtodosepuedellamardeforma esttica,estosignificaquenoesnecesarioquehayaunainstanciadeActiveRecordparahacer elllamado. $ c u r r e n t _ t i m e = A c t i v e R e c o r d : : s e l e c t _ o n e ( " c u r r e n t _ t i m e " ) EnelejemploqueremossaberlahoraactualdelservidordevueltadesdeMySQLasque podemosusarestemtodoparaesto.

5.4.1.7exists()
Estemtodonospermiteverificarsielregistroexisteonoenlabasededatosmediantesuido unacondicin. $ u s u a r i o = L o a d : : m o d e l ( ' u s u a r i o ' ) $ u s u a r i o > i d = 3 i f ( $ u s u a r i o > e x i s t s ( ) ) { / / E l u s u a r i o c o n i d i g u a l a 3 s i e x i s t e } L o a d : : m o d e l ( ' u s u a r i o ' ) > e x i s t s ( " n o m b r e = ' J u a n P e r e z ' " ) L o a d : : m o d e l ( ' u s u a r i o ' ) > e x i s t s ( 2 ) / / U n U s u a r i o c o n i d > 2 ?

5.4.1.8find_all_by()

Estemtodonospermiterealizarunabsquedaporalgncampo $ r e s u l t a d o = L o a d : : m o d e l ( ' p r o d u c t o ' ) > f i n d _ a l l _ b y ( c a t e g o r i a , I n s u m o s )

5.4.1.9find_by_*campo*()
Estemtodonospermiterealizarunabsquedaporalgncampousandoelnombredelmtodo comonombredeste.Devuelveunsoloregistro. $ r e s u l t a d o = L o a d : : m o d e l ( ' p r o d u c t o ' ) > f i n d _ b y _ c a t e g o r i a ( I n s u m o s )

5.4.1.10find_all_by_*campo*()
Estemtodonospermiterealizarunabsquedaporalgncampousandoelnombredelmtodo comonombredeste.Devuelvetodoslosregistrosquecoincidanconlabsqueda. $ r e s u l t a d o = L o a d : : m o d e l ( ' p r o d u c t o ' ) > f i n d _ a l l _ b y _ c a t e g o r i a ( " I n s u m o s " )

5.4.2Conteosysumatorias
5.4.2.1count()
Realizaunconteosobrelosregistrosdelaentidadconosinalgunacondicinadicional.Emulala funcindeagrupamientocount. $ n u m e r o _ r e g i s t r o s = L o a d : : m o d e l ( ' c l i e n t e ' ) > c o u n t ( ) $ n u m e r o _ r e g i s t r o s = L o a d : : m o d e l ( ' c l i e n t e ' ) > c o u n t ( " c i u d a d = ' B O G O T A ' " )

5.4.2.2sum()
Realizaunasumatoriasobrelosvaloresnumricosdeelatributodealgunaentidad,emulala funcindeagrupamientosumenellenguajeSQL. $ s u m a = L o a d : : m o d e l ( ' p r o d u c t o ' ) > s u m ( " p r e c i o " ) $ s u m a = L o a d : : m o d e l ( ' p r o d u c t o ' ) > s u m ( " p r e c i o " , " c o n d i t i o n s : e s t a d o = ' A ' " )

5.4.2.3count_by_sql()
RealizaunasumatoriautilizandolenguajeSQL. $numero=Load::model('producto')>count_by_sql("selectcount(precio)fromproducto, facturawherefactura.codigo=1124\ andfactura.codigo_producto=producto.codigo_producto")

5.4.3Promedios,mximoymnimo

5.4.4Creacin,actualizacinyborradoderegistros

5.4.5Validaciones

5.4.6Transacciones

5.4.7Otrosmtodos

5.4.8CallbacksActiveRecord

5.4.9Asociaciones

5.4.10Paginadores

6Scaffold
Introduccin
Paraempezaresimportantesaber,queelScaffoldseutilizhastalaversinestablede Kumbiaphp0.5yquealsalirlaversindeKumbiaphp1.0Spiritbeta1sedejaunlado,hasta crearunonuevomasconfigurableymantenible. ViendolanecesidadylasfacilidadesqueelScaffoldproporcionaalapoyodeaplicaciones,el equipodedesarrollodeKumbiaphpvuelveaincorporarunnuevoparasuversinKumbiaPHP beta2,mejorandoysimplificandoeldesempeodelScaffoldparaelFrameworkyquesinduda aportaaungranavanceencualquierdesarrollodeaplicacinparausuariosiniciadoseneluso deKumbiaphpyusuariosavanzados,entregandoparatodosunagamaaltadeposibilidades.

Concepto
Scaffoldesunmtododemetaprogramacinparaconstruiraplicacionesdesoftwareque soportanbasesdedatos.Estaesunanuevatcnicasoportadaporalgunosframeworksdeltipo MVC(ModeloVistaControlador),dondeelprogramadordebeescribirunaespecificacinque escribacomodebeserusadalaaplicacindebasesdedatos.Elcompiladorluegousaraesta parageneraruncdigoquepuedausarlaaplicacinparaleer,crear,actualizaryborrarentradas delabasededatos(algoconocidocomoCRUDoABM),tratandodeponerplantillascomoun andamioScaffold)enlacualconstruirunaaplicacinmaspotente. Scaffoldingeslaevolucindecdigosgenereadoresdebasesdedatosdesdeambientesms desarrollados,comoserCASEGeneratordeOracleyotrostantosservidores4GLparaservicios alCliente.Scaffoldingsehizopopulargraciasalframework"RubyonRails",quehasido adaptadoaotrosframeworks,incluyendoDjango,Monorail,KumbiaPHPframeworkentreotros. Tomadode:ScaffoldingKumbiaphp

Objetivo
CrearunCRUD100%Funcionalcontansolo2lneasdecdigoenmicontroller. KumbiaPHPtomarcomoporartedemagia,losparmetrosindicadosenmiTABLAyarmar todoelCRUD.

PrimerosPasos

PararealizarnuestroprimerScaffold,vamosautilizarelmismomodeloquetrabajamosenel CRUDparaKumbiaPHPBeta2,yquetienepornombremenus.

Modelo
Crearelmodelo,comodecostumbreapuntandosiemprealaclaseActiveRecord. [app]/models/menus.php: < ? p h p c l a s s M e n u s e x t e n d s A c t i v e R e c o r d { }

Controlador
CrearelControladorenesteejemplo,NOapuntaremosalaclaseAppControllerySIalaclase ScaffoldController. [app]/controllers/menus_controller.php: < ? p h p c l a s s M e n u s C o n t r o l l e r e x t e n d s S c a f f o l d C o n t r o l l e r { p u b l i c $ m o d e l = ' m e n u s ' } Aquterminannuestrosprimerospasos.NoesnecesarioNADAMS.Tendremosporartede magiaunCRUD100%Funcional.

Ventajas
1. PodremosircargandonuestrosprimerosregistrosenlaBD 2. Pruebasalinsertarregistros 3. Avanceprogresivo,yaquepodremosirsustituyendolasvistasdelScaffoldpormis propiasvistas.

Desventaja
1. ElScaffoldnoesparahacersistemas,sinoparaayudaralprincipiodeunaaplicacin.

Viewsparaelscaffold
Pordefectousalosdeviews/_shared/scaffolds/kumbia/...Unopuedecrearlossuyosdentrode scaffoldsviews/_shared/scaffolds/foo/...yenelcontrollerademsdelatributo$modelaade public$scaffold='foo'

Asiusarlosviewsdescaffolds/foo/... Msimportanteestodava,queunopuedecrearsusviewscomosiempre.esdecir,sicreasel controllerMiControllerycreaselviewenviews/mi/editar.phtml(porejemplo)usarprimeroel view,sinoexisteusareldescaffolds.Asunocambialosviewsasugustodondequieray progresivamente.

7Clasespadre
7.1AppController 7.2ActiveRecord
Eslaprincipalclaseparalaadministracinyfuncionamientodemodelos.ActiveRecordesuna implementacindeestepatrndeprogramacinyestamuyinfluenciadaporlafuncionalidadde suanlogaenRubydisponibleenRails.ActiveRecordproporcionalacapaobjetorelacionalque siguerigurosamenteelestndarORM:TablasenClases,RegistrosenObjetos,yCamposen Atributos.Facilitaelentendimientodelcdigoasociadoabasededatosyencapsulalalgica especificahacindolamsfcildeusarparaelprogramador.

< ? p h p $ c l i e n t e = L o a d : : m o d e l ( ' c l i e n t e ' ) $ c l i e n t e > n i t = " 8 0 8 1 1 1 8 2 7 2 " $ c l i e n t e > r a z o n _ s o c i a l = " E M P R E S A D E T E L E C O M U N I C A C I O N E S X Y Z " $ c l i e n t e > s a v e ( )

7.2.1.

VentajasdelActiveRecord
SetrabajanlasentidadesdelModelomsNaturalmentecomoobjetos. LasaccionescomoInsertar,Consultar,Actualizar,Borrar,etc.deunaentidaddelModelo estnencapsuladasasquesereduceelcdigoysehacemsfcildemantener. CdigomsfcildeEntenderyMantener ReduccindelusodelSQLenun80%,conloqueselograunaltoporcentajede independenciadelmotordebasededatos. Menosdetallesmspracticidadyutilidad ActiveRecordprotegeenungranporcentajedeataquesdeSQLinyectionquepuedan llegarasufrirtusaplicacionesescapandocaracteresquepuedanfacilitarestosataques.

7.2.2.

CrearunModeloenKumbiaPHPFramework

Loprimeroescrearunarchivoeneldirectoriomodelsconelmismonombredelarelacinenla basededatos.Porejemplo:models/clientes.phpLuegocreamosunaclaseconelnombredela tablaextendiendoalgunadelasclasesparamodelos.

Ejemplo:

< ? p h p c l a s s C l i e n t e e x t e n d s A c t i v e R e c o r d { } Siloquesedeseaescrearunmodelodeunaclasequetienenombrecompuestoporejemplola claseTipodeCliente,porconvencinennuestrabasededatosestatabladebellamarse: tipo_de_clienteyelarchivo:models/tipo_de_cliente.phpyelcdigodeesemodeloelsiguiente: < ? p h p c l a s s T i p o D e C l i e n t e e x t e n d s A c t i v e R e c o r d { }

7.2.3.

ColumnasyAtributos

ObjetosActiveRecordcorrespondenaregistrosenunatabladeunabasededatos.Losobjetos poseenatributosquecorrespondenaloscamposenestastablas.LaclaseActiveRecord automticamenteobtieneladefinicindeloscamposdelastablasylosconvierteenatributosde laclaseasociada.Aestoesloquenosreferamosconmapeoobjetorelacional. Miremoslatablalbum: C R E A T E T A B L E a l b u m ( i d I N T E G E R N O T N U L L A U T O _ I N C R E M E N T , n o m b r e V A R C H A R ( 1 0 0 ) N O T N U L L , f e c h a D A T E N O T N U L L , v a l o r D E C I M A L ( 1 2 , 2 ) N O T N U L L , a r t i s t a _ i d I N T E G E R N O T N U L L , e s t a d o C H A R ( 1 ) , P R I M A R Y K E Y ( i d ) )

PodemoscrearunActiveRecordquemapeeestatabla: < ? p h p c l a s s A l b u m e x t e n d s A c t i v e R e c o r d { }

Unainstanciadeestaclaseserunobjetoconlosatributosdelatablalbum: < ? p h p $ a l b u m = L o a d : : m o d e l ( ' a l b u m ' ) $ a l b u m > i d = 2 $ a l b u m > n o m b r e = G o i n g U n d e r $ a l b u m > s a v e ( ) Ocon... < ? p h p L o a d : : m o d e l s ( ' a l b u m ' ) $ a l b u m = n e w A l b u m ( ) $ a l b u m > i d = 2 $ a l b u m > n o m b r e = G o i n g U n d e r $ a l b u m > s a v e ( )

7.2.4.

LlavesPrimariasyelusodeIDs

EnlosejemplosmostradosdeKumbiaPHPsiempresetrabajaunacolumnallamadaidcomo llaveprimariadenuestrastablas.Talvez,estonosiempreesprcticoasuparecer,deprontoal crearlatablaclienteslacolumnadenumerodeidentificacinseraunaexcelenteeleccin,pero encasodecambiarestevalorporotrotendraproblemasconeldatoqueestereplicadoenotras relaciones(ejemplofacturas),ademsdeestotendraquevalidarotrascosasrelacionadascon sunaturaleza.KumbiaPHPproponeelusodeidscomollavesprimariasconestoseautomatiza muchastareasdeconsultayproporcionaunaformadereferirseunvocamenteaunregistroen especialsindependerdelanaturalezadeunatributoespecfico.UsuariosdeRailssesentirn familiarizadosconestacaracterstica. EstaparticularidadtambinpermiteaKumbiaPHPentenderelmodeloentidadrelacinleyendo losnombresdelosatributosdelastablas.Porejemploenlatablalbumdelejemploanteriorla convencinnosdicequeideslallaveprimariadeestatablaperoademsnosdicequehayuna llaveforneaalatablaartistaensucampoid.

7.2.5.

ConvencionesenActiveRecord

ActiveRecordposeeunaseriedeconvencionesquelesirvenparaasumirdistintascualidadesy relacionarunmodelodedatos.Lasconvencionessonlassiguientes:

id SiActiveRecordencuentrauncampollamadoid,ActiveRecordasumirquesetratadelallave primaradelaentidadyqueesautonumrica. tabla_id Loscamposterminadosen_idindicanrelacionesforneasaotrastablas,deestaformase puededefinirfcilmentelasrelacionesentrelasentidadesdelmodelo: Uncampollamadoclientes_idenunatablaindicaqueexisteotratablallamadaclientesyesta contieneuncampoidqueesforneaaeste. campo_at Loscamposterminadosen_atindicanquesonfechasyposeelafuncionalidadextraque obtienenelvalordefechaactualenunainsercin created_atesuncampofecha campo_in Loscamposterminadosen_inindicanquesonfechasyposeelafuncionalidadextraque obtienenelvalordefechaactualenunaactualizacin modified_inesuncampofecha NOTA:Loscampos_aty_indebenserdetipofecha(date)enlaRDBMSqueseesteutilizando.

View
...

8LibsdeKumbiaPHP
Kumbiaphpllevaclaseslistasparausar,perorecordadquepodiscrearosvuestraspropias clasesparareutilizarlasenvuestrosproyectos.Tambinpodisusarclasesexternasa KumbiaPHP,comoseexplicaenelprximocaptulo.

Cach
Uncachesunconjuntodedatosduplicadosdeotrosoriginales,conlapropiedaddequelos datosoriginalessoncostososdeacceder,normalmenteentiempo,respectoalacopiaenla cach.

ElcachdedatosestaimplementadoenKumbiaPHPutilizandolospatronesdediseofactoryy singleton.Parahacerusodelacacheesnecesariotenerpermisosdeescrituraeneldirectorio "cache"(solamenteenelcasodelosmanejadores"sqlite"y"file"). Cadacachescontroladaporunmanejadordecach.ElsistemadecachdeKumbiaPHP actualmenteposeelossiguientesmanejadores: APC:utilizaAlternativePHPCache. file:cachenarchivos,estossealmacenaneneldirectoriocachycompatiblecon todoslossistemasoperativos. nixfile:cachenarchivos,estossealmacenaneneldirectoriocachycompatiblesolo consistemasoperativos*nix(linux,freebsd,entreotros).Estacachesmsrpidaque lacachfile. sqlite:cachutilizandobasededatosSqLiteyestaseubicaeneldirectoriocache. memsqlite:cachutilizandobasededatosSqLiteylosdatospersistenenmemoria durantelaejecucindelapeticinweb. Paraobtenerunmanejadordecachsedebeutilizarelmtododriverqueproporcionalaclase Cache.

driver($driver=null)
Este mtodo permite obtener un manejador de cache especfico (APC, file, nixfile, sqlite, memsqlite). Si no se indica, se obtiene el manejador de cache por defecto indicado en el config.ini. < ? p h p / / c a c h e p o r d e f e c t o $ d a t a = C a c h e : : d r i v e r ( ) > g e t ( ' d a t a ' ) / / m a n e j a d o r p a r a m e m c a c h e $ d a t a _ m e m c a c h e = C a c h e : : d r i v e r ( ' m e m c a c h e ' ) > g e t ( ' d a t a ' ) / / m a n e j a d o r p a r a c a c h e c o n A P C $ d a t a _ a p c = C a c h e : : d r i v e r ( ' A P C ' ) > g e t ( ' d a t a ' ) ? >

get($id,$group='default')
Permite obtenerun valor almacenadoenlacacheesnecesarioespecificarelparametro$idcon elidcorrespondientealvalorencache,tomandodemanerapredeterminadaelgrupodefault.

save($value,$lifetime=null,$id=false,$group='default')

Permite guardar un valor en la cache, el tiempo de vida del valoren cache se debe especificar utilizandoelformatodelafuncinstrtotimedephp. Alomitirparametrosalinvocarelmtodosavesecomportadelamanerasiguiente: Sinoseespecfica$lifetime,entoncessecacheaportiempoindefinido. Si no se especifica $id y $group, entonces se toma los indicados al invocar por ltima vezelmtodoget. <?php $data=Cache::driver()>get(saludo) if(!$data){ Cache::driver()>save(Hola,+1day) } echo$data ?>

start($lifetime,$id,$group='default')
Muestra buffer de salida cacheado, o en caso contrario inicia cacheo de buffer de salida hasta queseinvoqueelmtodoend.Estemtodoseutilizafrecuentementeparacachearunfragmento devista. <?phpif(Cache::driver()>start('+1day','saludo')):?> Hola<?phpecho$usuario?> <?phpCache::driver()>end()?> <?phpendif?>

end($save=true)
Terminacacheodebufferdesalidaindicandosisedebeguardaronoenlacache.

Logger
LaclaseLoggerparaelmanejodeLogfuereescritadeformaesttica,estoquieredeciryanoes necesariocrearunainstanciadelaclaseLogger.Estaclasedisponedeunavariedadde mtodosparamanejardistintostiposdeLog. < ? p h p L o g g e r : : e r r o r ( ' M e n s a j e d e E r r o r ' ) ? > Lasalidadelainstruccinanteriorserlosiguiente: [Thu,05Feb0915:19:390500][ERROR]MensajedeError PordefectolosarchivoslogtienenelsiguientenombrelogDDMMYYY.txtestenombrepuedeser cambiadosiaslodeseamosatravsdeunparmetroadicionalalmtodo. < ? p h p L o g g e r : : e r r o r ( ' M e n s a j e d e E r r o r ' , ' m i _ l o g ' ) ? > Sepuedeapreciarelsegundoparmetroahoraelarchivotendrcomonombremi_log.txt

Logger::warning($msg) Logger::error($msg) Logger::debug($msg) Logger::alert($msg) Logger::critical($msg) Logger::notice($msg) Logger::info($msg) Logger::emergence($msg) Logger::custom($type='CUSTOM',$msg)

Flash
FlashesunhelpermuytilenKumbiaquepermitehacerlasalidademensajesdeerror, advertencia,informativosyxitodeformaestndar.

Flash::error($text)
Permiteenviarunmensajedeerroralusuario.Pordefectoesunmensajedeletrascolorrojoy fondocolorrosaperoestospuedenseralteradosenlaclasecssenpublic/css/style.cssllamada error. F l a s h : : e r r o r ( H a o c u r r i d o u n e r r o r )

Flash::valid($text)
Permiteenviarunmensajedexitoalusuario.Pordefectoesunmensajedeletrascolorverdes yfondocolorverdepastelperoestospuedenseralteradosenlaclasecssen public/css/style.cssllamadavalid. F l a s h : : v a l i d ( S e r e a l i z e l p r o c e s o c o r r e c t a m e n t e )

Flash::info($text)
Permiteenviarunmensajedeinformacinalusuario.Pordefectoesunmensajedeletrascolor azulesyfondocolorazulpastelperoestospuedenseralteradosenlaclasecssen public/css/style.cssllamadainfo. F l a s h : : i n f o ( N o h a y r e s u l t a d o s e n l a b s q u e d a )

Flash::warning($text)
Permiteenviarunmensajedeadvertenciaalusuario.Pordefectoesunmensajedeletrascolor azulesyfondocolorazulpastelperoestospuedenseralteradosenlaclasecssen public/css/style.cssllamadawarning. F l a s h : : w a r n i n g ( A d v e r t e n c i a : N o h a i n i c i a d o s e s i n e n e l s i s t e m a )

Flash::show($name,$text)
...

Session
LaclaseSessionesparafacilitarelmanejodelasessiones.

Session::set($index,$value,$namespace='default')
Crearoespecificaelvalorparaunindicedelasesinactual. < ? p h p S e s s i o n : : s e t ( ' u s u a r i o ' , ' A d m i n i s t r a d o r ' ) ? >

Session::get($index,$namespace='default')
Obtenerelvalorparaunindicedelasesinactual. < ? p h p S e s s i o n : : g e t ( ' u s u a r i o ' ) / / r e t o r n a ' A d m i n i s t r a d o r ' ? >

Session::delete($index,$namespace='default')
Eliminaelvalorparaunindicedelasesinactual. < ? p h p S e s s i o n : : d e l e t e ( ' u s u a r i o ' ) ? >

Session::has($index,$namespace='default')
Verificaqueestedefinidoelindiceenlasesinactual. < ? p h p S e s s i o n : : h a s ( ' i d _ u s u a r i o ' ) / / r e t o r n a f a l s e . ? > NOTA:$namespaceesunespacioindividualenelcualsepuedencontenerlasvariablesde sesin,permitiendoevitarcolisionesconnombresdevariables.

Load
LaclaseloadpermitelacargadelibrerasenKumbiaPHP.

Load::coreLib($lib)
PermitecargarunalibreradelncleodeKumbiaPHP.

< ? p h p / / C a r g a l a l i b r e r a c a c h e L o a d : : c o r e L i b ( c a c h e ) ? >

Load::lib($lib)
Permitecargarunalibreradeaplicacin.Laslibrerasdeaplicacinseubicaneneldirectorio app/libs. < ? p h p / / C a r g a e l a r c h i v o a p p / l i b s / s p l i t . p h p L o a d : : l i b ( s p l i t ) ? > Encasodequenoexistalalibreraintentacargarunadelncleoconelnombreindicado. < ? p h p / * C a r g a e l a r c h i v o a p p / l i b s / a u t h 2 . p h p s i e x i s t e , e n c a s o c o n t r a r i o , c a r g a r l a l i b r e r i a d e l n c l e o a u t h 2 * / L o a d : : l i b ( a u t h 2 ) ? > Paraagruparlibreriasdebescolocarlasenunsubdirectorioyantecederelnombredeldirectorio enlarutaalmomentodecargarla. < ? p h p / / C a r g a e l a r c h i v o a p p / l i b s / c o n t r o l l e r s / a u t h _ c o n t r o l l e r . p h p L o a d : : l i b ( c o n t r o l l e r s / a u t h _ c o n t r o l l e r . p h p ) ? >

Load::model($model)
Cargaeinstanciaelmodeloindicado.Retornalainstanciadelmodelo. < ? p h p / / C a r g a e i n s t a n c i a e l m o d e l o u s u a r i o . p h p $ u s u a r i o = L o a d : : m o d e l ( u s u a r i o ) ? > Paraagruparmodelosdebescolocarlosenunsubdirectorioyantecederelnombredeldirectorio enlarutaalmomentodecargarlo.

< ? p h p / / C a r g a e i n s t a n c i a e l m o d e l o p a r t e s _ v e h i c u l o / m o t o r . p h p $ m o t o r = L o a d : : m o d e l ( p a r t e s _ v e h i c u l o / m o t o r . p h p ) ? >

Auth2
Estaclasepermitemanejarautenticacindeusuarios,conestefinseutilizanadaptadorespara tiposespecializadosdeautenticacin.

Solicitandounadaptador
Para solicitar un adaptador sehaceusodelmtodoestticofactory,dichomtodorecibecomo argumento eltipodeadaptadorautilizar.Encasodenoindicarseeltipodeadaptadorseutilizael adaptadorpredeterminado. Ejemplo: < ? p h p $ a u t h = A u t h 2 : : f a c t o r y ( m o d e l ) ? > Lossiguientesadaptadoresseencuentranimplementados: Model:permitetomarcomofuentededatosunmodeloActiveRecord.Debeindicarseen elargumentodefactorymodel.

Adaptadorpredeterminado
El adaptador predeterminado es model, sin embargo esto se puede modificar utilizando el mtodoestticosetDefault.

$ a d a p t e r ( s t r i n g ) : n o m b r e d e a d a p t a d o r s e t D e f a u l t ( $ a d a p t e r ) E j e m p l o : A u t h 2 : : s e t D e f a u l t ( m o d e l )

Comotrabajalaautenticacin

El mtodo identify verifica si existe una sesin autenticada previa, en caso contrario toma de $_POST el usuario y clave deacceso, y verifica el usuario y la clave encriptada contralafuente dedatos.Demanerapredeterminadalaclaveesencriptadautilizandomd5. Para poder efectuar la autenticacin debe existir una variable $_POST[mode] cuyo valor debe serauth. Elformularioparaautenticacindebetenerlasiguienteestructurabsica: < ? p h p e c h o F o r m : : o p e n ( ) ? > < i n p u t n a m e = m o d e t y p e = h i d d e n v a l u e = a u t h > < l a b e l f o r = l o g i n > U s u a r i o : < / l a b e l > < ? p h p e c h o F o r m : : t e x t ( l o g i n ) ? > < l a b e l f o r = p a s s w o r d > C l a v e : < / l a b e l > < ? p h p e c h o F o r m : : p a s s ( p a s s w o r d ) ? > < ? p h p e c h o F o r m : : c l o s e ( ) ? > De manera predeterminada Auth2 toma para el nombre de usuario el campo login y para la claveelcampopassword. Para poder iniciar una sesin de usuario y realizar la autenticacin se debe invocar el mtodo identify, sin embargo dependiendo del tipo de adaptador, es necesario especificar ciertos parmetrosdeconfiguracin.

AdaptadorModel
Este adaptador permite utilizar autenticacin en base a un modelo que herede de la clase ActiveRecord,verificandolosdatosdeautenticacinenlabasededatos.

setModel()
EstableceelmodeloActiveRecordqueseutilizarcomofuentededatos.Demanera predeterminadaelmodeloqueseutilizarcomofuentededatosesusers. $ m o d e l ( s t r i n g ) : n o m b r e d e m o d e l o e n s m a l l c a s e s e t M o d e l ( $ m o d e l ) E j e m p l o : $ a u t h > s e t M o d e l ( u s u a r i o )

identify()
Realiza la autenticacin. Si ya existe una sesin de usuario activa o los datos de usuario son correctos,entonceslaidentificacinessatisfactoria.

r e t u r n b o o l e a n i d e n t i f y ( ) E j e m p l o : $ v a l i d = $ a u t h > i d e n t i f y ( )

logout()
Terminalasesindeusuario. l o g o u t ( ) E j e m p l o : $ a u t h > l o g o u t ( )

setFields()
EstableceloscamposdelmodeloquesecargarnensesinmedianteelmtodoSession::set. Demanerapredeterminadasecargaelcampoid. $ f i e l d s ( a r r a y ) : a r r e g l o d e c a m p o s s e t F i e l d s ( $ f i e l d s ) E j e m p l o : $ a u t h > s e t F i e l d s ( a r r a y ( i d , u s u a r i o ) )

setSessionNamespace()
Estableceunnamespaceparaloscamposquesecarganensesin. $ n a m e s p a c e ( s t r i n g ) : n a m e s p a c e d e s e s i o n s e t S e s s i o n N a m e s p a c e ( $ n a m e s p a c e ) E j e m p l o : $ a u t h > s e t S e s s i o n N a m e s p a c e ( a u t h )

isValid()
Verificasiexisteunasesindeusuarioautenticado.

r e t u r n b o o l e a n i s V a l i d ( ) E j e m p l o : $ v a l i d = $ a u t h > i s V a l i d ( )

getError()
Obtieneelmensajedeerror. r e t u r n s t r i n g g e t E r r o r ( ) E j e m p l o : i f ( ! $ a u t h > i d e n t i f y ( ) ) F l a s h : : e r r o r ( $ a u t h > g e t E r r o r ( ) )

setAlgos()
Estableceelmtododeencriptacindelaclavedeusuario. $ a l g o s ( s t r i n g ) : m t o d o d e e n c r i p t a c i n , e l n o m b r e c o i n c i d e c o n l a f u n c i n h a s h d e p h p . s e t A l g o s ( $ a l g o s ) E j e m p l o : $ a u t h > s e t A l g o s ( m d 5 )

setKey()
Establece la clave para identificar si existe una sesin autenticada, dicha clave toma un valor booleano true cuando la sesin autenticada es vlida, asignada mediante el mtodo Session::set.

$ k e y ( s t r i n g ) : c l a v e d e s e s i n s e t K e y ( $ k e y ) E j e m p l o : $ a u t h > s e t K e y ( u s u a r i o _ l o g g e d )

setCheckSession()
IndicaquenoseiniciesesindesdebrowserdistintoconlamismaIP. $ c h e c k ( b o o l e a n ) : i n d i c a d o r s e t C h e c k S e s s i o n ( $ c h e c k ) E j e m p l o : $ a u t h > s e t C h e c k S e s s i o n ( t r u e )

setPass()
Asigna el nombre de campo para el campo de clave. Este campo debe corresponder con el campodelabasededatosydelformulario.Demanerapredeterminadaespassword. $ f i e l d ( s t r i n g ) : n o m b r e d e c a m p o q u e r e c i b e p o r P O S T . s e t P a s s ( $ f i e l d ) E j e m p l o : $ a u t h > s e t P a s s ( c l a v e )

setLogin()
Asigna el nombre de campo para el campo de nombre de usuario. Este campo debe corresponder conel campo de la base de datos y del formulario. Demanerapredeterminadaes login. $ f i e l d ( s t r i n g ) : n o m b r e d e c a m p o q u e r e c i b e p o r P O S T . s e t L o g i n ( $ f i e l d ) E j e m p l o : $ a u t h > s e t L o g i n ( u s u a r i o )

Obtenerloscamposcargadosensesin
LoscamposseobtienenpormediodelmtodoSession::get. $ i d = S e s s i o n : : g e t ( i d ) Sisehaespecificadounnamespacedesesin,entoncesdebeindicarloalinvocarelmtodo.

$ i d = S e s s i o n : : g e t ( i d , m i _ n a m e s p a c e )

Ejemplo
Lavista: app/views/acceso/login.phtml < ? p h p e c h o F o r m : : o p e n ( ) ? > < i n p u t n a m e = m o d e t y p e = h i d d e n v a l u e = a u t h > < l a b e l f o r = l o g i n > U s u a r i o : < / l a b e l > < ? p h p e c h o F o r m : : t e x t ( l o g i n ) ? > < l a b e l f o r = p a s s w o r d > C l a v e : < / l a b e l > < ? p h p e c h o F o r m : : p a s s ( p a s s w o r d ) ? > < ? p h p e c h o F o r m : : c l o s e ( ) ? > Elcontrolador: app/controllers/auth_controller.php < ? p h p c l a s s A u t h C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { p u b l i c f u n c t i o n l o g i n ( ) { / / S i s e l o g u e a s e r e d i r e c c i o n a a l m d u l o d e c l i e n t e i f ( L o a d : : m o d e l ( u s u a r i o ) > l o g i n ( ) ) { R o u t e r : : t o A c t i o n ( u s u a r i o / p a n e l ) } } p u b l i c f u n c t i o n l o g o u t ( ) { / / T e r m i n a l a s e s i o n L o a d : : m o d e l ( u s u a r i o ) > l o g o u t ( ) R o u t e r : : t o A c t i o n ( l o g i n ) } } ? > Para validar que el usuario est autenticado, basta con adicionar en cualquier accin del controladoroenelmtodobefore_filterelsiguientecdigo: i f ( ! L o a d : : m o d e l ( u s u a r i o ) > l o g g e d ( ) ) { R o u t e r : : t o A c t i o n ( a u t h / l o g i n )

r e t u r n f a l s e }

Elmodelo: app/models/usuario.php < ? p h p / / C a r g a d e l a l i b r e r i a a u t h 2 L o a d : : l i b ( a u t h 2 ) c l a s s U s u a r i o e x t e n d s A c t i v e R e c o r d { / * * * I n i c i a r s e s i o n * * / p u b l i c f u n c t i o n l o g i n ( ) { / / O b t i e n e e l a d a p t a d o r $ a u t h = A u t h 2 : : f a c t o r y ( m o d e l ) / / M o d e l o q u e u t i l i z a r p a r a c o n s u l t a r $ a u t h > s e t M o d e l ( u s u a r i o ) i f ( $ a u t h > i d e n t i f y ( ) ) r e t u r n t r u e F l a s h : : e r r o r ( $ a u t h > g e t E r r o r ( ) ) r e t u r n f a l s e } / * * * T e r m i n a r s e s i o n * * / p u b l i c f u n c t i o n l o g o u t ( ) { A u t h 2 : : f a c t o r y ( m o d e l ) > l o g o u t ( ) } / * * * V e r i f i c a s i e l u s u a r i o e s t a a u t e n t i c a d o * * @ r e t u r n b o o l e a n * / p u b l i c f u n c t i o n l o g g e d ( ) { r e t u r n A u t h 2 : : f a c t o r y ( m o d e l ) > i s V a l i d ( ) }

} ? >

9Usarclasesexternas

10LaConsola
Introduccin
La consola, es una herramienta de linea de comandos de KumbiaPHP que permite realizar tareas automatizadas en el mbito de tu aplicacin. En este sentido KumbiaPHP incluye las siguientesconsolas:Cache,ModelyController. Cada consola esta compuesta por un conjunto de comandos, cada comando puede recibir argumentos secuenciales yargumentosconnombre.Paraindicarunargumentoconnombre sedebeantecederelprefijoalargumento.

ComoutilizarlaConsola
Para utilizar la consola debes ejecutar el despachador de comandosdeconsoladeKumbiaPHP en un terminal, ubicarte en eldirectorio app de tu aplicacin y ejecutarlainstruccinacordeal siguienteformato: p h p . . / . . / c o r e / c o n s o l e / k u m b i a . p h p [ c o n s o l a ] [ c o m a n d o ] [ a r g ] [ a r g _ n o m ] = v a l o r Si no se especifica el comando ha ejecutar, entonces se ejecutar el comando main de la consola. Tambin es posible indicar laruta al directorio app de la aplicacin explcitamentepormediodel argumentoconnombrepath. Ejemplos: p h p . . / . . / c o r e / c o n s o l e / k u m b i a . p h p c a c h e c l e a n d r i v e r = s q l i t e p h p k u m b i a . p h p c a c h e c l e a n d r i v e r = s q l i t e p a t h = " / v a r / w w w / a p p "

ConsolasdeKumbiaPHP
Cache
Estaconsolapermiterealizartareasdecontrolsobrelacachedeaplicacin.

clean[group][driver]
Permitelimpiarlacache.

Argumentossecuenciales: group:nombredegrupodeelementosdecachequeseeliminar,sinoseespecifica valor,entoncesselimpiartodalacache.

Argumentosconnombre: driver:manejadordecachecorrespondientealacachealimpiar(nixfile,file,sqlite,APC), sinoseespecifica,entoncessetomaelmanejadordecachepredeterminado.

Ejemplo: p h p . . / . . / c o r e / c o n s o l e / k u m b i a . p h p c a c h e c l e a n

remove[id][group]
Eliminaunelementodelacache. Argumentossecuenciales: id:iddeelementoencache. group:nombredegrupoalqueperteneceelelemento,sinoseespecificavalor,entonces seutilizarelgrupodefault. Argumentosconnombre: driver:manejadordecachecorrespondientealacachealimpiar(nixfile,file,sqlite,APC). Ejemplo: p h p . . / . . / c o r e / c o n s o l e / k u m b i a . p h p c a c h e r e m o v e v i s t a 1 m i s _ v i s t a s

Model
Permitemanipularmodelosdelaaplicacin.

create[model]
Crea un modelo utilizando core/console/generators/model.php. como base la plantilla ubicada en

Argumentossecuenciales: model:nombredemodeloensmallcase. Ejemplo: p h p . . / . . / c o r e / c o n s o l e / k u m b i a . p h p m o d e l c r e a t e v e n t a _ v e h i c u l o

delete[model]
Eliminaunmodelo. Argumentossecuenciales: model:nombredemodeloensmallcase. Ejemplo: p h p . . / . . / c o r e / c o n s o l e / k u m b i a . p h p m o d e l d e l e t e v e n t a _ v e h i c u l o

Controller
Permitemanipularcontroladoresdelaaplicacin.

create[controller]
Crea un controlador utilizando core/console/generators/controller.php. como base la plantilla ubicada en

Argumentossecuenciales: controller:nombredecontroladorensmallcase. Ejemplo: p h p . . / . . / c o r e / c o n s o l e / k u m b i a . p h p c o n t r o l l e r c r e a t e v e n t a _ v e h i c u l o

delete[controller]
Eliminauncontrolador. Argumentossecuenciales: controller:nombredecontroladorensmallcase. Ejemplo: p h p . . / . . / c o r e / c o n s o l e / k u m b i a . p h p c o n t r o l l e r d e l e t e v e n t a _ v e h i c u l o

DesarrollandotusConsolas

Paradesarrollartusconsolasdebesdeconsiderarlosiguiente: Las consolas que desarrolles para tu aplicacin deben estar ubicadas en el directorio app/extensions/console. Elarchivodebetenerelsufijo_consoleydeigualmaneralaclaseelsufijoConsole. Cadacomandodelaconsolaequivaleaunmtododelaclase. Los argumentos con nombre que son enviados al invocar un comando se reciben en el primerargumentodelmtodocorrespondientealcomando. Los argumentos secuenciales que son enviados alinvocaruncomandoserecibencomo argumentosdelmtodoinvocadoposterioresalprimerargumento. Si no se especifica el comando a ejecutar, se ejecutar de manera predeterminada el mtodomaindelaclase. LasclasesLoad,ConfigyUtilsoncargadasautomticamenteparalaconsola. Las constantes APP_PATH, CORE_PATH y PRODUCTION se encuentran definidas paraelentornodelaconsola.

Ejemplo: Consideremos una parte del cdigo de la consola cache cuya funcionalidad fue explicada en la seccinanterior.

< ? p h p L o a d : : l i b ( ' c a c h e ' ) c l a s s C a c h e C o n s o l e { p u b l i c f u n c t i o n c l e a n ( $ p a r a m s , $ g r o u p = F A L S E ) { / / o b t i e n e e l d r i v e r d e c a c h e i f ( i s s e t ( $ p a r a m s [ ' d r i v e r ' ] ) ) { $ c a c h e = C a c h e : : d r i v e r ( $ p a r a m s [ ' d r i v e r ' ] ) } e l s e { $ c a c h e = C a c h e : : d r i v e r ( ) } / / l i m p i a l a c a c h e i f ( $ c a c h e > c l e a n ( $ g r o u p ) ) { i f ( $ g r o u p ) { e c h o " > S e h a l i m p i a d o e l g r u p o $ g r o u p " , P H P _ E O L } e l s e { e c h o " > S e h a l i m p i a d o l a c a c h e " , P H P _ E O L } } e l s e { t h r o w n e w K u m b i a E x c e p t i o n ( ' N o s e h a l o g r a d o e l i m i n a r e l c o n t e n i d o ' ) } }

} ? >

Console::input
EstemtododelaclaseConsolepermiteleerunaentradadesdeelterminal,secaracterizapor intentarleerlaentradahastaqueestaseavalida.

C o n s o l e : : i n p u t ( $ m e s s a g e , $ v a l u e s = n u l l ) $ m e s s a g e ( s t r i n g ) : m e n s a j e a m o s t r a r a l m o m e n t o d e s o l i c i t a r l a e n t r a d a . $ v a l u e s ( a r r a y ) : c o n j u n t o d e v a l o r e s v l i d o s p a r a l a e n t r a d a . E j e m p l o : $ v a l o r = C o n s o l e : : i n p u t ( D e s e a c o n t i n u a r ? , a r r a y ( s , n ) )

Apndices
IntegracindejQueryyKumbiaPHP
KumbiaPHPproveedeunaintegracinconelFrameworkdeDOMenJavaScript,jQuery

KDebug
KDebugesunnuevoobjetoincorporadoalpluginsdeintegracinKumbiaPHP/jQueryquepermite unadepuracindelcdigoentiempodedesarrollo.Consolounparmetrosepuedeaplicarun logquepermiteverenconsola(mientrasestaestedisponible,sinousaralert)quepermiteun mejorcontroldelaejecuccin. NoesnecesarioperosirecomendableusarFirebugsisetrabajaenMozillaFirefoxoalgun navegadorqueuselaconsoladeWebKitcomoGoogleChrome.

CRUD
Introduccin
Esteejemplonospermitirdemanerasencillaconoceryentenderlaimplementacindeun CRUD(Create,Read,UpdateyDeleteeningls)sinlanecesidaddeunScaffold(StandardForm) yunmanejocorrectodelMVCenKumbiaPHP. ElCRUDdelabeta1siguefuncionandoigualenlabeta2,peroquedadesaconsejado.Enla versin1.0sepodrusardelas2maneras.Yla1.2quesaldrjuntoala1.0sloseusarlo nuevoyseeliminarlodesaconsejado.

Configurandodatabase.ini
Configurarelarchivodatabases.ini,conlosdatosymotordeBasedeDatosautilizar.

Modelo
CrearelModeloelcualestavienedadoporladefinicindeunatablaenlaBD,paraefectodel ejemplocreamoslasiguientetabla. C R E A T E T A B L E m e n u s ( i d i n t u n i q u e n o t n u l l a u t o _ i n c r e m e n t , n o m b r e v a r c h a r ( 1 0 0 ) , t i t u l o v a r c h a r ( 1 0 0 ) n o t n u l l , p r i m a r y k e y ( i d ) )

VamosahoraadefinirelmodeloelcualnospermiteinteractuarconlaBD. [app]/models/menus.php: < ? p h p c l a s s M e n u s e x t e n d s A c t i v e R e c o r d { / * * * R e t o r n a l o s m e n u p a r a s e r p a g i n a d o s * * / p u b l i c f u n c t i o n g e t M e n u s ( $ p a g e , $ p p a g e = 2 0 ) { r e t u r n $ t h i s > p a g i n a t e ( " p a g e : $ p a g e " , " p e r _ p a g e : $ p p a g e " , ' o r d e r : i d d e s c ' ) } }

Controller
Elcontroladoresencargadodeatenderlaspeticionesdelcliente(ej.browser)yasuvezdedarle unarespuesta.EnestecontrollervamosadefinirtodaslasoperacionesCRUDquenecesitamos. [app]/controllers/menus_controller.php: < ? p h p / * * * C a r g a d e l m o d e l o M e n u s . . . * / L o a d : : m o d e l s ( ' m e n u s ' ) c l a s s M e n u s C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { / * * * O b t i e n e u n a l i s t a p a r a p a g i n a r l o s m e n u s * / p u b l i c f u n c t i o n i n d e x ( $ p a g e = 1 ) { $ m e n u = n e w M e n u s ( ) $ t h i s > l i s t M e n u s = $ m e n u > g e t M e n u s ( $ p a g e ) } / * * * C r e a u n R e g i s t r o * / p u b l i c f u n c t i o n c r e a t e ( )

{ / * * * S e v e r i f i c a s i e l u s u a r i o e n v i o e l f o r m ( s u b m i t ) y s i a d e m a s * d e n t r o d e l a r r a y P O S T e x i s t e u n o l l a m a d o " m e n u s " * e l c u a l a p l i c a l a a u t o c a r g a d e o b j e t o p a r a g u a r d a r l o s * d a t o s e n v i a d o p o r P O S T u t i l i z a n d o a u t o c a r g a d e o b j e t o * / i f ( I n p u t : : h a s P o s t ( ' m e n u s ' ) ) { / * * * s e l e p a s a a l m o d e l o p o r c o n s t r u c t o r l o s d a t o s d e l f o r m y A c t i v e R e c o r d r e c o g e e s o s d a t o s * y l o s a s o c i a a l c a m p o c o r r e s p o n d i e n t e s i e m p r e y c u a n d o s e u t i l i c e l a c o n v e n c i n * m o d e l . c a m p o * / $ m e n u = n e w M e n u s ( I n p u t : : p o s t ( ' m e n u s ' ) ) / / E n c a s o q u e f a l l e l a o p e r a c i n d e g u a r d a r i f ( ! $ m e n u > s a v e ( ) ) { F l a s h : : e r r o r ( ' F a l l O p e r a c i n ' ) } e l s e { F l a s h : : v a l i d ( ' O p e r a c i n e x i t o s a ' ) / / E l i m i n a m o s e l P O S T , s i n o q u e r e m o s q u e s e v e a n e n e l f o r m I n p u t : : d e l e t e ( ) } } } / * * * E d i t a u n R e g i s t r o * * @ p a r a m i n t $ i d ( r e q u e r i d o ) * / p u b l i c f u n c t i o n e d i t ( $ i d ) { $ m e n u = n e w M e n u s ( ) / / s e v e r i f i c a s i s e h a e n v i a d o e l f o r m u l a r i o ( s u b m i t ) i f ( I n p u t : : h a s P o s t ( ' m e n u s ' ) ) { i f ( ! $ m e n u > u p d a t e ( I n p u t : : p o s t ( ' m e n u s ' ) ) ) { F l a s h : : e r r o r ( ' F a l l O p e r a c i n ' ) } e l s e { F l a s h : : v a l i d ( ' O p e r a c i n e x i t o s a ' )

/ / e n r u t a n d o p o r d e f e c t o a l i n d e x d e l c o n t r o l l e r r e t u r n R o u t e r : : r e d i r e c t ( ) } } e l s e { / / A p l i c a n d o l a a u t o c a r g a d e o b j e t o , p a r a c o m e n z a r l a e d i c i n $ t h i s > m e n u s = $ m e n u > f i n d ( ( i n t ) $ i d ) } } / * * * E l i m i n a r u n m e n u * * @ p a r a m i n t $ i d ( r e q u e r i d o ) * / p u b l i c f u n c t i o n d e l ( $ i d ) { $ m e n u = n e w M e n u s ( ) i f ( ! $ m e n u > d e l e t e ( ( i n t ) $ i d ) ) { F l a s h : : e r r o r ( ' F a l l O p e r a c i n ' ) } e l s e { F l a s h : : v a l i d ( ' O p e r a c i n e x i t o s a ' ) } / / e n r u t a n d o p o r d e f e c t o a l i n d e x d e l c o n t r o l l e r r e t u r n R o u t e r : : r e d i r e c t ( ) } }

Vistas
Agregamoslasvistas... [app]/views/menus/index.phtml < d i v c l a s s = " c o n t e n t " > < ? p h p e c h o V i e w : : c o n t e n t ( ) ? > < h 3 > M e n u s < / h 3 > < u l > < ? p h p f o r e a c h ( $ l i s t M e n u s > i t e m s a s $ i t e m ) : ? > < l i > < ? p h p e c h o H t m l : : l i n k A c t i o n ( " e d i t / $ i t e m > i d / " , ' E d i t a r ' ) ? > < ? p h p e c h o H t m l : : l i n k A c t i o n ( " d e l / $ i t e m > i d / " , ' B o r r a r ' ) ? > < s t r o n g > < ? p h p e c h o $ i t e m > n o m b r e ? > < ? p h p e c h o $ i t e m > t i t u l o ? > < / s t r o n g >

< / l i > < ? p h p e n d f o r e a c h ? > < / u l > / / e j e m p l o m a n u a l d e p a g i n a d o r , h a y p a r t i a l l i s t o s e n f o r m a t o d i g g , c l a s i c , . . . . < ? p h p i f ( $ l i s t M e n u s > p r e v ) e c h o H t m l : : l i n k A c t i o n ( " i n d e x / $ l i s t M e n u s > p r e v / " , ' < < A n t e r i o r | ' ) ? > < ? p h p i f ( $ l i s t M e n u s > n e x t ) e c h o H t m l : : l i n k A c t i o n ( " i n d e x / $ l i s t M e n u s > n e x t / " , ' P r x i m o > > ' ) ? > < / d i v > [app]/views/menus/create.phtml < ? p h p V i e w : : c o n t e n t ( ) ? > < h 3 > C r e a r m e n u < h 3 > < ? p h p e c h o F o r m : : o p e n ( ) / / p o r d e f e c t o l l a m a a l a m i s m a u r l ? > < l a b e l > N o m b r e < ? p h p e c h o F o r m : : t e x t ( ' m e n u s . n o m b r e ' ) ? > < / l a b e l > < l a b e l > T t u l o < ? p h p e c h o F o r m : : t e x t ( ' m e n u s . t i t u l o ' ) ? > < / l a b e l > < ? p h p e c h o F o r m : : s u b m i t ( ' A g r e g a r ' ) ? > < ? p h p e c h o F o r m : : c l o s e ( ) ? > [app]/views/menus/edit.phtml < ? p h p V i e w : : c o n t e n t ( ) ? > < h 3 > E d i t a r m e n u < h 3 > < ? p h p e c h o F o r m : : o p e n ( ) / / p o r d e f e c t o l l a m a a l a m i s m a u r l ? > < l a b e l > N o m b r e < ? p h p e c h o F o r m : : t e x t ( ' m e n u s . n o m b r e ' ) ? > < / l a b e l > < l a b e l > T t u l o < ? p h p e c h o F o r m : : t e x t ( ' m e n u s . t i t u l o ' ) ? > < / l a b e l > < ? p h p e c h o F o r m : : h i d d e n ( ' m e n u s . i d ' ) ? > < ? p h p e c h o F o r m : : s u b m i t ( ' A c t u a l i z a r ' ) ? > < ? p h p e c h o F o r m : : c l o s e ( ) ? >

ProbandoelCRUD
Ahorasolorestaprobartodoelcdigoquehemosgenerado,enestepuntoesimportante conocerelcomportamientodelasURL'senKumbiaPHP.

indexeslaaccinparalistarhttp://localhost/menus/index/
NOTA:index/sepuedepasardeformaimplcitaono.KumbiaPHPencasoquenoselepase unaaccin,buscarpordefectounindex,esdecirsicolocamos:http://localhost/menus/ createcreaunmenuenlaBasedeDatoshttp://localhost/menus/create/

Lasaccionesdelyeditaambassedebeentrardesdeelindex,yaquerecibenel
parmetrosaeditaroborrarsegnelcaso.

Aplicacinenproduccin

Partialsdepaginacin
ComocomplementoparaelpaginadordeActiveRecord,atravsdevistasparcialesse implementanlostiposdepaginacinmscomunes.Estosseubicaneneldirectorio "core/views/partials/paginators"listosparaserusados.Soncompletamenteconfigurablesvia CSS.Porsupuesto,podiscrearvuestrospropiospartialsparapaginarenlasvistas.

Classic
Vistadepaginacinclsica.

ResultadoFinal Parmetrosdeconfiguracin: page:objetoobtenidoalinvocaralpaginador. show:nmerodepaginasquesemostraranenelpaginador,pordefecto10. url:urlparalaaccionqueefectualapaginacion,pordefecto"module/controller/page/"yseenvia porparmetroelnmerodepgina. V i e w : : p a r t i a l ( ' p a g i n a t o r s / c l a s s i c ' , f a l s e , a r r a y ( ' p a g e ' = > $ p a g e , ' s h o w ' = > 8 , ' u r l ' = > ' u s u a r i o / l i s t a ' ) )

Digg
Vistadepaginacinestilodigg. Parmetrosdeconfiguracin: page:objetoobtenidoalinvocaralpaginador. show:nmerodepginasquesemostrarnenelpaginador,pordefecto10. url:urlparalaaccinqueefectalapaginacin,pordefecto"module/controller/page/"yseenva porparmetroelnmerodepgina. V i e w : : p a r t i a l ( ' p a g i n a t o r s / d i g g ' , f a l s e , a r r a y ( ' p a g e ' = > $ p a g e , ' s h o w ' = > 8 , ' u r l ' = > ' u s u a r i o / l i s t a ' ) )

Extended

ResultadoFinal Vistadepaginacinextendida. Parmetrosdeconfiguracin: page:objetoobtenidoalinvocaralpaginador. url:urlparalaaccinqueefectalapaginacin,pordefecto"module/controller/page/"yseenva porparmetroelnmerodepgina. V i e w : : p a r t i a l ( ' p a g i n a t o r s / e x t e n d e d ' , f a l s e , a r r a y ( ' p a g e ' = > $ p a g e , ' u r l ' = > ' u s u a r i o / l i s t a ' ) )

Punbb
Vistadepaginacinestilopunbb. Parmetrosdeconfiguracin: page:objetoobtenidoalinvocaralpaginador. show:nmerodepginasquesemostrarnenelpaginador,pordefecto10. url:urlparalaaccinqueefectalapaginacin,pordefecto"module/controller/page/"yseenva porparmetroelnmerodepgina. V i e w : : p a r t i a l ( ' p a g i n a t o r s / p u n b b ' , f a l s e , a r r a y ( ' p a g e ' = > $ p a g e , ' s h o w ' = > 8 , ' u r l ' = > ' u s u a r i o / l i s t a ' ) )

Simple

ResultadoFinal Vistadepaginacinsimple. Parmetrosdeconfiguracin: page:objetoobtenidoalinvocaralpaginador. url:urlparalaaccinqueefectalapaginacin,pordefecto"module/controller/page/"yseenva porparmetroelnmerodepgina. V i e w : : p a r t i a l ( ' p a g i n a t o r s / s i m p l e ' , f a l s e , a r r a y ( ' p a g e ' = > $ p a g e , ' u r l ' = > ' u s u a r i o / l i s t a ' ) )

Ejemplodeuso
Supongamosquequeremospaginarunalistadeusuarios. ParaelmodeloUsuarioenmodels/usuario.php: < ? p h p c l a s s U s u a r i o e x t e n d s A c t i v e R e c o r d { / * * * M u e s t r a l o s u s u a r i o s d e c i n c o e n c i n c o u t i l i z a n d o p a g i n a d o r * * @ p a r a m i n t $ p a g e * @ r e t u r n o b j e c t * * / p u b l i c f u n c t i o n v e r ( $ p a g e = 1 ) { r e t u r n $ t h i s > p a g i n a t e ( " p a g e : $ p a g e " , ' p e r _ p a g e : 5 ' ) } } ? > ParaelcontroladorUsuarioControllerencontrollers/usuario_controller.php: < ? p h p L o a d : : m o d e l s ( ' u s u a r i o ' ) c l a s s U s u a r i o C o n t r o l l e r e x t e n d s A p p C o n t r o l l e r { / * * * A c c i o n d e p a g i n a c i o n *

* @ p a r a m i n t $ p a g e * * / p u b l i c f u n c t i o n p a g e ( $ p a g e = 1 ) { $ U s u a r i o = n e w U s u a r i o ( ) $ t h i s > p a g e = $ U s u a r i o > v e r ( $ p a g e ) } } ? > Yenlavistaviews/usuario/page.phtml < t a b l e > < t r > < t h > I d < / t h > < t h > N o m b r e < / t h > < / t r > < ? p h p f o r e a c h ( $ p a g e > i t e m s a s $ p ) : ? > < t r > < t d > < ? p h p e c h o $ p > i d ? > < / t d > < t d > < ? p h p e c h o $ p > n o m b r e ? > < / t d > < / t r > < ? p h p e n d f o r e a c h ? > < / t a b l e > < ? p h p V i e w : : p a r t i a l ( ' p a g i n a t o r s / c l a s s i c ' , f a l s e , a r r a y ( ' p a g e ' = > $ p a g e ) ) ? >

Auth

Beta1aBeta2

Deprecated
Mtodosyclasesqueseusabanenversionesanterioresyqueaunfuncionan.Peroquequedan desaconsejadasyquenofuncionaranenelfuturo(prximabetaoversinfinal): Posiblementehabr2versiones: beta2conlodeprecatedparafacilitarmigracin beta2.2sinlodeprecatedmslimpiayrpida,paraempezarnuevasapps Flash::success()ahoraFlash::valid() Flash::notice()ahoraFlash::info() ApplicationControllerahoraAppController(consusrespectivoscambiosdemtodos) . Usar$this>response=viewoView::response(view)paranomostrareltemplate. AhoraView::template(NULL)elView::response()sloseusaparaelegirformatosdevista alternativos.

Listadecambiosentreversiones:sinoseespecificabeta1esqueescompatibleenamboscasos
Application ControllerBase0.5=>ApplicationControllerbeta1=>AppControllerbeta2 publicfunctioninit0.5=>protectedfunctioninitializebeta2 render_view0.5=>View::selectbeta2 Models public$mode0.5=>public$databasebeta1ybeta2 Callbacks publicfunctioninitialize0.5=>protectedfunctioninitializebeta2 publicfunctionfinalize0.5=>protectedfunctionfinalizebeta2 publicfunctionbefore_filter0.5=>protectedfunctionbefore_filterbeta2 publicfunctionafter_filter0.5=>protectedfunctionafter_filterbeta2 boot.iniseeliminaenbeta2 kumbia/mail/libchart0.5=>seeliminalosprefijosbeta1 extensions0.5=>libsbeta1 Input:: $this>has_post0.5=>Input::hasPostbeta2 $this>has_get0.5=>Input::hasGetbeta2 $this>has_request0.5=>Input::hasRequestbeta2 $this>post0.5=>'Input::postbeta2

$this>get0.5=>'Input::getbeta2 $this>request0.5=>'Input::requestbeta2 View:: $this>cache0.5=>View::cachebeta2 $this>render0.5=>'View::selectbeta2 $this>set_response0.5=>View::responsebeta2 content()0.5=>View::content()beta2 render_partial0.5=>View::partialbeta2 Router:: $this>route_to0.5=>'Router::route_tobeta1ybeta2 $this>redirect0.5=>Router::redirectbeta2 Html:: img_tag0.5=>'Html::imgbeta2 link_to0.5=>'Html::linkbeta2 link_to_action0.5=>'Html::linkActionbeta2 stylesheet_link_tags0.5=>'Html::includeCssbeta2 Ajax:: form_remote_tag0.5=>'Ajax::formbeta2 link_to_remote0.5=>'Ajax::linkbeta2 Form:: end_form_tag0.5=>'Form::closebeta2 form_tag0.5=>'Form::openbeta2 input_field_tag0.5'=>'Form::inputbeta2 text_field_tag0.5=>'Form::textbeta2 password_field_tag0.5=>'Form::passbeta2 textarea_tag0.5=>'Form::textareabeta2 hidden_field_tag0.5=>'Form::hiddenbeta2 select_tag0.5=>'Form::selectbeta2 file_field_tag0.5=>'Form::filebeta2 button_tag0.5=>'Form::buttonbeta2 submit_image_tag0.5=>'Form::submitImagebeta2 submit_tag0.5=>'Form::submitbeta2 checkbox_field_tag0.5=>'Form::checkbeta2 radio_field_tag0.5=>'Form::radiobeta2 Tag:: javascript_include_tag0.5=>'Tag::jsbeta2 stylesheet_link_tag0.5=>'Tag::cssbeta2

Cambioenlasrutasentreversiones:
#0.5=>1.0beta1

'/apps/default'=>'/app', '/apps'=>'', '/app/controllers/application.php'=>'/app/application.php', '/app/views/layouts'=>'/app/views/templates', '/app/views/index.phtml'=>'/app/views/templates/default.phtml', '/app/views/not_found.phtml'=>'/app/views/errors/404.phtml', '/app/views/bienvenida.phtml'=>'/app/views/pages/index.phtml', '/app/helpers'=>'/app/extensions/helpers', '/app/models/base/model_base.php'=>'/app/model_base.php', '/app/models/base/'=>'', '/cache'=>'/app/cache', '/config'=>'/app/config', '/docs'=>'/app/docs', '/logs'=>'/app/logs', '/scripts'=>'/app/scripts', '/test'=>'/app/test', #1.0beta1=>1.0beta2 Cambiados: Session::isset_data()ahoraSession::has() Session::unset_data()ahoraSession::delete()

Glosario
CRUD=CreateReadUpdateDelete(CrearLeerActualizarBorrar) ABM MVC=ModelViewController(ModeloVistaControlador) HTML=HyperTextMarkupLanguage(LenguajedeMarcadodeHiperTexto) SQL=StructuredQueryLanguage(LenguajedeConsultaEstructurado) .

S-ar putea să vă placă și