|
|
(No se muestran 6 ediciones intermedias del mismo usuario) |
Línea 247: |
Línea 247: |
| </source> | | </source> |
| | | |
− | ='''Obtener valores desde una de Kumbia'''=
| + | [[Categoría:Application Controller]] |
− | | |
− | Las URLs de Kumbia están caracterizadas por tener varias partes cada una de ellas con una función conocida.
| |
− | | |
− | Para obtener desde un controlador los valores que vienen en la URL podemos usar algunas propiedades útiles en el controlador:
| |
− | | |
− | Ejemplo1:
| |
− | | |
− | '''http://www.kumbiaphp.com/aplicacion/productos/buscar/12'''
| |
− | | |
− | El sitio es: '''kumbiaphp.com'''
| |
− | | |
− | La aplicación es: '''aplicacion'''
| |
− | | |
− | El controlador es: '''productos'''
| |
− | | |
− | La acción es: '''buscar'''
| |
− | | |
− | El valor para id es: '''12'''
| |
− | | |
− | Nuestro controlador '''aplicación/productos_controller.php''' luce así:
| |
− | <source lang=php>
| |
− | <?php
| |
− | | |
− | class ProductosController extends ApplicactionController {
| |
− | | |
− | public function buscar($id){
| |
− | /* */
| |
− | }
| |
− | }
| |
− | | |
− | ?>
| |
− | </source>
| |
− | | |
− | Dentro del método buscar podemos obtener el valor de id osea 12 en nuestro ejemplo
| |
− | colocando un parámetro al controlador '''$id''' podemos recoger este valor y utilizarlo
| |
− | internamente.
| |
− | | |
− | Otras formas de hacer esto es utilizar los métodos '''post, get o request''' así:
| |
− | <source lang=php>
| |
− | public function buscar(){
| |
− | $id = $this->request(“id”);
| |
− | // o también
| |
− | $id = $this->id;
| |
− | }
| |
− | </source>
| |
− | | |
− | =='''¿Cómo saber el nombre del controlador actual?'''==
| |
− | <source lang=php>
| |
− | public function buscar(){
| |
− | $controlador = $this->controller_name;
| |
− | }
| |
− | </source>
| |
− | | |
− | =='''¿Cómo saber el nombre de la acción actual?'''==
| |
− | <source lang=php>
| |
− | public function buscar(){
| |
− | $accion = $this->action_name;
| |
− | }
| |
− | </source>
| |
− | | |
− | Ahora veamos el siguiente ejemplo:
| |
− | | |
− | '''http://www.kumbiaphp.com/aplicacion/registro/buscar_fecha/2006/12/01'''
| |
− | | |
− | El sitio es: '''kumbiaphp.com'''
| |
− | | |
− | La aplicación es: '''aplicacion'''
| |
− | | |
− | El controlador es: '''registro'''
| |
− | | |
− | La acción es: '''buscar_fecha'''
| |
− | | |
− | La mejor forma de recoger estos valores es de la siguiente forma:
| |
− | <source lang=php>
| |
− | <?php
| |
− | | |
− | class RegistroController extends ApplicactionController {
| |
− | | |
− | public function buscar_fecha($año, $mes, $dia){
| |
− | /* */
| |
− | }
| |
− | }
| |
− | | |
− | ?>
| |
− | </source>
| |
− | | |
− | Como vemos los valores adicionales en la URL son automáticamente agregados como
| |
− | parámetros en la acción del controlador.
| |
− | | |
− | =='''¿Que pasa con id en este ejemplo?'''==
| |
− | '''$id''' es el valor del primer parámetro siempre así que si nos referimos a éste,
| |
− | encontramos que tiene el valor 2006.
| |
− | | |
− | =='''¿Cómo puedo obtener los parámetros extra si no sé cuántos son?'''==
| |
− | Aquí usamos la propiedad del controlador '''$parameters''' que contiene estos valores así
| |
− | que el ejemplo podríamos reescribirlo así:
| |
− | | |
− | <source lang=php>
| |
− | <?php
| |
− | | |
− | class RegistroController extends ApplicactionController {
| |
− | | |
− | public function buscar_fecha(){
| |
− | $año = $this->parameters[0];
| |
− | $mes = $this->parameters[1];
| |
− | $dia = $this->parameters[2];
| |
− | /* ... */
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | Por último podemos ver todos los parámetros que vienen en una url de Kumbia usando la
| |
− | propiedad del controlador '''$this->all_parameters'''. Una salida de esta variable en el
| |
− | ejemplo anterior con print_r muestra:
| |
− | <source lang=php>
| |
− | Array
| |
− | (
| |
− | [0] => registro
| |
− | [1] => buscar_fecha
| |
− | [2] => 2006
| |
− | [3] => 12
| |
− | [4] => 01
| |
− | )
| |
− | </source>
| |
− | | |
− | ='''ApplicationControllerBase'''=
| |
− | | |
− | Es una clase definida en el archivo controllers/application.php, de esta forma:
| |
− | <source lang=php>
| |
− | <?php
| |
− | | |
− | class ControllerBase {
| |
− | | |
− | }//fin de la clase
| |
− | ?>
| |
− | </source>
| |
− | | |
− | La clase tiene como objetivo permitir que se compartan ciertos métodos y atributos que
| |
− | deben estar disponibles para todos los controladores de la aplicación.
| |
− | <source lang=php>
| |
− | <?php
| |
− | | |
− | class ControllerBase {
| |
− | | |
− | protected function seguridad(){
| |
− | /* ... */
| |
− | }
| |
− | | |
− | }//fin de la clase
| |
− | | |
− | ?>
| |
− | </source>
| |
− | | |
− | y por ejemplo en el controlador productos podríamos usar este método así:
| |
− | | |
− | <source lang=php>
| |
− | <?php
| |
− | | |
− | class Productos extends ApplicationController {
| |
− | | |
− | public function adicionar(){
| |
− | | |
− | if($this->seguridad()){
| |
− | /* .... */
| |
− | }
| |
− | | |
− | }
| |
− | | |
− | }//fin de la clase
| |
− | | |
− | ?>
| |
− | </source>
| |
− | | |
− | El método seguridad ahora se encuentra disponible para cualquier controlador.
| |
− | | |
− | ='''Enrutamiento y Redirecciones'''=
| |
− | | |
− | Kumbia proporciona un poderoso sistema de redireccionamiento que permite cambiar el
| |
− | flujo de la ejecución de una aplicación entre los controladores MVC.
| |
− | | |
− | Kumbia permite el re-direccionamiento de 2 formas: '''estático y dinámico'''.
| |
− | | |
− | =='''¿Por qué re-direccionamiento?'''==
| |
− | Necesitamos cambiar el flujo de la ejecución entre controladores, básicamente
| |
− | | |
− | Ejemplos:
| |
− | *El usuario trata de acceder a una acción que no existe y queremos enviarla a una válida.
| |
− | | |
− | *El usuario de la aplicación no tiene privilegios para continuar ejecutando determinada acción y debemos enviarlo a otra
| |
− | | |
− | =='''Estático'''==
| |
− | El direccionamiento estático ocurre en el archivo forms/config/routes.ini en donde le decimos al framework cuándo debe redireccionar de acuerdo a los controladores y/o acciones solicitadas.
| |
− | El archivo config/routes.ini se ve así:
| |
− | <source lang=ini>
| |
− | ; Usa este archivo para definir el enrutamiento estático entre
| |
− | ; controladores y sus acciones
| |
− | ;
| |
− | ; Un controlador se puede enrutar a otro controlador utilizando '*' como
| |
− | ; comodín así:
| |
− | ; controlador1/accion1/valor_id1 = controlador2/accion2/valor_id2
| |
− | ;
| |
− | ; Ej:
| |
− | ; Enrutar cualquier petición a posts/adicionar a posts/insertar/*
| |
− | ; posts/adicionar/* = posts/insertar/*
| |
− | ;
| |
− | ; Enrutar cualquier petición a cualquier controlador en la acción
| |
− | ; adicionar a posts/adicionar/*
| |
− | ; */adicionar/* = posts/insertar/*
| |
− | | |
− | [routes] | |
− | prueba/ruta1/* = prueba/ruta2/*
| |
− | prueba/ruta2/* = prueba/ruta3/*
| |
− | </source>
| |
− | Cualquier política definida en este archivo tiene menos relevancia sobre un
| |
− | direccionamiento dinámico.
| |
− | | |
− | =='''Dinámico'''==
| |
− | Ocurre cuando en ejecución necesitamos cambiar el flujo normal y pasar a otro controlador o a otra acción.
| |
− | | |
− | El principal método para hacer esto es usar el método route_to:
| |
− | ==route_to([params: valor])==
| |
− | Recibe los parámetros con nombre:
| |
− | | |
− | *'''controller:''' A que controlador se va a redireccionar
| |
− | | |
− | *'''action:''' A que acción se va a redireccionar
| |
− | | |
− | *'''id:''' Id de la redirección
| |
− | <source lang=php>
| |
− | return $this->route_to("controller: clientes", "action: consultar", "id:1");
| |
− | </source>
| |
− | No todos los parámetros son obligatorios sólo el que sea necesario.
| |
− | | |
− | '''Aviso:'''
| |
− | En la 0.5 en adelante es mejor usar Router::route_to
| |
− | <source lang=php>
| |
− | return Router::route_to("controller: clientes", "action: consultar", "id:1");
| |
− | </source>
| |
− | | |
− | ='''Filter'''=
| |
− | | |
− | Para la Versión 0.5 se incorpora el componente Filter el cual proporciona un conjunto
| |
− | de filtros que serán aplicados a datos que lo requieran.
| |
− | | |
− | =='''Que es un Filtro?'''==
| |
− | Un filtro es utilizado habitualmente para eliminar porciones no deseadas de una entrada
| |
− | de datos, y la porción deseada de la entrada pasa a través de la producción como filtro
| |
− | (por ejemplo, café). En estos escenarios, un filtro es un operador que produce un
| |
− | subconjunto de la entrada.
| |
− | | |
− | Este tipo de filtro es útil para aplicaciones web - la supresión
| |
− | de entrada ilegal, innecesario el recorte de los espacios en blanco, etc.
| |
− | | |
− | Esta definición básica de un filtro puede ser ampliado para incluir a las transformaciones
| |
− | generalizadas de entrada. Una transformación que se debe aplicar a las aplicaciones web
| |
− | es el escapar de las entidades HTML.
| |
− | | |
− | Por ejemplo, si un campo de formulario es
| |
− | automáticamente poco fiable de entrada, este valor debe ser libre de las entidades
| |
− | HTML, a fin de evitar las vulnerabilidades de seguridad. Para cumplir con este requisito,
| |
− | las entidades HTML que aparecen en la entrada debe ser eliminado o que se hayan
| |
− | escapado.
| |
− | | |
− | Por supuesto, el enfoque que es más apropiado depende de la situación. Un filtro
| |
− | que elimina las entidades HTML opera dentro del ámbito de aplicación de la primera
| |
− | definición de filtro - un operador que produce un subconjunto de la entrada.
| |
− | | |
− | =='''Utilización Básica'''==
| |
− | En este ejemplo se le pasa por el constructor de class Filter dos(upper, htmlspecialchars)
| |
− | filtros que serán aplicados a la cadena.
| |
− | <source lang=php line>
| |
− | $filter = new Filter('upper', 'htmlspecialchars');
| |
− | $var = '<b>Hola</b>';
| |
− | print_r($filter->apply($var)); //<B>HOLA</B>
| |
− | </source>
| |
− | A continuación se aplica el filtro de manera dinámica.
| |
− | <source lang=php line>
| |
− | $filter = new Filter();
| |
− | $var = '<b>Hola</b>';
| |
− | print_r( $filter->apply_filter($var, 'upper', 'htmlspecialchars')) //<B>HOLA</B>
| |
− | </source>
| |
− | | |
− | Otra forma de aplicar filtros
| |
− | <source lang=php line>
| |
− | $var = '<b>Hola</b>';
| |
− | $filter = new Filter('upper', 'htmlspecialchars');
| |
− | print_r ($filter->filter_value($var));
| |
− | Adicionalmente los filtros soportan como parámetros a filtrar array
| |
− | $var = array('<b>Hola</b>');
| |
− | $filter = new Filter('upper', 'htmlspecialchars');
| |
− | print_r( $filter->apply($var));//<B>HOLA</B>
| |
− | </source>
| |
− | | |
− | =='''Métodos de la clase Filter'''==
| |
− | | |
− | A continuación se listan los métodos disponibles en la clase filter, el constructor de la
| |
− | clase filter puede recibir los filtros a ser aplicados.
| |
− | | |
− | ==='''Add_filter($filter)'''===
| |
− | Agregar un filtro a la cola de filtros.
| |
− | | |
− | ==='''Apply($var, [filters])''' y '''apply_filter($var, [filters])'''===
| |
− | Aplica un filtros o un grupo de filtros a la variable $var.
| |
− | | |
− | ==='''Get_instance()'''===
| |
− | Obtiene una instancia singlenton.
| |
− | | |
− | ==='''Filtros Disponibles'''===
| |
− | Actualmente se cuenta con una serie de filtros que pueden utilizados.
| |
− | | |
− | ==='''Addslashes'''===
| |
− | Filtra una cadena haciendo addslashes
| |
− | | |
− | ==='''Alnun'''===
| |
− | Filtra una cadena para que contenga solo alpha-numeic.
| |
− | | |
− | ==='''Alpha'''===
| |
− | Filtra una cadena para que contenga solo alfabético
| |
− | | |
− | ==='''Date'''===
| |
− | Filtra una cadena para que contenga el formato fecha, debe cumplir con un patrón.
| |
− | | |
− | ==='''Digit'''===
| |
− | Filtra una cadena para que contenga solo Dígitos, sigue siendo un string lo que retorna el
| |
− | método.
| |
− | | |
− | ==='''Htmlentities'''===
| |
− | Filtra una cadena y hace que todos los caracteres que tengan una entidad equivalente en
| |
− | HTML serán cambiados a esas entidades.
| |
− | | |
− | ==='''htmlspecialchars'''===
| |
− | Filtra una cadena htmlspacialchars.
| |
− | | |
− | ==='''Upper'''===
| |
− | Filtra una cadena para que contenga solo Mayusculas
| |
− | | |
− | ==='''Trim'''===
| |
− | Filtra una cadena haciendo trim
| |
− | | |
− | ==='''Striptags'''===
| |
− | Filtra una cadena para eliminar etiquetas
| |
− | | |
− | ==='''Stripspace'''===
| |
− | Filtra una cadena para eliminar espacios
| |
− | | |
− | ==='''Stripslaches'''===
| |
− | Filtra una cadena haciendo stripslashes
| |
− | | |
− | ==='''Numeric'''===
| |
− | Filtra una cadena para que contenga solo numerico.
| |
− | | |
− | ==='''Nl2br'''===
| |
− | Filtra una cadena convirtiendo caracteres de nueva linea en <br>
| |
− | | |
− | ==='''Md5'''===
| |
− | Filtra una cadena encriptando a md5.
| |
− | | |
− | ==='''Lower'''===
| |
− | Filtra una cadena para que contenga solo minuscula.
| |
− | | |
− | ==='''Ipv4'''===
| |
− | Filtra una cadena para que sea de tipo ipv4, debe cumplir con el patrón.
| |
− | | |
− | ==='''Int'''===
| |
− | Filtra una cadena para que sea de tipo entero, retorna un integer método.
| |
ApplicationController[editar]
Es la clase principal utilizada para crear controladores, que son la primera parte del
modelo MVC. Contiene métodos importantes para facilitar la interacción entre éstos, los
modelos y la presentación.
Características:
- Los valores de los atributos de las sub-clases son persistentes, es decir que no se
pierden cuando termina la ejecución de un script.
- Automatiza la interacción entre la lógica y la presentación
Métodos de la Clase ApplicationController[editar]
La clase posee una serie de métodos que son útiles para el trabajo con controladores.
Render($view)[editar]
Visualiza una vista que pertenece al mismo controlador.
Ejemplo:
<?php
class ProductosController extends ApplicationController {
function index(){
$this->render('consultar');
}
} //fin de la clase
?>
En este caso se visualizaría la vista views/productos/consultar.phtml
Redirect($url, $seconds=0.5)[editar]
Redirecciona la ejecución a otro controlador en un tiempo de ejecución determinado
<?php
class ProductosController extends ApplicationController {
function index(){
$this->redirect('facturas/nueva', 2);
}
}
?>
En el ejemplo va a facturas/nueva después de 2 segundos
Post($value)[editar]
Obtiene acceso orientado a objetos a los valores de $_POST, $value es el índice para
pasar al array asociativo.
Get($value)[editar]
Obtiene acceso orientado a objetos a los valores de $_GET, $value es el índice para
pasar al array asociativo.
Request($value)[editar]
Obtiene acceso orientado a objetos a los valores de $_REQUEST, $value es el índice para
pasar al array asociativo.
Render_partial($name)[editar]
Visualiza una vista parcial (partial) que pertenece al mismo controlador. Ejemplo:
<?php
class ProductosController extends ApplicationController {
function index(){
$this->render_partial('mostrar_menu');
}//fin del metodo
}//fin de la clase
?>
En este caso se visualizaría la vista parcial views/productos/_mostrar_menu.phtml
Route_to([params: valor])[editar]
Hace el enrutamiento desde un controlador a otro, o desde una acción a otra.
Recibe los parámetros con nombre:
• controller: A qué controlador se va a redireccionar
• action: A que acción se va a redireccionar
• id: Id de la redirección
Ejemplo:
return $this->route_to("controller: clientes", "action: consultar", "id:1");
El tipo de enrutamiento que realiza es interno, es decir que lo usuarios no notan cuando
están siendo redireccionados en la aplicación.
Aviso:
En la 0.5 en adelante es mejor usar Router::route_to
return Router::route_to("controller: clientes", "action: consultar", "id:1");
Redirect($url_controlador)[editar]
Realiza un redireccionamiento a otro controlador/accion mediante HTTP.
Es útil cuando queremos hacer una real redirección que incluso cambie la URL que aparece en el
explorador.
Ejemplo:
$this->redirect(“/productos/query”);
Cache_layout($minutes)[editar]
Caché de la vista views/layout/ correspondiente al controlador durante $minutes
Not_found($controller, $action)[editar]
Puedes definir el método not_found en cualquier controlador, en caso de estar definido se
llamará cuando no encuentre definida alguna acción así es más fácil controlar este tipo
de errores:
<?php
class PruebaController extends ApplicationController {
function index(){
$this->render_text("Este es el index");
}
function not_found($controller, $action){
Flash::error("No esta definida la accion $action, redireccionando a index...");
return $this->route_to('action: index');
}
}
?>
NOTA: Ahora en la versión 0.5 se incluye un vista views/not_found.phtml, esto
hace que no se haga necesario la implementacion del metodo not_found, ya
que cuando no exista un controller o una acción se renderizara dicha vista, esta
puede ser totalmente personalizada de manera que sea mas comodo el
desarrollo
Set_response($type)[editar]
Especifica el tipo de respuesta que va a generar el controlador.
Cuando es el valor de $type es view solamente envía la salida de la vista más no del layout, el template o cualquier cabecera html.
Es ideal en salidas AJAX o PDF. Otro valor para $type es XML.
<?php
class PruebaController extends ApplicationController {
function accion_ajax(){
$this->set_response('view');
}
}
Is_alnum($valor)[editar]
Evalúa si un campo es alfanumérico o no.
Es útil para validar la entrada de datos al recibirlos por parte de usuarios.
<?php
class PruebaController extends ApplicationController {
function adicionar(){
$nombre = $this->request(“nombre”);
if($this->is_alnum($nombre)==false){
Flash::error(“Entrada invalidad para precio”);
return;
}
/* ..*/
}
}
?>
Load_record($record)[editar]
Carga los campos de un registro ActiveRecord como atributos del controlador, recibe
como parámetro $record ActiveRecord o string registro ActiveRecord a cargar, si es un
string: este debe corresponder al nombre de un modelo Soporta argumento variable.
field: campos a cargar separados por coma
except: campos que no se cargaran separados por coma
suffix: sufijo para el atributo en el controlador
preffix: prefijo para el atributo en el controlador
//Ejemplo1:
$usuario = $this->Usuario->find(1);
$this->load_record($usuario);
//Ejemplo2:
$usuario = $this->Usuario->find(1);
$this->load_record($usuario, 'except: id, sexo');
//Ejemplo3:
$usuario = $this->Usuario->find(1);
$this->load_record($usuario, 'field: nombre, apellido');
//Ejemplo4:
$usuario = $this->Usuario->find(1);
$this->load_record($usuario, 'preffix: c_');
//Ejemplo5:
$this->load_record('Usuario');
//Ejemplo6:
$this->load_record('Usuario', 'field: nombre, apellido');
is_numeric($valor)[editar]
Evalúa si un campo es numérico o no.
Es útil para validar la entrada de datos al recibirlos por parte de usuarios.
<?php
class PruebaController extends ApplicationController {
function adicionar(){
$precio = $this->request(“precio”);
if($this->is_numeric($precio)==false){
Flash::error(“Entrada invalida para precio”);
return;
}
/* ..*/
}
}
?>