https://wiki.kumbiaphp.com/api.php?action=feedcontributions&user=Emilio.rst&feedformat=atomKumbiaPHP Framework Wiki - Contribuciones del usuario [es]2024-03-29T09:42:57ZContribuciones del usuarioMediaWiki 1.34.1https://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2652KumbiaPHP Framework Versión 1.0 Beta22010-05-23T02:50:01Z<p>Emilio.rst: /* Adaptador Image */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo '''archivador.php''':<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''archivador_controller.php''':<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir archivos de texto al servidor.<br />
<br />
Modelo '''documento.php''':<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Verifica si se subió el documento<br />
if(!$file->isUploaded()) {<br />
return FALSE;<br />
}<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
<br />
// Extensiones permitidas<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''documento_controller.php''':<br />
<br />
<source lang=php><br />
class DocumentoController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir documento<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$documento = Load::model('documento');<br />
$documento->guardar();<br />
}<br />
}<br />
</source><br />
<br />
Vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Documento</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('documento') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador Image ===<br />
Este adaptador es utilizado para subir archivos de imagen, por defecto estos se guardan en el directorio '''public/img/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo de imagen, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Guarda la imagen<br />
$img->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo de imagen subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Guarda el archivo<br />
$fileName = $img->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo de imagen esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
if($img->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo de imagen. Por defecto se considera '''public/img/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Nueva ruta de destino<br />
$img->setPath(APP_PATH . 'temp/fotos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$img->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo de imagen.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos de imagen permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos de imagen permitidos según estándar MIME. Ejemplo: "jpg".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Formatos de Imagenes<br />
$img->setTypes(array('jpg', 'gif', 'png'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Archivos de Imagenes<br />
$img->setExtensions(array('jpg', 'gif', 'png'));<br />
</source><br />
<br />
==== setMinWidth() ====<br />
Indica el ancho mínimo en pixeles permitido para el archivo de imagen.<br />
<br />
<pre><br />
$value (int): ancho en pixeles.<br />
<br />
setMinWidth($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMinWidth(200);<br />
</source><br />
<br />
==== setMaxWidth() ====<br />
Indica el ancho máximo en pixeles permitido para el archivo de imagen.<br />
<br />
<pre><br />
$value (int): ancho en pixeles.<br />
<br />
setMaxWidth($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMaxWidth(200);<br />
</source><br />
<br />
==== setMinHeight() ====<br />
Indica el alto mínimo en pixeles permitido para el archivo de imagen.<br />
<br />
<pre><br />
$value (int): alto en pixeles.<br />
<br />
setMinHeight($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMinHeight(200);<br />
</source><br />
<br />
==== setMaxHeight() ====<br />
Indica el alto máximo en pixeles permitido para el archivo de imagen.<br />
<br />
<pre><br />
$value (int): alto en pixeles.<br />
<br />
setMaxHeight($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMaxHeight(200);<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir una foto a un servidor.<br />
<br />
Modelo '''foto.php''':<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir fotos<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Foto<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto ImageUpload<br />
$img = Upload::factory('foto', 'image');<br />
<br />
// Verifica si se subió la imagen<br />
if(!$img->isUploaded()) {<br />
return FALSE;<br />
}<br />
<br />
// Tamaño máximo<br />
$img->setMaxSize('2MB');<br />
<br />
// Tipos de imagenes permitidas<br />
$img->setTypes(array('jpg', 'png'));<br />
<br />
// Extensiones permitidas<br />
$img->setExtensions(array('jpg', 'png'));<br />
<br />
// Guarda la imagen<br />
if($img->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''foto_controller.php''':<br />
<br />
<source lang=php><br />
class FotoController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir foto<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$foto = Load::model('foto');<br />
$foto->guardar();<br />
}<br />
}<br />
</source><br />
<br />
Vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Foto</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('foto') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2651KumbiaPHP Framework Versión 1.0 Beta22010-05-23T02:48:28Z<p>Emilio.rst: /* Adaptador Image */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo '''archivador.php''':<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''archivador_controller.php''':<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir archivos de texto al servidor.<br />
<br />
Modelo '''documento.php''':<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Verifica si se subió el documento<br />
if(!$file->isUploaded()) {<br />
return FALSE;<br />
}<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
<br />
// Extensiones permitidas<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''documento_controller.php''':<br />
<br />
<source lang=php><br />
class DocumentoController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir documento<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$documento = Load::model('documento');<br />
$documento->guardar();<br />
}<br />
}<br />
</source><br />
<br />
Vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Documento</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('documento') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador Image ===<br />
Este adaptador es utilizado para subir archivos de imagen, por defecto estos se guardan en el directorio '''public/img/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo de imagen, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Guarda la imagen<br />
$img->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo de imagen subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Guarda el archivo<br />
$fileName = $img->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo de imagen esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
if($img->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo de imagen. Por defecto se considera '''public/img/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Nueva ruta de destino<br />
$img->setPath(APP_PATH . 'temp/fotos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$img->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo de imagen.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos de imagen permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos de imagen permitidos según estándar MIME. Ejemplo: "jpg".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Formatos de Imagenes<br />
$img->setTypes(array('jpg', 'gif', 'png'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
<br />
// Archivos de Imagenes<br />
$img->setExtensions(array('jpg', 'gif', 'png'));<br />
</source><br />
<br />
==== setMinWidth() ====<br />
Indica el ancho mínimo en pixeles permitido para el archivo de imagen.<br />
<br />
<pre><br />
$value (int): ancho en pixeles.<br />
<br />
setMinWidth($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMinWidth(200);<br />
</source><br />
<br />
==== setMaxWidth() ====<br />
Indica el ancho máximo en pixeles permitido para el archivo de imagen.<br />
<br />
<pre><br />
$value (int): ancho en pixeles.<br />
<br />
setMinWidth($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMaxWidth(200);<br />
</source><br />
<br />
==== setMinHeight() ====<br />
Indica el alto mínimo en pixeles permitido para el archivo de imagen.<br />
<br />
<pre><br />
$value (int): alto en pixeles.<br />
<br />
setMinWidth($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMinHeight(200);<br />
</source><br />
<br />
==== setMaxHeight() ====<br />
Indica el alto máximo en pixeles permitido para el archivo de imagen.<br />
<br />
<pre><br />
$value (int): alto en pixeles.<br />
<br />
setMaxHeight($value)<br />
</pre><br />
<br />
<source lang=php><br />
$img = Upload::factory('imagen', 'image');<br />
$img->setMaxHeight(200);<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir una foto a un servidor.<br />
<br />
Modelo '''foto.php''':<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir fotos<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Foto<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto ImageUpload<br />
$img = Upload::factory('foto', 'image');<br />
<br />
// Verifica si se subió la imagen<br />
if(!$img->isUploaded()) {<br />
return FALSE;<br />
}<br />
<br />
// Tamaño máximo<br />
$img->setMaxSize('2MB');<br />
<br />
// Tipos de imagenes permitidas<br />
$img->setTypes(array('jpg', 'png'));<br />
<br />
// Extensiones permitidas<br />
$img->setExtensions(array('jpg', 'png'));<br />
<br />
// Guarda la imagen<br />
if($img->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''foto_controller.php''':<br />
<br />
<source lang=php><br />
class FotoController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir foto<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$foto = Load::model('foto');<br />
$foto->guardar();<br />
}<br />
}<br />
</source><br />
<br />
Vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Foto</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('foto') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2645KumbiaPHP Framework Versión 1.0 Beta22010-05-22T02:26:48Z<p>Emilio.rst: /* Ejemplo simple */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo '''archivador.php''':<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''archivador_controller.php''':<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir archivos de texto al servidor.<br />
<br />
Modelo '''documento.php''':<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Verifica si se subió el documento<br />
if(!$file->isUploaded()) {<br />
return FALSE;<br />
}<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
<br />
// Extensiones permitidas<br />
$file->setTypes(array('txt', 'dot', 'doc'));<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''documento_controller.php''':<br />
<br />
<source lang=php><br />
class DocumentoController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir documento<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$documento = Load::model('documento');<br />
$documento->guardar();<br />
}<br />
}<br />
</source><br />
<br />
Vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Documento</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('documento') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2644KumbiaPHP Framework Versión 1.0 Beta22010-05-22T02:24:21Z<p>Emilio.rst: /* Ejemplo simple */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo '''archivador.php''':<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''archivador_controller''':<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir archivos de texto al servidor.<br />
<br />
Modelo '''documento.php''':<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Verifica si se subió el documento<br />
if(!$file->isUploaded()) {<br />
return FALSE;<br />
}<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
<br />
// Extensiones permitidas<br />
$file->setTypes(array('txt', 'dot', 'doc'));<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''documento_controller.php''':<br />
<br />
<source lang=php><br />
class DocumentoController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir documento<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$documento = Load::model('documento');<br />
$documento->guardar();<br />
}<br />
}<br />
</source><br />
<br />
Vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Documento</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('documento') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2643KumbiaPHP Framework Versión 1.0 Beta22010-05-22T02:19:22Z<p>Emilio.rst: /* Ejemplo */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir archivos de texto al servidor.<br />
<br />
Modelo '''documento.php''':<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Verifica si se subió el documento<br />
if(!$file->isUploaded()) {<br />
return FALSE;<br />
}<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
<br />
// Extensiones permitidas<br />
$file->setTypes(array('txt', 'dot', 'doc'));<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador '''documento_controller.php''':<br />
<br />
<source lang=php><br />
class DocumentoController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir documento<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$documento = Load::model('documento');<br />
$documento->guardar();<br />
}<br />
}<br />
</source><br />
<br />
Vista '''subir.phtml''':<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Documento</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('documento') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2642KumbiaPHP Framework Versión 1.0 Beta22010-05-22T02:17:36Z<p>Emilio.rst: /* Ejemplo */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir archivos de texto al servidor.<br />
<br />
Modelo:<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Verifica si se subió el documento<br />
if(!$file->isUploaded()) {<br />
return FALSE;<br />
}<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
<br />
// Extensiones permitidas<br />
$file->setTypes(array('txt', 'dot', 'doc'));<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador:<br />
<br />
<source lang=php><br />
class DocumentoController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir documento<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$documento = Load::model('documento');<br />
$documento->guardar();<br />
}<br />
}<br />
</source><br />
<br />
Vista:<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Documento</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('documento') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2641KumbiaPHP Framework Versión 1.0 Beta22010-05-22T02:09:58Z<p>Emilio.rst: /* Ejemplo */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir archivos de texto al servidor.<br />
<br />
Modelo:<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
<br />
// Extensiones permitidas<br />
$file->setTypes(array('txt', 'dot', 'doc'));<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2640KumbiaPHP Framework Versión 1.0 Beta22010-05-22T02:09:00Z<p>Emilio.rst: /* Ejemplo */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
En el siguiente ejemplo se muestra un caso donde se desea subir archivos de texto al servidor.<br />
<br />
Modelo:<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
<br />
// Extensiones permitidas<br />
$file->setTypes(array('txt', 'dot', 'doc'));<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::error('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2639KumbiaPHP Framework Versión 1.0 Beta22010-05-22T01:58:21Z<p>Emilio.rst: /* setExtensions() */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source><br />
<br />
==== Ejemplo ====<br />
Modelo:<br />
<br />
<source lang=php><br />
/**<br />
* Modelo para subir documentos de texto<br />
*<br />
*/<br />
<br />
// Carga la libreria Upload<br />
Load::lib('upload');<br />
<br />
class Documento<br />
{<br />
/**<br />
* Guarda el documento<br />
*<br />
* @return boolean<br />
*/<br />
public function guardar()<br />
{<br />
// Instancia con factory un objeto FileUpload<br />
$file = Upload::factory('documento');<br />
<br />
// Tamaño máximo<br />
$file->setMaxSize('2MB');<br />
<br />
// Tipos de archivos permitidos<br />
$file->setTypes(array());<br />
<br />
// Guarda el archivo<br />
if($file->save()) {<br />
Flash::error('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2638KumbiaPHP Framework Versión 1.0 Beta22010-05-21T02:04:28Z<p>Emilio.rst: /* isUploaded() */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2637KumbiaPHP Framework Versión 1.0 Beta22010-05-21T02:03:55Z<p>Emilio.rst: /* Migrando de la versión 1.0 Beta1 a Beta2 */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2636KumbiaPHP Framework Versión 1.0 Beta22010-05-21T02:02:59Z<p>Emilio.rst: /* saveRandom() */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== isUploaded() ====<br />
Verifica si el archivo esta subido de manera que posteriormente se pueda guardar.<br />
<br />
<pre><br />
Retorna (boolean).<br />
<br />
isUploaded()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
if($file->isUploaded()) {<br />
echo 'Archivo listo para guardarse';<br />
}<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2635KumbiaPHP Framework Versión 1.0 Beta22010-05-21T01:58:02Z<p>Emilio.rst: /* save() */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== save() ====<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== saveRandom() ====<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2634KumbiaPHP Framework Versión 1.0 Beta22010-05-21T01:57:08Z<p>Emilio.rst: /* saveRandom() */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
<br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
=== save() ===<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2633KumbiaPHP Framework Versión 1.0 Beta22010-05-21T01:55:22Z<p>Emilio.rst: /* setPath() */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
=== saveRandom() ===<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
=== save() ===<br />
Guarda el archivo subido.<br />
<br />
<pre><br />
$name (string): nombre con el que se guardará el archivo, por defecto se guarda con su nombre original.<br />
<br />
Retorna (boolean).<br />
<br />
save($name = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$file->save();<br />
</source><br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2632KumbiaPHP Framework Versión 1.0 Beta22010-05-21T01:54:39Z<p>Emilio.rst: /* save() */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory() ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
<br />
factory($name, $adapter = 'file')<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
</source><br />
<br />
<br />
<br />
=== saveRandom() ===<br />
Guarda el archivo subido con un nombre aleatorio. El nombre del archivo se genera con la siguiente instrucción '''md5(time())''', por lo tanto cada nombre de archivo es único.<br />
<br />
<pre><br />
Retorna (boolean | string): si es exitoso retorna el nombre del archivo generado, si falla retorna FALSE.<br />
<br />
saveRandom()<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo<br />
$fileName = $file->saveRandom();<br />
</source><br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:<br />
<br />
==== setPath() ====<br />
Asigna la ruta al directorio de destino para el archivo. Por defecto se considera '''public/files/upload'''.<br />
<br />
<pre><br />
$path (string): ruta de destino<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Nueva ruta de destino<br />
$file->setPath(APP_PATH . 'temp/archivos');<br />
</source><br />
<br />
==== setAllowScripts() ====<br />
Indica si se permite subir archivos scripts ejecutables (php, phtml, php3, php4, js, shtml, pl, py, rb, rhtml). Por defecto no esta permitido.<br />
<br />
<pre><br />
$value (boolean): indica si se permite subir o no scripts.<br />
<br />
setAllowScripts($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Esto se hace bajo propio riesgo.<br />
$file->setAllowScripts(TRUE);<br />
</source><br />
<br />
==== setMinSize() ====<br />
Indica el tamaño mínimo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMinSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMinSize('0.3 MB');<br />
</source><br />
<br />
==== setMaxSize() ====<br />
Indica el tamaño máximo permitido para el archivo.<br />
<br />
<pre><br />
$size (string): tamaño del archivo (B, KB, MB, GB, PB). Ejemplo: "0.3 MB".<br />
<br />
setMaxSize($size)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
$file->setMaxSize('1 MB');<br />
</source><br />
<br />
==== setTypes() ====<br />
Indica los tipos de archivos permitidos.<br />
<br />
<pre><br />
$value (array): lista de tipos de archivos permitidos según estándar MIME. Ejemplo: "text/plain".<br />
<br />
setTypes($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setTypes(array('text/plain', 'application/vnd.oasis.opendocument.text', 'application/msword'));<br />
</source><br />
<br />
==== setExtensions() ====<br />
Indica las extensiones de archivos permitidas.<br />
<br />
<pre><br />
$value (array): lista de extensiones para archivos. Ejemplo: "png".<br />
<br />
setExtensions($value)<br />
</pre><br />
<br />
<source lang=php><br />
$file = Upload::factory('archivo');<br />
<br />
// Documentos de texto<br />
$file->setExtensions(array('txt', 'dot', 'doc'));<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2621KumbiaPHP Framework Versión 1.0 Beta22010-05-20T02:05:09Z<p>Emilio.rst: /* Libreria Upload */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory($name, $adapter = 'file') ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
</pre><br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source><br />
<br />
=== Adaptador File ===<br />
Este adaptador es utilizado para subir archivos de cualquier tipo, por defecto estos se guardan en el directorio '''public/files/upload'''. Este adaptador cuenta con los siguientes métodos:</div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2620KumbiaPHP Framework Versión 1.0 Beta22010-05-19T03:36:08Z<p>Emilio.rst: /* Ejemplo simple */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory($name, $adapter = 'file') ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
</pre><br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php View::content() ?><br />
<br />
<h1>Subir Archivo</h1><br />
<br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2619KumbiaPHP Framework Versión 1.0 Beta22010-05-19T03:35:19Z<p>Emilio.rst: /* Ejemplo simple */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory($name, $adapter = 'file') ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
</pre><br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=php><br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2618KumbiaPHP Framework Versión 1.0 Beta22010-05-19T03:34:46Z<p>Emilio.rst: /* Ejemplo simple */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory($name, $adapter = 'file') ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
</pre><br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=html4strict><br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2617KumbiaPHP Framework Versión 1.0 Beta22010-05-19T03:33:59Z<p>Emilio.rst: Ejemplo simple</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory($name, $adapter = 'file') ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
</pre><br />
<br />
=== Ejemplo simple ===<br />
Se presenta un ejemplo simple de uso de la libreria Upload.<br />
<br />
<br />
Modelo "Archivador":<br />
<br />
<source lang=php><br />
class Archivador<br />
{<br />
/**<br />
* Guardar archivo<br />
*<br />
* @return boolean<br />
*/<br />
public static function guardar()<br />
{<br />
$file = Upload::factory('archivo');<br />
<br />
// Guarda el archivo en el directorio "public/files/upload"<br />
if($file->save()) {<br />
Flash::valid('Operación Exitosa');<br />
return TRUE;<br />
}<br />
<br />
return FALSE;<br />
}<br />
}<br />
</source><br />
<br />
Controlador "ArchivadorController":<br />
<br />
<source lang=php><br />
class ArchivadorController extends ApplicationController<br />
{<br />
/**<br />
* Accion para subir archivo<br />
*<br />
*/<br />
public function subir()<br />
{<br />
$archivador = Load::model('archivador');<br />
$archivador->guardar();<br />
}<br />
}<br />
</source><br />
<br />
En la vista "subir.phtml":<br />
<br />
<source lang=html><br />
<?php echo Form::openMultipart() ?><br />
<?php echo Form::file('archivo') ?><br />
<?php echo Form::submit('Subir') ?><br />
<?php echo Form::close() ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2614KumbiaPHP Framework Versión 1.0 Beta22010-05-17T02:39:36Z<p>Emilio.rst: /* Helpers */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
<br />
== Migrando de la versión 1.0 Beta1 a Beta2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (Nuevo) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
<br />
<br />
=== El Controlador principal cambio de nombre ===<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
=== Nuevo árbol de directorios ===<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
==== Html::meta() ====<br />
Crea un metatag y lo agrega a una lista estatica que sera añadida mas adelnate mediante Html::includeMetatags();<br />
<br />
<pre><br />
$content contenido del metatag<br />
$attrs atributos adicionales del tag<br />
meta($content, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'"); //Agrega: <meta content="Kumbiaphp-team" name = 'Author'/><br />
Html::meta('text/html; charset=UTF-8',"http-equiv = 'Content-type'"); //Agrega: <meta content="text/html; charset=UTF-8" http-equiv = 'Content-type'/> <br />
</source><br />
<br />
<br />
==== Html::includeMetatags() ====<br />
Agrega los metatag que previamente se habia agregado<br />
<br />
<source lang=php><br />
Html::meta('Kumbiaphp-team',"name = 'Author'");<br />
charset=UTF-8" http-equiv = 'Content-type'/> <br />
echo Html::includeMetatags(); //Visualiza <meta content="Kumbiaphp-team" name = 'Author'/><br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Agrega un elemento de vinculo externo de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss())<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLink($href, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headlink('http://www.kumbiaphp.com/public/style.css',"rel='stylesheet',type='text/css' media='screen'"); //Se agrega a la cola de links el enlace a un recurso externo, en este caso la hoja de estilo ubicada en "http://www.kumbiaphp.com/public/style.css"<br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed sin usar las convenciones de kumbiaphp */<br />
Html::headlink('http://www.kumbiaphp.com/blog/feed/',"rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
==== Html::headLinkAction() ====<br />
Agrega un elemento de vinculo interno de tipo [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks() de modo similar que Html::includeCss()) respetando las convenciones de kumbiaphp<br />
<br />
<pre><br />
$href direccion url del recurso a enlazar<br />
$attrs atributos adicionales<br />
<br />
headLinkAction($action, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
<br />
/*Agrega a la cola de links "<link rel="alternate" type="application/rss+xml" title="KumbiaPHP Framework RSS Feed" href="http://www.kumbiaphp.com/blog/feed/" />" con lo cual podemos incluir un feed usando las convenciones de kumbiaphp. <br />
Siendo 'articulos/feed' el nombre de la vista con el contenido del feed */<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Agrega un elemento de vinculo a un recurso interno con la etiqueta [http://html.conclase.net/w3c/html401-es/struct/links.html#h-12.3 <link> ] a la cola de enlaces (para poder ser visualizado se requiere de Html::includeHeadLinks())<br />
<br />
<pre><br />
$resource ubicacion del recurso en public<br />
$attrs atributos adicionales<br />
<br />
headLinkResource($resource, $attrs = NULL)<br />
</pre><br />
<br />
<source lang="php" line><br />
Html::headLinkResource('favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon interno ubicado en el directorio '/public/'<br />
<br />
echo Html::includeHeadLinks(); //Muestra los links que contiene la cola<br />
</source><br />
<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links que previamente se pusieron en cola<br />
<br />
<source lang=php><br />
<br />
Html::headlink('http://www.kumbiaphp.com/favicon.ico',"rel='shortcut icon',type='image/x-icon'"); //Agrega la etiqueta <link> para usar un favicon externo<br />
<br />
Html::headLinkAction('articulos/feed', "rel='alternate' type='application/rss+xml' title='KumbiaPHP Framework RSS Feed'");<br />
<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
<?php echo Tag::js('jquery/jquery.kumbiaphp');?> //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::openMultipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::openMultipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::openMultipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
Controlador<br />
<source lang=php><br />
$usuarios = new Usuarios();<br />
$this->usuarios = $usuarios->find();<br />
</source><br />
<br />
Vista<br />
<source lang=php><br />
echo Form::dbSelect('usuarios.id', $usuarios, 'nombres', '- seleccione -');<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$on = 'masculino';<br />
echo Form::radio("rdo", 'masculino', $on); //<input id="rdo1" name="rdo" type="radio" value="masculino" checked="checked"><br />
echo Form::radio("rdo", 'femenino', $on); //<input id="rdo2" name="rdo" type="radio" value="femenino"><br />
</source><br />
<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
== Libreria Upload ==<br />
<br />
La nueva implementación de Upload incluye ahora mayor seguridad y facilidad de uso. Existen dos adaptadores para subir archivos, el adaptador FileUpload y el adaptador ImageUpload. <br />
<br />
=== factory($name, $adapter = 'file') ===<br />
Este metodo permite obtener un objeto Upload correspondiente al adaptador requerido. Los argumentos que acepta son los siguientes:<br />
<br />
<pre><br />
$name (string): el nombre del campo correspondiente al archivo en el formulario.<br />
$adapter (string): adaptador para upload (file, image)<br />
</pre></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2510KumbiaPHP Framework Versión 1.0 Spirit2010-03-18T02:20:10Z<p>Emilio.rst: /* boot.ini */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Constante en KumbiaPHP==<br />
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 maneras rutas (paths) en el framework.<br />
<br />
=== APP_PATH ===<br />
Constante que contiene la ruta absoluta al directorio donde se encuentra nuestra aplicación (app).<br />
<br />
Ejemplo:<br />
<pre><br />
echo APP_PATH; //la salida es: /var/www/kumbiaphp/app/ <br />
</pre><br />
<br />
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.<br />
<br />
<pre><br />
include_once APP_PATH.'libs/test.php';<br />
</pre><br />
<br />
'''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.'''<br />
<br />
=== CORE_PATH ===<br />
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.<br />
<br />
Ejemplo:<br />
<pre><br />
echo CORE_PATH; //la salida es: /var/www/kumbiaphp/core/ <br />
</pre><br />
<br />
Para incluir archivos que se encuentre bajo este arbol de directorio es el mismo precidimiento que se explico para la constante APP_PATH<br />
<br />
'''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]]'''<br />
<br />
=== PUBLIC_PATH ===<br />
Constante que contiene la URL para el navegador (browser) y apunta a '''app/public/''' para enlazar imágenes, CSS, JavaScritp y todo lo que sea ruta para browser.<br />
<br />
Ejemplo:<br />
<pre><br />
//Genera un link que ira al controller: controller y action: action<br />
<a href="<?php echo PUBLIC_PATH ?>controller/action/" title="Mi Link">Mi Link</a> <br />
<br />
//Enlaza una imagen que esta en public/img/imagen.jpg<br />
<img src="<?php echo PUBLIC_PATH ?>img/imagen.jpg" alt="Una Imagen" /> <br />
<br />
//Enlaza el archivo CSS en public/css/style.css<br />
<link rel="stylesheet" type="text/css" href="<?php echo PUBLIC_PATH ?>css/style.css"/> <br />
</pre><br />
<br />
'''NOTA: siempre será mejor hacer uso de los helpers'''<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
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.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión.<br />
*'''routes''' Activar enrutamiento estatico.<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
; routes: Activar enrutamiento estatico<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
;routes = On<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
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.<br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''driver''' que te proporciona la clase Cache.<br />
<br />
===Cache::driver($driver=null)===<br />
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'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$data = Cache::driver()->get('data');<br />
<br />
// manejador para memcache<br />
$data_memcache = Cache::driver('memcache')->get('data');<br />
<br />
// manejador para cache con APC<br />
$data_apc = Cache::driver('APC')->get('data');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<source lang=php><br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::driver()->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::driver()->save('hola', null, 'data');<br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::driver()->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::driver()->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::driver()->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2509KumbiaPHP Framework Versión 1.0 Spirit2010-03-18T02:19:22Z<p>Emilio.rst: /* boot.ini */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Constante en KumbiaPHP==<br />
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 maneras rutas (paths) en el framework.<br />
<br />
=== APP_PATH ===<br />
Constante que contiene la ruta absoluta al directorio donde se encuentra nuestra aplicación (app).<br />
<br />
Ejemplo:<br />
<pre><br />
echo APP_PATH; //la salida es: /var/www/kumbiaphp/app/ <br />
</pre><br />
<br />
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.<br />
<br />
<pre><br />
include_once APP_PATH.'libs/test.php';<br />
</pre><br />
<br />
'''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.'''<br />
<br />
=== CORE_PATH ===<br />
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.<br />
<br />
Ejemplo:<br />
<pre><br />
echo CORE_PATH; //la salida es: /var/www/kumbiaphp/core/ <br />
</pre><br />
<br />
Para incluir archivos que se encuentre bajo este arbol de directorio es el mismo precidimiento que se explico para la constante APP_PATH<br />
<br />
'''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]]'''<br />
<br />
=== PUBLIC_PATH ===<br />
Constante que contiene la URL para el navegador (browser) y apunta a '''app/public/''' para enlazar imágenes, CSS, JavaScritp y todo lo que sea ruta para browser.<br />
<br />
Ejemplo:<br />
<pre><br />
//Genera un link que ira al controller: controller y action: action<br />
<a href="<?php echo PUBLIC_PATH ?>controller/action/" title="Mi Link">Mi Link</a> <br />
<br />
//Enlaza una imagen que esta en public/img/imagen.jpg<br />
<img src="<?php echo PUBLIC_PATH ?>img/imagen.jpg" alt="Una Imagen" /> <br />
<br />
//Enlaza el archivo CSS en public/css/style.css<br />
<link rel="stylesheet" type="text/css" href="<?php echo PUBLIC_PATH ?>css/style.css"/> <br />
</pre><br />
<br />
'''NOTA: siempre será mejor hacer uso de los helpers'''<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
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.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión.<br />
*'''routes''' Activar enrutamiento estatico.<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
; routes: Activar enrutamiento estatico<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
;routes = On<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo fue eliminado, ahora se sugiere la carga explicita con ***require*** o ***include*** o en su defecto aprovechar la autocarga de librerias de KumbiaPHP.<br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''driver''' que te proporciona la clase Cache.<br />
<br />
===Cache::driver($driver=null)===<br />
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'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$data = Cache::driver()->get('data');<br />
<br />
// manejador para memcache<br />
$data_memcache = Cache::driver('memcache')->get('data');<br />
<br />
// manejador para cache con APC<br />
$data_apc = Cache::driver('APC')->get('data');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<source lang=php><br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::driver()->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::driver()->save('hola', null, 'data');<br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::driver()->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::driver()->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::driver()->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2508KumbiaPHP Framework Versión 1.0 Spirit2010-03-18T02:18:37Z<p>Emilio.rst: /* boot.ini */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Constante en KumbiaPHP==<br />
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 maneras rutas (paths) en el framework.<br />
<br />
=== APP_PATH ===<br />
Constante que contiene la ruta absoluta al directorio donde se encuentra nuestra aplicación (app).<br />
<br />
Ejemplo:<br />
<pre><br />
echo APP_PATH; //la salida es: /var/www/kumbiaphp/app/ <br />
</pre><br />
<br />
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.<br />
<br />
<pre><br />
include_once APP_PATH.'libs/test.php';<br />
</pre><br />
<br />
'''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.'''<br />
<br />
=== CORE_PATH ===<br />
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.<br />
<br />
Ejemplo:<br />
<pre><br />
echo CORE_PATH; //la salida es: /var/www/kumbiaphp/core/ <br />
</pre><br />
<br />
Para incluir archivos que se encuentre bajo este arbol de directorio es el mismo precidimiento que se explico para la constante APP_PATH<br />
<br />
'''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]]'''<br />
<br />
=== PUBLIC_PATH ===<br />
Constante que contiene la URL para el navegador (browser) y apunta a '''app/public/''' para enlazar imágenes, CSS, JavaScritp y todo lo que sea ruta para browser.<br />
<br />
Ejemplo:<br />
<pre><br />
//Genera un link que ira al controller: controller y action: action<br />
<a href="<?php echo PUBLIC_PATH ?>controller/action/" title="Mi Link">Mi Link</a> <br />
<br />
//Enlaza una imagen que esta en public/img/imagen.jpg<br />
<img src="<?php echo PUBLIC_PATH ?>img/imagen.jpg" alt="Una Imagen" /> <br />
<br />
//Enlaza el archivo CSS en public/css/style.css<br />
<link rel="stylesheet" type="text/css" href="<?php echo PUBLIC_PATH ?>css/style.css"/> <br />
</pre><br />
<br />
'''NOTA: siempre será mejor hacer uso de los helpers'''<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
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.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión.<br />
*'''routes''' Activar enrutamiento estatico.<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
; routes: Activar enrutamiento estatico<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
;routes = On<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo fue eliminado, ahora se sugiere la carga explicita o en su defecto aprovechar la autocarga de librerias de KumbiaPHP.<br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''driver''' que te proporciona la clase Cache.<br />
<br />
===Cache::driver($driver=null)===<br />
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'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$data = Cache::driver()->get('data');<br />
<br />
// manejador para memcache<br />
$data_memcache = Cache::driver('memcache')->get('data');<br />
<br />
// manejador para cache con APC<br />
$data_apc = Cache::driver('APC')->get('data');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<source lang=php><br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::driver()->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::driver()->save('hola', null, 'data');<br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::driver()->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::driver()->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::driver()->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2507KumbiaPHP Framework Versión 1.0 Spirit2010-03-18T02:16:41Z<p>Emilio.rst: /* config.ini */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Constante en KumbiaPHP==<br />
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 maneras rutas (paths) en el framework.<br />
<br />
=== APP_PATH ===<br />
Constante que contiene la ruta absoluta al directorio donde se encuentra nuestra aplicación (app).<br />
<br />
Ejemplo:<br />
<pre><br />
echo APP_PATH; //la salida es: /var/www/kumbiaphp/app/ <br />
</pre><br />
<br />
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.<br />
<br />
<pre><br />
include_once APP_PATH.'libs/test.php';<br />
</pre><br />
<br />
'''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.'''<br />
<br />
=== CORE_PATH ===<br />
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.<br />
<br />
Ejemplo:<br />
<pre><br />
echo CORE_PATH; //la salida es: /var/www/kumbiaphp/core/ <br />
</pre><br />
<br />
Para incluir archivos que se encuentre bajo este arbol de directorio es el mismo precidimiento que se explico para la constante APP_PATH<br />
<br />
'''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]]'''<br />
<br />
=== PUBLIC_PATH ===<br />
Constante que contiene la URL para el navegador (browser) y apunta a '''app/public/''' para enlazar imágenes, CSS, JavaScritp y todo lo que sea ruta para browser.<br />
<br />
Ejemplo:<br />
<pre><br />
//Genera un link que ira al controller: controller y action: action<br />
<a href="<?php echo PUBLIC_PATH ?>controller/action/" title="Mi Link">Mi Link</a> <br />
<br />
//Enlaza una imagen que esta en public/img/imagen.jpg<br />
<img src="<?php echo PUBLIC_PATH ?>img/imagen.jpg" alt="Una Imagen" /> <br />
<br />
//Enlaza el archivo CSS en public/css/style.css<br />
<link rel="stylesheet" type="text/css" href="<?php echo PUBLIC_PATH ?>css/style.css"/> <br />
</pre><br />
<br />
'''NOTA: siempre será mejor hacer uso de los helpers'''<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
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.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión.<br />
*'''routes''' Activar enrutamiento estatico.<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
; routes: Activar enrutamiento estatico<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
;routes = On<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
Es decir, se usa libs= en vez de extensions=<br />
Y también se quita el prefijo kumbia.<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''driver''' que te proporciona la clase Cache.<br />
<br />
===Cache::driver($driver=null)===<br />
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'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$data = Cache::driver()->get('data');<br />
<br />
// manejador para memcache<br />
$data_memcache = Cache::driver('memcache')->get('data');<br />
<br />
// manejador para cache con APC<br />
$data_apc = Cache::driver('APC')->get('data');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<source lang=php><br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::driver()->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::driver()->save('hola', null, 'data');<br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::driver()->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::driver()->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::driver()->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Beta2&diff=2452KumbiaPHP Framework Versión 1.0 Beta22010-03-09T01:48:50Z<p>Emilio.rst: /* Como se usa */</p>
<hr />
<div>Documentación de KumbiaPHP 1.0 beta2<br />
<br />
== Helpers ==<br />
<br />
=== Clase Html ===<br />
<br />
Clase con métodos estáticos con la que podemos crear etiquetas HTML optimizadas respetando las convenciones de KumbiaPHP.<br />
<br />
<br />
==== Html::img() ====<br />
Permite incluir una imagen<br />
<pre><br />
$src ruta de la imagen<br />
$alt atruibuto alt para la imagen<br />
$attrs atributos adicionales<br />
<br />
img ($src, $alt=NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::img('spin.gif','una imagen'); //se muestra la imagen spin.gif que se encuentra dentro de "/public/img/" <br />
//con el artibuto alt 'una imagen'<br />
</source><br />
<br />
<br />
==== Html::link() ====<br />
Permite incluir un link <br />
<pre><br />
$action ruta a la accion<br />
$text texto a mostrar<br />
$attrs atributos adicionales<br />
<br />
link ($action, $text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Html::link('pages/show/kumbia/status','Configuracion'); //se muestra un link con el texto 'Configuracion'<br />
</source><br />
<br />
<br />
==== Html::lists() ====<br />
Crea una lista html a partir de un array<br />
<pre><br />
$array contenido de la lista<br />
$type por defecto ul, y si no ol<br />
$attrs atributos adicionales <br />
<br />
lists($array, $type = 'ul', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
$ar = array('Abdomen' => 'Abdomen',<br />
'Brazos' => 'Brazos',<br />
'Cabeza' => 'Cabeza',<br />
'Cuello' => 'Cuello',<br />
'Genitales' => 'Genitales',<br />
'Piernas' => 'Piernas',<br />
'Tórax' => 'Tórax',<br />
'Otros' => 'Otros');<br />
//$ar el array que contiene los items de la lista<br />
echo Html::lists($ar, $type = 'ol'); //Muestra una lista <ol></ol><br />
<br />
<br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Html::lists($ar2, $type = 'ol'); //Muestra una lista <ol></ol><br />
</source><br />
<br />
<br />
<br />
==== Html::includeCss() ====<br />
Incluye los archivos CSS que previamente fueron cargados a la lista mediante Tag::css()<br />
<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
<br />
<br />
==== Html::headLink() ====<br />
Enlaza una acción<br />
<br />
me falta info...<br />
<br />
==== Html::headLinkAction() ====<br />
Enlaza una accion<br />
<br />
me falta info...<br />
<br />
<br />
==== Html::headLinkResource() ====<br />
Enlaza un recurso de la aplicacion<br />
<br />
me falta info...<br />
<br />
<br />
==== Html::includeHeadLinks() ====<br />
Incluye los links para el head<br />
<br />
<source lang=php><br />
echo Html::headLink('www.google.com');<br />
echo Html::includeHeadLinks();<br />
</source><br />
<br />
<br />
<br />
=== '''Clase Tag''' ===<br />
<br />
Esta clase nos va a permitir adicionar archivos JS y CSS a nuestro proyecto (como lo hacíamos con las funciones stylesheet_link_tag y javascript_include_tag de la Beta1), bien sean archivos que se encuentren en nuestro servidor o en un servidor externo. Tambien vamos a poder hacer <br />
<br />
Las funciones de esta clase son de tipo static lo que nos permite referenciarlas directamente de la forma como se presentan a continuación.<br />
<br />
==== Tag::css() ====<br />
<br />
Incluye un archivo CSS a la lista<br />
<source lang=php><br />
Tag::css('bienvenida'); //Pone en lista un CSS (app/public/css/bienvenida.css)<br />
echo Html::includeCss(); //Adiciona los recursos enlazados de la clase en el proyecto<br />
</source><br />
<br />
==== Tag::js() ====<br />
Incluye un archivo JavaScript a la vista, partial o template<br />
<source lang=php><br />
Tag::js('jquery/jquery.kumbiaphp') //Adiciona un archivo javascript (app/public/javascript/jquery/jquery.kumbiaphp)<br />
</source><br />
<br />
<br />
=== '''Clase Form''' ===<br />
Clase para el manejo y la creación de formularios<br />
<br />
<br />
==== Form::open() ====<br />
Crea una etiqueta de formulario<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$method 'POST', 'GET', 'DELETE', 'HEAD', 'PUT'. Por defecto se tiene en 'POST'<br />
$attrs atributos adicionales<br />
<br />
Form::open($action = NULL, $method = 'POST', $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
<?php echo Form::open(); ?>//inicia un formulario que enviara los datos a la acción que corresponde al controller actual<br />
<?php echo Form::open('usuarios/nuevo'); ?> //inicia un formulario que enviara los datos al controller 'usuarios' y la acción 'nuevo'<br />
</source><br />
<br />
==== Form::multipart() ====<br />
Crea una etiqueta de formulario multipart, este es ideal para formularios que contienen campos de subida de archivos<br />
<pre><br />
$action acción a la que envía los datos, por defecto llama la misma acción de donde proviene<br />
$attrs atributos adicionales<br />
<br />
openMultipart ($action = NULL, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::multipart();//inicia un formulario multipart que enviara los datos a la acción que corresponde a la vista actual<br />
echo Form::multipart('usuarios/nuevo');//inicia un formulario multipart que enviara los datos al controller 'usuario' y la acción 'nuevo'<br />
</source><br />
<br />
<br />
<br />
==== Form::close() ====<br />
Crea una etiqueta de cierre de formulario<br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::close();//crea una etiqueta de cierre de formulario </form><br />
</source><br />
<br />
<br />
<br />
==== Form::input() ====<br />
Crea un campo de tipo input<br />
<pre><br />
$attrs atributos para el tag<br />
$content contenido interno<br />
<br />
input($attrs = NULL, $content = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::input('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::text() ====<br />
Crea un campo de tipo input<br />
<br />
Siempre que se le da el parmetro name de la forma model.campo, es decir un nombre que contenga un punto dentro del string, se crea el campo de texto con el name= "model[campo]" y el id="model.campo" (en la version 1.0 beta 1 se cambiaba por id="model_campo")<br />
<pre><br />
$field Nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el input<br />
<br />
text($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::text('nombre'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre"<br />
echo Form::text('usuario.nombre'); //crea un campo de tipo texto con el parametro name= "usuario[nombre]", id = "usuario.nombre"<br />
echo Form::text('nombre',"class= 'caja'",'55'); //crea un campo de tipo texto con el parametro name= "nombre", id = "nombre", class= "caja", value = "55"<br />
</source><br />
<br />
<br />
<br />
==== Form::pass() ====<br />
Crea un campo de tipo Password<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
pass($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
/*Ejemplo*/<br />
echo Form::pass('password'); //crea un campo de tipo password con el parametro name= "password"<br />
</source><br />
<br />
<br />
<br />
==== Form::textarea() ====<br />
Crea un textarea<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos de campo<br />
$value valor inicial para el textarea<br />
<br />
textarea($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::textarea('detalles'); //Crea un textarea <br />
</source><br />
<br />
<br />
<br />
==== Form::label() ====<br />
Crea un label y lo asocia a un campo<br />
<pre><br />
$text texto a mostrar<br />
$field campo al que hace referencia<br />
$attrs array de atributos opcionales<br />
<br />
label($text, $field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::label('nombre de usuario:','nombre'); //Crea un label para el campo nombre con el texto 'nombre de usuario:'<br />
echo Form::text('nombre');<br />
</source><br />
<br />
<br />
<br />
==== Form::hidden() ====<br />
Crea un campo hidden (campo oculto)<br />
<pre><br />
$field nombre de campo<br />
$attrs atributos adicionales de campo<br />
$value valor inicial para el campo oculto<br />
<br />
hidden($field, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::hidden('id',null,12); //Crea un campo oculto con el name="id" y el value="12"<br />
</source><br />
<br />
<br />
<br />
==== Form::dbSelect() ====<br />
Crea campo Select que toma los valores de un array de objetos de ActiveRecord<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$show campo que se mostrara<br />
$blank campo en blanco<br />
$attrs atributos de campo<br />
$value valor inicial para el campo oculto<br />
<br />
dbSelect($field, $data, $show, $blank = NULL, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
ejemplo pendiente...<br />
</source><br />
<br />
==== Form::select() ====<br />
Crea un campo Select (un combobox)<br />
<pre><br />
$field nombre de campo<br />
$data array de valores para la lista desplegable<br />
$attrs atributos de campo<br />
$value valor inicial para el campo<br />
<br />
select($field, $data, $attrs = NULL, $value = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
$ar2 = array('Abdomen','Brazos','Cabeza','Cuello','Genitales','Piernas','Tórax','Otros');<br />
echo Form::Select('region', $ar2,'Cuello'); //Crea un campo Select (un combobox) con el nombre 'region' y teniendo preseleccionado 'Cuello'<br />
</source><br />
<br />
<br />
==== Form::file() ====<br />
Crea campo File para subir archivos, el formulario se debe abrir con Form::openMultipart()<br />
<pre> <br />
$field nombre de campo<br />
$attrs atributos de campo<br />
<br />
file($field, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::openMultipart(); //Abre el formulario multipart<br />
echo Form::file('subir'); crear el campo para subir archivos<br />
echo Form::close(); //Cierra el formulario<br />
</source><br />
<br />
<br />
==== Form::button() ====<br />
Crea un botón<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
button($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::button('calcular'); //Crea un botón con el texto 'calcular'<br />
</source><br />
<br />
<br />
==== Form::submitImage() ====<br />
Crea un botón de tipo imagen siguendo las convenciones de kumbiaphp, la imagen devera estar dentro del directorio '/public/img/'<br />
<pre><br />
$img ruta de la imagen que usa el botón<br />
$attrs atributos del botón<br />
<br />
submitImage($img, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submitImage('botones/edit.gif'); //Crea un botón con la imagen 'botones/edit.gif'<br />
</source><br />
<br />
<br />
==== Form::submit() ====<br />
Crea un boton de submit para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
submit($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::submit('enviar'); //Crea un botón con el texto 'enviar'<br />
</source><br />
<br />
<br />
==== Form::reset() ====<br />
Crea un botón reset para el formulario actual<br />
<pre><br />
$text texto del botón<br />
$attrs atributos del botón<br />
<br />
reset($text, $attrs = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::reset('reiniciar'); //Crea un botón con el texto 'reiniciar'<br />
</source><br />
<br />
<br />
==== Form::check() ====<br />
Crea un checkbox<br />
<pre><br />
$field nombre de campo<br />
$value valor en el checkbox<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
check($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
echo Form::check('recuerdame','1','',true); // Crea un check seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
echo Form::check('recuerdame','1','',false); // Crea un check NO seleccionado con id="recuerdame" , name="recuerdame" y value="1" <br />
<br />
</source><br />
<br />
==== Form::radio() ====<br />
Crea un radio button<br />
<pre><br />
$field nombre de campo<br />
$value valor en el radio<br />
$attrs atributos de campo<br />
$checked indica si se marca el campo<br />
<br />
radio($field, $value, $attrs = NULL, $checked = NULL)<br />
</pre><br />
<br />
<source lang=php><br />
ejemplo pendiente..<br />
</source><br />
<br />
<br />
<br />
== Migrando de 1.0 Beta 1 a 1.0 Beta 2 ==<br />
<br />
La versión 1.0 beta2 trae consigo correcciones y mejoras, nuevos helpers, clases y extensiones que facilitaran aun mas el trabajo.<br />
<br />
Para realizar la migración de la versión 1.0beta1 a la versión 1.0beta2 solamente hay que tener presentes los cambios que se han realizado en cuanto a funcionamiento, la inclusión de nuevos helpers para las vistas y controllers. <br />
<br />
Recordemos que todo lo que se incluye es con el fin de facilitar la curva de aprendizaje, la forma de trabajo y de poseer un framework con una semántica mucho mayor, claro esta que sigue sin perder su cualidades mvc y de scaffolding<br />
<br />
=== Autoload libs (new) ===<br />
<br />
<br />
En la versión 1.0 beta 2 las librerías se cargan automáticamente, siempre y cuando se encuentren en el directorio correspondiente “app/libs”, de igual modo se cargan las extensiones automáticamente “extensions/” y los helpers “helpers/”. Por esta razón el archivo “/config/boot.ini” ya no se usa en la versión 1.0 beta2<br />
<br />
==== ¿Que debo cambiar? ====<br />
<br />
Si se tiene una APP con la versión 1.0 beta1, solamente debe eliminar (ya que no sera necesario) el archivo “/config/boot.ini” la carga de librerías que se realizaba mediante load::lib(''); ya no es necesaria, así que estas también se pueden borrar. <br />
En resumen: eliminar todas las cargas de librerías que se hagan mediante load::lib(''); y boot.ini<br />
<br />
==== Como se usa ====<br />
<br />
Como verán se omite la carga de librerías y se crea directamente el objeto<br />
<br />
'''Versión 1.0 beta 1'''<br />
<source lang=php><br />
Load::lib('session');<br />
$var = Session::get('var');</source><br />
<br />
'''Versión 1.0 beta 2'''<br />
<source lang=php>$var = Session::get('var');</source><br />
<br />
== Controller principal cambio de nombre ==<br />
<br />
Dentro de los cambios que encontraremos en las versiones beta 1 y beta 2 estar el cambio de nombre del archivo application.php por application_controller.php el cual mantendrá la funcionalidad, solo cambia el nombre del archivo que sigue siendo el controller principal <br />
<br />
¿porque se cambio? simple, es un controller y al igual que los demás debe llevar el sufijo _controller que identifica los controladores de kumbiaphp<br />
<br />
<br />
<br />
== Nuevo árbol de directorios ==<br />
<br />
Anteriormente los partials, templates y errors se almacenaban en 'app/views/' a pesar de que no eran vistas, debido a eso se creo el directorio '_shared' y se movió todo lo que no son vistas allí.<br />
<br />
_shared es el directorio 'app/views/_shared' que ahora almacena partials, templates y errors<br />
<br />
Así que en nuestra migración debemos mover los archivos correspondientes a dichos directorios<br />
Ejemplo: 'app/views/partials/menu.phtml' pasara al directorio 'app/views/_shared/partials/menu.phtml'<br />
(pueden ver el ejemplo básico dentro de su app con el partial footer.phtml que se encuentra en dicho directorio)<br />
<br />
<br />
----<br />
<br />
Por supuesto... aun falta a esta documentación, por el momento les recomiendo que revisen el CRUD de la versión 1.0 beta 2 allí podrán ver otros cambios, estos se documentaran muy pronto [[Beta2_CRUD_en_KumbiaPHP_Framework| CRUD Beta2 KumbiaPHP]]<br />
<br />
<br />
--[[Usuario:Onizukar|Onizukar]] 16:16 05 mar 2010 (UTC)<br />
--[[Usuario:Ingjuanfelipe|Ingjuanfelipe]] 20:38 21 feb 2010 (UTC)</div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2244KumbiaPHP Framework Versión 1.0 Spirit2010-01-19T03:37:24Z<p>Emilio.rst: /* get($id, $group='default') */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Constante en KumbiaPHP==<br />
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 maneras rutas (paths) en el framework.<br />
<br />
=== APP_PATH ===<br />
Constante que contiene la ruta absoluta al directorio donde se encuentra nuestra aplicación (app).<br />
<br />
Ejemplo:<br />
<pre><br />
echo APP_PATH; //la salida es: /var/www/kumbiaphp/app/ <br />
</pre><br />
<br />
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.<br />
<br />
<pre><br />
include_once APP_PATH.'libs/test.php';<br />
</pre><br />
<br />
'''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.'''<br />
<br />
=== CORE_PATH ===<br />
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.<br />
<br />
Ejemplo:<br />
<pre><br />
echo CORE_PATH; //la salida es: /var/www/kumbiaphp/core/ <br />
</pre><br />
<br />
Para incluir archivos que se encuentre bajo este arbol de directorio es el mismo precidimiento que se explico para la constante APP_PATH<br />
<br />
'''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]]'''<br />
<br />
=== URL_PATH ===<br />
Constante que contiene la URL para el navegador (browser) y apunta a '''app/public/''' para enlazar imágenes, CSS, JavaScritp y todo lo que sea ruta para browser.<br />
<br />
Ejemplo:<br />
<pre><br />
//Genera un link que ira al controller: controller y action: action<br />
<a href="<?php echo URL_PATH ?>controller/action/" title="Mi Link">Mi Link</a> <br />
<br />
//Enlaza una imagen que esta en public/img/imagen.jpg<br />
<img src="<?php echo URL_PATH ?>img/imagen.jpg" alt="Una Imagen" /> <br />
<br />
//Enlaza el archivo CSS en public/css/style.css<br />
<link rel="stylesheet" type="text/css" href="<?php echo URL_PATH ?>css/style.css"/> <br />
</pre><br />
<br />
'''NOTA: siempre será mejor hacer uso de los helpers'''<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
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.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
Es decir, se usa libs= en vez de extensions=<br />
Y también se quita el prefijo kumbia.<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''driver''' que te proporciona la clase Cache.<br />
<br />
===Cache::driver($driver=null)===<br />
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'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$data = Cache::driver()->get('data');<br />
<br />
// manejador para memcache<br />
$data_memcache = Cache::driver('memcache')->get('data');<br />
<br />
// manejador para cache con APC<br />
$data_apc = Cache::driver('APC')->get('data');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<source lang=php><br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::driver()->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::driver()->save('hola', null, 'data');<br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::driver()->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::driver()->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::driver()->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2243KumbiaPHP Framework Versión 1.0 Spirit2010-01-19T03:36:08Z<p>Emilio.rst: /* Cache */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Constante en KumbiaPHP==<br />
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 maneras rutas (paths) en el framework.<br />
<br />
=== APP_PATH ===<br />
Constante que contiene la ruta absoluta al directorio donde se encuentra nuestra aplicación (app).<br />
<br />
Ejemplo:<br />
<pre><br />
echo APP_PATH; //la salida es: /var/www/kumbiaphp/app/ <br />
</pre><br />
<br />
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.<br />
<br />
<pre><br />
include_once APP_PATH.'libs/test.php';<br />
</pre><br />
<br />
'''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.'''<br />
<br />
=== CORE_PATH ===<br />
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.<br />
<br />
Ejemplo:<br />
<pre><br />
echo CORE_PATH; //la salida es: /var/www/kumbiaphp/core/ <br />
</pre><br />
<br />
Para incluir archivos que se encuentre bajo este arbol de directorio es el mismo precidimiento que se explico para la constante APP_PATH<br />
<br />
'''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]]'''<br />
<br />
=== URL_PATH ===<br />
Constante que contiene la URL para el navegador (browser) y apunta a '''app/public/''' para enlazar imágenes, CSS, JavaScritp y todo lo que sea ruta para browser.<br />
<br />
Ejemplo:<br />
<pre><br />
//Genera un link que ira al controller: controller y action: action<br />
<a href="<?php echo URL_PATH ?>controller/action/" title="Mi Link">Mi Link</a> <br />
<br />
//Enlaza una imagen que esta en public/img/imagen.jpg<br />
<img src="<?php echo URL_PATH ?>img/imagen.jpg" alt="Una Imagen" /> <br />
<br />
//Enlaza el archivo CSS en public/css/style.css<br />
<link rel="stylesheet" type="text/css" href="<?php echo URL_PATH ?>css/style.css"/> <br />
</pre><br />
<br />
'''NOTA: siempre será mejor hacer uso de los helpers'''<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
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.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
Es decir, se usa libs= en vez de extensions=<br />
Y también se quita el prefijo kumbia.<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''driver''' que te proporciona la clase Cache.<br />
<br />
===Cache::driver($driver=null)===<br />
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'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$data = Cache::driver()->get('data');<br />
<br />
// manejador para memcache<br />
$data_memcache = Cache::driver('memcache')->get('data');<br />
<br />
// manejador para cache con APC<br />
$data_apc = Cache::driver('APC')->get('data');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::driver()->get('data');<br />
</pre><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::driver()->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::driver()->save('hola', null, 'data');<br />
$data = Cache::driver()->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::driver()->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::driver()->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::driver()->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::driver()->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2228KumbiaPHP Framework Versión 1.0 Spirit2010-01-01T00:08:11Z<p>Emilio.rst: /* config.ini */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
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.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
Es decir, se usa libs= en vez de extensions=<br />
Y también se quita el prefijo kumbia.<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''factory''' que te proporciona la clase Cache.<br />
<br />
===Cache::factory($driver=null)===<br />
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'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$cache = Cache::factory();<br />
<br />
// manejador para memcache<br />
$memcache = Cache::factory('memcache');<br />
<br />
// manejador para cache con APC<br />
$apc = Cache::factory('APC');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$cache = Cache::factory();<br />
$data = $cache->get('data');<br />
</pre><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php $cache = Cache::factory(); ?><br />
<?php if($data = $cache->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
$cache->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->save('hola', null, 'data');<br />
$data = $cache->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php $cache = Cache::factory(); ?><br />
<?php if($data = $cache->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php $cache->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2219KumbiaPHP Framework Versión 1.0 Spirit2009-12-27T03:41:41Z<p>Emilio.rst: /* Cache::factory($driver=null) */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil para cuando se manejan muchos modelos no tener la necesidad de cargarlos todos en un momento, sino que se cargan 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
Es decir, se usa libs= en vez de extensions=<br />
Y también se quita el prefijo kumbia.<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''factory''' que te proporciona la clase Cache.<br />
<br />
===Cache::factory($driver=null)===<br />
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'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$cache = Cache::factory();<br />
<br />
// manejador para memcache<br />
$memcache = Cache::factory('memcache');<br />
<br />
// manejador para cache con APC<br />
$apc = Cache::factory('APC');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$cache = Cache::factory();<br />
$data = $cache->get('data');<br />
</pre><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php $cache = Cache::factory(); ?><br />
<?php if($data = $cache->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
$cache->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->save('hola', null, 'data');<br />
$data = $cache->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php $cache = Cache::factory(); ?><br />
<?php if($data = $cache->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php $cache->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=2218KumbiaPHP Framework Versión 1.0 Spirit2009-12-27T03:40:05Z<p>Emilio.rst: /* Cache */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador <br />
admin y una acción autenticar / = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
*Si Cargas librerias vía boot.ini ahora se usa libs= en vez de extensions= Y también se quita el prefijo '''kumbia.'''<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil para cuando se manejan muchos modelos no tener la necesidad de cargarlos todos en un momento, sino que se cargan 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
Es decir, se usa libs= en vez de extensions=<br />
Y también se quita el prefijo kumbia.<br />
<br />
'''KumbiaPHP 0.5'''<br />
<pre><br />
[modules]<br />
extensions = kumbia.logger, kumbia.auth<br />
</pre><br />
'''KumbiaPHP 1.0'''<br />
<pre><br />
[modules]<br />
libs = logger, auth<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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"). <br />
<br />
Puedes obtener un driver de Cache utilizando el metodo '''factory''' que te proporciona la clase Cache.<br />
<br />
===Cache::factory($driver=null)===<br />
Este metodo permite obtener el manejador de cache indicado, si no se indica se obtiene el manejador de cache por defecto indicado en el '''config.ini'''.<br />
<br />
Ejemplos:<br />
<br />
<source lang=php><br />
// cache por defecto<br />
$cache = Cache::factory();<br />
<br />
// manejador para memcache<br />
$memcache = Cache::factory('memcache');<br />
<br />
// manejador para cache con APC<br />
$apc = Cache::factory('APC');<br />
</source><br />
<br />
<br />
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:<br />
<br />
===get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$cache = Cache::factory();<br />
$data = $cache->get('data');<br />
</pre><br />
<br />
===save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php $cache = Cache::factory(); ?><br />
<?php if($data = $cache->get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
$cache->save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->save('hola', null, 'data');<br />
$data = $cache->get('data');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php $cache = Cache::factory(); ?><br />
<?php if($data = $cache->start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php $cache->end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->clean('default');<br />
</source><br />
<br />
===remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
$cache = Cache::factory();<br />
$cache->remove('data');<br />
</source><br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo (muestra un mensaje con el valor del campo)<br />
<br />
'''Nota:''' Solo un parametro con nombre se muestra a la vez, teniendo prioridad el parametro con nombre '''message'''.<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
o <br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'field: cedula')<br />
$this->validates_uniqueness_of('cedula', array('field'=>'cedula'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida el tamaño mínimo y máximo de caracteres permitidos en el campo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que no son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'stripspace');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::image($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::image('archivo');<br />
...<br />
</source><br />
<br />
==Partials de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
?><br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
?><br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre; ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=Cambios_Pendientes_Spirit&diff=2110Cambios Pendientes Spirit2009-10-13T16:16:28Z<p>Emilio.rst: /* Helpers */</p>
<hr />
<div>== Cambios Pendientes KumbiaPHP versión 1.0 Spirit==<br />
<br />
* Terminar el scaffold<br />
* Crear la web de Kumbiaphp con Kumbiaphp<br />
<br />
* Tener siempre en cuenta:<br />
** KISS<br />
** Convención sobre configuración<br />
** Velocidad<br />
<br />
==Views==<br />
* <s>templates, partials y errors por _shared y ponerlos dentro o no se pueden usar esos nombres para controllers</s><br />
* <s>en View para usar el set_response tambien usar _xxx. ejemplo: views/controller/_rss/action</s><br />
* Proposicion crear tambien un dir default(u otro nombre) dentro del _shared, para tener views por defecto si no existe para esa accion en su dir views/controller/action.(debe tener un atributo el controller para habilitarlo por seguridad)<br />
<br />
Por ejemplo si no tiene index.php cargar el shared/default/index.phmtl si existe. Otro, un xml.phtml que podria usar cualquier accion de cualquier controller.<br />
<br />
==ActiveRecord==<br />
* Eliminar ereg, eregi, ereg_xxx del codigo<br />
* El paginate debe enviar exception si se le pasa valor negativo y evitar la llamada a bd<br />
* <s>Tambien el paginate debe enviar exception si despues de la consulta no existe esa pag</s><br />
* Ahora los modelos llevaran el include_once arriba para la clase que necesiten<br />
* Las validaciones no deben usar el Flash al no validar<br />
* Mirar si podemos pasarle algo del nuevo ActiveRecord<br />
* Intentar añadir with: <br />
* (Behaviors)<br />
* Si lo podemos aligerar un poco, mejor<br />
* Intentar añadir metodos estaticos, por si usan php 5.3 que lo aprovechen. (internamente ese metodo comprobara la version de PHP)<br />
* <s>Eliminar exception de la clase</s><br />
* <s>Cambiado models_autoload a Off en el config.ini. Ademas era una mala practica</s><br />
* <s>Posibilidad de quitar el models_autoload del config.ini. Eso lo puede hacer el usuario en el initialize añadir Load::models()</s><br />
* (Los callabacks deben ser protected)<br />
* (Crear convencion _up en activeRecord para upload de archivos.)<br />
<br />
==Helpers==<br />
* (Crear alias e para el echo, igual como ahora el h para htmlspecialchars)<br />
* <s>Este es mejor: <br />
crear alias eh para que haga las 2 cosas de un golpe, el echo y el htmlspecialchars. Podemos escoger otro nombre para este alias.<br />
ejemplo: <br />
<pre><br />
<h1><?php eh($model->campo) ?></h1><br />
</pre></s><br />
<br />
* Ya que los nuevos hepers son clases, poder cambiar los dirs de js, img, css,.... Via atributos. Más que nada para poder tenerlos en subdominio, si uno quiere.<br />
* <s>Partials paginators si van al page 1 no deben enviar el 1, solo el path</s><br />
<br />
==Router==<br />
* <s>Quitar el redirect del controller y pasarlo al router,</s> tambien que pueda pasar el 301, 302,... si no usa tiempo.<br />
* <s>Quitar de atributos el all_parameters y el id (id no es necesario y si alguien lo quiere $parameters[0])</s><br />
* (Optimizarlo)<br />
* Cambiar routes.ini para evitar el bug que tiene php 5.3<br />
* poder pasar parametros usando el routes.ini<br />
<br />
* Poder usar el Flash via session (no es del router pero el cambio es debido al enrutar)<br />
* Obtener la URL completa incluyendo el dominio.(con esto ademas podriamos usar routes relativas y absolutas)<br />
* Manejo de rutas estáticas para subdominios. (Posiblemente sea mejor usar el .htaccess)<br />
<br />
==Dispatcher==<br />
* Intentar eliminar el get_controller()<br />
<br />
==Exception==<br />
* Arreglar la exception por si hay espacios en el trace<br />
* Cambiar los path separators(win)en el trace<br />
* Poder enviar en el throw el tipo de error (404,500,501,....)<br />
* Añadir boton listar ficheros, debajo de xx files includes. (Posible que salga via jquery). Separados por:<br />
** Includes app<br />
** Includes Core<br />
** Includes Exception<br />
* (Mirar donde podemos usar mas Try y Catch de exceptions, y poder quitar validaciones.)<br />
<br />
==Recordar==<br />
* Intentar standarizar el sistema de drivers o adapters (db adapters, cache drivers, sesion drivers, auth ...)<br />
* Mejorar la cache<br />
* Y si quitamos el constructor del controller??? por seguridad y ponemos este y un par mas como private vacios.<br />
* Posibilidad de crear un php en el dir de CORE para que devuelva la version y su path.(esto para que se pueda poner en bin, por ejemplo)<br />
* Crear plantilla para partials, helpers, ... (Autor, categoria, descripcion,...)<br />
* Crear boceto para sistema de plugins(mini apps)<br />
* Considerar HomeController como controller por defecto (mostraria la bienvenida tb) sin usar routes.ini<br />
* Considerar admin o backend modulo por defecto con auth <br />
* Intentar poder usar el auth por defecto, si existe la tabla usuarios y usar el http auth.(convencion sobre configuaracion)<br />
* Quitar o cambiar los vendors por nuevos<br />
* Posible cambio en pages, en vez de show usar el index. Asi funcionaria example.com/pages/xxx<br />
* Tambien se puede añadir en pages un metodo secret o secure que miraria primero el auth<br />
* Mejorar el config class<br />
<br />
==Antiguo beta1==<br />
* <s>Terminar la nueva bienvenida</s><br />
* <s>Cuando se lanzan las excepciones en ocasiones no se cargan los estilos</s><br />
* <s>Terminar que el kumbia exception se encargue de mostrar views para la salida de errores (diferentes en desarrollo y en producción )</s><br />
* <s>Crear session en dispatcher solo si el controller es persistente</s><br />
* <s>Mover la carga del tags.php y use_helper('main') al get_view()</s><br />
* <s>Si no usa ni template ni view, validarlo antes de llamar al get_view()</s<<br />
* Cambiar en los callbacks de ActiveRecord el '''return 'cancel'''' por un bool es mejor hacer '''return false'''<br />
* <s>Mover el application controller del dir controllers al dir de la app</s><br />
* <s>Mover el model base tambien al dir de la app</s><br />
* <s>El application debe extender del controller base de kumbia libs (ahora esta al reves)</s><br />
* <s>Cambiar enviroment.ini por databases.ini</s> (lo suyo seria que tuviese el db_date del config.ini y si es posible añadir uno para el charset de la db)<br />
* Cambiar los if(file_exists por if(!include $file) { throw new KumbiaException..... (o mejor con un try, si es posible)<br />
* <s>Crear un dir temp (para poner dentro el de cache y el de logs)</s><br />
* <s>Cambiar, si es posible el mode de config.ini para que sea production = on | off</s><br />
* <s>Quitar del config.ini la configuracion de directorios</s><br />
* <s>Necesitamos un metodo para la carga selectiva de modulos (como la de modelos)</s><br />
* <s>Quitar el extends object en las clases que no lo necesitan (posiblemente no la necesita ninguna)</s><br />
* <s>Quitar el join_path y donde se use</s><br />
* <s>Solucionar el problema de los headers</s><br />
* <s>Integrar la nueva cache</s><br />
* <s>Eliminar toda la vieja cache en la clase kumbia y controller</s><br />
* <s>Añadir cache a los partials</s><br />
* <s>Hacer la clase logger estática</s><br />
* Añadir mas información a los log (estilo apache)<br />
* Habilitar archivos log vía rss<br />
* Habilitar una opción vía '''config.ini''' para enviar un mail con los log, contendría el mail del admin.<br />
* Cuando la APP este en producción las excepciones deben ir a un log o rss(si esta habilitado). Y enviar un error 500<br />
* <s>Añadir locale al config.ini</s><br />
* <s>Mejorar la carga de clases del boot.ini</s><br />
* <s>Mover la carga del standard form al boot.ini</s><br />
* Utilizar el [http://fr.php.net/manual/es/filter.constants.php filter_var] de PHP en la clase filter. Y en el sanitize y validate de models<br />
* <s>Terminar y limpiar el pages controller</s><br />
* <s>Usar el pages controller para visualizar la bienvenida y ponerlo en el routes.ini</s><br />
* La clase xml debe cargarse cuando se necesita y después hacer un exit()<br />
* <s>Añadir variable $view al controller para evitar bug y limpiar codigo del render del controller</s><br />
* Rehacer el Router::route_to<br />
* <s>Arreglo de los validadores de ActiveRecord.</s><br />
* <s>Quitar de los validadores de ActiveRecord el llamado a $this->_connet() eso se ha de pasar al save() tomar como referencia al método '''validates_presence_of'''</s><br />
* <s>Habilitar en el config.ini la carga de modelos (databases), esto para cuando se desee trabajar con o sin modelos</s><br />
* <s>Agregar al paginate de ActiveRecord el atributo count</s><br />
* El objeto devuelto por Active Record debe ser:<br />
:Objeto ActiveRecord {<br />
::array Metadata (con la metadata)<br />
::array Items (con objetos stdObject)<br />
:}<br />
:Y si es posible, mejor sólo un array sin nombre con los items.<br />
* El active record debe crear el objecto de un golpe ( $items[] = (obj) $array_row )<br />
* El controller debe hacer el sanitize del get, post y request y no el active record<br />
* <s>Las variables que inicializa al principio Kumbia::main() deberia crear constantes<br />
Sera más fácil de leer el código y podremos quitar código que sólo pasa esas variables,<br />
asi como las variables de objeto, usando menos memoria.<br />
Serian para los directorios:<br />
MODELS, CONTROLLERS, LIBS, VIEWS, HELPERS<br />
<br />
Y si es un módulo, ya se creara aqui el directorio correctamente (posible problema con el <br />
route_to, hay que mirarlo)</s></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=Cambios_Pendientes_Spirit&diff=2109Cambios Pendientes Spirit2009-10-13T15:29:17Z<p>Emilio.rst: /* ActiveRecord */</p>
<hr />
<div>== Cambios Pendientes KumbiaPHP versión 1.0 Spirit==<br />
<br />
* Terminar el scaffold<br />
* Crear la web de Kumbiaphp con Kumbiaphp<br />
<br />
* Tener siempre en cuenta:<br />
** KISS<br />
** Convención sobre configuración<br />
** Velocidad<br />
<br />
==Views==<br />
* <s>templates, partials y errors por _shared y ponerlos dentro o no se pueden usar esos nombres para controllers</s><br />
* <s>en View para usar el set_response tambien usar _xxx. ejemplo: views/controller/_rss/action</s><br />
* Proposicion crear tambien un dir default(u otro nombre) dentro del _shared, para tener views por defecto si no existe para esa accion en su dir views/controller/action.(debe tener un atributo el controller para habilitarlo por seguridad)<br />
<br />
Por ejemplo si no tiene index.php cargar el shared/default/index.phmtl si existe. Otro, un xml.phtml que podria usar cualquier accion de cualquier controller.<br />
<br />
==ActiveRecord==<br />
* Eliminar ereg, eregi, ereg_xxx del codigo<br />
* El paginate debe enviar exception si se le pasa valor negativo y evitar la llamada a bd<br />
* <s>Tambien el paginate debe enviar exception si despues de la consulta no existe esa pag</s><br />
* Ahora los modelos llevaran el include_once arriba para la clase que necesiten<br />
* Las validaciones no deben usar el Flash al no validar<br />
* Mirar si podemos pasarle algo del nuevo ActiveRecord<br />
* Intentar añadir with: <br />
* (Behaviors)<br />
* Si lo podemos aligerar un poco, mejor<br />
* Intentar añadir metodos estaticos, por si usan php 5.3 que lo aprovechen. (internamente ese metodo comprobara la version de PHP)<br />
* <s>Eliminar exception de la clase</s><br />
* <s>Cambiado models_autoload a Off en el config.ini. Ademas era una mala practica</s><br />
* <s>Posibilidad de quitar el models_autoload del config.ini. Eso lo puede hacer el usuario en el initialize añadir Load::models()</s><br />
* (Los callabacks deben ser protected)<br />
* (Crear convencion _up en activeRecord para upload de archivos.)<br />
<br />
==Helpers==<br />
* (Crear alias e para el echo, igual como ahora el h para htmlspecialchars)<br />
* <s>Este es mejor: <br />
crear alias eh para que haga las 2 cosas de un golpe, el echo y el htmlspecialchars. Podemos escoger otro nombre para este alias.<br />
ejemplo: <br />
<pre><br />
<h1><?php eh($model->campo) ?></h1><br />
</pre></s><br />
<br />
* Ya que los nuevos hepers son clases, poder cambiar los dirs de js, img, css,.... Via atributos. Más que nada para poder tenerlos en subdominio, si uno quiere.<br />
* Partials paginators si van al page 1 no deben enviar el 1, solo el path<br />
<br />
==Router==<br />
* <s>Quitar el redirect del controller y pasarlo al router,</s> tambien que pueda pasar el 301, 302,... si no usa tiempo.<br />
* <s>Quitar de atributos el all_parameters y el id (id no es necesario y si alguien lo quiere $parameters[0])</s><br />
* (Optimizarlo)<br />
* Cambiar routes.ini para evitar el bug que tiene php 5.3<br />
* poder pasar parametros usando el routes.ini<br />
<br />
* Poder usar el Flash via session (no es del router pero el cambio es debido al enrutar)<br />
* Obtener la URL completa incluyendo el dominio.(con esto ademas podriamos usar routes relativas y absolutas)<br />
* Manejo de rutas estáticas para subdominios. (Posiblemente sea mejor usar el .htaccess)<br />
<br />
==Dispatcher==<br />
* Intentar eliminar el get_controller()<br />
<br />
==Exception==<br />
* Arreglar la exception por si hay espacios en el trace<br />
* Cambiar los path separators(win)en el trace<br />
* Poder enviar en el throw el tipo de error (404,500,501,....)<br />
* Añadir boton listar ficheros, debajo de xx files includes. (Posible que salga via jquery). Separados por:<br />
** Includes app<br />
** Includes Core<br />
** Includes Exception<br />
* (Mirar donde podemos usar mas Try y Catch de exceptions, y poder quitar validaciones.)<br />
<br />
==Recordar==<br />
* Intentar standarizar el sistema de drivers o adapters (db adapters, cache drivers, sesion drivers, auth ...)<br />
* Mejorar la cache<br />
* Y si quitamos el constructor del controller??? por seguridad y ponemos este y un par mas como private vacios.<br />
* Posibilidad de crear un php en el dir de CORE para que devuelva la version y su path.(esto para que se pueda poner en bin, por ejemplo)<br />
* Crear plantilla para partials, helpers, ... (Autor, categoria, descripcion,...)<br />
* Crear boceto para sistema de plugins(mini apps)<br />
* Considerar HomeController como controller por defecto (mostraria la bienvenida tb) sin usar routes.ini<br />
* Considerar admin o backend modulo por defecto con auth <br />
* Intentar poder usar el auth por defecto, si existe la tabla usuarios y usar el http auth.(convencion sobre configuaracion)<br />
* Quitar o cambiar los vendors por nuevos<br />
* Posible cambio en pages, en vez de show usar el index. Asi funcionaria example.com/pages/xxx<br />
* Tambien se puede añadir en pages un metodo secret o secure que miraria primero el auth<br />
* Mejorar el config class<br />
<br />
==Antiguo beta1==<br />
* <s>Terminar la nueva bienvenida</s><br />
* <s>Cuando se lanzan las excepciones en ocasiones no se cargan los estilos</s><br />
* <s>Terminar que el kumbia exception se encargue de mostrar views para la salida de errores (diferentes en desarrollo y en producción )</s><br />
* <s>Crear session en dispatcher solo si el controller es persistente</s><br />
* <s>Mover la carga del tags.php y use_helper('main') al get_view()</s><br />
* <s>Si no usa ni template ni view, validarlo antes de llamar al get_view()</s<<br />
* Cambiar en los callbacks de ActiveRecord el '''return 'cancel'''' por un bool es mejor hacer '''return false'''<br />
* <s>Mover el application controller del dir controllers al dir de la app</s><br />
* <s>Mover el model base tambien al dir de la app</s><br />
* <s>El application debe extender del controller base de kumbia libs (ahora esta al reves)</s><br />
* <s>Cambiar enviroment.ini por databases.ini</s> (lo suyo seria que tuviese el db_date del config.ini y si es posible añadir uno para el charset de la db)<br />
* Cambiar los if(file_exists por if(!include $file) { throw new KumbiaException..... (o mejor con un try, si es posible)<br />
* <s>Crear un dir temp (para poner dentro el de cache y el de logs)</s><br />
* <s>Cambiar, si es posible el mode de config.ini para que sea production = on | off</s><br />
* <s>Quitar del config.ini la configuracion de directorios</s><br />
* <s>Necesitamos un metodo para la carga selectiva de modulos (como la de modelos)</s><br />
* <s>Quitar el extends object en las clases que no lo necesitan (posiblemente no la necesita ninguna)</s><br />
* <s>Quitar el join_path y donde se use</s><br />
* <s>Solucionar el problema de los headers</s><br />
* <s>Integrar la nueva cache</s><br />
* <s>Eliminar toda la vieja cache en la clase kumbia y controller</s><br />
* <s>Añadir cache a los partials</s><br />
* <s>Hacer la clase logger estática</s><br />
* Añadir mas información a los log (estilo apache)<br />
* Habilitar archivos log vía rss<br />
* Habilitar una opción vía '''config.ini''' para enviar un mail con los log, contendría el mail del admin.<br />
* Cuando la APP este en producción las excepciones deben ir a un log o rss(si esta habilitado). Y enviar un error 500<br />
* <s>Añadir locale al config.ini</s><br />
* <s>Mejorar la carga de clases del boot.ini</s><br />
* <s>Mover la carga del standard form al boot.ini</s><br />
* Utilizar el [http://fr.php.net/manual/es/filter.constants.php filter_var] de PHP en la clase filter. Y en el sanitize y validate de models<br />
* <s>Terminar y limpiar el pages controller</s><br />
* <s>Usar el pages controller para visualizar la bienvenida y ponerlo en el routes.ini</s><br />
* La clase xml debe cargarse cuando se necesita y después hacer un exit()<br />
* <s>Añadir variable $view al controller para evitar bug y limpiar codigo del render del controller</s><br />
* Rehacer el Router::route_to<br />
* <s>Arreglo de los validadores de ActiveRecord.</s><br />
* <s>Quitar de los validadores de ActiveRecord el llamado a $this->_connet() eso se ha de pasar al save() tomar como referencia al método '''validates_presence_of'''</s><br />
* <s>Habilitar en el config.ini la carga de modelos (databases), esto para cuando se desee trabajar con o sin modelos</s><br />
* <s>Agregar al paginate de ActiveRecord el atributo count</s><br />
* El objeto devuelto por Active Record debe ser:<br />
:Objeto ActiveRecord {<br />
::array Metadata (con la metadata)<br />
::array Items (con objetos stdObject)<br />
:}<br />
:Y si es posible, mejor sólo un array sin nombre con los items.<br />
* El active record debe crear el objecto de un golpe ( $items[] = (obj) $array_row )<br />
* El controller debe hacer el sanitize del get, post y request y no el active record<br />
* <s>Las variables que inicializa al principio Kumbia::main() deberia crear constantes<br />
Sera más fácil de leer el código y podremos quitar código que sólo pasa esas variables,<br />
asi como las variables de objeto, usando menos memoria.<br />
Serian para los directorios:<br />
MODELS, CONTROLLERS, LIBS, VIEWS, HELPERS<br />
<br />
Y si es un módulo, ya se creara aqui el directorio correctamente (posible problema con el <br />
route_to, hay que mirarlo)</s></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1538KumbiaPHP Framework Versión 1.0 Spirit2009-09-11T01:11:17Z<p>Emilio.rst: /* Load::lib($lib) */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1537KumbiaPHP Framework Versión 1.0 Spirit2009-09-11T01:09:51Z<p>Emilio.rst: /* Filtrando datos enviados en el Request */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1536KumbiaPHP Framework Versión 1.0 Spirit2009-09-11T01:09:15Z<p>Emilio.rst: /* Load::models($model) */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save_action()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1535KumbiaPHP Framework Versión 1.0 Spirit2009-09-11T01:08:41Z<p>Emilio.rst: /* Load::models($model) */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index_action()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save_action()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1534KumbiaPHP Framework Versión 1.0 Spirit2009-09-11T01:07:44Z<p>Emilio.rst: /* Vamos a lo Práctico */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index_action()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index_action()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save_action()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1533KumbiaPHP Framework Versión 1.0 Spirit2009-09-11T01:05:43Z<p>Emilio.rst: /* Migración Rápida */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*En el Controlador los métodos '''initialize, finalize, before_filter y after_filter''' ahora son '''protected''' por motivos de seguridad.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index_action()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index_action()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save_action()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1528KumbiaPHP Framework Versión 1.0 Spirit2009-09-10T18:33:17Z<p>Emilio.rst: /* Migración Rápida */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index_action()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index_action()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save_action()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1519KumbiaPHP Framework Versión 1.0 Spirit2009-09-09T03:05:10Z<p>Emilio.rst: /* Carga Selectiva, Inyección de Dependencias y el Componente Load */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*Ahora por motivos de seguridad se adiciona el sufijo "'''_action'''" a las acciones en los controllers, de esa manera se evita la ejecución cualquier metodo público del controller através la URL y solamente se pueden ejecutar aquellos que el usuario defina explicitamente como acciones utilizando el sufijo.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index_action()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index_action()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save_action()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1518KumbiaPHP Framework Versión 1.0 Spirit2009-09-09T03:04:15Z<p>Emilio.rst: /* Filtrando datos enviados en el Request */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*Ahora por motivos de seguridad se adiciona el sufijo "'''_action'''" a las acciones en los controllers, de esa manera se evita la ejecución cualquier metodo público del controller através la URL y solamente se pueden ejecutar aquellos que el usuario defina explicitamente como acciones utilizando el sufijo.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index_action()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index_action()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save_action()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1517KumbiaPHP Framework Versión 1.0 Spirit2009-09-09T03:02:41Z<p>Emilio.rst: /* Load::models($model) */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*Ahora por motivos de seguridad se adiciona el sufijo "'''_action'''" a las acciones en los controllers, de esa manera se evita la ejecución cualquier metodo público del controller através la URL y solamente se pueden ejecutar aquellos que el usuario defina explicitamente como acciones utilizando el sufijo.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index_action()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index_action()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index_action()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1516KumbiaPHP Framework Versión 1.0 Spirit2009-09-09T02:51:48Z<p>Emilio.rst: /* Vamos a lo Práctico */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*Ahora por motivos de seguridad se adiciona el sufijo "'''_action'''" a las acciones en los controllers, de esa manera se evita la ejecución cualquier metodo público del controller através la URL y solamente se pueden ejecutar aquellos que el usuario defina explicitamente como acciones utilizando el sufijo.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo_action($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1515KumbiaPHP Framework Versión 1.0 Spirit2009-09-09T02:43:32Z<p>Emilio.rst: /* Migración Rápida */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*Ahora por motivos de seguridad se adiciona el sufijo "'''_action'''" a las acciones en los controllers, de esa manera se evita la ejecución cualquier metodo público del controller através la URL y solamente se pueden ejecutar aquellos que el usuario defina explicitamente como acciones utilizando el sufijo.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1514KumbiaPHP Framework Versión 1.0 Spirit2009-09-09T02:42:12Z<p>Emilio.rst: /* Migración Rápida */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*Ahora por motivos de seguridad se adiciona el sufijo "'''_action'''" a las acciones en los controllers, de esa manera se evita que se ejecute cualquier metodo público del controller mediante la URL y solamente se pueden ejecutar aquellos que el usuario defina explicitamente como acciones por medio del sufijo.<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
=== Utilizando el método render($view, [$template]) ===<br />
El método '''render($view, [$template])''' se encuentra en la super clase ApplicationController es decir lo tenemos disponible solo en los controladores.<br />
<br />
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]].<br />
<br />
==== ¿De que sirve esto? ====<br />
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.<br />
<br />
==== Vamos a lo Práctico ====<br />
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.<br />
<br />
'''NOTA: KumbiaPHP muestra el view con el mismo nombre de la acción.'''<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view<br />
$this->render('adios');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
Ahora tenemos las vistas.<br />
<br />
'''app/views/blog/saludo.phtml''' (vista por defecto de la acción).<br />
<br />
<source lang=php><br />
<?php echo "Bienvenido $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/<br />
<br />
'''app/views/blog/adios.phtml''' (vista cuando existe el parámetro).<br />
<br />
<source lang=php><br />
<?php echo "Adios $usuario" ?><br />
</source><br />
<br />
La vista anterior se renderizara (mostrar) cuando tengamos la siguiente URL:<br />
<br />
http://dominio.com/blog/saludo/adios/<br />
<br />
===== Cambiando el Template con método render($view, $template) =====<br />
Pero también es posible cambiar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero ahora cambiara el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y el template<br />
$this->render('adios', 'otro_template');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Ahora mostramos un nuevo [[#views.2Ftemplates.2F | Template]] llamado '''otro_template''' para cuando cambiamos el views a '''adios'''.<br />
<br />
===== Ahora sin Template render($view, null) =====<br />
Ahora indicamos que no deseamos mostrar el [[#views.2Ftemplates.2F | Template]] veamos la misma acción pero sin el template.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//cambiamos el view y sin template<br />
$this->render('adios', null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Cuando vayan a http://dominio.com/blog/saludo/adios/ KumbiaPHP cargara solamente el view adios.phtml sin template ya que así lo indicamos.<br />
<br />
===== Ahora sin view render(null, [$template]) =====<br />
Ahora indicamos que no deseamos mostrar el View de la acción, veamos la misma acción pero sin el view.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//Mostrando un mensaje desde la acción<br />
Flash::notice('Adios '.$this->usuario);<br />
<br />
//sin el view y con el template por defecto<br />
$this->render(null);<br />
}<br />
}<br />
}<br />
</source><br />
<br />
===== Ahora sin view y sin template render(null, null) =====<br />
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.<br />
<br />
<source lang=php><br />
<?php<br />
class BlogController extends ApplicationController <br />
{<br />
public function saludo($var=null)<br />
{<br />
$this->usuario = 'Usuario';<br />
if($var == 'adios'){<br />
//KumbiaPHP no mostrará nada<br />
$this->render(null, null);<br />
<br />
//enrutamos a otro controller<br />
return Router::route_to('controller: otro_controller');<br />
}<br />
}<br />
}<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
== Carga Selectiva, Inyección de Dependencias y el Componente Load ==<br />
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.<br />
<br />
=== Load::lib($lib) ===<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
[[Archivo:Paginado classic.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
[[Archivo:paginado_extended.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
[[Archivo:paginado_simple.JPG|thumb|right|Resultado Final]]<br />
<br />
<br />
Vista de paginación simple. <br />
<br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo $p->nombre ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1172KumbiaPHP Framework Versión 1.0 Spirit2009-08-12T05:16:58Z<p>Emilio.rst: /* Ejemplo de uso */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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 podemos agregar cuantos se desee y poderlo cambiar desde nuestro controlador de la siguiente forma:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
=== Carga Selectiva, Inyección de Dependencias y el Componente Load ===<br />
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.<br />
<br />
==== Load::lib($lib) ====<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
Vista de paginación simple. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''UsuarioController''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source><br />
<br />
Y en la vista '''views/usuario/page.phtml'''<br />
<br />
<source lang=php><br />
<table><br />
<tr><br />
<th>Id</th><br />
<th>Nombre</th><br />
</tr><br />
<?php foreach($page->items as $p): ?><br />
<tr><br />
<td><?php echo $p->id; ?></td><br />
<td><?php echo htmlspecialchars($p->nombre); ?></td><br />
</tr><br />
<?php endforeach; ?><br />
</table><br />
<br />
<?php View::partial('paginators/classic', false, array('page' => $page)); ?><br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1171KumbiaPHP Framework Versión 1.0 Spirit2009-08-12T05:10:23Z<p>Emilio.rst: /* Ejemplo de uso */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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 podemos agregar cuantos se desee y poderlo cambiar desde nuestro controlador de la siguiente forma:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
=== Carga Selectiva, Inyección de Dependencias y el Componente Load ===<br />
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.<br />
<br />
==== Load::lib($lib) ====<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
Vista de paginación simple. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''' en '''models/usuario.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
/**<br />
* Muestra los usuarios de cinco en cinco utilizando paginador<br />
*<br />
* @param int $page<br />
* @return object<br />
**/<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source><br />
<br />
<br />
Para el controlador '''Usuario''' en '''controllers/usuario_controller.php''':<br />
<br />
<source lang=php><br />
<?php<br />
class UsuarioController extends ApplicationController<br />
{<br />
public $models = array('usuario');<br />
<br />
/**<br />
* Accion de paginacion<br />
*<br />
* @param int $page<br />
**/<br />
public function page($page=1)<br />
{<br />
$this->page = $this->Usuario->ver($page);<br />
} <br />
}<br />
</source></div>Emilio.rsthttps://wiki.kumbiaphp.com/index.php?title=KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit&diff=1170KumbiaPHP Framework Versión 1.0 Spirit2009-08-12T04:55:33Z<p>Emilio.rst: /* Simple */</p>
<hr />
<div>== Introducción ==<br />
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.<br />
<br />
Entre los componentes a nivel del core que hemos tocado para lograr nuestros objetivos se encuentran:<br />
#Estructura de Directorios<br />
#environment.ini<br />
#Router<br />
#Dispatcher<br />
#Clase Kumbia<br />
#Vistas<br />
##Templates y Partials<br />
##Helpers<br />
#Logger<br />
#config.ini<br />
#Cache<br />
<br />
<br />
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.<br />
===¿Por qué Spirit?===<br />
"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."<br />
<br />
== Migración Rápida ==<br />
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.<br />
<br />
*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]]<br />
<br />
*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.<br />
<br />
* Sustituye la función <s>content()</s> por View::content() y <s>render_partial()</s> por View::partial().<br />
<br />
*Para inicializar tu aplicación se ha de utilizar el '''config/routes.ini''' agregando una regla de enrutamiento estático, por ejemplo:<br />
;con esta regla cada vez que inicie la aplicación http://localhost/kumbia/ irá hacia un controlador admin y una acción autenticar<br />
/ = admin/autenticar<br />
<br />
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>'''<br />
<br />
*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]].<br />
<br />
== Nueva Estructura de Directorios ==<br />
En la versión de KumbiaPHP se incorpora la siguiente estructura de directorios, a continuación se detallan los elementos mas relevantes:<br />
<br />
<pre><br />
spirit/<br />
|-- app<br />
| |-- application.php<br />
| |-- config<br />
| |-- controllers<br />
| |-- extensions<br />
| | |-- filters<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- index.php<br />
| |-- libs<br />
| |-- locale<br />
| |-- model_base.php<br />
| |-- models<br />
| |-- public<br />
| |-- temp<br />
| `-- views<br />
| |-- errors<br />
| |-- pages<br />
| |-- partials<br />
| `-- templates<br />
|-- core<br />
| |-- console<br />
| |-- docs<br />
| |-- extensions<br />
| | |-- helpers<br />
| | `-- scaffolds<br />
| |-- kumbia<br />
| |-- libs<br />
| |-- tests<br />
| |-- vendors<br />
| `-- views<br />
| |-- errors<br />
| |-- partials<br />
| `-- templates<br />
</pre><br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
===Ventajas de esta nueva estructura de directorios===<br />
* Mayor Velocidad :-)<br />
* Cada aplicación tiene su propio front controller (index.php)<br />
* '''Independencia''' total de nuestra aplicación respecto al core del framework.<br />
* 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).<br />
* 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.<br />
<br />
===Explicando dir app===<br />
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.<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|config||Archivos de configuración de nuestra aplicación (config.ini, routes.ini, databases.ini y boot.ini)<br />
|-<br />
|controllers||Estan agrupados los controladores (controllers) y/o módulos. Por defecto se encuentra el controller '''pages_controller.php'''<br />
|-<br />
|models||Estan agrupados los modelos (models).<br />
|-<br />
|views||Estan agrupados las vistas de los controladores (controllers). Por defecto se encuentran los directorios '''templates/''', '''pages/''', '''partials/''' y '''errors/'''<br />
|-<br />
|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 he integradas a la aplicación por medio de las librerías que proporciona [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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).<br />
|-<br />
|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'''.<br />
|-<br />
|public||Agrupa las imágenes, css, javascript y files que serán utilizados por nuestra aplicación <br />
|-<br />
|locale||Agrupa los archivos para el soporte a la internacionalización i18n para la aplicación. <br />
|-<br />
|'''application.php'''||Super class de los controladores (ApplicationController). <br />
|-<br />
|'''model_base.php'''||Super class de los modelos (ActiveRecord). <br />
|}<br />
<br />
===application.php===<br />
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.<br />
<br />
[[Archivo:Application_kumbiaphp_framework.png|center|thumb|200px|application.php]]<br />
<br />
Como se aprecia en la imagen existe una estrecha relación entre '''apllication.php''' y los controladores disponibles en el directorio controllers/. Esta relación se basa principalmente en que las variables y metodos creados en el '''ApplicationController''' (application.php), estarán disponibles para ser usados en cualquier controlador que tengamos en nuestra aplicación.<br />
<br />
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.<br />
<br />
El método '''initialize()''' se ejecuta antes de llamar al controller.<br />
<br />
El método '''finalize()''' se ejecuta despúes de haber llamado al controller.<br />
<br />
<br />
----<br />
<br />
=== Ejemplo de application.php ===<br />
<br />
[[Archivo:Ejemplo_application_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== model_base.php ===<br />
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.<br />
<br />
model_base.php es donde esta definida la super clase '''ActiveRecord'''.<br />
<br />
NOTA: Los modelos representan las tablas de nuestra Base de Datos.<br />
<br />
<br />
[[Archivo:Model_base_kumbiaphp_framework.png|center|thumb|600px|application.php]]<br />
<br />
=== Explicando dir core/ ===<br />
<br />
{| cellpadding="2" cellspacing="2" border="2" style="background: #eee; border: 1px #666 solid; border-collapse: collapse; "<br />
!Directorio!!Descripción<br />
|-<br />
|console||En este directorio se ubican los scripts de terminal que te ayudarán a construir y manejar algunos aspectos de nuestra aplicación<br />
|-<br />
|docs||En este directorio se encuentran los detalles de licencia y otros archivos inherentes a la documentación de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|extensions|| En este directorio se encuentran las extensiones compartidas por todas las aplicaciones<br />
|-<br />
|kumbia|| En este directorio se ubica el núcleo de [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|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.<br />
|-<br />
|tests||En este directorio se ubican las pruebas unitarias para [http://www.kumbiaphp.com KumbiaPHP]<br />
|-<br />
|vendors||En este directorio se ubican las librerias de terceros que son compartidas por todas las aplicaciones<br />
|}<br />
<br />
== config.ini ==<br />
Se agregan opciones para un manejo mas apropiado de la configuración del framework, para la aplicación.<br />
<br />
*'''models_autoload''' Auto carga de modelos, útil 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]]<br />
*'''metadata_lifetime''' Tiempo de vida de la metadata cacheada.<br />
*'''database''' Base de datos a utilizar, especificada en databases.ini.<br />
*'''production''' Indica si se encuentra en producción.<br />
*'''cache_driver''' driver que se utilizara para el manejo de cache. KumbiaPHP cuenta con tres (3) driver: file, sqlite y memsqlite.<br />
*'''locale''' Localicazión<br />
<br />
<pre>;; Configuracion de Aplicacion<br />
<br />
; Explicación de la Configuración:<br />
<br />
; name: Es el nombre de la aplicación<br />
; timezone: Es la zona horaria que usará el framework<br />
; production: Indica si esta en producción<br />
; database: base de datos a utilizar<br />
; dbdate: Formato de Fecha por defecto de la Applicación<br />
; debug: muestra los errores en pantalla (On|off)<br />
; log_exceptions: muestra las excepciones en pantalla (On|off)<br />
; charset: codificacion de caracteres<br />
; models_autoload: Habilita la autocarga de modelos<br />
; cache_driver: driver para la cache (file, sqlite, memsqlite)<br />
; metadata_lifetime: Tiempo de vida de la metadata cacheada<br />
; locale: Localicazion<br />
<br />
<br />
; ¡¡¡ ADVERTENCIA !!!<br />
; Cuando se efectua el cambio de production=Off, a production=On, es necesario eliminar<br />
; el contenido del directorio de cache de la aplicacion para que se renueve<br />
; la metadata<br />
<br />
[application]<br />
name = "KUMBIA PROJECT"<br />
;timezone = "America/New_York"<br />
production = Off<br />
database = development<br />
dbdate = YYYY-MM-DD<br />
debug = On<br />
log_exceptions = On<br />
charset = UTF-8<br />
models_autoload = On<br />
cache_driver = file<br />
;metadata_lifetime = "+1 year"<br />
;locale = es_ES<br />
</pre><br />
<br />
== databases.ini ==<br />
Este archivo viene a remplazar a <s>environment.ini</s> para establecer la configuración de conexión a la base de datos, en este sentido se eliminó el prefijo '''database''', cada sección esta asociada a unos datos de conexión al motor de BD y a su vez esta corresponde al atributo '''database''' del archivo config.ini.<br />
<br />
Veamos un ejemplo, si en el archivo de configuración '''config/config.ini''' tenemos '''database = development''' KumbiaPHP Framework tomara los datos de conexión que estén en la sección '''[development]'''<br />
<br />
Lo mismo sucede para los modelos, el atributo <s>$mode</s> fue reemplazado por '''$database'''<br />
<br />
<source lang=php><br />
class Usuarios extends ActiveRecord<br />
{<br />
public $database = 'test';<br />
}<br />
</source><br />
<br />
Ahora KumbiaPHP Framework buscara los datos de conexión de la sección '''[test]''', para el modelo Usuarios.<br />
<br />
<pre><br />
; KumbiaPHP Web Framework Configuration<br />
; Parámetros de base de datos<br />
; Utiliza el nombre del controlador nativo (mysql, pgsql, oracle)<br />
; Coloca pdo = On si usas PHP Data Objects<br />
<br />
[development]<br />
host = localhost<br />
username = root<br />
password =<br />
name = innogest<br />
type = mysql<br />
<br />
[production]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
<br />
[test]<br />
host = localhost<br />
username = root<br />
password =<br />
name = test<br />
type = mysql<br />
</pre><br />
<br />
== boot.ini ==<br />
En este archivo es donde el usuario carga las extensiones (librerías) que trae el framework o bien alguna que deseen agregar.<br />
<br />
Extensiones Propias de Kumbiaphp Framework<br />
*session<br />
*logger<br />
*auth<br />
*date<br />
*filter<br />
*acl<br />
*benchmark<br />
*security<br />
<br />
Extensiones externas al framework<br />
*excel<br />
*fpdf<br />
*phpmailer<br />
*libchart<br />
<br />
<pre><br />
; LIBRERIAS DISPONIBLES<br />
; Librerias Propias de KumbiaPHP Framework (libraries)<br />
; * session<br />
; * logger<br />
; * auth<br />
; * date<br />
; * filter<br />
; * acl<br />
; * benchmark<br />
; * security<br />
;<br />
; Cargadores en libraries para librerias de terceros (vendors)<br />
; * excel<br />
; * fpdf<br />
; * phpmailer<br />
; * libchart<br />
<br />
<br />
[modules]<br />
libs = logger<br />
</pre><br />
<br />
== Router ==<br />
Mejoras de Rendimiento.<br />
<br />
== Dispatcher ==<br />
Mejoras de Rendimiento.<br />
<br />
== Clase Kumbia ==<br />
Mejoras de Rendimiento.<br />
<br />
== Vistas ==<br />
[[Imagen:Vistas_1.0_spirit.jpg|Estructura de Vistas KumbiaPHP Framework V1.0 Spirit|right|frameless|400px]]<br />
Kumbia posee un sistema de presentación basado en Vistas (Views) que viene siendo el tercer componente del sistema [http://es.wikipedia.org/wiki/Modelo_Vista_Controlador MVC], el framework permite mediante plantillas que son reutilizables para no repetir código.<br />
<br />
Las vistas deberían contener una cantidad mínima de código en PHP para que fuese suficientemente entendible por un diseñador Web y además, para dejar a las vistas sólo las tareas de visualizar los resultados generados por los controladores y presentar las capturas de datos para usuarios.<br />
<br />
En la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) se incorporan dos(02) nuevos directorios en el directorio de vistas de nuestra aplicación los cuales son:<br />
#views/templates/<br />
#views/partials/<br />
<br />
=== views/templates/ ===<br />
Los [http://en.wikipedia.org/wiki/Template_(file_format) Template] son un tipo de archivo pre-formateado utilizado como base para otros archivos.<br />
<br />
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 podemos agregar cuantos se desee y poderlo cambiar desde nuestro controlador de la siguiente forma:<br />
<br />
<source lang=php> <br />
class PruebaController extends ApplicationController <br />
{<br />
public $template = 'plantilla';<br />
}<br />
</source><br />
<br />
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'''<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
Este es mi template<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
'''View::content()''' puede ubicarse en cualquier lugar del template.<br />
<br />
=== views/partials/ ===<br />
Los partials ([http://es.wikipedia.org/wiki/Widget#Los_widget_en_el_.C3.A1mbito_de_la_programaci.C3.B3n_gr.C3.A1fica widget]) son pequeñas vistas que pueden incluirse dentro de otra vista para evitar repetir código, en la '''versión 0.5''' la convención que se tiene es que ha comenzar el nombre del archivo con un underscore(_) ejemplo, '''_partials.phtml''' y estar dentro del directorio de vistas de controlador que lo invoca, en la [https://launchpad.net/kumbia/0.5.1 versión 1.0](<s>antigua 0.5.1</s>) con la finalidad de ofrecer mayor flexibilidad en el manejo de las vistas se ha creado el directorio '''views/partials/''' donde se han de colocar los partials con esto quitamos la convención de los nombres de los partials, de igual forma ya no se encuentran atados a los controladores tal como pasaba en la '''versión 0.5'''.<br />
Los partials pueden representar cualquier tipo de [http://es.wikipedia.org/wiki/GUI Interfaz de Usuario], importante destacar que los partials pueden ser renderizados (mostrados) desde cualquier nivel de vista donde lo necesitemos.<br />
<br />
Ejemplo:<br />
<br />
'''views/partials/fecha.phtml'''<br />
<source lang=php ><br />
<div style='background: #333eee; padding: 15px 10px 15px 10px; text-align: center'><br />
<i><?php echo date('Y-m-d'); ?></i><br />
</div><br />
</source><br />
<br />
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 myor orden e intuitividad, esta función se encapsulo en la clase '''View''', y basta con hacer en la vista (Templates, views) lo siguiente.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha') ?><br />
</source><br />
<br />
<br />
'''Describiendo la función de manera mas detallada:'''<br />
<source lang=php ><br />
View::partial($partial, $time=false, $params=array())<br />
</source><br />
<br />
Para cachear los partials, el tiempo de cacheo debe indicarse con el formato de strtotime tal como lo utiliza el componente cache.<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', '+4 days') ?><br />
</source> <br />
<br />
Si no se desea cachear, se indica como segundo argumento "false", el cual es el valor por defecto<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false) ?><br />
</source> <br />
<br />
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).<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, 'var: valor, var2: valor2') ?><br />
</source> <br />
<br />
<br />
<source lang=php ><br />
<?php View::partial('fecha', false, array('var' => 'valor')) ?><br />
</source> <br />
<br />
Y esta es accesible en el partial como $var<br />
<br />
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:<br />
<br />
<source lang=php ><br />
<?php <br />
$Usuario = new Usuario();<br />
$usuario = $Usuario->find(1);<br />
?><br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php <br />
Load::models('usuario');<br />
$usuario = new Usuario();<br />
$result = $usuario->find(1);<br />
?><br />
</source><br />
<br />
KumbiaPHP con la intención de ofrecer mayor comodidad tambien 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)]]'''.<br />
<br />
<source lang=php ><br />
<?php <br />
$result = Load::model('usuario')->find(1);<br />
?><br />
</source><br />
<br />
=== View::content()===<br />
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.<br />
<br />
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 los mensajes '''Flash''' provenientes de ActiveRecord o los propios. Ejemplo:<br />
<br />
<source lang=php ><br />
<?php <br />
class SaludoController extends ApplicationController<br />
{<br />
public function hola()<br />
{<br />
Flash::success('Hola mundo');<br />
}<br />
}<br />
?><br />
</source><br />
<br />
Y en mi vista "hola.phtml"<br />
<br />
<source lang=php ><br />
Saludo realizado:<br />
<br />
<?php View::content() ?><br />
</source><br />
<br />
===View::helpers($helper)===<br />
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 vitas.<br />
<br />
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).<br />
<br />
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.<br />
<br />
<source lang=php ><br />
<br />
//Ubicamos este código en un fichero de nombre: miapp/extensions/helpers/MiHelper.php<br />
<br />
class MiHelper <br />
{<br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
public static function paisSelect($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
echo $code;<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
<source lang=php ><br />
<?php<br />
//Esta es una vista cualquiera<br />
<br />
//la convención para cargar el helpers es pasar el parámetro tal como llamamos al fichero<br />
//cargamos el helpers<br />
View::helpers('MiHelper')<br />
<br />
//Hacemos uso del helpers, con esto tendremos un select en el view<br />
MiHelpers::paisSelect(1) <br />
<br />
?><br />
<br />
</source><br />
<br />
== Logger ==<br />
La clase Logger para el manejo de [http://es.wikipedia.org/wiki/Log_(registro) Log] fue reescrita de forma estática, esto quiere decir ya no es necesario crear una instancia de la clase Logger. Esta clase dispone de una variedad de métodos para manejar distintos tipos de Log.<br />
<pre><br />
<?php Logger::error('Mensaje de Error')?><br />
</pre><br />
La salida de la instrucción anterior será lo siguiente:<br />
<pre>[Thu, 05 Feb 09 15:19:39 -0500][ERROR] Mensaje de Error</pre><br />
Por defecto los archivos log tienen el siguiente nombre '''logDDMMYYY.txt''' este nombre puede ser cambiado si así lo deseamos a través de un parámetro adicional al método.<br />
<pre><br />
<?php Logger::error('Mensaje de Error', 'mi_log')?><br />
</pre><br />
Se puede apreciar el segundo parámetro ahora el archivo tendrá como nombre '''mi_log.txt'''<br />
=== Métodos de la Clase Logger ===<br />
<br />
Logger::warning ($msg);<br />
<br />
Logger::error ($msg)<br />
<br />
Logger::debug ($msg)<br />
<br />
Logger::alert ($msg)<br />
<br />
Logger::critical ($msg)<br />
<br />
Logger::notice ($msg)<br />
<br />
Logger::info ($msg)<br />
<br />
Logger::emergence ($msg)<br />
<br />
Logger::custom ($type='CUSTOM', $msg)<br />
<br />
==Cache==<br />
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:<br />
<br />
===Cache::get($id, $group='default')===<br />
Obtiene los datos cacheados. Los elementos cacheados pueden agruparse en grupos, lo cual permite evitar colisiones entre elementos cacheados con igual $id.<br />
<br />
string '''$id''': identificador del elemento cacheado<br><br />
string '''$group''': grupo al cual pertenece el elemento cacheado (por defecto "default")<br />
<br />
<pre><br />
$data = Cache::get('data');<br />
</pre><br />
<br />
===Cache::save($value, $lifetime=null, $id=false, $group='default')===<br />
Guarda los datos a cachear.<br />
<br />
mixed '''$value''': valor a cachear (automaticamente es serializado antes de guardar)<br><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><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::get('data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
<?php ob_start() ?><br />
Hola<br />
<?php <br />
$data = ob_get_contents();<br />
Cache::save($data, '+21 days');<br />
ob_end_flush(); <br />
?><br />
<?php endif; ?> <br />
</source><br />
<br />
<br />
<source lang=php><br />
Cache::save('hola', null, 'data');<br />
$data = Cache::get('hola');<br />
</source><br />
<br />
Nota: el grupo "kumbia.*" esta reservado para el uso exclusivo de KumbiaPHP.<br />
<br />
===Cache::start($lifetime, $id, $group='default')===<br />
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.<br />
<br />
string '''$lifetime''': tiempo de vida de los datos (formato de strtotime), si es null, los datos no expiran nunca.<br><br />
string '''$id''': identificador del elemento a almacenar, si no se especifica, se toma el id y grupo del ultimo get efectuado<br><br />
string '''$group''': grupo al cual pertenece<br />
<br />
<source lang=php><br />
<?php if($data = Cache::start('+1 day','data')): ?><br />
<?php echo $data ?><br />
<?php else: ?><br />
Hola<br />
<?php Cache::end()?><br />
<?php endif; ?> <br />
</source><br />
<br />
===Cache::end()===<br />
Guarda los datos en la cache tomados del buffer de salida.<br />
<br />
===Cache::clean($group=false)===<br />
Limpia la cache. Si no se indica grupo limpia toda la cache.<br />
<br />
<source lang=php><br />
Cache::clean('default');<br />
</source><br />
<br />
===Cache::remove($id, $group='default')===<br />
Elimina un elemento específico de la cache<br />
<br />
<source lang=php><br />
Cache::remove('data');<br />
</source><br />
<br />
<br />
<br />
==Cacheo automático de views y templates==<br />
Ahora el cacheo de views y templates desde el controller se hará utilizando el método '''cache()'''.<br />
<br />
=== cache($time, $type='view') ===<br />
Para cachear una vista desde la acción:<br />
<pre><br />
$this->cache('+1 day');<br />
</pre><br />
<br />
Para cachear un template:<br />
<pre><br />
$this->cache('+1 day', 'template');<br />
</pre><br />
<br />
Si no desea cachear:<br />
<pre><br />
$this->cache(false);<br />
</pre><br />
<br />
==ActiveRecord==<br />
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.<br />
<br />
<source lang=php><br />
class Model extends ActiveRecord<br />
{<br />
public function initialize()<br />
{<br />
//valida que la cedula sea unica<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe');<br />
}<br />
}<br />
</source><br />
<br />
NOTA: El método '''initialize''' hace las veces de constructor y se ejecuta siempre por eso nuestros validadores deberían estar alli...<br />
<br />
===validates_uniqueness_of($field, $params=array())===<br />
Valida que el campo sea único<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_uniqueness_of('cedula', 'message: La cedula ya existe')<br />
$this->validates_uniqueness_of('cedula', array('message'=>'La cedula ya existe'))<br />
...<br />
</source><br />
<br />
===validates_date_in($field, $params=array())===<br />
Valida que el campo sea tipo fecha<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_date_in('fecha', 'message: Fecha invalida')<br />
$this->validates_date_in('fecha', array('message'=>'Fecha invalida'))<br />
...<br />
</source><br />
<br />
<br />
===validates_presence_of($field, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_presence_of('fecha_opt', 'field: Fecha')<br />
...<br />
</source><br />
<br />
<br />
===validates_length_of($field, $max, $min=0, $params=array())===<br />
Valida que el campo no sea nulo<br />
<br />
string '''$field''': campo a validar<br><br />
int '''$max''': valor maximo<br><br />
int '''$min''': valor minimo<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
too_long: mensaje a mostrar cuando sea muy largo<br><br />
too_short: mensaje a mostrar cuando sea muy corto<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_length_of('nombre', '25')<br />
$this->validates_length_of('nombre', '25', 0,'too_long: Nombre muy largo')<br />
$this->validates_length_of('nombre', '25', 0,array('too_long'=>'Nombre muy largo'))<br />
...<br />
</source><br />
<br />
<br />
===validates_inclusion_in($field, $list, $params=array())===<br />
Valida que el campo este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_inclusion_in('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
<br />
===validates_exclusion_of($field, $list, $params=array())===<br />
Valida que el campo no este incluido en los valores de la lista<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$list''': lista de elementos<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_exclusion_of('seleccion', array('a', 'b'))<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
===validates_format_of($field, $pattern, $params=array())===<br />
Valida que el campo coincida con el patron indicado<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$pattern''': expresion regular compatible con perl<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_format_of('seleccion', '/^\d{3}[A-Z]/')<br />
...<br />
</source><br />
<br />
<br />
===validates_numericality_of($field, $params=array())===<br />
Valida que el campo sea numerico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_numericality_of('cedula')<br />
...<br />
</source><br />
<br />
<br />
===validates_email_in($field, $params=array())===<br />
Valida que el campo sea un correo electronico<br />
<br />
string '''$field''': campo a validar<br><br />
array '''$params''': array de parametros con nombre<br />
<br />
Parametros con nombre:<br><br />
message: mensaje a mostrar<br><br />
field: nombre del campo<br />
<br />
<source lang=php><br />
...<br />
$this->validates_email_in('email')<br />
...<br />
</source><br />
<br />
==Modos de una Aplicación==<br />
'''KumbiaPHP''' ofrece dos modos de ejecución de una aplicación el cual es indicado en el '''config.ini''', estos se describen a continuación:<br />
<br />
===Production===<br />
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. <br />
<br />
===Development===<br />
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.<br />
<br />
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'''.<br />
<br />
<source lang=php><br />
Load::lib('cache');<br />
</source><br />
<br />
'''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.'''<br />
<br />
== Carga selectiva de modelos ==<br />
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"'''.<br />
<br />
==== Load::models($model) ====<br />
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. <br />
<br />
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.<br />
<br />
''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.'' <br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
//usuario.php y datos_personales.php<br />
Load::models('usuario', 'datos_personales');<br />
}<br />
}<br />
</source><br />
<br />
Asimismo se puede indicar con el atributo de controlador $models y estos serán cargados en cada acción.<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
//Se cargan los modelos Usuario y DatosPersonales<br />
public $models = array('usuario', 'datos_personales');<br />
<br />
public function index()<br />
{}<br />
}<br />
</source><br />
<br />
Cargando un directorio de modelos<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController {<br />
<br />
public function index()<br />
{<br />
/** se cargan los modelos en: <br />
* mi_app/models/dir/* <br />
* mi_app/models/dir2/model1.php<br />
* mi_app/models/model2.php<br />
*/<br />
Load::models('dir', 'dir2/model1', 'model2')<br />
}<br />
<br />
}<br />
</source><br />
<br />
==== Load::model($model) ====<br />
Obtiene una instancia del modelo indicado, esto permite hacer uso de modelos en cualquier lugar de la aplicación de manera intuitiva.<br />
<br />
'''NOTA: el nombre del modelo que recibe como parámetro este método debe ser pasado en notación smallcase'''<br />
<br />
<source lang=php ><br />
/**<br />
* Construye una lista desplegable para países<br />
**/<br />
function pais_select($id, $value=null) {<br />
//carga el modelo models/pais.php<br />
$Pais = Load::model('pais');<br />
<br />
$code = "<select name=\"$id\" id=\"$id\">";<br />
foreach($Pais->find() as $pais) {<br />
$code .= "<option value=\"$pais->id\"";<br />
if($pais->id == $value) {<br />
$code .= ' selected="selected"';<br />
}<br />
$nombre = htmlspecialchars($pais->nombre);<br />
$code .= ">$nombre</option>";<br />
}<br />
$code .= '</select>';<br />
<br />
return $code;<br />
}<br />
</source><br />
<br />
Uso avanzado...<br />
<br />
<source lang=php ><br />
...<br />
//busca el país con ID 1<br />
Load::model('pais')->find(1);<br />
<br />
//carga el modelo ubicado en models/dir/user.php<br />
Load::model('dir/user')->find();<br />
<br />
//carga el modelo ubicado en models/user_group.php<br />
Load::model('user_group')->find();<br />
<br />
...<br />
</source><br />
<br />
== Pages Controller ==<br />
Es un nuevo controlador para el manejo de páginas estáticas (views estáticos), aunque se puede utilizar como cualquier otro controlador haciendo uso de los [[KumbiaPHP_Framework_Versión_1.0_Spirit#Vistas |Templates y Partials]].<br />
<br />
Los parámetros pasados al método '''show()''' indican vistas que están en views/pages/ manteniendo su estructura de directorios<br />
<br />
Ejemplos:<br />
<pre><br />
http://www.dominio.com/pages/show/organizacion/privacidad<br />
</pre><br />
enseñará la vista views/pages/organizacion/privacidad.phtml<br />
<pre><br />
http://www.dominio.com/pages/show/aviso<br />
</pre><br />
enseñara la vista views/pages/aviso.phtml<br />
<br />
También se puede usar el routes.ini para llamarlo con otro nombre,<br />
<pre><br />
/aviso = pages/show/aviso<br />
</pre><br />
Asi al ir a www.dominio.com/aviso enseñara la vista views/pages/aviso.phtml<br />
<pre><br />
/organizacion/* = pages/show/organizacion/*<br />
</pre><br />
Al ir a www.dominio.com/organizacion/privacidad enseñará la vista en views/pages/organizacion/privacidad.phtml (si existe).<br />
<br />
Ademas se pueden utilizar los Helpers y Partials dentro de estos views.<br />
<source lang=php><br />
<?php echo link_to('pages/show/aviso', 'Ir Aviso') ?><br />
</source><br />
Mostrará un enlace que al hacer clic ira a dominio.com/pages/show/aviso<br />
<br />
== Nuevo Helper ==<br />
<br />
=== swf_tag($src) ===<br />
<br />
Con este helper tendremos la posibilidad de agregar archivos flash a nuestras páginas de una manera fácil, rápida y sencilla, este helper utiliza una librería hecha en JavaScript y lo mejor de todo es que es Open Source, el helper object_tag("archivo.swf"), recibe como parámetro el nombre del archivo flash el cual debe estar ubicado en la carpeta public/swf, además de eso recibe parámetros por nombre como son "width", "height" y "wmode", el ancho y alto deben ser colocados para que el flash sea visible, de otra manera no se vera por las dimensiones. Veamos el siguiente ejemplo realizado en la vista '''index.phtml'''<br />
<br />
<source lang="php" line><br />
<?php echo swf_tag("archivo.swf", "height: 300", "width: 300", "wmode: transparent") ?><br />
</source><br />
<br />
Este Helper nos garantiza que el código XHTML generado es validado por la W3C.<br />
<br />
== Filter ==<br />
<br />
=== Uso de Filter ===<br />
<br />
El componente Filter, es un componente que permite filtrar y validar datos de una manera intuitiva, facil y simple.<br />
<br />
Filter dispone de una serie de métodos estaticos que le permitirán filtrar los elementos indicados.<br />
<br />
=== Filter::get($s, $options=array()) ===<br />
<br />
'''$s (mixed)''': el valor a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican al valor indicado.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$value = Filter::get($s, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
Asimismo se pueden aplicar filtros en cadena.<br />
<source lang=php> <br />
$value = Filter::get($s, 'trim', 'addslashes');<br />
</source><br />
<br />
Los filtros en cadena no aceptan opciones de configuración, por lo tanto toman las opciones por defecto.<br />
<br />
=== Filter::get_array($array, $options=array()) ===<br />
<br />
'''$array (array)''': un array de elementos a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada elemento del array.<br />
<br />
Ejemplo:<br />
<source lang=php> <br />
$array = Filter::get_array(array('<b>Hola</b>', '<b>Adios</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
<br />
<source lang=php> <br />
$array = Filter::get_array(array('saludo' => '<b>Hola</b>'), 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filter::get_object($object, $options=array()) ===<br />
<br />
'''$object (object)''': objeto a filtrar.<br />
<br><br />
'''$options (array)''': array de configuración del filtro.<br />
<br />
Los filtros se aplican a cada atributo del objeto.<br />
<br />
Ejemplo:<br />
<source lang=php><br />
$object = Filter::get_object($usuario, 'htmlspecialchars', array('charset' => 'UTF-8'));<br />
</source><br />
<br />
=== Filtros ===<br />
Los filtros que existen actualmente son los siguientes:<br />
<br />
==== addslashes ====<br />
Escapa las comillas dobles y simples en una cadena de texto.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente"', 'addslashes');<br />
</source><br />
<br />
==== alnum ====<br />
Filtra la cadena eliminando los caracteres que no son alfanumericos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alnum');<br />
</source><br />
<br />
==== alpha ====<br />
Filtra la cadena eliminando los caracteres que no son alfabéticos o espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'alpha');<br />
</source><br />
<br />
==== date ====<br />
Verifica que sea una fecha valida en el formato YYYY-MM-DD.<br />
<br />
<source lang=php><br />
if(Filter::date($s, 'date')) {<br />
...<br />
}<br />
</source><br />
<br />
==== digits ====<br />
Filtra la cadena eliminando los caracteres que nos son digitos.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola "gente112"', 'digits');<br />
</source><br />
<br />
==== htmlentities ====<br />
Escapa los elementos del lenguaje html con sus correspondientes entidades.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlentities');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== htmlspecialchars ====<br />
Escapa caracteres especial de html.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>"hola"</p>', 'htmlspecialchars');<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''charset''': codificación de caracteres de la cadena a escapar.<br />
<br />
==== int ====<br />
Convierte un valor a tipo entero.<br />
<br />
<source lang=php><br />
$value = Filter::get('1.2', 'int');<br />
</source><br />
<br />
==== ipv4 ====<br />
Verifica si la cadena tiene el formato ipv4.<br />
<br />
<source lang=php><br />
if(Filter::get($s, 'ipv4')) {<br />
...<br />
}<br />
</source><br />
<br />
==== lower ====<br />
Convierte una cadena de texto a minusculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'lower');<br />
</source><br />
<br />
==== md5 ====<br />
Calcula el hash md5 para el valor indicado.<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO', 'md5', array('binary' => true));<br />
</source><br />
<br />
'''Opciones:'''<br><br />
'''binary:''' indica si se usa modo binario<br />
<br />
==== nl2br ====<br />
Convierte el caracter de nueva linea a "&lt;br&gt;".<br />
<br />
<source lang=php><br />
$value = Filter::get('TEXTO\nTexto2', 'nl2br');<br />
</source><br />
<br />
==== numeric ====<br />
Filtra una cadena solo permitiendo valores numericos.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== stripslashes ====<br />
Filtra una cadena haciendo la operación inversa a addslashes.<br />
<br />
<source lang=php><br />
$value = Filter::get('\"Hola\"', 'stripslashes');<br />
</source><br />
<br />
==== stripspace ====<br />
Elimina los espacios.<br />
<br />
<source lang=php><br />
$value = Filter::get('a1.2', 'numeric');<br />
</source><br />
<br />
==== striptags ====<br />
Elimina las etiquetas HTML.<br />
<br />
<source lang=php><br />
$value = Filter::get('<p>Hola</p>', 'striptags');<br />
</source><br />
<br />
==== trim ====<br />
Elimina los espacios en blanco a la izquiera y a la derecha.<br />
<br />
<source lang=php><br />
$value = Filter::get(' Hola ', 'trim');<br />
</source><br />
<br />
==== upper ====<br />
Convierte la cadena a mayúsculas.<br />
<br />
<source lang=php><br />
$value = Filter::get('hola', 'upper');<br />
</source><br />
<br />
=== Extendiendo el componente Filter ===<br />
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:<br />
<br />
<source lang=php><br />
interface FilterInterface<br />
{<br />
/**<br />
* Metodo para ejecutar el filtro<br />
*<br />
* @param string $s cadena a filtrar<br />
* @param array $options opciones para el filtro<br />
**/<br />
public static function execute ($s, $options);<br />
}<br />
</source><br />
<br />
Los filtros de usuario deben ubicarse en el directorio "app/filters".<br />
<br />
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.<br />
<br />
'''Ejemplo:'''<br />
Un filtro que permite obtener la extension de un archivo, pasandole como valor el nombre del archivo.<br />
<br />
app/extensions/filters/file_extension_filter.php<br />
<source lang=php ><br />
/**<br />
* Filtro para obtener la extensión de un archivo<br />
**/<br />
class FileExtensionFilter implements FilterInterface<br />
{<br />
public static function execute($s, $options=array()) <br />
{<br />
return strchr($s,".");<br />
}<br />
}<br />
</source><br />
<br />
Y se utilizaría de la siguiente manera:<br />
<source lang=php><br />
$ext = Filter::get('/home/yo/prueba.php', 'file_extension');<br />
</source><br />
<br />
=== Filtrando datos enviados en el Request ===<br />
El controller dispone de ciertas facilidades, en sus métodos: post, get y request, se puede indicar diversos filtros para aplicar al valor recibido.<br />
<br />
Ejemplo:<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController<br />
{<br />
public function save()<br />
{<br />
if($this->has_post('usuario')) {<br />
$usuario = new Usuario($this->post('usuario', 'trim'));<br />
$usuario->save();<br />
}<br />
}<br />
}<br />
</source><br />
<br />
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.<br />
<br />
=== Carga Selectiva, Inyección de Dependencias y el Componente Load ===<br />
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.<br />
<br />
==== Load::lib($lib) ====<br />
<br />
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).<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga la librería app/libs/my_util.php<br />
Load::lib('my_util');<br />
}<br />
}<br />
</source><br />
<br />
'''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'''<br />
<br />
<source lang=php ><br />
class UsuarioController extends ApplicationController <br />
{<br />
public function index()<br />
{<br />
//Se carga core/libs/auth/auth.php, siempre que no exista algún archivo<br />
//con el mismo nombre en app/libs/ ya que KumbiaPHP da prioridad a tu app sobre el core.<br />
Load::lib('Auth');<br />
}<br />
}<br />
</source><br />
<br />
==Persistencia de Datos en el Controller==<br />
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.<br />
<br />
Para suplir esta necesidad se incoporan los siguientes métodos.<br />
<br />
<source lang=php><br />
...<br />
//hace persistente la variable $data<br />
$this->set_persistent('data', 'valor');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//recupera la persistencia de la variable $data<br />
$this->get_persistent('data');<br />
...<br />
</source><br />
<br />
<br />
<source lang=php><br />
...<br />
//destruye la persistencia de la variable $data<br />
$this->destroy_persistent('data');<br />
...<br />
</source><br />
<br />
==Session==<br />
En la extensions ''Session'' se quitan dos métodos que estaban descontinuado ('''deprecated''') los cuales son:<br />
* set_data()<br />
* get_data()<br />
<br />
Quedando la extensions Session con los siguientes métodos para el manejo de la sessiones.<br />
<br />
===set($index, $value, $namespace='default')===<br />
Crear o especifica el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::set('usuario', 'Administrador');<br />
</source><br />
<br />
===get($index, $namespace='default')===<br />
Obtener el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::get('usuario');//retorna 'Administrador'<br />
</source><br />
<br />
===unset_data($index, $namespace='default')===<br />
Elimina el valor para un indice de la sesión actual.<br />
<br />
<source lang=php><br />
Session::unset_data('usuario');<br />
</source><br />
<br />
===isset_data($index, $namespace='default')===<br />
Verifica que este definido el indice en la sesión actual.<br />
<br />
<source lang=php><br />
Session::isset_data('id_usuario');//retorna false.<br />
</source><br />
<br />
<br />
NOTA: '''$namespace''' es un espacio individual en el cual se pueden contener las variables de sesión, permitiendo evitar colisiones con nombres de variables.<br />
<br />
<br />
==Upload==<br />
Anteriormente en los controladores, estaban disponibles los métodos <br />
'''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.<br />
<br />
=== Upload::file_in_path($name, $path, $new_name=null) ===<br />
Sube un archivo la ruta indicada.<br />
<br />
$name (string): nombre del archivo en el formulario (se revisa en $_FILES)<br />
<br />
$path (string): ruta donde se subira. Ejemplo: "/var/www/public/app/temp/files/"<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo, por defecto se toma el nombre original.<br />
<br />
<source lang=php><br />
...<br />
Upload::file_in_path('archivo', APP_PATH . 'temp/mis_archivos/');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::file($name, $new_name=null) ===<br />
Sube un archivo al directorio público "files/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::file('archivo');<br />
...<br />
</source><br />
<br />
<br />
=== Upload::img($name, $new_name=null) ===<br />
Sube una imagen al directorio público "img/upload".<br />
<br />
$name (string): nombre del archivo en el formulario<br />
<br />
$new_name (string): indica el nuevo nombre para el archivo <br />
<br />
<source lang=php><br />
...<br />
Upload::img('archivo');<br />
...<br />
</source><br />
<br />
==Vistas de Paginación==<br />
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.<br />
<br />
=== Classic ===<br />
Vista de paginación clásica. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/classic', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Digg ===<br />
Vista de paginación estilo digg. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/digg', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Extended ===<br />
Vista de paginación extendida. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/extended', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Punbb ===<br />
Vista de paginación estilo punbb. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''show:''' número de paginas que se mostraran en el paginador, por defecto 10.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/punbb', false, array('page' => $page, 'show' => 8, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Simple ===<br />
Vista de paginación simple. <br />
<br />
Parametros de configuración:<br />
<br />
'''page:''' objeto obtenido al invocar al paginador.<br />
<br />
'''url:''' url para la accion que efectua la paginacion, por defecto "module/controller/page/" y se envia por parametro el numero de pagina.<br />
<br />
<br />
<source lang=php><br />
View::partial('paginators/simple', false, array('page' => $page, 'url' => 'usuario/lista'))<br />
</source><br />
<br />
<br />
=== Ejemplo de uso ===<br />
<br />
Supongamos que queremos paginar una lista de usuarios.<br />
<br />
Para el modelo '''Usuario''':<br />
<br />
<source lang=php><br />
<?php<br />
class Usuario extends ActiveRecord<br />
{<br />
public function ver($page=1)<br />
{<br />
return $this->paginate("page: $page", 'per_page: 5');<br />
} <br />
}<br />
</source></div>Emilio.rst