Edición de «KumbiaPHP Framework Versión 1.0 Spirit»

De KumbiaPHP Framework Wiki

Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si inicias sesión o creas una cuenta, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.

Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así efectuar la reversión.

Revisión actual Tu texto
Línea 1: Línea 1:
{{cleanupbox
 
|image=[[Archivo:Information_icon4.png|45px]]
 
|imageright=[[Archivo:Information_icon4.png|45px]]
 
|texto ='''Este manual corresponde la versión 1.0 beta 1(Desaconsejada). <br />Se recomienda ver la última versión del [https://github.com/KumbiaPHP/Documentation/tree/master/es Manual de KumbiaPHP 1.0]'''
 
}}
 
 
 
== Introducción ==
 
== Introducción ==
 
En la [https://launchpad.net/kumbia/1.0 versión 1.0](<s>antigua 0.5.1</s>) el enfoque primordial que ha considerado el [[Team_Development_KumbiaPHP_Framework|Equipo de Desarrollo]] gira en torno al rendimiento del framework a nivel de velocidad y mantenibilidad del framework en este sentido hemos desacoplado el core de kumbiaphp framework en una nueva estructura obteniendo grandes resultados, de manera que las pruebas en base a esta versión nos indica que vamos en buen camino y ademas es bastante rápida con los cambios aplicados siempre con las mejores practicas de desarrollo.
 
En la [https://launchpad.net/kumbia/1.0 versión 1.0](<s>antigua 0.5.1</s>) el enfoque primordial que ha considerado el [[Team_Development_KumbiaPHP_Framework|Equipo de Desarrollo]] gira en torno al rendimiento del framework a nivel de velocidad y mantenibilidad del framework en este sentido hemos desacoplado el core de kumbiaphp framework en una nueva estructura obteniendo grandes resultados, de manera que las pruebas en base a esta versión nos indica que vamos en buen camino y ademas es bastante rápida con los cambios aplicados siempre con las mejores practicas de desarrollo.
Línea 24: Línea 18:
 
Como se menciona al principio muchos de estos cambios son a nivel de '''core''', esto significa que haremos pocas adecuaciones para migrar nuestras aplicaciones que hayan sido desarrolladas con la [https://launchpad.net/kumbia/0.5 versión 0.5] para llevarlas hasta la [https://launchpad.net/kumbia/1.0 versión 1.0](<s>antigua 0.5.1</s>), esto con la finalidad de garantizar compatibilidad entre versiones.
 
Como se menciona al principio muchos de estos cambios son a nivel de '''core''', esto significa que haremos pocas adecuaciones para migrar nuestras aplicaciones que hayan sido desarrolladas con la [https://launchpad.net/kumbia/0.5 versión 0.5] para llevarlas hasta la [https://launchpad.net/kumbia/1.0 versión 1.0](<s>antigua 0.5.1</s>), esto con la finalidad de garantizar compatibilidad entre versiones.
 
===¿Por qué Spirit?===
 
===¿Por qué Spirit?===
"Hemos llamado Spirit a la versión 1.0 porque Spirit, [http://es.wikipedia.org/wiki/Spirit nuestro robot de Marte], tiene como características principales, fuerza y velocidad. Fuerza, porque su comunidad cada vez mas grande hace que nuestro framework KumbiaPHP avance a pasos agigantados. Velocidad, porque nuestro core team que pertenece a otro planeta, continuamente esta aplicando las ultimas técnicas y haciendo que otros framework's se queden atrás día a día. En definitiva Spirit, hace que tus aplicaciones vuelen, resulten mas atractivas y fáciles de mantener."
+
"Hemos llamado Spirit a la versión 1.0 porque Spirit, [http://es.wikipedia.org/wiki/Spirit nuestro robot de Marte], tiene como características principales, fuerza y velocidad. Fuerza, porque su comunidad cada vez mas grande hace que nuestro framework KumbiaPHP avance a pasos agigantados. Velocidad, porque nuestro core team que pertenece a otro planeta, continuamente esta aplicando las ultimas técnicas y haciendo que otros frameworks se queden atrás día a día. En definitiva Spirit, hace que tus aplicaciones vuelen, resulten mas atractivas y fáciles de mantener."
  
 
== Migración Rápida ==
 
== Migración Rápida ==
En esta sección se explica de forma rápida y sencilla como migrar nuestras aplicaciones de la <s>versión [https://launchpad.net/kumbia/0.5 0.5]</s> a la [https://launchpad.net/kumbia/1.0 versión 1.0](<s>antigua 0.5.1</s>) en las próximas secciones se explican en detalle los cambios.
+
En esta sección se explica de forma rápida y sencilla como migrar nuestras aplicaciones de la versión [https://launchpad.net/kumbia/0.5 0.5] a la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) en las próximas secciones se explican en detalle los cambios.
 
+
*Si has modificado el archivo '''views/index.phtml''' este fue ubicado en el directorio '''views/templates/default.phtml''', es decir que lo debes sobreescribir o aplicar los cambios que quieras.
*Con la nueva estructura de directorio migrar nuestras aplicaciones de la <s>versión [https://launchpad.net/kumbia/0.5 0.5]</s> es sumamente simple solo se ha copiar nuestra carpeta '''apps/default/''' (donde estan los controllers, models, views, etc) hacia el directorio '''app/''' de [[KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit#Nueva_Estructura_de_Directorios |Nueva Estructura]]
+
*Para inicializar tu aplicación es mejor utilizar el archivo '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo.
 
+
  ;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.
+
/ = admin/autenticar
 
+
Esto sustituye editar el archivo '''apps/default/controllers/application.php''' en su acción '''init()''', solo se ha de agregar en el '''routes.ini''' la ruta que hacemos en el método '''init()'''
*Si has modificado el archivo '''views/index.phtml''' este fue ubicado en el directorio '''views/templates/default.phtml''', es decir que le debes aplicar los cambios que quieras.
 
 
 
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().
 
 
 
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:
 
  ;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador  
 
admin y una acción autenticar / = admin/autenticar
 
 
 
Esto sustituye editar el archivo '''<s>apps/default/controllers/application.php</s>''' en su acción '''init()''', solo se ha de agregar en el '''routes.ini''' la ruta que hacemos en el método '''<s>init()</s>'''
 
 
 
 
*Si en tus modelos utilizas el atributo '''$mode''' para establecer otros datos de conexión, debes reemplazarlo por '''$database''', [[KumbiaPHP_Framework_Versión_1.0_Spirit#databases.ini| ver mas]].
 
*Si en tus modelos utilizas el atributo '''$mode''' para establecer otros datos de conexión, debes reemplazarlo por '''$database''', [[KumbiaPHP_Framework_Versión_1.0_Spirit#databases.ini| ver mas]].
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''
 
 
'''KumbiaPHP 0.5'''
 
<pre>
 
[modules]
 
extensions = kumbia.logger, kumbia.auth
 
</pre>
 
'''KumbiaPHP 1.0'''
 
<pre>
 
[modules]
 
libs = logger, auth
 
</pre>
 
 
== Constante en KumbiaPHP==
 
En la version 1.0 Spirit, se ha creado tres constantes cada cual cumple un objetivo especifico con el fin de brindar mayor flexibilidad al momento de manejar rutas (paths) en el framework.
 
 
=== APP_PATH ===
 
Constante que contiene la ruta absoluta al directorio donde se encuentra nuestra aplicación (app).
 
 
Ejemplo:
 
<pre>
 
echo APP_PATH; //la salida es: /var/www/kumbiaphp/app/ 
 
</pre>
 
 
Esta constante es posible utilizarla para incluir archivos que se encuentre bajo el arbol de directorio de la aplicación, por ejemplo imagine que quiere incluir un archivo que esta en el directio '''app/libs/test.php''' la forma de hacerlo seria.
 
 
<pre>
 
  include_once APP_PATH.'libs/test.php';
 
</pre>
 
 
'''NOTA: siempre será mejor utilizar el [[KumbiaPHP_Framework_Versión_1.0_Spirit#Carga_Selectiva.2C_Inyecci.C3.B3n_de_Dependencias_y_el_Componente_Load |Componente Load]] para incluir dependencias.'''
 
 
=== CORE_PATH ===
 
Constante que contiene la ruta absoluta al directorio donde se encuentra el [[KumbiaPHP_Framework_Versión_1.0_Spirit#Explicando_dir_core.2F |core]] de KumbiaPHP.
 
 
Ejemplo:
 
<pre>
 
echo CORE_PATH; //la salida es: /var/www/kumbiaphp/core/ 
 
</pre>
 
 
Para incluir archivos que se encuentre bajo este arbol de directorio es el mismo procedimiento que se explico para la constante APP_PATH
 
 
'''NOTA: El core de KumbiaPHP en la version 1.0 esta totalmente desacoplado del directorio de la aplicación. [[KumbiaPHP_Framework_Versión_1.0_Spirit#Ventajas_de_esta_nueva_estructura_de_directorios|Ventajas de la Estructura de directorio]]'''
 
 
=== PUBLIC_PATH ===
 
Constante que contiene la URL para el navegador (browser) y apunta a '''app/public/''' para enlazar imágenes, CSS, JavaScript y todo lo que sea ruta para browser.
 
 
Ejemplo:
 
<pre>
 
//Genera un link que ira al controller: controller y action: action
 
<a href="<?php echo PUBLIC_PATH ?>controller/action/" title="Mi Link">Mi Link</a>
 
 
//Enlaza una imagen que esta en public/img/imagen.jpg
 
<img src="<?php echo PUBLIC_PATH ?>img/imagen.jpg" alt="Una Imagen" />
 
 
//Enlaza el archivo CSS en public/css/style.css
 
<link rel="stylesheet" type="text/css" href="<?php echo PUBLIC_PATH ?>css/style.css"/>
 
</pre>
 
 
'''NOTA: siempre será mejor hacer uso de los helpers'''
 
  
 
== Nueva Estructura de Directorios ==
 
== Nueva Estructura de Directorios ==
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:
+
Ahora Kumbia incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:
  
 
<pre>
 
<pre>
spirit/
+
.
 
|-- app
 
|-- app
 
|  |-- application.php
 
|  |-- application.php
 
|  |-- config
 
|  |-- config
 +
|  |  |-- boot.ini
 +
|  |  |-- config.ini
 +
|  |  |-- databases.ini
 +
|  |  `-- routes.ini
 
|  |-- controllers
 
|  |-- controllers
|  |-- extensions
+
|  |-- helpers
|  |  |-- filters
 
|  |-- helpers
 
|  |  `-- scaffolds
 
 
|  |-- index.php
 
|  |-- index.php
|  |-- libs
 
|  |-- locale
 
 
|  |-- model_base.php
 
|  |-- model_base.php
 
|  |-- models
 
|  |-- models
 
|  |-- public
 
|  |-- public
 
|  |-- temp
 
|  |-- temp
 +
|  |  |-- cache
 +
|  |  `-- logs
 
|  `-- views
 
|  `-- views
 
|      |-- errors
 
|      |-- errors
Línea 131: Línea 56:
 
|      `-- templates
 
|      `-- templates
 
|-- core
 
|-- core
|-- console
+
    |-- console
|-- docs
+
    |-- docs
|  |-- extensions
+
    |  |-- LICENSE.txt
|-- helpers
+
    `-- README
|   |  `-- scaffolds
+
    |-- extensions
|-- kumbia
+
    |-- helpers
|-- libs
+
    |-- kumbia
|-- tests
+
    |-- scaffolds
|-- vendors
+
    |-- tests
`-- views
+
    |-- vendors
|      |-- errors
+
    `-- views
|      |-- partials
 
|      `-- templates
 
 
</pre>
 
</pre>
  
Anteriormente [http://www.kumbiaphp.com KumbiaPHP] utilizaba un fichero '''index.php''' el cual servía para enrutar a cada aplicación utilizando inversión de control, esto erá poco flexible y resultaba en un consumo inadecuado de recursos, por lo tanto en esta nueva versión se preparó una nueva estructura de directorios donde cada aplicación posee un directorio independiente con su '''index.php''' (Front Controller) correspondiente el cual se encarga de cargar las librerías del framework.
+
Anteriormente kumbia utilizaba un fichero index.php el cual servía para enrutar a cada aplicación utilizando inversión de control, esto erá poco flexible y resultaba en un consumo inadecuado de recursos, por lo tanto en esta nueva versión se preparó una nueva estructura de directorios donde cada aplicación posee un directorio independiente con su index.php (Front controller) correspondiente el cual se encarga de cargar las librerias del framework.
 
 
Copiando el directorio '''app''', tenemos toda la estructura para un nueva aplicación. Ya que podemos tener tantas aplicaciones como necesitemos con un único core.
 
 
 
Asimismo el núcleo, las extensiones de KumbiaPHP y otras herramientas que utilizarán las aplicaciones de manera global fueron agrupadas en el directorio core.
 
 
 
===Ventajas de esta nueva estructura de directorios===
 
* Mayor Velocidad :-)
 
* Cada aplicación tiene su propio front controller (index.php)
 
* '''Independencia''' total de nuestra aplicación respecto al core del framework.
 
* Cada aplicación tendrá sus '''propios directorios''' (public, temp, libraries, etc). En versiones anteriores si se tenia 40 aplicaciones significaba que todo iba al mismo public (css, img, js, etc).
 
* En cada '''actualización''' de KumbiaPHP, sólo se ha de pasar la carpeta de tu aplicación ("app") a la nueva versión de kumbiaPHP Framework y ya tendremos la última versión del Framework.
 
 
 
===Explicando dir app===
 
Este será el directorio sobre el cual trabajamos el 90% mientras desarrollamos nuestra aplicación. A continuación se explica en detalle cada uno de los directorios disponible para cada aplicación.
 
  
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "
+
Copiando el directorio app, tenemos toda la estructura para un nueva aplicación. Ya que podemos tener tantas aplicaciones como necesitemos con un único core.
!Directorio!!Descripción
 
|-
 
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)
 
|-
 
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''
 
|-
 
|models||Estan agrupados los modelos (models).
 
|-
 
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''
 
|-
 
|extensions||En este directorio se ubican las extensiones para nuestra aplicación, una extensión te permite adicionar nuevas características que serán utilizadas e integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]
 
|-
 
|libs||En este directorio se pueden colocar clases propias con fines específicos o librerías externas al framework (vendors). Estas para ser utilizadas en los controladores (controllers) y/o Modelos (models).
 
|-
 
|temp||Este directorio contiene las carpetas y archivos creados cuando [http://www.kumbiaphp.com/ KumbiaPHP] está cacheando un template, view o partial y cuando realiza operaciones de logs. '''Este directorio necesita permisos de escritura'''.
 
|-
 
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación
 
|-
 
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación.
 
|-
 
|'''application.php'''||Super class de los controladores (ApplicationController). 
 
|-
 
|'''model_base.php'''||Super class de los modelos (ActiveRecord).
 
|}
 
  
===application.php===
+
Asimismo el nucleo, las extensiones de kumbia y otras herramientas que utilizarán las aplicaciones de manera global fueron agrupadas en el directorio core.
Cada vez es mas usado en las aplicaciones creadas en PHP la Programación Orientada a Objetos (POO), KumbiaPHP Framework fomenta el uso de la misma, debemos hacer especial hincapié en el archivo '''application.php''' el cual fue concebido como una superclase (ApplicationController) padre de todos los controladores.
 
 
 
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]
 
 
 
Como se aprecia en la imagen existe una estrecha relación entre '''application.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y métodos creados en el '''ApplicationController''' (application.php) estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.
 
 
 
En esta clase se encuentran dos métodos principales, dichos métodos se comportan como un filtro antes y después de ejecutar un controller.
 
 
 
El método '''initialize()''' se ejecuta antes de llamar al controller.
 
 
 
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.
 
 
 
 
 
----
 
 
 
=== Ejemplo de application.php ===
 
 
 
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]
 
 
 
=== model_base.php ===
 
De la misma manera como se relacionan los controladores con application.php, existe otra relación muy importante entre el '''model_base.php''' y los modelos. Todo lo que se define en model_base.php estará disponible en los modelos ya que es la class padre.
 
 
 
model_base.php es donde esta definida la super clase '''ActiveRecord'''.
 
 
 
  NOTA: Los modelos representan las tablas de nuestra Base de Datos.
 
 
 
 
 
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]
 
 
 
=== Explicando dir core/ ===
 
 
 
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "
 
!Directorio!!Descripción
 
|-
 
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación
 
|-
 
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]
 
|-
 
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones
 
|-
 
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]
 
|-
 
|libs|| En este directorio se encuentran las librerias compartidas por todas las aplicaciones, las cuales el [http://wiki.kumbiaphp.com/Team_Development_KumbiaPHP_Framework Equipo de Desarrollo] se responsabiliza por su mantenimiento.
 
|-
 
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]
 
|-
 
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones
 
|}
 
  
 
== config.ini ==
 
== config.ini ==
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.
+
Se agregan opciones para un manejo mas apropiado de la configuración del framework.
  
 +
*'''databases''' cuando se necesite trabajar con el framework pero sin interactuar con una Base de Datos.
 +
*'''models_autoload''' Auto carga de modelos, util para cuando se manejan muchos modelos no tener la necesidad de cargarlos todos en un momento, sino que se cargan se de acuerdo lo que se necesiten en el controller, todo esto se traduce en mejor rendimiento, [[KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit#Carga_selectiva_de_modelos| leer mas]]
 
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.
 
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.
 
*'''database''' Base de datos a utilizar, especificada en databases.ini.
 
*'''database''' Base de datos a utilizar, especificada en databases.ini.
 
*'''production''' Indica si se encuentra en producción.
 
*'''production''' Indica si se encuentra en producción.
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.
 
*'''locale''' Localización.
 
*'''routes''' Activar enrutamiento estatico.
 
  
<pre>;; Configuracion de Aplicacion
+
<pre>
 +
;; Configuración de Aplicación
  
 
; Explicación de la Configuración:
 
; Explicación de la Configuración:
 
+
; production: Indica si esta en producción
 +
; database: base de datos a utilizar
 
; name: Es el nombre de la aplicación
 
; name: Es el nombre de la aplicación
 
; timezone: Es la zona horaria que usará el framework
 
; timezone: Es la zona horaria que usará el framework
; production: Indica si esta en producción
+
; interactive: Indica si la aplicación se encuentra en modo interactivo
; database: base de datos a utilizar
 
 
; dbdate: Formato de Fecha por defecto de la Applicación
 
; dbdate: Formato de Fecha por defecto de la Applicación
; debug: muestra los errores en pantalla (On|off)
 
; log_exceptions: muestra las excepciones en pantalla (On|off)
 
 
; charset: codificacion de caracteres
 
; charset: codificacion de caracteres
; cache_driver: driver para la cache (file, sqlite, memsqlite)
+
; models_autoload: Habilita la autocarga de modelos
 
; metadata_lifetime: Tiempo de vida de la metadata cacheada
 
; metadata_lifetime: Tiempo de vida de la metadata cacheada
; locale: Localizacion
+
; locale: Localicazion
; routes: Activar enrutamiento estatico
 
  
  
Línea 270: Línea 104:
 
; el contenido del directorio de cache de la aplicacion para que se renueve
 
; el contenido del directorio de cache de la aplicacion para que se renueve
 
; la metadata
 
; la metadata
 +
  
 
[application]
 
[application]
 
name = "KUMBIA PROJECT"
 
name = "KUMBIA PROJECT"
;timezone = "America/New_York"
+
timezone = "America/New_York"
 
production = Off
 
production = Off
 
database = development
 
database = development
Línea 280: Línea 115:
 
log_exceptions = On
 
log_exceptions = On
 
charset = UTF-8
 
charset = UTF-8
cache_driver = file
+
models_autoload = On
 
;metadata_lifetime = "+1 year"
 
;metadata_lifetime = "+1 year"
 
;locale = es_ES
 
;locale = es_ES
;routes = On
 
 
</pre>
 
</pre>
  
Línea 293: Línea 127:
 
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''
 
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''
  
<source lang=php>
+
<source lang=php line>
 
class Usuarios extends ActiveRecord
 
class Usuarios extends ActiveRecord
 
{
 
{
Línea 311: Línea 145:
 
host = localhost
 
host = localhost
 
username = root
 
username = root
password = 1qaz2WSX
+
password =
name = test
+
name = innogest
 
type = mysql
 
type = mysql
  
Línea 318: Línea 152:
 
host = localhost
 
host = localhost
 
username = root
 
username = root
password = 1qaz2WSX
+
password =
 
name = test
 
name = test
type = mssql
+
type = mysql
  
 
[test]
 
[test]
 
host = localhost
 
host = localhost
 
username = root
 
username = root
password = 1qaz2WSX
+
password =
 
name = test
 
name = test
type = mssql
+
type = mysql
 
</pre>
 
</pre>
  
 
== boot.ini ==
 
== boot.ini ==
En este archivo fue eliminado, ahora se recomienda la carga explicita con '''require''' o '''include''' o en su defecto aprovechar la autocarga de librerias de KumbiaPHP.
+
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.
O mejor usar el Load::lib('lib')
+
En este archivo se agregan dos atributos '''kumbia''' y '''extensions''' para que la lectura del mismo sea mas rápida.
 +
 
 +
Extensiones Propias de Kumbiaphp Framework
 +
*logger
 +
*auth
 +
*date
 +
*standard_form
 +
*filter
 +
*acl
 +
*benchmark
 +
*security
 +
 
 +
Extensiones externas al framework
 +
*excel
 +
*fpdf
 +
*mail
 +
*smarty
 +
 
 +
<pre>
 +
; Cargar los modulos de Kumbia en library/
 +
; CONVENCIONES
 +
; La convención para la carga de extensiones (librerías) por medio
 +
; de este archivo es la siguiente:
 +
; kumbia = logger indica que en el directorio library/kumbia/logger
 +
; y a su vez este tiene un archivo logger.php kumbia incluira library/kumbia/logger/logger.php
 +
; lo mismo sucede para las extensiones externas al core del framework, solo que estas no estan
 +
; kumbia, sino en la variable extensions
 +
 
 +
; kumbia: Modulos del framework que se cargaran library/kumbia
 +
; extensions: Modulos a cargar library/
 +
 
 +
[modules]
 +
kumbia = logger, filter
 +
extensions =
 +
</pre>
  
 
== Router ==
 
== Router ==
Línea 356: Línea 224:
 
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.
 
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.
  
En este directorio esta la capa mas externa de nuestras vistas, para aclarar esta idea en esta es donde se coloca la estructura del documento XHTML (doctype, html, head, etc) en la forma como se trabaja en la <s>versión 0.5</s> esto es representado por el archivo <s>'''views/index.phtml'''</s> de esta forma no existe una flexibilidad de manera que podamos cambiar ese template, en la [https://launchpad.net/kumbia/1.0 versión 1.0] se crea un directorio '''views/templates/''' por defecto existe el archivo '''default.phtml''' pero podemos agregar cuantos se desee y poderlo cambiar desde nuestro controlador de la siguiente forma:
+
En este directorio esta la capa mas externa de nuestras vistas, para aclarar esta idea en esta es donde se coloca la estructura del documento XHTML (doctype, html, head, etc) en la forma como se trabaja en la '''versión 0.5''' esto es representado por el archivo '''views/index.phtml''' de esta forma no existe una flexibilidad de manera que podamos cambiar ese template, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se crea un directorio '''views/templates/''' por defecto existe el archivo '''default.phtml''' pero podemos podemos agregar cuantos se desee y poderlo cambiar desde nuestro controlador de la siguiente forma:
 
+
<source lang=php>
 
 
  class PruebaController extends ApplicationController  
 
  class PruebaController extends ApplicationController  
 
  {
 
  {
 
     public $template = 'plantilla';
 
     public $template = 'plantilla';
 
  }
 
  }
</source>
 
 
El atributo '''$template''' existe en la super clase '''Controller''' y tiene un valor por defecto (default) esto significa que el sistema de plantillas de KumbiaPHP Framework buscara dentro de directorio views/templates/ el valor que le demos, por defecto buscara '''default.phtml''' pero en otro caso que veamos conveniente podría ser otro template tal como se muestra en el ejemplo seria '''plantilla.phtml'''
 
 
En la '''version 0.5''' para determinar en que parte del template se debe renderizar se hacia uso de la función "content", ahora esa función se encapsuló en la clase View y se utiliza de la siguiente manera.
 
 
<source lang=php >
 
 
Este es mi template
 
 
<?php View::content() ?>
 
</source>
 
  
'''View::content()''' puede ubicarse en cualquier lugar del template.
+
El atributo '''$template''' existe en la super clase '''Controller''' y tiene un valor por defecto (default) esto significa que el sistema de plantillas del framework buscara dentro de directorio views/templates/ el valor que le demos, por defecto buscara '''default.phtml''' pero en otro caso que veamos conveniente podría ser otro template tal como se muestra en el ejemplo seria '''plantilla.phtml'''
  
 
=== views/partials/ ===
 
=== views/partials/ ===
Línea 385: Línea 240:
  
 
'''views/partials/fecha.phtml'''
 
'''views/partials/fecha.phtml'''
<source lang=php >
+
<source lang=php line>
 
  <div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'>
 
  <div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'>
 
       <i><?php echo date('Y-m-d'); ?></i>
 
       <i><?php echo date('Y-m-d'); ?></i>
Línea 391: Línea 246:
 
</source>
 
</source>
  
Como se aprecia este partials solo mostrará la fecha actual cuando sea invocado, pero como se menciono antes puede contener cualquier información para el usuario, pero aun falta hacer un llamado a este partials para que el mismo sea mostrado este llamado puede ser desde cualquier nivel del sistema de plantilla que ofrece el framework, en la'''versión 0.5''' se hacia uso de la funcion "render_partial", sin embargo con la finalidad de obtener mayor orden e intuitividad, esta función se encapsulo en la clase '''View''',  y basta con hacer en la vista (Templates, views) lo siguiente.
+
Como se aprecia este partials solo mostrará la fecha actual cuando sea invocado, pero como se menciono antes puede contener cualquier información para el usuario, pero aun falta hacer un llamado a este partials para que el mismo sea mostrado este llamado puede ser desde cualquier nivel del sistema de plantilla que ofrece el framework y basta con hacer en la vista (Templates, views) lo siguiente.
  
<source lang=php >
+
<source lang=php line>
  <?php View::partial('fecha') ?>
+
  <?php render_partial('fecha') ?>
 
</source>
 
</source>
  
  
 
'''Describiendo la función de manera mas detallada:'''
 
'''Describiendo la función de manera mas detallada:'''
<source lang=php >
+
<source lang=php line>
   View::partial($partial, $time=false, $params=array())
+
   render_partial($partial, $time=false, $params=array())
 
</source>
 
</source>
  
 
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.
 
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.
  
<source lang=php >
+
<source lang=php line>
   <?php View::partial('fecha', '+4 days') ?>
+
   <?php render_partial('fecha', '+4 days') ?>
 
</source>  
 
</source>  
  
 
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto
 
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto
  
<source lang=php >
+
<source lang=php line>
   <?php View::partial('fecha', false) ?>
+
   <?php render_partial('fecha', false) ?>
 
</source>  
 
</source>  
  
También es posible pasar variables al partial utilizando parámetros con nombre o utilizando como argumento un array. Si estos parámetros se pasan en forma de array soporta cualquier tipo de dato (objecto, array, etc).
+
También es posible pasar variables al partial utilizando parámetros con nombre o utilizando como argumento un array. Si estos parámetros son se pasan en forma de array soporta cualquier tipo de dato (objecto, array, etc).
  
<source lang=php >
+
<source lang=php line>
   <?php View::partial('fecha', false, 'var: valor, var2: valor2') ?>
+
   <?php render_partial('fecha', false, 'var: valor') ?>
 
</source>  
 
</source>  
  
  
<source lang=php >
+
<source lang=php line>
  <?php View::partial('fecha', false, array('var' => 'valor')) ?>
+
  <?php render_partial('fecha', false, array('var' => 'valor')) ?>
 
</source>  
 
</source>  
  
Línea 430: Línea 285:
 
Los modelos ya no se cargan directamente en los partials, esto mejora la velocidad, para hacer uso de los modelos en los partials, el usuario puede instanciar directamente el modelo, la desventaja de esta manera es que el usuario debe haber cargado previamente el modelo haciendo uso de "load_models" en el controller en caso de utilizar carga selectiva de modelos:
 
Los modelos ya no se cargan directamente en los partials, esto mejora la velocidad, para hacer uso de los modelos en los partials, el usuario puede instanciar directamente el modelo, la desventaja de esta manera es que el usuario debe haber cargado previamente el modelo haciendo uso de "load_models" en el controller en caso de utilizar carga selectiva de modelos:
  
<source lang=php >
+
<source lang=php line>
 
  <?php  
 
  <?php  
 
     $Usuario = new Usuario();
 
     $Usuario = new Usuario();
Línea 439: Línea 294:
 
También es posible utilizar el método '''Load::models($model)''', el cual se encarga de cargar la clase de ser necesario, este método solo debe usarse para obtener un modelo para efectuar consultas de recuperación de datos (find, findBy, find_first, etc) preferiblemente.
 
También es posible utilizar el método '''Load::models($model)''', el cual se encarga de cargar la clase de ser necesario, este método solo debe usarse para obtener un modelo para efectuar consultas de recuperación de datos (find, findBy, find_first, etc) preferiblemente.
  
<source lang=php >
+
<source lang=php line>
 
  <?php  
 
  <?php  
 
   Load::models('usuario');
 
   Load::models('usuario');
Línea 445: Línea 300:
 
   $result = $usuario->find(1);
 
   $result = $usuario->find(1);
 
  ?>
 
  ?>
</source>
 
 
Con la intención de ofrecer mayor comodidad, KumbiaPHP también hace posible obtener una instancia de un modelo directamente haciendo uso del método '''[[KumbiaPHP_Framework_Versión_1.0_Spirit#Load::model.28.24model.29 |Load::model($modelo)]]'''.
 
 
<source lang=php >
 
<?php
 
  $result = Load::model('usuario')->find(1);
 
?>
 
</source>
 
 
=== View::content()===
 
Este método de la clase '''View''' viene a remplazar la función '''content()''', esta se utiliza para indicar donde [http://www.kumbiaphp.com KumbiaPHP] debe renderizar (mostrar) el contenido almacenado en el buffer de salida, es decir el próximo nivel de la vista.
 
 
Su uso para las vistas de las acciones esta íntimamente ligado a los '''echo''' o '''print''' que efectué el usuario, asimismo determina el lugar donde se mostrarán los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:
 
 
<source lang=php >
 
<?php
 
  class SaludoController extends ApplicationController
 
  {
 
      public function hola()
 
      {
 
          Flash::success('Hola mundo');
 
      }
 
  }
 
?>
 
</source>
 
 
Y en mi vista "hola.phtml"
 
 
<source lang=php >
 
  Saludo realizado:
 
 
  <?php View::content() ?>
 
</source>
 
 
===View::helpers($helper)===
 
Un '''''helpers''''' representa una ayuda a nivel de las vistas (view), esto quiere decir siendo consistente con el m'''V'''c solo deben ser utilizados en las vistas.
 
 
Los '''''helpers''''' estan ubicados en '''miapp/extensions/helpers/''', en ese directorio pueden existir tantos helpers como necesitemos [http://www.kumbiaphp.com KumbiaPHP], pero tambien pueden existir helpers en '''core/extensions/helpers/''' en estos casos el framework da prioridad a los helpers ubicados en el directorio de la aplicación, esto quiere decir que si existen dos archivos con el mismo nombre en los directorios helpers antes descrito [http://www.kumbiaphp.com KumbiaPHP] cargara el que se encuentra ubicado en el directorio de la aplicación (app).
 
 
Estos '''''helpers''''' pueden ser métodos con fines como formatear fechas, creación de tags HTML personalizados adecuados a las necesidades de nuestra aplicación, etc. veamos un ejemplo de un helpers.
 
 
<source lang=php >
 
 
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php
 
 
class MiHelper
 
{
 
/**
 
* Construye una lista desplegable para países
 
**/
 
public static function paisSelect($id, $value=null) {
 
    //carga el modelo models/pais.php
 
    $Pais = Load::model('pais');
 
 
    $code = "<select name=\"$id\" id=\"$id\">";
 
    foreach($Pais->find() as $pais) {
 
        $code .= "<option value=\"$pais->id\"";
 
        if($pais->id == $value) {
 
            $code .= ' selected="selected"';
 
        }
 
        $nombre = htmlspecialchars($pais->nombre);
 
        $code .= ">$nombre</option>";
 
    }
 
    $code .= '</select>';
 
 
    echo $code;
 
}
 
</source>
 
 
Como vemos en el helper anterior se construye un tag select de acuerdo a ciertas necesidades y este representa una salida, es decir un view por eso se utilizan en las vistas (views) para hacer buen uso del MVC, la forma de utilizar el helper anterior en cualquier vista seria de la siguiente manera.
 
 
<source lang=php >
 
<?php
 
//Esta es una vista cualquiera
 
 
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero
 
//cargamos el helpers
 
View::helpers('MiHelper')
 
 
//Hacemos uso del helpers, con esto tendremos un select en el view
 
MiHelpers::paisSelect(1)
 
 
?>
 
 
</source>
 
 
=== Utilizando el método render($view, [$template]) ===
 
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.
 
 
Este es un método que es muy poderoso con una utilización correcta del mismo, en la versión 1.0 lo hemos extendido para ofrecer mas flexibilidad en el manejo de las vistas, el cual nos permite de forma dinámica poder cambiar un view y un [[#views.2Ftemplates.2F | Template]] (el template es opcional) esto nos permite tener varias vistas (views) para la misma action incluso varios [[#views.2Ftemplates.2F | Template]].
 
 
==== ¿De que sirve esto? ====
 
Esto es una de las ventajas del manejo de vistas de [http://www.kumbiaphp.com KumbiaPHP] y nos sirve para muchas cosas. Por ej: Si tenemos una aplicación web y también se quiere que esta pueda ser accedida desde dispositivos móviles (celular, PDA, etc.) no es necesario programar toda la aplicación de nuevo, sino que simplemente se cambia la vista pero lo mas importante es que el controlador sigue siendo el mismo.
 
 
==== Vamos a lo Práctico ====
 
Tenemos un controlador con una acción, pero deseamos que dicha acción tenga dos vistas asociadas y poderlas cambiar según sea el caso, el cambio de vista se dará de acuerdo a un parámetro que recibirá la acción del controlador.
 
 
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''
 
 
<source lang=php>
 
<?php
 
class BlogController extends ApplicationController
 
{
 
    public function saludo($var=null)
 
    {
 
        $this->usuario = 'Usuario';
 
    if($var == 'adios'){
 
            //cambiamos el view
 
            $this->render('adios');
 
    }
 
    }
 
}
 
</source>
 
 
Como se aprecia se cambiara el view de la acción si el parámetro es "adios" sino es pasado ningún parámetro KumbiaPHP seguirá la convención que buscara el directorio de views la vista asociada al nombre de la acción.
 
 
Ahora tenemos las vistas.
 
 
'''app/views/blog/saludo.phtml'''  (vista por defecto de la acción).
 
 
<source lang=php>
 
  <?php echo "Bienvenido $usuario" ?>
 
</source>
 
 
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:
 
 
  http://dominio.com/blog/saludo/
 
 
'''app/views/blog/adios.phtml'''  (vista cuando existe el parámetro).
 
 
<source lang=php>
 
  <?php echo "Adios $usuario" ?>
 
</source>
 
 
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:
 
 
  http://dominio.com/blog/saludo/adios/
 
 
===== Cambiando el Template con método render($view, $template) =====
 
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.
 
 
<source lang=php>
 
<?php
 
class BlogController extends ApplicationController
 
{
 
    public function saludo($var=null)
 
    {
 
        $this->usuario = 'Usuario';
 
    if($var == 'adios'){
 
            //cambiamos el view y el template
 
            $this->render('adios', 'otro_template');
 
    }
 
    }
 
}
 
</source>
 
 
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.
 
 
===== Ahora sin Template render($view, null) =====
 
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.
 
 
<source lang=php>
 
<?php
 
class BlogController extends ApplicationController
 
{
 
    public function saludo($var=null)
 
    {
 
        $this->usuario = 'Usuario';
 
    if($var == 'adios'){
 
            //cambiamos el view y sin template
 
            $this->render('adios', null);
 
    }
 
    }
 
}
 
</source>
 
 
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.
 
 
===== Ahora sin view render(null, [$template]) =====
 
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.
 
 
<source lang=php>
 
<?php
 
class BlogController extends ApplicationController
 
{
 
    public function saludo($var=null)
 
    {
 
        $this->usuario = 'Usuario';
 
    if($var == 'adios'){
 
            //Mostrando un mensaje desde la acción
 
            Flash::notice('Adios '.$this->usuario);
 
 
            //sin el view y con el template por defecto
 
            $this->render(null);
 
    }
 
    }
 
}
 
</source>
 
 
===== Ahora sin view y sin template render(null, null) =====
 
Ahora indicamos que no deseamos mostrar el View de la acción y el Template, veamos la misma acción pero sin el view y sin template.
 
 
<source lang=php>
 
<?php
 
class BlogController extends ApplicationController
 
{
 
    public function saludo($var=null)
 
    {
 
        $this->usuario = 'Usuario';
 
    if($var == 'adios'){
 
            //KumbiaPHP no mostrará nada
 
            $this->render(null, null);
 
           
 
            //enrutamos a otro controller
 
            return Router::route_to('controller: otro_controller');
 
    }
 
    }
 
}
 
 
</source>
 
</source>
  
Línea 699: Línea 335:
  
 
==Cache==
 
==Cache==
El componente cache fué mejorado y ahora posee una implementación utilizando los patrones de diseño factory y singleton, para hacer uso de la cache es necesario tener permisos de escritura en el directorio "cache" (para el caso de los manejadores "sqlite" y "file").  
+
El componente cache fué mejorado y ahora posee una implementación estática, para hacer uso de la cache es necesario tener permisos de escritura en el directorio "cache". Los métodos de la clase Cache son los siguientes:
 
 
Puedes obtener un driver de Cache utilizando el metodo '''driver''' que te proporciona la clase Cache.
 
 
 
===Cache::driver($driver=null)===
 
Este metodo permite obtener un manejador de cache específico, si no se indica, se obtiene el manejador de cache por defecto indicado en el '''config.ini'''.
 
 
 
Ejemplos:
 
 
 
<source lang=php>
 
// cache por defecto
 
$data = Cache::driver()->get('data');
 
 
 
// manejador para memcache
 
$data_memcache = Cache::driver('memcache')->get('data');
 
 
 
// manejador para cache con APC
 
$data_apc = Cache::driver('APC')->get('data');
 
</source>
 
 
 
 
 
Todos los manejadores de cache comparten métodos comunes indicados através de la clase abstracta '''Cache''' he implementados especificamente en cada manejador, los metodos de los manejadores de cache son los siguientes:
 
  
===get($id, $group='default')===
+
===Cache::get($id, $group='default')===
 
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.
 
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.
  
Línea 728: Línea 343:
 
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")
 
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")
  
<source lang=php>
+
<pre>
$data = Cache::driver()->get('data');
+
$data = Cache::get('data');
</source>
+
</pre>
  
===save($value, $lifetime=null, $id=false, $group='default')===
+
===Cache::save($value, $lifetime=null, $id=false, $group='default')===
 
Guarda los datos a cachear.
 
Guarda los datos a cachear.
  
 
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br>
 
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br>
string '''$lifetime''': tiempo de vida de los datos (formato de [http://es2.php.net/manual/en/function.strtotime.php strtotime]), si es null, los datos no expiran nunca.<br>
+
string '''$lifetime''': tiempo de vida de los datos (formato de [http://fr.php.net/manual/es/function.strtotime.php strtotime]), si es null, los datos no expiran nunca.<br>
 
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br>
 
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br>
 
string '''$group''': grupo al cual pertenece
 
string '''$group''': grupo al cual pertenece
  
<source lang=php>
+
<pre>
<?php if($data = Cache::driver()->get('data')): ?>
+
<?php if($data = Cache::get('data')): ?>
 
     <?php echo $data ?>
 
     <?php echo $data ?>
 
<?php else: ?>
 
<?php else: ?>
Línea 748: Línea 363:
 
     <?php  
 
     <?php  
 
         $data = ob_get_contents();
 
         $data = ob_get_contents();
         Cache::driver()->save($data, '+21 days');
+
         Cache::save($data, '+21 days');
 
         ob_end_flush();         
 
         ob_end_flush();         
 
     ?>
 
     ?>
 
<?php endif; ?>     
 
<?php endif; ?>     
</source>
+
</pre>
  
 +
<pre>
 +
Cache::save('hola', null, 'data');
 +
$data = Cache::get('hola');
 +
</pre>
  
<source lang=php>
+
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de Kumbia.
Cache::driver()->save('hola', null, 'data');
 
$data = Cache::driver()->get('data');
 
</source>
 
 
 
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.
 
  
===start($lifetime, $id, $group='default')===
+
===Cache::start($lifetime, $id, $group='default')===
Cachea capturando el buffer de salida, se debe utilizar en conjunto a "end()" para terminar la captura, si el elemento esta cacheado entonces lo retorna.
+
Cachea capturando el buffer de salida, se debe utilizar en conjunto a "Cache::end()" para terminar la captura, si el elemento esta cacheado entonces lo retorna.
  
 
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br>
 
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br>
Línea 769: Línea 383:
 
string '''$group''': grupo al cual pertenece
 
string '''$group''': grupo al cual pertenece
  
<source lang=php>
+
<pre>
<?php if($data = Cache::driver()->start('+1 day','data')): ?>
+
<?php if($data = Cache::start('+1 day','data')): ?>
 
     <?php echo $data ?>
 
     <?php echo $data ?>
 
<?php else: ?>
 
<?php else: ?>
 
     Hola
 
     Hola
     <?php Cache::driver()->end()?>
+
     <?php Cache::end()?>
 
<?php endif; ?>     
 
<?php endif; ?>     
</source>
+
</pre>
  
===end()===
+
===Cache::end()===
 
Guarda los datos en la cache tomados del buffer de salida.
 
Guarda los datos en la cache tomados del buffer de salida.
  
===clean($group=false)===
+
===Cache::clean($group=false)===
 
Limpia la cache. Si no se indica grupo limpia toda la cache.
 
Limpia la cache. Si no se indica grupo limpia toda la cache.
  
<source lang=php>
+
<pre>
Cache::driver()->clean('default');
+
Cache::clean('default');
</source>
+
</pre>
  
===remove($id, $group='default')===
+
===Cache::remove($id, $group='default')===
 
Elimina un elemento específico de la cache
 
Elimina un elemento específico de la cache
  
<source lang=php>
+
<pre>
Cache::driver()->remove('data');
+
Cache::remove('data');
</source>
+
</pre>
 +
 
 +
===Cache::active($active)===
 +
Activa el uso de la cache
 +
 
 +
<pre>
 +
Cache::active(true);
 +
</pre>
  
 
==Cacheo automático de views y templates==
 
==Cacheo automático de views y templates==
Línea 817: Línea 438:
 
Ahora se ha definido una forma concreta para el paso de parámetros en los validadores y asimismo se adicionaron parámetros para personalizar los mensajes de error.
 
Ahora se ha definido una forma concreta para el paso de parámetros en los validadores y asimismo se adicionaron parámetros para personalizar los mensajes de error.
  
<source lang=php>
+
<pre>
 
class Model extends ActiveRecord
 
class Model extends ActiveRecord
 
{
 
{
Línea 826: Línea 447:
 
     }
 
     }
 
}
 
}
</source>
+
</pre>
  
 
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...
 
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...
Línea 838: Línea 459:
 
Parametros con nombre:<br>
 
Parametros con nombre:<br>
 
message: mensaje a mostrar<br>
 
message: mensaje a mostrar<br>
field: nombre del campo (muestra un mensaje con el valor del campo)
+
field: nombre del campo
  
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.
+
<pre>
 
 
<source lang=php>
 
...
 
 
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')
 
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')
 
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))
 
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))
...
+
</pre>
</source>
 
 
 
o
 
 
 
<source lang=php>
 
...
 
$this->validates_uniqueness_of('cedula', 'field: cedula')
 
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))
 
...
 
</source>
 
  
 
===validates_date_in($field, $params=array())===
 
===validates_date_in($field, $params=array())===
Línea 868: Línea 476:
 
field: nombre del campo
 
field: nombre del campo
  
<source lang=php>
+
<pre>
...
 
 
$this->validates_date_in('fecha', 'message: Fecha invalida')
 
$this->validates_date_in('fecha', 'message: Fecha invalida')
 
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))
 
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))
...
+
</pre>
</source>
 
  
  
Línea 886: Línea 492:
 
field: nombre del campo
 
field: nombre del campo
  
<source lang=php>
+
<pre>
...
 
 
$this->validates_presence_of('fecha_opt', 'field: Fecha')
 
$this->validates_presence_of('fecha_opt', 'field: Fecha')
...
+
</pre>
</source>
 
  
  
 
===validates_length_of($field, $max, $min=0, $params=array())===
 
===validates_length_of($field, $max, $min=0, $params=array())===
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo
+
Valida que el campo no sea nulo
  
 
string '''$field''': campo a validar<br>
 
string '''$field''': campo a validar<br>
Línea 906: Línea 510:
 
field: nombre del campo
 
field: nombre del campo
  
<source lang=php>
+
<pre>
...
 
 
$this->validates_length_of('nombre', '25')
 
$this->validates_length_of('nombre', '25')
 
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')
 
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')
 
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))
 
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))
...
+
</pre>
</source>
+
 
  
 
===validates_inclusion_in($field, $list, $params=array())===
 
===validates_inclusion_in($field, $list, $params=array())===
Línea 925: Línea 528:
 
field: nombre del campo
 
field: nombre del campo
  
<source lang=php>
+
<pre>
...
 
 
$this->validates_inclusion_in('seleccion', array('a', 'b'))
 
$this->validates_inclusion_in('seleccion', array('a', 'b'))
...
+
</pre>
</source>
 
  
  
Línea 943: Línea 544:
 
field: nombre del campo
 
field: nombre del campo
  
<source lang=php>
+
<pre>
...
 
 
$this->validates_exclusion_of('seleccion', array('a', 'b'))
 
$this->validates_exclusion_of('seleccion', array('a', 'b'))
...
+
</pre>
</source>
 
  
 
===validates_format_of($field, $pattern, $params=array())===
 
===validates_format_of($field, $pattern, $params=array())===
Línea 960: Línea 559:
 
field: nombre del campo
 
field: nombre del campo
  
<source lang=php>
+
<pre>
...
 
 
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')
 
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')
...
+
</pre>
</source>
+
 
 +
===validates_format_of($field, $pattern, $params=array())===
 +
Valida que el campo coincida con el patron indicado
 +
 
 +
string '''$field''': campo a validar<br>
 +
array '''$pattern''': expresion regular compatible con perl<br>
 +
array '''$params''': array de parametros con nombre
 +
 
 +
Parametros con nombre:<br>
 +
message: mensaje a mostrar<br>
 +
field: nombre del campo
  
 +
<pre>
 +
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')
 +
</pre>
  
  
Línea 978: Línea 589:
 
field: nombre del campo
 
field: nombre del campo
  
<source lang=php>
+
<pre>
...
 
 
$this->validates_numericality_of('cedula')
 
$this->validates_numericality_of('cedula')
...
+
</pre>
</source>
 
  
  
Línea 995: Línea 604:
 
field: nombre del campo
 
field: nombre del campo
  
<source lang=php>
+
<pre>
...
 
 
$this->validates_email_in('email')
 
$this->validates_email_in('email')
...
+
</pre>
</source>
 
  
 
==Modos de una Aplicación==
 
==Modos de una Aplicación==
Línea 1005: Línea 612:
  
 
===Production===
 
===Production===
Indicando en el config.ini '''"production = On"''', se entra en el modo de producción, en este la cache de kumbiaphp framework esta activada y se cachea información necesaria para agilizar la carga de la aplicación tal como la metadata de la base datos (información de tablas y campos), asimismo las vistas que el usuario desee cachear.
+
Indicando en el config.ini '''"production = On"''', se entra en el modo de producción, en este la cache de kumbiaphp framework esta activada y se cachea información necesaria para agilizar la carga de la aplicación tal como la metadata de la base datos (información de tablas y campos), asimismo las vistas que el usuario desee cachear.  
  
 
===Development===
 
===Development===
Indicando en el config.ini '''"production = Off"''', se entra en el modo de desarrollo, en este la cache de [http://www.kumbiaphp.com KumbiaPHP] esta desactivada y cualquier cambio que se haga en los campos y tablas de la base de datos (adición de campos, etc), vistas de la aplicación que se cacheen, surtirán efecto inmediatamente.
+
Indicando en el config.ini '''"production = Off"''', se entra en el modo de desarrollo, en este la cache de kumbiaphp framework esta desactivada y cualquier cambio que se haga en los campos y tablas de la base de datos (adición de campos, etc), vistas de la aplicación que se cacheen, surtirán efecto inmediatamente.
  
La para utilizar manualmente la cache de [http://www.kumbiaphp.com KumbiaPHP] debes cargarla explicitamente indicándola en el boot.ini o utilizando el componente '''Load'''.
+
La cache de kumbiaphp framework se puede activar nuevamente utilizando el método active de la clase Cache.
  
<source lang=php>
+
<pre>
Load::lib('cache');
+
Cache::active(true);
</source>
+
</pre>
  
'''Cuando se cambia de modo, es necesario limpiar la cache que [http://www.kumbiaphp.com KumbiaPHP] ha creado para que se pueda renovar los nuevos metadatos y vistas, esto se hace simplemente eliminando el contenido del directorio de cache para la aplicación.'''
+
'''Cuando se cambia de modo, es necesario limpiar la cache que kumbiaphp framework ha creado para que se pueda renovar los nuevos metadatos y vistas, esto se hace simplemente eliminando el contenido del directorio de cache para la aplicación, en el caso de la aplicación por defecto sería el directorio cache/default/.'''
  
 
== Carga selectiva de modelos ==
 
== Carga selectiva de modelos ==
 
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se puede cargar solo los modelos que el controlador requiera, de esa manera se optimiza los procesos de la aplicación y consume menos recursos. Para utilizar la carga selectiva, es conveniente deshabilitar la autocarga de modelos en el config.ini con '''"models_autoload = Off"'''.
 
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se puede cargar solo los modelos que el controlador requiera, de esa manera se optimiza los procesos de la aplicación y consume menos recursos. Para utilizar la carga selectiva, es conveniente deshabilitar la autocarga de modelos en el config.ini con '''"models_autoload = Off"'''.
  
==== Load::models($model) ====
+
Para cargar los modelos en el controlador se utiliza el método estático '''"Load::models($modelo)"'''
Carga los modelos, se pueden cargar varios de manera simultánea indicándolos como argumentos múltiples del método o mediante un array. Asimismo se pueden cargar directorios completos de modelos.
 
  
Si la carga se efectúa en el controlador, automaticamente una instancia del modelo es cargada en un atributo del controlador correspondiente al nombre del modelo en notación camelcase.
+
El parámetro '''$modelo''' puede ser un directorio y/o archivo, en el caso de ser el archivo debe ser igual al nombre del mismo.  
  
''NOTA: El parámetro '''$model''' puede ser un directorio y/o archivo, en el caso de ser el archivo debe ser igual al nombre del mismo.''
+
<source lang=php line>
 
+
class UsuarioController extends ApplicationController {
<source lang=php >
 
class UsuarioController extends ApplicationController  
 
{
 
 
   public function index()
 
   public function index()
 
   {
 
   {
Línea 1040: Línea 643:
 
</source>
 
</source>
  
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.
+
Asimismo se puede indicar con el atributo de controlador $models.
  
<source lang=php >
+
<source lang=php line>
 
class UsuarioController extends ApplicationController {
 
class UsuarioController extends ApplicationController {
  
Línea 1053: Línea 656:
 
</source>
 
</source>
  
Cargando un directorio de modelos
+
'''Uso avanzado'''
  
<source lang=php >
+
<source lang=php line>
 
class UsuarioController extends ApplicationController {
 
class UsuarioController extends ApplicationController {
 
    
 
    
Línea 1069: Línea 672:
  
 
}
 
}
</source>
 
 
==== Load::model($model) ====
 
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.
 
 
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''
 
 
<source lang=php >
 
/**
 
* Construye una lista desplegable para países
 
**/
 
function pais_select($id, $value=null) {
 
    //carga el modelo models/pais.php
 
    $Pais = Load::model('pais');
 
 
    $code = "<select name=\"$id\" id=\"$id\">";
 
    foreach($Pais->find() as $pais) {
 
        $code .= "<option value=\"$pais->id\"";
 
        if($pais->id == $value) {
 
            $code .= ' selected="selected"';
 
        }
 
        $nombre = htmlspecialchars($pais->nombre);
 
        $code .= ">$nombre</option>";
 
    }
 
    $code .= '</select>';
 
 
    return $code;
 
}
 
</source>
 
 
Uso avanzado...
 
 
<source lang=php >
 
...
 
    //busca el país con ID 1
 
    Load::model('pais')->find(1);
 
 
    //carga el modelo ubicado en models/dir/user.php
 
    Load::model('dir/user')->find();
 
 
    //carga el modelo ubicado en models/user_group.php
 
    Load::model('user_group')->find();
 
 
...
 
 
</source>
 
</source>
  
Línea 1141: Línea 700:
 
   
 
   
 
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.
 
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.
<source lang=php>
+
<pre>
 
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?>
 
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?>
</source>
+
</pre>
 
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso
 
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso
 +
 +
  
 
== Nuevo Helper ==
 
== Nuevo Helper ==
Línea 1164: Línea 725:
 
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.
 
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.
  
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.
+
Filter dispone de un método estático "Filter::get" el cuál permite filtrar el elemento indicado.
  
 
=== Filter::get($s, $options=array()) ===
 
=== Filter::get($s, $options=array()) ===
  
'''$s (mixed)''': el valor a filtrar.
+
'''$s (string, array, object)''': array, objeto, o string a filtrar.
 
<br>
 
<br>
 
'''$options (array)''': array de configuración del filtro.
 
'''$options (array)''': array de configuración del filtro.
  
Los filtros se aplican al valor indicado.
+
Los filtros se aplican de manera recursiva en los arrays y objetos.
  
 
Ejemplo:
 
Ejemplo:
<source lang=php>  
+
<pre>
 
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));
 
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));
</source>
+
</pre>
  
 
Asimismo se pueden aplicar filtros en cadena.
 
Asimismo se pueden aplicar filtros en cadena.
<source lang=php>  
+
<pre>
 
$value = Filter::get($s, 'trim', 'addslashes');
 
$value = Filter::get($s, 'trim', 'addslashes');
</source>
+
</pre>
 
 
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.
 
  
=== Filter::get_array($array, $options=array()) ===
+
Los filtros en cadena no aceptan opciones de configuración, tomando las opciones por defecto.
 
 
'''$array (array)''': un array de elementos a filtrar.
 
<br>
 
'''$options (array)''': array de configuración del filtro.
 
 
 
Los filtros se aplican a cada elemento del array.
 
 
 
Ejemplo:
 
<source lang=php>
 
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));
 
</source>
 
 
 
 
 
<source lang=php>
 
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));
 
</source>
 
 
 
=== Filter::get_object($object, $options=array()) ===
 
 
 
'''$object (object)''': objeto a filtrar.
 
<br>
 
'''$options (array)''': array de configuración del filtro.
 
 
 
Los filtros se aplican a cada atributo del objeto.
 
 
 
Ejemplo:
 
<source lang=php>
 
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));
 
</source>
 
  
 
=== Filtros ===
 
=== Filtros ===
Línea 1223: Línea 753:
 
Escapa las comillas dobles y simples en una cadena de texto.
 
Escapa las comillas dobles y simples en una cadena de texto.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('hola "gente"', 'addslashes');
 
$value = Filter::get('hola "gente"', 'addslashes');
</source>
+
</pre>
  
 
==== alnum ====
 
==== alnum ====
 
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.
 
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('hola "gente112"', 'alnum');
 
$value = Filter::get('hola "gente112"', 'alnum');
</source>
+
</pre>
  
 
==== alpha ====
 
==== alpha ====
 
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.
 
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('hola "gente112"', 'alpha');
 
$value = Filter::get('hola "gente112"', 'alpha');
</source>
+
</pre>
  
 
==== date ====
 
==== date ====
 
Verifica que sea una fecha valida en el formato YYYY-MM-DD.
 
Verifica que sea una fecha valida en el formato YYYY-MM-DD.
  
<source lang=php>
+
<pre>
if(Filter::get($s, 'date')) {
+
if(Filter::date($s, 'date')) {
 
     ...
 
     ...
 
}
 
}
</source>
+
</pre>
  
 
==== digits ====
 
==== digits ====
Filtra la cadena eliminando los caracteres que no son digitos.
+
Filtra la cadena eliminando los caracteres que nos son digitos.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('hola "gente112"', 'digits');
 
$value = Filter::get('hola "gente112"', 'digits');
</source>
+
</pre>
  
 
==== htmlentities ====
 
==== htmlentities ====
 
Escapa los elementos del lenguaje html con sus correspondientes entidades.
 
Escapa los elementos del lenguaje html con sus correspondientes entidades.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('<p>"hola"</p>', 'htmlentities');
 
$value = Filter::get('<p>"hola"</p>', 'htmlentities');
</source>
+
</pre>
  
 
'''Opciones:'''<br>
 
'''Opciones:'''<br>
Línea 1270: Línea 800:
 
Escapa caracteres especial de html.
 
Escapa caracteres especial de html.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');
 
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');
</source>
+
</pre>
  
 
'''Opciones:'''<br>
 
'''Opciones:'''<br>
Línea 1280: Línea 810:
 
Convierte un valor a tipo entero.
 
Convierte un valor a tipo entero.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('1.2', 'int');
 
$value = Filter::get('1.2', 'int');
</source>
+
</pre>
  
 
==== ipv4 ====
 
==== ipv4 ====
 
Verifica si la cadena tiene el formato ipv4.
 
Verifica si la cadena tiene el formato ipv4.
  
<source lang=php>
+
<pre>
 
if(Filter::get($s, 'ipv4')) {
 
if(Filter::get($s, 'ipv4')) {
 
     ...
 
     ...
 
}
 
}
</source>
+
</pre>
  
 
==== lower ====
 
==== lower ====
 
Convierte una cadena de texto a minusculas.
 
Convierte una cadena de texto a minusculas.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('TEXTO', 'lower');
 
$value = Filter::get('TEXTO', 'lower');
</source>
+
</pre>
  
 
==== md5 ====
 
==== md5 ====
 
Calcula el hash md5 para el valor indicado.
 
Calcula el hash md5 para el valor indicado.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('TEXTO', 'md5', array('binary' => true));
 
$value = Filter::get('TEXTO', 'md5', array('binary' => true));
</source>
+
</pre>
  
 
'''Opciones:'''<br>
 
'''Opciones:'''<br>
Línea 1313: Línea 843:
 
Convierte el caracter de nueva linea a "&lt;br&gt;".
 
Convierte el caracter de nueva linea a "&lt;br&gt;".
  
<source lang=php>
+
<pre>
 
$value = Filter::get('TEXTO\nTexto2', 'nl2br');
 
$value = Filter::get('TEXTO\nTexto2', 'nl2br');
</source>
+
</pre>
  
 
==== numeric ====
 
==== numeric ====
 
Filtra una cadena solo permitiendo valores numericos.
 
Filtra una cadena solo permitiendo valores numericos.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('a1.2', 'numeric');
 
$value = Filter::get('a1.2', 'numeric');
</source>
+
</pre>
  
 
==== stripslashes ====
 
==== stripslashes ====
 
Filtra una cadena haciendo la operación inversa a addslashes.
 
Filtra una cadena haciendo la operación inversa a addslashes.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('\"Hola\"', 'stripslashes');
 
$value = Filter::get('\"Hola\"', 'stripslashes');
</source>
+
</pre>
  
 
==== stripspace ====
 
==== stripspace ====
 
Elimina los espacios.
 
Elimina los espacios.
  
<source lang=php>
+
<pre>
$value = Filter::get(' Hola  ', 'stripspace');
+
$value = Filter::get('a1.2', 'numeric');
</source>
+
</pre>
  
 
==== striptags ====
 
==== striptags ====
 
Elimina las etiquetas HTML.
 
Elimina las etiquetas HTML.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('<p>Hola</p>', 'striptags');
 
$value = Filter::get('<p>Hola</p>', 'striptags');
</source>
+
</pre>
  
 
==== trim ====
 
==== trim ====
 
Elimina los espacios en blanco a la izquiera y a la derecha.
 
Elimina los espacios en blanco a la izquiera y a la derecha.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('  Hola  ', 'trim');
 
$value = Filter::get('  Hola  ', 'trim');
</source>
+
</pre>
  
 
==== upper ====
 
==== upper ====
 
Convierte la cadena a mayúsculas.
 
Convierte la cadena a mayúsculas.
  
<source lang=php>
+
<pre>
 
$value = Filter::get('hola', 'upper');
 
$value = Filter::get('hola', 'upper');
</source>
+
</pre>
  
 
=== Extendiendo el componente Filter ===
 
=== Extendiendo el componente Filter ===
 
El componente Filter puede extenderse permitiendo al usuario crear sus propios filtros, para este fin el usuario debe hacer uso de la interface "FilterInterface", la cual se describe a continuación:
 
El componente Filter puede extenderse permitiendo al usuario crear sus propios filtros, para este fin el usuario debe hacer uso de la interface "FilterInterface", la cual se describe a continuación:
  
<source lang=php>
+
<pre>
 
interface FilterInterface
 
interface FilterInterface
 
{
 
{
Línea 1373: Línea 903:
 
     public static function execute ($s, $options);
 
     public static function execute ($s, $options);
 
}
 
}
</source>
+
</pre>
  
Los filtros de usuario deben ubicarse en el directorio "app/extensions/filters/".
+
Los filtros de usuario deben ubicarse en el directorio "app/filters".
  
 
Por convenio la clase que corresponde al filtro debe llevar el sufijo "Filter" y el archivo debe llamarse igual que la clase pero en notación smallcase.
 
Por convenio la clase que corresponde al filtro debe llevar el sufijo "Filter" y el archivo debe llamarse igual que la clase pero en notación smallcase.
  
 
'''Ejemplo:'''
 
'''Ejemplo:'''
 +
<br>
 
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.
 
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.
  
app/extensions/filters/file_extension_filter.php
+
app/filters/file_extension_filter.php
<source lang=php >
+
<pre>
 
/**
 
/**
  * Filtro para obtener la extensión de un archivo
+
  * Filtro para obtener la extension de un archivo
 
  **/
 
  **/
 
class FileExtensionFilter implements FilterInterface
 
class FileExtensionFilter implements FilterInterface
Línea 1394: Línea 925:
 
   }
 
   }
 
}
 
}
</source>
+
</pre>
  
 
Y se utilizaría de la siguiente manera:
 
Y se utilizaría de la siguiente manera:
<source lang=php>
+
<pre>
 
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');
 
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');
</source>
+
</pre>
  
 
=== Filtrando datos enviados en el Request ===
 
=== Filtrando datos enviados en el Request ===
Línea 1405: Línea 936:
  
 
Ejemplo:
 
Ejemplo:
<source lang=php >
+
<source lang=php line>
 
class UsuarioController extends ApplicationController
 
class UsuarioController extends ApplicationController
 
{
 
{
Línea 1419: Línea 950:
  
 
En el ejemplo anterior, los datos enviados en el array de campos "usuario", son filtrados con un trim, cargados por el constructor del objecto ActiveRecord y posteriormente se guarda en la base de datos.
 
En el ejemplo anterior, los datos enviados en el array de campos "usuario", son filtrados con un trim, cargados por el constructor del objecto ActiveRecord y posteriormente se guarda en la base de datos.
 
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==
 
El componente '''Load''', esta diseñado especialmente para satisfacer las necesidades de Carga Selectiva e Inyección de Dependencias, con este componente disponemos de los elementos de [http://www.kumbiaphp.com KumbiaPHP Framework] (vendors, libraries y models) donde así lo necesite nuestra aplicación.
 
 
=== Load::lib($lib) ===
 
 
El método library del componente Load nos permite cargar dinámicamente aquellas clases que tengamos definidas en el dir '''app/libs/''' a fin de utilizarlas en los controladores(controllers) y/o Modelos(models).
 
 
<source lang=php >
 
class UsuarioController extends ApplicationController
 
{
 
  public function index()
 
  {
 
    //Se carga la librería app/libs/my_util.php
 
    Load::lib('my_util');
 
  }
 
}
 
</source>
 
 
'''NOTA: Por convención del método Load::lib($lib) busca primero en el directorio app/libs/ y en caso de no encontrar la biblioteca requerida pasaría a buscar en el directorio core/libs/, por lo que podríamos cargar dinámicamente la librería Auth del core de la siguiente forma'''
 
 
<source lang=php >
 
class UsuarioController extends ApplicationController
 
{
 
  public function index()
 
  {
 
    //Se carga core/libs/auth/auth.php, siempre que no exista algún archivo
 
    //con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.
 
    Load::lib('auth');
 
  }
 
}
 
</source>
 
 
==Persistencia de Datos en el Controller==
 
En ocasiones se necesita la persistencia de algunas variables en la ejecución de nuestros controladores, lo mas común en estos casos es guardar consultas avanzadas o bien pudiera los articulos de carro de compras. Para estos casos y mas que se puedan presentar [http://www.kumbiaphp.com KumbiaPHP] hace persistente las variables para el controlador dependiendo el caso.
 
 
Para suplir esta necesidad se incoporan los siguientes métodos.
 
 
<source lang=php>
 
...
 
//hace persistente la variable $data
 
$this->set_persistent('data', 'valor');
 
...
 
</source>
 
 
 
<source lang=php>
 
...
 
//recupera la persistencia de la variable $data
 
$this->get_persistent('data');
 
...
 
</source>
 
 
 
<source lang=php>
 
...
 
//destruye la persistencia de la variable $data
 
$this->destroy_persistent('data');
 
...
 
</source>
 
 
==Session==
 
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:
 
* set_data()
 
* get_data()
 
 
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.
 
 
===set($index, $value, $namespace='default')===
 
Crear o especifica el valor para un indice de la sesión actual.
 
 
<source lang=php>
 
Session::set('usuario', 'Administrador');
 
</source>
 
 
===get($index, $namespace='default')===
 
Obtener el valor para un indice de la sesión actual.
 
 
<source lang=php>
 
Session::get('usuario');//retorna 'Administrador'
 
</source>
 
 
===delete($index, $namespace='default')===
 
Elimina el valor para un indice de la sesión actual.
 
 
<source lang=php>
 
Session::delete('usuario');
 
</source>
 
 
===has($index, $namespace='default')===
 
Verifica que este definido el indice en la sesión actual.
 
 
<source lang=php>
 
Session::has('id_usuario');//retorna false.
 
</source>
 
 
 
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.
 
 
==Upload==
 
Anteriormente en los controladores, estaban disponibles los métodos
 
'''upload_file''' y '''upload_image''', ya que realmente el controlador no depende de estos para su correcto funcionamiento, estos fueron agrupados en el componente '''Upload'''. Este componente permite subir tanto archivos e imagenes al servidor donde se aloja tu aplicación.
 
 
=== Upload::file_in_path($name, $path, $new_name=null) ===
 
Sube un archivo la ruta indicada.
 
 
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)
 
 
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"
 
 
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.
 
 
<source lang=php>
 
...
 
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');
 
...
 
</source>
 
 
 
=== Upload::file($name, $new_name=null) ===
 
Sube un archivo al directorio público "files/upload".
 
 
$name (string): nombre del archivo en el formulario
 
 
$new_name (string): indica el nuevo nombre para el archivo
 
 
<source lang=php>
 
...
 
Upload::file('archivo');
 
...
 
</source>
 
 
 
=== Upload::image($name, $new_name=null) ===
 
Sube una imagen al directorio público "img/upload".
 
 
$name (string): nombre del archivo en el formulario
 
 
$new_name (string): indica el nuevo nombre para el archivo
 
 
<source lang=php>
 
...
 
Upload::image('archivo');
 
...
 
</source>
 
 
==Partials de Paginación==
 
Como complemento para el paginador de ActiveRecord, através de vistas parciales se implementan los tipos de vistas de paginación más comunes, estos se ubican en el directorio "core/views/partials/paginators" y estas en capacidad de personalizarlos en tu aplicación aprovechando las características de renderizado de vistas parciales.
 
 
=== Classic ===
 
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]
 
 
 
Vista de paginación clásica.
 
 
Parametros de configuración:
 
 
'''page:''' objeto obtenido al invocar al paginador.
 
 
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.
 
 
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.
 
 
 
<source lang=php>
 
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))
 
</source>
 
 
=== Digg ===
 
Vista de paginación estilo digg.
 
 
Parametros de configuración:
 
 
'''page:''' objeto obtenido al invocar al paginador.
 
 
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.
 
 
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.
 
 
 
<source lang=php>
 
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))
 
</source>
 
 
 
=== Extended ===
 
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]
 
 
 
 
Vista de paginación extendida.
 
 
Parametros de configuración:
 
 
'''page:''' objeto obtenido al invocar al paginador.
 
 
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.
 
 
 
<source lang=php>
 
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))
 
</source>
 
 
=== Punbb ===
 
Vista de paginación estilo punbb.
 
 
Parametros de configuración:
 
 
'''page:''' objeto obtenido al invocar al paginador.
 
 
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.
 
 
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.
 
 
 
<source lang=php>
 
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))
 
</source>
 
 
 
=== Simple ===
 
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]
 
 
 
Vista de paginación simple.
 
 
 
Parametros de configuración:
 
 
'''page:''' objeto obtenido al invocar al paginador.
 
 
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.
 
 
 
 
<source lang=php>
 
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))
 
</source>
 
 
=== Ejemplo de uso ===
 
 
Supongamos que queremos paginar una lista de usuarios.
 
 
Para el modelo '''Usuario''' en '''models/usuario.php''':
 
 
<source lang=php>
 
<?php
 
class Usuario extends ActiveRecord
 
{
 
    /**
 
    * Muestra los usuarios de cinco en cinco utilizando paginador
 
    *
 
    * @param int $page
 
    * @return object
 
    **/
 
    public function ver($page=1)
 
    {
 
        return $this->paginate("page: $page", 'per_page: 5');
 
    }
 
}
 
?>
 
</source>
 
 
 
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':
 
 
<source lang=php>
 
<?php
 
class UsuarioController extends ApplicationController
 
{
 
    public $models = array('usuario');
 
 
    /**
 
    * Accion de paginacion
 
    *
 
    * @param int $page
 
    **/
 
    public function page($page=1)
 
    {
 
        $this->page = $this->Usuario->ver($page);
 
    }
 
}
 
?>
 
</source>
 
 
Y en la vista '''views/usuario/page.phtml'''
 
 
<source lang=php>
 
<table>
 
<tr>
 
  <th>Id</th>
 
  <th>Nombre</th>
 
</tr>
 
<?php foreach($page->items as $p): ?>
 
<tr>
 
  <td><?php echo $p->id; ?></td>
 
  <td><?php echo $p->nombre; ?></td>
 
</tr>
 
<?php endforeach; ?>
 
</table>
 
 
<?php View::partial('paginators/classic', false, array('page' => $page)); ?>
 
</source>
 

Ten en cuenta que todas las contribuciones a KumbiaPHP Framework Wiki pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre (véase Proyecto:Derechos de autor para más detalles). ¡No uses textos con copyright sin permiso!

Para editar esta página, responde la pregunta que aparece abajo (más información):

Cancelar Ayuda de edición (se abre en una ventana nueva)

Plantilla usada en esta página: