You are on page 1of 107

paSinousamosheadingsnotendremosTOC!!!

(TOC=tabladecontenidoondice)
Losnombresdearchivoymtodosenitlica.
Elcdigoenunatabla.(Nohemosencontradomejorsolucin),porahorasecoloreacon
http://codepad.orgyfuenteCourierNew.
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.

1.2.6.

Seguridad.

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

<?php
/**
*ControllerSaludo
*/
classSaludoControllerextendsAppController{
publicfunctionhola(){
}
}

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

<?php
/**
*ControllerSaludo
*/
classSaludoControllerextendsAppController{
/**
*mtodoparasaludar
*/
publicfunctionhola(){
$this>fecha=date("YmdH:i")
}
}

KumbiaPHPimplementalasvariablesdeinstancialoquesignificaquetodosatributosdefinidos
enelcontroller,pasarautomticamentealavista,enelcdigoanteriortenemoselatributo
$this>fechaestepasaralavistacomounavariablellamada$fecha.

Enlavistaquesecreoenlaseccin2.1.3.3yagregamos.

<h1>Hola,KumbiaPHP!</h1>
<?phpecho$fecha?>

Ahora,sivolvemosahttp://localhost/kumbiaphp/saludo/hola/,obtendremoslahorayfechadel
momentoenquesehagalapeticin,comosemuestraenlafigura2.5.

Figura2.5:Horayfechadepeticin
Paraagregarlecalidezalasunto,lepreguntaremosalusuariosunombreva
parmetro2.1.3.4,volvemosaeditarelcontroladorsaludo_controller.php...

<?php
/**
*ControllerSaludo
*/
classSaludoControllerextendsAppController
{
/**
*mtodoparasaludar
*@paramstring$nombre
*/
publicfunctionhola($nombre)
{
$this>fecha=date("YmdH:i")
$this>nombre=$nombre
}
}

Editamoslavistaapp/views/saludo/hola.phtml

<h1>Hola<?phpecho$nombre?>,QulindoesutilizarKumbiaPHP!
cierto?</h1>
<?phpecho$fecha?>

Siahoraentramosahttp://localhost/kumbiaphp/saludo/CaChi/,nosmostrarenelnavegador
webelsaludojuntoconelnombrecolocadoylafechaactual,comosemuestraenlafigura2.6.

Figura2.6:SaludandoalUsuario

2.1.3.6.RepitiendolaHistoria
Ahoravamosotraaccinllamadaadios()ycomosunombreindicaharemoselprocesoinversoa
saludar,esdecirdespediralosusuarios.

<?php
/**
*ControllerSaludo
*/
classSaludoControllerextendsAppController{
/**
*mtodoparasaludar
*@paramstring$nombre
*/
publicfunctionhola($nombre){
$this>fecha=date("YmdH:i")
$this>nombre=$nombre
}
/**
*mtodoparadespedir
*/
publicfunctionadios(){
}
}


Agregamosunanuevavistaparapresentarelcontenidodelaaccinadios()ysirecordamoslo
queseexplicenlaseccin2.1.3.3deberamoscrearunavistaapp/views/saludo/adios.phtml
conelsiguientecontenido.

<h1>Ops!sehaido:(</h1>
<?phpechoHtml::link('saludo/hola/CaChi/','VolveraSaludar')?>

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:

...
error_reporting(E_ALL^E_STRICT)
...
//define('PRODUCTION',TRUE)
...
define('START_TIME',microtime(1))
...
define('APP_PATH',dirname(dirname(__FILE__)).'/app/')
...
define('CORE_PATH',dirname(dirname(APP_PATH)).'/core/')
...
if($_SERVER['QUERY_STRING']){
define('PUBLIC_PATH',substr(urldecode($_SERVER['REQUEST_URI']),
0,strlen($_SERVER['QUERY_STRING'])+6))
}else{

define('PUBLIC_PATH',$_SERVER['REQUEST_URI'])
}
...
$url=isset($_GET['_url'])?$_GET['_url']:'/'
...
requireCORE_PATH.'kumbia/bootstrap.php'

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:

echoAPP_PATH
//lasalidaes:/var/www/kumbiaphp/default/app/

Conestaconstanteesposibleutilizarlaparaincluirarchivosqueseencuentrebajoelrbolde
directoriodelaaplicacin,porejemplosiquiereincluirunarchivoqueestaeneldirectorio
app/libs/test.phplaformadehacerlosera.

include_onceAPP_PATH.'libs/test.php'

3.1.3.2.CORE_PATH
ConstantequecontienelarutaabsolutaaldirectoriodondeseencuentraelcoredeKumbiaPHP.
porejemplo:

echoCORE_PATH
//lasalidaes:/var/www/kumbiaphp/core/

Paraincluirarchivos,queseencuentrebajoesterboldedirectorios,eselmismoprocedimiento
queseexplicparalaconstanteAPP_PATH.

3.1.3.3.PUBLIC_PATH
ConstantequecontienelaURLparaelnavegador(browser)yapuntaaldirectoriopublic/para
enlazarimgenes,CSS,JavaScriptytodoloquesearutaparabrowser.

//Generaunlinkqueiraal
//controller:controlleryaction:action
<ahref="<?phpechoPUBLIC_PATH?>controller/action/"title="Mi
Link">MiLink</a>

//Enlazaunaimagenqueestaenpublic/img/imagen.jpg
<imgsrc="<?phpechoPUBLIC_PATH?>img/imagen.jpg"alt="UnaImagen"

/>

//EnlazaelarchivoCSSenpublic/css/style.css
<linkrel="stylesheet"type="text/css"href="<?phpechoPUBLIC_PATH
?>css/style.css"/>

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

<?php
/**
*ControllerNoticia
*/
classNoticiasControllerextendsAppController{
/**
*mtodoparaverlanoticia

*@paramint$id
*/
publicfunctionver($id){
echo$this>controller_name//noticias
echo$this>action_name//ver
//Unarraycontodoslosparmetrosenviadosalaaccin
var_dump($this>parameters)
}
}

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.

<?php
/**
*ControllerSaludo
*/
classSaludoControllerextendsAppController{
/**
*Limitalacantidadcorrectade
*parmetrosdeunaaction
*/
public$limit_params=FALSE
...mtodos...
}

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.

<?php
/**
*ControllerSaludo
*/
classSaludoControllerextendsAppController{
}

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:

<?php
classSaludoControllerextendsAppController{
publicfunctionsaludo(){

View::select('hola')

}
}

Deestamaneraluegodequeseejecutelaaccinsaludosemostrarlavista
saludo/hola.phtmlutilizandoeltemplatedefault.

Encasodequenodeseemostrarunavista,solamentedebepasarNULLcomoargumentode
View::select().

<?php
classSaludoControllerextendsAppController{
publicfunctionindex(){

View::select(NULL)
}
}

Parafinalizaresteapartadocabedestacarquetantolasvistasdeaccin,lostemplatesylos
partialssonvistas,peroporcomodidadsesuelereferiralavistadeaccinsencillamentebajoel
nombredevista.

4.1Pasandodatosalavista
Parapasardatosalavistaestosdebencargarsecomoatributospblicosdelcontroladoryluego
dequeseejecutelaaccin,elmanejadordevistascargarlosatributospblicosdelcontrolador
comovariablesdembitolocalenlavista.Ejemplo:

Elcontrolador:controllers/saludo_controller.php
<?php
classSaludoControllerextendsAppController{
publicfunctionhola(){

$this>usuario='Mundo'
}
}

Lavista:views/saludo/hola.phtml
Hola<?phpecho$usuario?>

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


Elcontrolador:saludo_controller.php
<?php
classSaludoControllerextendsAppController{
publicfunctionhola(){

Flash::valid('HolaMundo')
}
}

Lavista:hola.phtml
Saludorealizado:
<?phpView::content()?>

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

<!DOCTYPEhtml>
<html>
<head>
<title>TemplatedeEjemplo</title>
</head>
<body>
<h1>TemplatedeEjemplo</h1>

<?phpView::content()?>
</body>
</html>

4.3.2Comoutilizaruntemplate?

ParaseleccionareltemplateautilizarsedebeinvocarelmtodoView::template()pasandocomo
argumentoeltemplateautilizar.Ejemplo:

Enelcontrolador:
<?php
classSaludoControllerextendsAppController{
publicfunctionhola(){

//Seleccionaeltemplate'mi_template.phtml'

View::template('mi_template')
}
}

Asimismoesposibleindicaralmanejadordevistasquenoutiliceningntemplateyporlotanto
muestresolamentelavista,paraestosedebepasarNULLcomoargumentoaView::template().

<?php
classSaludoControllerextendsAppController{
publicfunctionhola(){

//Noutilizartemplate

View::template(NULL)
}
}

4.3.3Pasandodatosaltemplate

ComosevioenlaseccinPasandodatosalavista,losatributospblicosdelcontroladorse
cargancomovariablesdembitolocalenlavista,comomostrareltemplate,constituyeel

segundopasoparamostrarlavistacompleta,losatributospblicosdelcontroladorestarnde
igualmaneracargadoscomovariablesdembitolocaleneltemplate.Ejemplo:

Enelcontroladorsaludo_controller.php
<?php
classSaludoControllerextendsAppController{
publicfunctionhola(){

Flash::valid('HolaMundo')

//Pasandoeltituloparalapgina

$this>titulo='SaludandoalMundo'

/*Noseutilizarvista,porlotantola

salidaserdelbufferytemplate*/

View::select(NULL,'saludo')
}
}

Eneltemplatesaludo.phtml
<!DOCTYPEhtml>
<html>
<head>
<title><?phpecho$titulo?></title>
</head>
<body>
<h1>TemplatedeSaludo</h1>

<?phpView::content()?>
</body>
</html>

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
<h1>TemplatedeSaludo</h1>

4.4.2Comoutilizarunpartial?

ParautilizarunpartialsedebeinvocarelmtodoView::partial()indicandocomoargumentoel
partialdeseadoylavistaparcialsemostrarenellugardondeseinvoc.

Ejemploutilizandounpartialenuntemplate:
<!DOCTYPEhtml>
<html>
<head>
<title>Ejemplo</title>
</head>
<body>
<?phpView::partial('cabecera')?>

<?phpView::content()?>
</body>
</html>

Cabedestacarquelospartialsepuedenutilizartantoenvistasdeaccin,templateseincluso
dentrodeotrospartials.

4.4.3Pasandodatosalospartials

Parapasardatosaunpartial,estossedebenindicarenunarrayasociativodondecadaclave
consucorrespondientevalorsecargarncomovariablesenelmbitolocaldelpartial.

Ejemplo:

views/partials/cabecera.phtml
<h1>Ttulo:<?phpecho$titulo?></h1>

views/ejemplo/index.phtml
<?phpView::partial('cabecera',FALSE,array('titulo'=>'Ejemplo'))

?>
<p>
Esteesunejemplo
</p>

4.5Agrupandoendirectorios

EnKumbiaPHPtantolasvistas,lospartialsylostemplatespuedenagruparseendirectorios,
utilizandoelseparador/enlaruta.

4.5.1Ejemplodeagrupacindevista

Lavistaviews/usuario/clasificado/fomulario.phtml,seutilizadelasiguientemaneraenel
controlador:

<?php
classUsuarioControllerextendsAppController{
publicfunctionnuevo(){

//Seleccionalavista

View::select('clasificado/formulario')
}
}

4.5.2Ejemplodeagrupacindepartial

Elpartialviews/_shared/partials/usuario/formulario.phtml,seutilizadelasiguientemanerayasea
envistaoentemplate:

<h1>NuevoUsuario</h1>
<?phpView::partial('usuario/formulario')?>

4.5.3Ejemplodeagrupacindetemplate

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

<?php
classAdministradorControllerextendsAppController{
protectedfunctionbefore_filter(){

//Seleccionaeltemplate

View::template('usuario/administrador')
}
}

4.6Tiposderespuestas

Lostiposderespuestassonutilizadosparaestablecerdistintosformatosdelavista.Por
ejemplo:xml,jsonypdf.

ParaestableceruntipoderespuestasedebeinvocarelmtodoView::response()indicandola
respuestadeseada,unavezqueseindicaeltipoderespuestaesteesautomticamente
colocadocomoextensindelarchivodevista.Enconsecuenciautilizarlostiposderespuestas
enconjuntoalostemplateconstituyenunapotenteherramientaparageneracindevistas
completasparaelusuario.

Ejemplo:
<?php
classUsuarioControllerextendsAppController{
publicfunctionindex(){

//Estableceeltipoderespuesta

View::response('json')
}
}

Enesteejemplosemostrarlavistaindex.json.phtml.

4.7Usodecacheenlasvistas

Elmanejadordevistasproporcionamecanismosatravsdeloscualeslasvistas,lospartialsy
lostemplatessepuedencachear,elusuarioindicaeltiempoduranteelcualestosestarn
almacenadosenlacachedemaneraqueelmanejadordevistascargarestoselementossin
necesidaddeprocesarlos,aumentandoelrendimientodelaaplicacin.

Enestesentidoparaindicareltiempodecachesesigueelformatodelafuncinstrtotimede
PHP.Ejemplo:'+1week'

4.7.1Cachedevistas

ParacachearunavistaseutilizaelmtodoView::cache()enelcontrolador.

<?php
classUsuarioControllerextendsAppController{
publicfunctionindex(){

//Indicaeltiempodecachedelavista

View::cache('+20days')
}
}

Cabedestacarquelaaccinenelcontroladorseejecuta,debidoaquelosdatospasadosala
vistapuedendeigualmaneraserrequeridoseneltemplate.

4.7.1.1Gruposdevistasencache

Lasvistascacheadassepuedenalmacenarengrupos.Losgrupossonmuyinteresantes,yaque
sepuedeborrarlacacheporgrupostambin.Ejemplo:guardarcachedepostsenungrupo,al
crear,editaroborrarunpost,podemosborrarlacachedeesegrupo,paraqueseregenerela
cache.

EnestecasoesnecesarioindicarenelmtodoView::cache()quesecachearunavistaenun
grupoespecfico.

<?php
classUsuarioControllerextendsAppController{
publicfunctionindex(){

//Indicaeltiempodecachedelavista

View::cache('+20days','view','miGrupo')
}
}

4.7.2Cachedetemplates

Cachearuntemplateconsisteencachearenconjuntotantolavistaytemplateparaunaurl
especfica.ParacachearuntemplateseusaelmtodoView::cache()enelcontroladorindicando
eltiempoduranteelcualestarcacheadoeltemplate.

<?php

classUsuarioControllerextendsAppController{
publicfunctionindex(){

//Indicaeltiempodecachedetemplate

View::cache('+20days','template')
}
}

Cabedestacarqueparaaumentarelrendimientonoseejecutalaaccinenelcontrolador,
debidoaquemostrareltemplateeselltimopasoquerealizaelmanejadordevistaspara
mostrarlavistaalusuarioyenestepasoyatodoslosdatosenviadosalavistaytemplatehan
sidoutilizados.

4.7.3Cachedepartials

ParacachearpartialssedebeindicarcomosegundoargumentoalinvocarView::partial()el
tiempoduranteelcualsecachear.

<?phpView::partial('usuario','+1day')?>

<?phpView::partial('usuario','+1day',array('nombre'=>'pepe'))
?>

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

4.8.1ClaseHtml
ClaseconmtodosestticosconlaquepodemoscrearetiquetasHTMLoptimizadasrespetando
lasconvencionesdeKumbiaPHP.

Html::img()
Permiteincluirunaimagen

$srcrutadelaimagen
$altatributoaltparalaimagen
$attrsatributosadicionales

img($src,$alt=NULL,$attrs=NULL)

/*Ejemplo*/
echoHtml::img('spin.gif','unaimagen')//semuestralaimagen
spin.gifqueseencuentradentrode"/public/img/"
//conelartibutoalt'unaimagen'

Html::link()
Permiteincluirunlink

$actionrutaalaaccin
$texttextoamostrar
$attrsatributosadicionales

Html::link($action,$text,$attrs=NULL)

/*Ejemplo*/
echoHtml::link('pages/show/kumbia/status','Configuracin')//se
muestraunlinkconeltexto'Configuracin'

Html::lists()
Creaunalistahtmlapartirdeunarray

$arraycontenidodelalista
$typepordefectoul,ysinool
$attrsatributosadicionales

Html::lists($array,$type='ul',$attrs=NULL)

/*Ejemplo*/
$ar=array('Abdomen'=>'Abdomen',
'Brazos'=>'Brazos',
'Cabeza'=>'Cabeza',
'Cuello'=>'Cuello',

'Genitales'=>'Genitales',
'Piernas'=>'Piernas',
'Trax'=>'Trax',
'Otros'=>'Otros')
//$arelarrayquecontienelositemsdelalista
echoHtml::lists($ar,$type='ol')//Muestraunalista<ol></ol>

$ar2=
array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','T
rax','Otros')
echoHtml::lists($ar2,$type='ol')//Muestraunalista<ol></ol>

Html::gravatar()
Incluyeimgenesdegravatar.com

$emailCorreoparaconseguirsugravatar
$altTextoalternativodelaimagen.Pordefecto:gravatar
$sizeTamaodelgravatar.Unnumerode1a512.Pordefecto:40
$defaultURLgravatarpordefectosinoexiste,oundefaultde
gravatar.Pordefecto:mm

Html::gravatar($email,$alt='gravatar',$size=40,$default='mm')

echoHtml::gravatar($email)//Simple
echoHtml::link(Html::gravatar($email),$url)//Ungravatarque
esunlink
echoHtml::gravatar($email,$name,20,
'http://www.example.com/default.jpg')//Completo

Html::includeCss()
IncluyelosarchivosCSSquepreviamentefueroncargadosalalistamedianteTag::css()

Tag::css('bienvenida')//PoneenlistaunCSS
(app/public/css/bienvenida.css)
echoHtml::includeCss()//Adicionalosrecursosenlazadosdela
claseenelproyecto

Html::meta()
Creaunmetatagyloagregaaunalistaestticaqueseraadidamsadelnatemediante

Html::includeMetatags()

$contentcontenidodelmetatag
$attrsatributosadicionalesdeltag

Html::meta($content,$attrs=NULL)

Html::meta('Kumbiaphpteam',"name='Author'")
//Agrega:<metacontent="Kumbiaphpteam"name='Author'/>
Html::meta('text/htmlcharset=UTF8',"httpequiv=
'Contenttype'")
//Agrega:<metacontent="text/htmlcharset=UTF8"httpequiv=
'Contenttype'/>

Html::includeMetatags()
Agregalosmetatagquepreviamentesehabanagregado

Html::meta('Kumbiaphpteam',"name='Author'")
Html::meta('text/htmlcharset=UTF8',"httpequiv=
'Contenttype'")
echoHtml::includeMetatags()//Visualiza<meta
content="Kumbiaphpteam"name='Author'/>

Html::headLink()
Agregaunelementodevinculoexternodetipo<link>alacoladeenlaces(parapoderser
visualizadoserequieredeHtml::includeHeadLinks()demodosimilarqueHtml::includeCss())

$hrefdireccinurldelrecursoaenlazar
$attrsatributosadicionales

Html::headLink($href,$attrs=NULL)

Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='sty
lesheet',type='text/css'media='screen'")//Seagregaalacolade
linkselenlaceaunrecursoexterno,enestecasolahojadeestilo
ubicadaen"http://www.kumbiaphp.com/public/style.css"

/*Agregaalacoladelinks"<linkrel="alternate"
type="application/rss+xml"title="KumbiaPHPFrameworkRSSFeed"
href="http://www.kumbiaphp.com/blog/feed/"/>"conlocualpodemos

incluirunfeedsinusarlasconvencionesdekumbiaphp*/

Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate
'type='application/rss+xml'title='KumbiaPHPFrameworkRSSFeed'")
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut
icon',type='image/xicon'")//Agregalaetiqueta<link>parausar
unfaviconexterno

echoHtml::includeHeadLinks()//Muestraloslinksquecontienela
cola

Html::headLinkAction()
Agregaunelementodevinculointernodetipo<link>alacoladeenlaces(parapoderser
visualizadoserequieredeHtml::includeHeadLinks()demodosimilarqueHtml::includeCss())
respetandolasconvencionesdeKumbiaPHP.

$hrefdireccinurldelrecursoaenlazar
$attrsatributosadicionales

Html::headLinkAction($action,$attrs=NULL)

/*Agregaalacoladelinks"<linkrel="alternate"
type="application/rss+xml"title="KumbiaPHPFrameworkRSSFeed"
href="http://www.kumbiaphp.com/blog/feed/"/>"conlocualpodemos
incluirunfeedusandolasconvencionesdeKumbiaPHP.
Siendo'articulos/feed'elnombredelavistaconelcontenidodel
feed*/

Html::headLinkAction('articulos/feed',"rel='alternate'
type='application/rss+xml'title='KumbiaPHPFrameworkRSSFeed'")

echoHtml::includeHeadLinks()//Muestraloslinksquecontienela
cola

Html::headLinkResource()
Agregaunelementodevinculoaunrecursointernoconlaetiqueta<link>alacoladeenlaces
(parapoderservisualizadoserequieredeHtml::includeHeadLinks())

$resourceubicacindelrecursoenpublic
$attrsatributosadicionales


Html::headLinkResource($resource,$attrs=NULL)

Html::headLinkResource('favicon.ico',"rel='shortcut
icon',type='image/xicon'")//Agregalaetiqueta<link>parausar
unfaviconinternoubicadoeneldirectorio'/public/'

echoHtml::includeHeadLinks()//Muestraloslinksquecontienela
cola

Html::includeHeadLinks()
Incluyeloslinksquepreviamentesepusieronencola

Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut
icon',type='image/xicon'")//Agregalaetiqueta<link>parausar
unfaviconexterno
Html::headLinkAction('articulos/feed',"rel='alternate'
type='application/rss+xml'title='KumbiaPHPFrameworkRSSFeed'")
echoHtml::includeHeadLinks()

4.8.2.ClaseTag
EstaclasenosvaapermitiradicionararchivosJSyCSSanuestroproyecto,bienseanarchivos
queseencuentrenennuestroservidoroenunservidorexterno.Tambinvamosapoderhacer

Lasfuncionesdeestaclasesondetipostticas,loquenospermiteusarlasdirectamentedela
formacomosepresentanacontinuacin.

Tag::css()
IncluyeunarchivoCSSalalista

Tag::css('bienvenida')//PoneenlistaunCSS
(app/public/css/bienvenida.css)
echoHtml::includeCss()//Adicionalosrecursosenlazadosdela
claseenelproyecto

Tag::js()
IncluyeunarchivoJavaScriptalavista,partialotemplate

<?php
echoTag::js('jquery/jquery.kumbiaphp')//Adicionaunarchivo
javascript(/app/public/javascript/jquery/jquery.kumbiaphp.js)
?>

4.8.3.ClaseForm
Claseparaelmanejoylacreacindeformularios

Form::open()
Creaunaetiquetadeformulario

$actionaccinalaqueenvalosdatos,pordefectollamala
mismaaccindedondeproviene
$method'POST','GET','DELETE','HEAD','PUT'.Pordefectose
tieneen'POST'
$attrsatributosadicionales

Form::open($action=NULL,$method='POST',$attrs=NULL)

/*Ejemplo*/
<?phpechoForm::open()?>//iniciaunformularioqueenviaralos
datosalaaccinquecorrespondealcontrolleractual
<?phpechoForm::open('usuarios/nuevo')?>//iniciaunformulario
queenviaralosdatosalcontroller'usuarios'ylaaccin'nuevo'

Form::openMultipart()
Creaunaetiquetadeformulariomultipart,esteesidealparaformulariosquecontienencampos
desubidadearchivos

$actionaccinalaqueenvalosdatos,pordefectollamala
mismaaccindedondeproviene
$attrsatributosadicionales

Form::openMultipart($action=NULL,$attrs=NULL)

/*Ejemplo*/
echoForm::openMultipart()//iniciaunformulariomultipartque
enviaralosdatosalaaccinquecorrespondealavistaactual
echoForm::openMultipart('usuarios/nuevo')//iniciaunformulario

multipartqueenviaralosdatosalcontroller'usuario'ylaaccin
'nuevo'

Form::close()
Creaunaetiquetadecierredeformulario

/*Ejemplo*/
echoForm::close()
//creaunaetiquetadecierredeformulario</form>

Form::input()
Creauncampodetipoinput

$attrsatributosparaeltag
$contentcontenidointerno

Form::input($attrs=NULL,$content=NULL)

/*Ejemplo*/
echoForm::input('nombre')

Form::text()
Creauncampodetipoinput

Siemprequeseledaelparmetronamedelaformamodel.campo,esdecirunnombreque
contengaunpuntodentrodelstring,secreaelcampodetextoconelname="model[campo]"yel
id="model_campo".

$fieldNombredecampo
$attrsatributosdecampo
$valuevalorinicialparaelinput

Form::text($field,$attrs=NULL,$value=NULL)

/*Ejemplo*/
echoForm::text('nombre')//creauncampodetipotextoconel
parmetroname="nombre",id="nombre"
echoForm::text('usuario.nombre')//creauncampodetipotextocon

elparmetroname="usuario[nombre]",id="usuario.nombre"
echoForm::text('nombre',"class='caja'",'55')//creauncampode
tipotextoconelparmetroname="nombre",id="nombre",class=
"caja",value="55"

Form::pass()
CreauncampodetipoPassword

$fieldnombredecampo
$attrsatributosdecampo
$valuevalorinicialparaelcampo

Form::pass($field,$attrs=NULL,$value=NULL)

/*Ejemplo*/
echoForm::pass('password')//creauncampodetipopasswordconel
parmetroname="password"

Form::textarea()
Creauntextarea

$fieldnombredecampo
$attrsatributosdecampo
$valuevalorinicialparaeltextarea

Form::textarea($field,$attrs=NULL,$value=NULL)

echoForm::textarea('detalles')//Creauntextarea

Form::label()
Creaunlabelyloasociaauncampo

$texttextoamostrar
$fieldcampoalquehacereferencia
$attrsarraydeatributosopcionales

Form::label($text,$field,$attrs=NULL)

echoForm::label('nombredeusuario:','nombre')//Creaunlabel
paraelcamponombreconeltexto'nombredeusuario:'
echoForm::text('nombre')

Form::hidden()
Creauncampohidden(campooculto)

$fieldnombredecampo
$attrsatributosadicionalesdecampo
$valuevalorinicialparaelcampooculto

Form::hidden($field,$attrs=NULL,$value=NULL)

echoForm::hidden('id',NULL,12)//Creauncampoocultoconel
name="id"yelvalue="12"

Form::dbSelect()
CreacampoSelectquetomalosvaloresdeobjetosdeActiveRecord,paraestaversindel
frameworkelusodeestehelperhasidosimplificado.Yanoesnecesarioinstanciarelmodelo.

$fieldnombredelmodeloycampopk(bajolaconvencin
modelo.campo_id)
$showcampoquesemostrar
$dataarraydevalores,array('modelo','mtodo','param')
$blankcampoenblanco
$attrsatributosdecampo
$valuevalorinicialparaelcampo

Form::dbSelect($field,$show=NULL,$data=NULL,$blank=NULL,
$attrs=NULL,$value=NULL)
Vista

echoForm::dbSelect('usuarios.campo_id')//laformamsfcil,
cargaelmodelo(campo)ymuestraelprimercampodespusdelpk(id)
echoForm::dbSelect('usuarios.campo_id','campo')//muestrael
campoyloordenaascendentemente

Form::select()
CreauncampoSelect(uncombobox)

$fieldnombredecampo
$dataarraydevaloresparalalistadesplegable
$attrsatributosdecampo
$valuevalorinicialparaelcampo

Form::select($field,$data,$attrs=NULL,$value=NULL)

$ar2=
array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','T
rax','Otros')
echoForm::Select('region',$ar2,NULL,'Cuello')//Creauncampo
Select(uncombobox)conelnombre'region'yteniendo
preseleccionado'Cuello'
Resultado:
<selectid="region"name="region">
<optionvalue="0">Abdomen</option>
<optionvalue="1">Brazos</option>
[...]
</select>

OtraPosibilidad:
$ar2=
array('Abdomen'=>'Abdomen','Brazos'=>'Brazos','Cabeza'=>'Cabeza','Cu
ello'=>'Cuello','Genitales'=>'Genitales','Piernas'=>'Piernas','Trax
'=>'Trax','Otros'=>'Otros')
echoForm::Select('region',$ar2,NULL,'Cuello')
Resultado:
<selectid="region"name="region">
<optionvalue="Abdomen">Abdomen</option>
<optionvalue="Brazos">Brazos</option>
[...]
</select>

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

$fieldnombredecampo
$attrsatributosdecampo

Form::file($field,$attrs=NULL)

echoForm::openMultipart()//Abreelformulariomultipart
echoForm::file('subir')crearelcampoparasubirarchivos
echoForm::close()//Cierraelformulario

Form::button()
Creaunbotn

$texttextodelbotn
$attrsatributosdelbotn

Form::button($text,$attrs=NULL)

echoForm::button('calcular')//Creaunbotnconeltexto
'calcular'

Form::submitImage()
CreaunbotndetipoimagensiguiendolasconvencionesdeKumbiaPHP,laimagendeber
estardentrodeldirectorio'/public/img/'

$imgrutadelaimagenqueusaelbotn
$attrsatributosdelbotn

Form::submitImage($img,$attrs=NULL)

echoForm::submitImage('botones/edit.gif')//Creaunbotnconla
imagen'botones/edit.gif'

Form::submit()
Creaunbotndesubmitparaelformularioactual

$texttextodelbotn
$attrsatributosdelbotn


Form::submit($text,$attrs=NULL)

echoForm::submit('enviar')//Creaunbotnconeltexto'enviar'

Form::reset()
Creaunbotnresetparaelformularioactual

$texttextodelbotn
$attrsatributosdelbotn

Form::reset($text,$attrs=NULL)

echoForm::reset('reiniciar')//Creaunbotnconeltexto
'reiniciar'

Form::check()
Creauncheckbox

$fieldnombredecampo
$valuevalorenelcheckbox
$attrsatributosdecampo
$checkedindicasisemarcaelcampo

Form::check($field,$value,$attrs=NULL,$checked=NULL)

echoForm::check('recuerdame','1','',true)//Creauncheck
seleccionadoconid="recuerdame",name="recuerdame"yvalue="1"
echoForm::check('recuerdame','1','',false)//CreauncheckNO
seleccionadoconid="recuerdame",name="recuerdame"yvalue="1"

Form::radio()
Creaunradiobutton

$fieldnombredecampo
$valuevalorenelradio
$attrsatributosdecampo

$checkedindicasisemarcaelcampo

Form::radio($field,$value,$attrs=NULL,$checked=NULL)

$on='masculino'
echoForm::radio("rdo",'masculino',NULL,TRUE)//<input
id="rdo1"name="rdo"type="radio"value="masculino"
checked="checked">
echoForm::radio("rdo",'femenino')//<inputid="rdo2"name="rdo"
type="radio"value="femenino">

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

distinct([string$atributo_entidad],["conditions:"],["order:
"],["limit:"],["column:"])

Ejemplo

$unicos=Load::model('usuario')>distinct("estado")
#array('A','I','N')

Losparmetrosconditions,orderylimitfuncionanidnticamentequeenlafuncinfindypermiten
modificarlaformaolosmismosvaloresderetornodevueltosporsta.

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

encargadeeliminarelusodelSQLengranporcentaje,perohaymomentosenqueesnecesario
queseamosmsespecficosytengamosquerecurriralusodeeste.

Ejemplo

$usuarios=Load::model('usuario')>find_all_by_sql("select*from
usuarioswherecodigonotin(selectcodigofromingreso)")

Enesteejemploconsultamostodoslosusuariosconunasentenciawhereespecial.Laideaes
quelosusuariosconsultadosnopuedenestarenlaentidadingreso.

5.4.1.3find_by_sql(string$sql)
EstemtodonospermitehacerunaconsultapormediodeunSQLyelresultadodevueltoesun
objetoquerepresentaelresultadoencontrado.Laideaesqueelusodeestemtodonodebera
sercomnennuestrasaplicacionesyaqueActiveRecordseencargadeeliminarelusodelSQL
engranporcentaje,perohaymomentosenqueesnecesarioqueseamosmsespecficosy
tengamosquerecurriralusodeeste.

Ejemplo

$usuario=Load::model('usuario')>find_by_sql("select*from
usuarioswherecodigonotin(selectcodigofromingreso)limit1")

Esteejemploconsultamostodoslosusuariosconunasentenciawhereespecialeimprimimos
susnombres.Laideaesqueelusuarioconsultadonopuedeestarenlaentidadingreso.

5.4.1.4find_first(string$sql)

Sintaxis
find_first([integer$id],["conditions:"],["order:"],["limit:
"],["columns:"])

Elmtodofind_firstdevuelveelprimerregistrodeunaentidadolaprimeraocurrenciade
acuerdoaunoscriteriosdebsquedauordenamiento.Losparmetrossontodosopcionalesy
suordennoesrelevante,cuandoseinvocasinparmetrosdevuelveelprimerregistroinsertado
enlaentidad.Estemtodoesmuyflexibleypuedeserusadodemuchasformas:

Ejemplo
$usuario=Load::model('usuario')>find_first("conditions:
estado='A'","order:fechadesc")

EnesteejemplobuscamoselprimerregistrocuyoestadoseaigualaAyordenado
descendentemente,elresultadodeste,secargaalavariable$Usuarioseigualmentedevuelve
unainstanciadelmismoobjetoActiveRecordencasodexitoofalseencasocontrario.

Conelmtodofind_firstpodemosbuscarunregistroenparticularapartirdesuiddeestaforma:

$usuario=Load::model('usuario')>find_first(123)

Asobtenemoselregistro123eigualmentedevuelveunainstanciadelmismoobjeto.
ActiveRecordencasodexitoofalseencasocontrario.Kumbiageneraunaadvertenciacuando
loscriteriosdebsquedaparafind_firstdevuelvenmsdeunregistro,paraestopodemosforzar
quesedevuelvasolamenteuno,medianteelparmetrolimit,deestaforma:

$usuario=Load::model('usuario')>find_first("conditions:
estado='A'","limit:1")

Cuandoqueremosconsultarsloalgunosdelosatributosdelaentidadpodemosutilizarel
parmetrocolumnsas:

$usuario=Load::model('usuario')>find_first("columns:nombre,
estado")

Cuandoespecificamoselprimerparmetrodetipostring,ActiveRecordasumirquesonlas
condicionesdebsquedaparafind_first,as:

$usuario=Load::model('usuario')>find_first("estado=A")

Deestaformapodemostambindeducirqueestas2sentenciasarrojaranelmismoresultado:

$usuario=Load::model('usuario')>find_first("id=123")

$usuario=Load::model('usuario')>find_first(123)

5.4.1.5find()

Sintaxis
find([integer$id],["conditions:"],["order:"],["limit:],
["columns:"])

Elmtodo"find"eselprincipalmtododebsquedadeActiveRecord,devuelvetodaslos
registrosdeunaentidadoelconjuntodeocurrenciasdeacuerdoaunoscriteriosdebsqueda.
Losparmetrossontodosopcionalesysuordennoesrelevante,inclusopuedenser
combinadosuomitidossiesnecesario.Cuandoseinvocasinparmetrosdevuelvetodoslos
registrosenlaentidad.

Nohayqueolvidarsedeincluirunespaciodespusdelosdospuntos(:)encadaparmetro.

Ejemplo
$usuarios=Load::model('usuario')>find("conditions:
estado=A","order:fechadesc")

Enesteejemplobuscamostodoslosregistroscuyoestadoseaiguala"A"ydevuelvastos
ordenadosdescendentemente,elresultadodeesteesunarraydeobjetosdelamismaclasecon
losvaloresdelosregistroscargadosenellos,encasodenohayanregistrosdevuelveunarray
vaco.

Conelmtodofindpodemosbuscarunregistroenparticularapartirdesuiddeestaforma:

$usuario=Load::model('usuario')>find(123)

Asobtenemoselregistro123eigualmentedevuelveunainstanciadelmismoobjeto
ActiveRecordencasodexitoofalseencasocontrario.Comoesunsoloregistronodevuelve
unarray,sinoquelosvaloresdestesecarganenlamismavariablesiexisteelregistro.

Paralimitarelnmeroderegistrosdevueltos,podemosusarelparmetrolimit,as:

$usuarios=Load::model('usuario')>find("conditions:
estado=A",limit:5,offset:1)

Cuandoqueremosconsultarsloalgunosdelosatributosdelaentidadpodemosutilizarel
parmetrocolumnsas:

$usuarios=Load::model('usuario')>find("columns:nombre,estado")

Cuandoespecificamoselprimerparmetrodetipostring,ActiveRecordasumirquesonlas
condicionesdebsquedaparafind,as:

$usuarios=Load::model('usuario')>find("estado=A")

Sepuedeutilizarlapropiedadcountparasabercuntosregistrosfuerondevueltosenla
bsqueda.


Nota:Noesnecesariousarfind('id:$id')paraelfind,seusadirectamentfind($id)

5.4.1.5select_one(string$select_query)

Estemtodonospermitehacerciertasconsultascomoejecutarfuncionesenelmotordebase
dedatossabiendoquestasdevuelvenunsoloregistro.

$current_time=Load::model('usuario')>select_one("current_time")

EnelejemploqueremossaberlahoraactualdelservidordevueltadesdeMySQLasque
podemosusarestemtodoparaesto.

5.4.1.6select_one(string$select_query)(static)

Estemtodonospermitehacerciertasconsultascomoejecutarfuncionesenelmotordebase
dedatos,sabiendoquestasdevuelvenunsoloregistro.Estemtodosepuedellamardeforma
esttica,estosignificaquenoesnecesarioquehayaunainstanciadeActiveRecordparahacer
elllamado.

$current_time=ActiveRecord::select_one("current_time")

EnelejemploqueremossaberlahoraactualdelservidordevueltadesdeMySQLasque
podemosusarestemtodoparaesto.

5.4.1.7exists()

Estemtodonospermiteverificarsielregistroexisteonoenlabasededatosmediantesuido
unacondicin.

$usuario=Load::model('usuario')

$usuario>id=3

if($usuario>exists()){
//Elusuarioconidiguala3siexiste
}

Load::model('usuario')>exists("nombre='JuanPerez'")
Load::model('usuario')>exists(2)//UnUsuarioconid>2?

5.4.1.8find_all_by()


Estemtodonospermiterealizarunabsquedaporalgncampo

$resultado=
Load::model('producto')>find_all_by(categoria,Insumos)

5.4.1.9find_by_*campo*()

Estemtodonospermiterealizarunabsquedaporalgncampousandoelnombredelmtodo
comonombredeste.Devuelveunsoloregistro.

$resultado=Load::model('producto')>find_by_categoria(Insumos)

5.4.1.10find_all_by_*campo*()

Estemtodonospermiterealizarunabsquedaporalgncampousandoelnombredelmtodo
comonombredeste.Devuelvetodoslosregistrosquecoincidanconlabsqueda.

$resultado=
Load::model('producto')>find_all_by_categoria("Insumos")

5.4.2Conteosysumatorias
5.4.2.1count()

Realizaunconteosobrelosregistrosdelaentidadconosinalgunacondicinadicional.Emulala
funcindeagrupamientocount.

$numero_registros=Load::model('cliente')>count()
$numero_registros=Load::model('cliente')>count("ciudad=
'BOGOTA'")

5.4.2.2sum()

Realizaunasumatoriasobrelosvaloresnumricosdeelatributodealgunaentidad,emulala
funcindeagrupamientosumenellenguajeSQL.

$suma=Load::model('producto')>sum("precio")
$suma=Load::model('producto')>sum("precio","conditions:estado=
'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:
<?php
classMenusextendsActiveRecord{

Controlador
CrearelControladorenesteejemplo,NOapuntaremosalaclaseAppControllerySIalaclase
ScaffoldController.

[app]/controllers/menus_controller.php:
<?php
classMenusControllerextendsScaffoldController{
public$model='menus'
}

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.

<?php
$cliente=Load::model('cliente')
$cliente>nit="8081118272"
$cliente>razon_social="EMPRESADETELECOMUNICACIONESXYZ"
$cliente>save()

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:

<?php
classClienteextendsActiveRecord{
}

Siloquesedeseaescrearunmodelodeunaclasequetienenombrecompuestoporejemplola
claseTipodeCliente,porconvencinennuestrabasededatosestatabladebellamarse:
tipo_de_clienteyelarchivo:models/tipo_de_cliente.phpyelcdigodeesemodeloelsiguiente:

<?php
classTipoDeClienteextendsActiveRecord{
}

7.2.3.

ColumnasyAtributos

ObjetosActiveRecordcorrespondenaregistrosenunatabladeunabasededatos.Losobjetos
poseenatributosquecorrespondenaloscamposenestastablas.LaclaseActiveRecord
automticamenteobtieneladefinicindeloscamposdelastablasylosconvierteenatributosde
laclaseasociada.Aestoesloquenosreferamosconmapeoobjetorelacional.

Miremoslatablalbum:

CREATETABLEalbum(
idINTEGERNOTNULLAUTO_INCREMENT,
nombreVARCHAR(100)NOTNULL,
fechaDATENOTNULL,
valorDECIMAL(12,2)NOTNULL,
artista_idINTEGERNOTNULL,
estadoCHAR(1),
PRIMARYKEY(id)
)

PodemoscrearunActiveRecordquemapeeestatabla:

<?php
classAlbumextendsActiveRecord{
}

Unainstanciadeestaclaseserunobjetoconlosatributosdelatablalbum:

<?php

$album=Load::model('album')
$album>id=2
$album>nombre=GoingUnder
$album>save()

Ocon...

<?php

Load::models('album')

$album=newAlbum()
$album>id=2
$album>nombre=GoingUnder
$album>save()

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.

<?php
//cachepordefecto
$data=Cache::driver()>get('data')

//manejadorparamemcache
$data_memcache=Cache::driver('memcache')>get('data')

//manejadorparacacheconAPC
$data_apc=Cache::driver('APC')>get('data')
?>

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.

<?phpLogger::error('MensajedeError')?>

Lasalidadelainstruccinanteriorserlosiguiente:
[Thu,05Feb0915:19:390500][ERROR]MensajedeError

PordefectolosarchivoslogtienenelsiguientenombrelogDDMMYYY.txtestenombrepuedeser
cambiadosiaslodeseamosatravsdeunparmetroadicionalalmtodo.
<?phpLogger::error('MensajedeError','mi_log')?>
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.

Flash::error(Haocurridounerror)

Flash::valid($text)
Permiteenviarunmensajedexitoalusuario.Pordefectoesunmensajedeletrascolorverdes
yfondocolorverdepastelperoestospuedenseralteradosenlaclasecssen
public/css/style.cssllamadavalid.

Flash::valid(Serealizelprocesocorrectamente)

Flash::info($text)
Permiteenviarunmensajedeinformacinalusuario.Pordefectoesunmensajedeletrascolor
azulesyfondocolorazulpastelperoestospuedenseralteradosenlaclasecssen
public/css/style.cssllamadainfo.

Flash::info(Nohayresultadosenlabsqueda)

Flash::warning($text)
Permiteenviarunmensajedeadvertenciaalusuario.Pordefectoesunmensajedeletrascolor
azulesyfondocolorazulpastelperoestospuedenseralteradosenlaclasecssen
public/css/style.cssllamadawarning.

Flash::warning(Advertencia:Nohainiciadosesinenelsistema)

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

Session
LaclaseSessionesparafacilitarelmanejodelasessiones.

Session::set($index,$value,$namespace='default')
Crearoespecificaelvalorparaunindicedelasesinactual.
<?phpSession::set('usuario','Administrador')?>

Session::get($index,$namespace='default')
Obtenerelvalorparaunindicedelasesinactual.
<?php
Session::get('usuario')//retorna'Administrador'
?>

Session::delete($index,$namespace='default')
Eliminaelvalorparaunindicedelasesinactual.
<?phpSession::delete('usuario')?>

Session::has($index,$namespace='default')
Verificaqueestedefinidoelindiceenlasesinactual.
<?php
Session::has('id_usuario')//retornafalse.
?>
NOTA:$namespaceesunespacioindividualenelcualsepuedencontenerlasvariablesde
sesin,permitiendoevitarcolisionesconnombresdevariables.

Load

LaclaseloadpermitelacargadelibrerasenKumbiaPHP.

Load::coreLib($lib)
PermitecargarunalibreradelncleodeKumbiaPHP.

<?php
//Cargalalibreracache
Load::coreLib(cache)
?>

Load::lib($lib)
Permitecargarunalibreradeaplicacin.Laslibrerasdeaplicacinseubicaneneldirectorio
app/libs.

<?php
//Cargaelarchivoapp/libs/split.php
Load::lib(split)
?>

Encasodequenoexistalalibreraintentacargarunadelncleoconelnombreindicado.

<?php
/*Cargaelarchivoapp/libs/auth2.phpsiexiste,encaso
contrario,cargarlalibreriadelncleoauth2*/
Load::lib(auth2)
?>

Paraagruparlibreriasdebescolocarlasenunsubdirectorioyantecederelnombredeldirectorio
enlarutaalmomentodecargarla.

<?php
//Cargaelarchivoapp/libs/controllers/auth_controller.php
Load::lib(controllers/auth_controller.php)
?>

Load::model($model)
Cargaeinstanciaelmodeloindicado.Retornalainstanciadelmodelo.

<?php
//Cargaeinstanciaelmodelousuario.php
$usuario=Load::model(usuario)
?>

Paraagruparmodelosdebescolocarlosenunsubdirectorioyantecederelnombredeldirectorio
enlarutaalmomentodecargarlo.

<?php
//Cargaeinstanciaelmodelopartes_vehiculo/motor.php
$motor=Load::model(partes_vehiculo/motor.php)
?>

Auth2
Estaclasepermitemanejarautenticacindeusuarios,conestefinseutilizanadaptadorespara
tiposespecializadosdeautenticacin.

Solicitandounadaptador
Para solicitar un adaptador sehaceusodelmtodoestticofactory,dichomtodorecibecomo
argumento eltipodeadaptadorautilizar.Encasodenoindicarseeltipodeadaptadorseutilizael
adaptadorpredeterminado.

Ejemplo:

<?php
$auth=Auth2::factory(model)
?>

Lossiguientesadaptadoresseencuentranimplementados:

Model:permitetomarcomofuentededatosunmodeloActiveRecord.Debeindicarseen
elargumentodefactorymodel.

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

$adapter(string):nombredeadaptador

setDefault($adapter)

Ejemplo:

Auth2::setDefault(model)

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:

<?phpechoForm::open()?>
<inputname=modetype=hiddenvalue=auth>

<labelfor=login>Usuario:</label>
<?phpechoForm::text(login)?>

<labelfor=password>Clave:</label>
<?phpechoForm::pass(password)?>
<?phpechoForm::close()?>

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.

$model(string):nombredemodeloensmallcase

setModel($model)

Ejemplo:
$auth>setModel(usuario)

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


returnboolean

identify()

Ejemplo:
$valid=$auth>identify()

logout()
Terminalasesindeusuario.

logout()

Ejemplo:
$auth>logout()

setFields()
EstableceloscamposdelmodeloquesecargarnensesinmedianteelmtodoSession::set.
Demanerapredeterminadasecargaelcampoid.

$fields(array):arreglodecampos

setFields($fields)

Ejemplo:
$auth>setFields(array(id,usuario))

setSessionNamespace()
Estableceunnamespaceparaloscamposquesecarganensesin.

$namespace(string):namespacedesesion

setSessionNamespace($namespace)

Ejemplo:
$auth>setSessionNamespace(auth)

isValid()
Verificasiexisteunasesindeusuarioautenticado.

returnboolean

isValid()

Ejemplo:
$valid=$auth>isValid()

getError()
Obtieneelmensajedeerror.

returnstring

getError()

Ejemplo:
if(!$auth>identify())Flash::error($auth>getError())

setAlgos()
Estableceelmtododeencriptacindelaclavedeusuario.

$algos(string):mtododeencriptacin,elnombrecoincideconla
funcinhashdephp.

setAlgos($algos)

Ejemplo:
$auth>setAlgos(md5)

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.

$key(string):clavedesesin

setKey($key)

Ejemplo:
$auth>setKey(usuario_logged)

setCheckSession()
IndicaquenoseiniciesesindesdebrowserdistintoconlamismaIP.

$check(boolean):indicador

setCheckSession($check)

Ejemplo:
$auth>setCheckSession(true)

setPass()
Asigna el nombre de campo para el campo de clave. Este campo debe corresponder con el
campodelabasededatosydelformulario.Demanerapredeterminadaespassword.

$field(string):nombredecampoquerecibeporPOST.

setPass($field)

Ejemplo:
$auth>setPass(clave)

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.

$field(string):nombredecampoquerecibeporPOST.

setLogin($field)

Ejemplo:
$auth>setLogin(usuario)

Obtenerloscamposcargadosensesin
LoscamposseobtienenpormediodelmtodoSession::get.

$id=Session::get(id)

Sisehaespecificadounnamespacedesesin,entoncesdebeindicarloalinvocarelmtodo.

$id=Session::get(id,mi_namespace)

Ejemplo
Lavista:
app/views/acceso/login.phtml

<?phpechoForm::open()?>
<inputname=modetype=hiddenvalue=auth>

<labelfor=login>Usuario:</label>
<?phpechoForm::text(login)?>

<labelfor=password>Clave:</label>
<?phpechoForm::pass(password)?>
<?phpechoForm::close()?>

Elcontrolador:
app/controllers/auth_controller.php

<?php
classAuthControllerextendsAppController
{
publicfunctionlogin()
{
//Siselogueaseredireccionaalmdulodecliente
if(Load::model(usuario)>login()){
Router::toAction(usuario/panel)
}
}

publicfunctionlogout()
{
//Terminalasesion
Load::model(usuario)>logout()
Router::toAction(login)
}
}
?>

Para validar que el usuario est autenticado, basta con adicionar en cualquier accin del
controladoroenelmtodobefore_filterelsiguientecdigo:

if(!Load::model(usuario)>logged()){
Router::toAction(auth/login)

returnfalse
}

Elmodelo:
app/models/usuario.php

<?php
//Cargadelalibreriaauth2
Load::lib(auth2)

classUsuarioextendsActiveRecord
{
/**
*Iniciarsesion
*
*/
publicfunctionlogin()
{
//Obtieneeladaptador
$auth=Auth2::factory(model)

//Modeloqueutilizarparaconsultar
$auth>setModel(usuario)

if($auth>identify())returntrue

Flash::error($auth>getError())
returnfalse
}

/**
*Terminarsesion
*
*/
publicfunctionlogout()
{
Auth2::factory(model)>logout()
}

/**
*Verificasielusuarioestaautenticado
*
*@returnboolean
*/
publicfunctionlogged()
{
returnAuth2::factory(model)>isValid()
}

}
?>

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:

php../../core/console/kumbia.php[consola][comando][arg]
[arg_nom]=valor

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:
php../../core/console/kumbia.phpcachecleandriver=sqlite
phpkumbia.phpcachecleandriver=sqlitepath="/var/www/app"

ConsolasdeKumbiaPHP
Cache
Estaconsolapermiterealizartareasdecontrolsobrelacachedeaplicacin.

clean[group][driver]
Permitelimpiarlacache.

Argumentossecuenciales:

group:nombredegrupodeelementosdecachequeseeliminar,sinoseespecifica
valor,entoncesselimpiartodalacache.

Argumentosconnombre:

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

Ejemplo:
php../../core/console/kumbia.phpcacheclean

remove[id][group]
Eliminaunelementodelacache.

Argumentossecuenciales:
id:iddeelementoencache.
group:nombredegrupoalqueperteneceelelemento,sinoseespecificavalor,entonces
seutilizarelgrupodefault.

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

Ejemplo:

php../../core/console/kumbia.phpcacheremovevista1mis_vistas

Model
Permitemanipularmodelosdelaaplicacin.

create[model]
Crea
un
modelo
utilizando
como
core/console/generators/model.php.

Argumentossecuenciales:
model:nombredemodeloensmallcase.

Ejemplo:

base

la

plantilla

ubicada

php../../core/console/kumbia.phpmodelcreateventa_vehiculo

en

delete[model]
Eliminaunmodelo.
Argumentossecuenciales:
model:nombredemodeloensmallcase.

Ejemplo:

php../../core/console/kumbia.phpmodeldeleteventa_vehiculo

Controller
Permitemanipularcontroladoresdelaaplicacin.

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

Argumentossecuenciales:
controller:nombredecontroladorensmallcase.

Ejemplo:

la

plantilla

ubicada

en

php../../core/console/kumbia.phpcontrollercreateventa_vehiculo

delete[controller]
Eliminauncontrolador.

Argumentossecuenciales:
controller:nombredecontroladorensmallcase.

Ejemplo:

php../../core/console/kumbia.phpcontrollerdeleteventa_vehiculo

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.

<?php
Load::lib('cache')

classCacheConsole
{
publicfunctionclean($params,$group=FALSE)
{
//obtieneeldriverdecache
if(isset($params['driver'])){
$cache=Cache::driver($params['driver'])
}else{
$cache=Cache::driver()
}

//limpialacache
if($cache>clean($group)){
if($group){
echo">Sehalimpiadoelgrupo$group",PHP_EOL

}else{
echo">Sehalimpiadolacache",PHP_EOL

}
}else{
thrownewKumbiaException('Nosehalogradoeliminarel
contenido')
}
}

}
?>

Console::input
EstemtododelaclaseConsolepermiteleerunaentradadesdeelterminal,secaracterizapor
intentarleerlaentradahastaqueestaseavalida.

Console::input($message,$values=null)

$message(string):mensajeamostraralmomentodesolicitarla
entrada.
$values(array):conjuntodevaloresvlidosparalaentrada.

Ejemplo:

$valor=Console::input(Deseacontinuar?,array(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.

CREATETABLEmenus
(
idintuniquenotnullauto_increment,
nombrevarchar(100),
titulovarchar(100)notnull,
primarykey(id)
)


VamosahoraadefinirelmodeloelcualnospermiteinteractuarconlaBD.

[app]/models/menus.php:
<?php
classMenusextendsActiveRecord
{
/**
*Retornalosmenuparaserpaginados
*
*/
publicfunctiongetMenus($page,$ppage=20)
{
return$this>paginate("page:$page","per_page:$ppage",
'order:iddesc')
}
}

Controller
Elcontroladoresencargadodeatenderlaspeticionesdelcliente(ej.browser)yasuvezdedarle
unarespuesta.EnestecontrollervamosadefinirtodaslasoperacionesCRUDquenecesitamos.

[app]/controllers/menus_controller.php:
<?php
/**
*CargadelmodeloMenus...
*/
Load::models('menus')

classMenusControllerextendsAppController{
/**
*Obtieneunalistaparapaginarlosmenus
*/
publicfunctionindex($page=1)
{
$menu=newMenus()
$this>listMenus=$menu>getMenus($page)
}

/**
*CreaunRegistro
*/
publicfunctioncreate()

{
/**
*Severificasielusuarioenvioelform(submit)ysi
ademas
*dentrodelarrayPOSTexisteunollamado"menus"
*elcualaplicalaautocargadeobjetoparaguardarlos
*datosenviadoporPOSTutilizandoautocargadeobjeto
*/
if(Input::hasPost('menus')){
/**
*selepasaalmodeloporconstructorlosdatosdel
formyActiveRecordrecogeesosdatos
*ylosasociaalcampocorrespondientesiempreycuando
seutilicelaconvencin
*model.campo
*/
$menu=newMenus(Input::post('menus'))
//Encasoquefallelaoperacindeguardar
if(!$menu>save()){
Flash::error('FallOperacin')
}else{
Flash::valid('Operacinexitosa')
//EliminamoselPOST,sinoqueremosqueseveanen
elform
Input::delete()
}
}
}

/**
*EditaunRegistro
*
*@paramint$id(requerido)
*/
publicfunctionedit($id)
{
$menu=newMenus()

//severificasisehaenviadoelformulario(submit)
if(Input::hasPost('menus')){

if(!$menu>update(Input::post('menus'))){
Flash::error('FallOperacin')
}else{
Flash::valid('Operacinexitosa')

//enrutandopordefectoalindexdelcontroller
returnRouter::redirect()
}
}else{
//Aplicandolaautocargadeobjeto,paracomenzarla
edicin
$this>menus=$menu>find((int)$id)
}
}

/**
*Eliminarunmenu
*
*@paramint$id(requerido)
*/
publicfunctiondel($id)
{
$menu=newMenus()
if(!$menu>delete((int)$id)){
Flash::error('FallOperacin')
}else{
Flash::valid('Operacinexitosa')
}

//enrutandopordefectoalindexdelcontroller
returnRouter::redirect()
}
}

Vistas
Agregamoslasvistas...

[app]/views/menus/index.phtml
<divclass="content">
<?phpechoView::content()?>
<h3>Menus</h3>
<ul>
<?phpforeach($listMenus>itemsas$item):?>
<li>
<?phpechoHtml::linkAction("edit/$item>id/",'Editar')?>
<?phpechoHtml::linkAction("del/$item>id/",'Borrar')?>
<strong><?phpecho$item>nombre?><?phpecho
$item>titulo?></strong>

</li>
<?phpendforeach?>
</ul>

//ejemplomanualdepaginador,haypartiallistosenformato
digg,clasic,....
<?phpif($listMenus>prev)echo
Html::linkAction("index/$listMenus>prev/",'<<Anterior|')?>
<?phpif($listMenus>next)echo
Html::linkAction("index/$listMenus>next/",'Prximo>>')?>
</div>
[app]/views/menus/create.phtml
<?phpView::content()?>
<h3>Crearmenu<h3>

<?phpechoForm::open()//pordefectollamaalamismaurl?>

<label>Nombre
<?phpechoForm::text('menus.nombre')?></label>

<label>Ttulo
<?phpechoForm::text('menus.titulo')?></label>

<?phpechoForm::submit('Agregar')?>

<?phpechoForm::close()?>
[app]/views/menus/edit.phtml
<?phpView::content()?>
<h3>Editarmenu<h3>

<?phpechoForm::open()//pordefectollamaalamismaurl?>

<label>Nombre
<?phpechoForm::text('menus.nombre')?></label>

<label>Ttulo
<?phpechoForm::text('menus.titulo')?></label>

<?phpechoForm::hidden('menus.id')?>
<?phpechoForm::submit('Actualizar')?>

<?phpechoForm::close()?>

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.

View::partial('paginators/classic',false,array('page'=>$page,
'show'=>8,'url'=>'usuario/lista'))

Digg
Vistadepaginacinestilodigg.

Parmetrosdeconfiguracin:
page:objetoobtenidoalinvocaralpaginador.
show:nmerodepginasquesemostrarnenelpaginador,pordefecto10.
url:urlparalaaccinqueefectalapaginacin,pordefecto"module/controller/page/"yseenva
porparmetroelnmerodepgina.

View::partial('paginators/digg',false,array('page'=>$page,
'show'=>8,'url'=>'usuario/lista'))

Extended

ResultadoFinal

Vistadepaginacinextendida.

Parmetrosdeconfiguracin:
page:objetoobtenidoalinvocaralpaginador.
url:urlparalaaccinqueefectalapaginacin,pordefecto"module/controller/page/"yseenva
porparmetroelnmerodepgina.

View::partial('paginators/extended',false,array('page'=>$page,
'url'=>'usuario/lista'))

Punbb
Vistadepaginacinestilopunbb.

Parmetrosdeconfiguracin:
page:objetoobtenidoalinvocaralpaginador.
show:nmerodepginasquesemostrarnenelpaginador,pordefecto10.
url:urlparalaaccinqueefectalapaginacin,pordefecto"module/controller/page/"yseenva
porparmetroelnmerodepgina.

View::partial('paginators/punbb',false,array('page'=>$page,
'show'=>8,'url'=>'usuario/lista'))

Simple

ResultadoFinal

Vistadepaginacinsimple.

Parmetrosdeconfiguracin:
page:objetoobtenidoalinvocaralpaginador.
url:urlparalaaccinqueefectalapaginacin,pordefecto"module/controller/page/"yseenva
porparmetroelnmerodepgina.

View::partial('paginators/simple',false,array('page'=>$page,
'url'=>'usuario/lista'))

Ejemplodeuso
Supongamosquequeremospaginarunalistadeusuarios.

ParaelmodeloUsuarioenmodels/usuario.php:
<?php
classUsuarioextendsActiveRecord
{
/**
*Muestralosusuariosdecincoencincoutilizandopaginador
*
*@paramint$page
*@returnobject
**/
publicfunctionver($page=1)
{
return$this>paginate("page:$page",'per_page:5')
}
}
?>
ParaelcontroladorUsuarioControllerencontrollers/usuario_controller.php:
<?php
Load::models('usuario')

classUsuarioControllerextendsAppController
{

/**
*Acciondepaginacion
*

*@paramint$page
**/
publicfunctionpage($page=1)
{
$Usuario=newUsuario()
$this>page=$Usuario>ver($page)
}
}
?>

Yenlavistaviews/usuario/page.phtml
<table>
<tr>
<th>Id</th>
<th>Nombre</th>
</tr>
<?phpforeach($page>itemsas$p):?>
<tr>
<td><?phpecho$p>id?></td>
<td><?phpecho$p>nombre?></td>
</tr>
<?phpendforeach?>
</table>

<?phpView::partial('paginators/classic',false,array('page'=>
$page))?>

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

You might also like