Edición de «Application controller»
De KumbiaPHP Framework Wiki
Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si inicias sesión o creas una cuenta, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así efectuar la reversión.
Revisión actual | Tu texto | ||
Línea 7: | Línea 7: | ||
Características: | 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. | pierden cuando termina la ejecución de un script. | ||
− | + | • Automatiza la interacción entre la lógica y la presentación | |
− | + | • Es sencilla de usar | |
='''Métodos de la Clase ApplicationController'''= | ='''Métodos de la Clase ApplicationController'''= | ||
Línea 39: | Línea 39: | ||
Redirecciona la ejecución a otro controlador en un tiempo de ejecución determinado | Redirecciona la ejecución a otro controlador en un tiempo de ejecución determinado | ||
− | <source lang=php> | + | <source lang=php line> |
<?php | <?php | ||
Línea 69: | Línea 69: | ||
=='''Render_partial($name)'''== | =='''Render_partial($name)'''== | ||
Visualiza una vista parcial (partial) que pertenece al mismo controlador. Ejemplo: | Visualiza una vista parcial (partial) que pertenece al mismo controlador. Ejemplo: | ||
− | <source lang=php> | + | <source lang=php line> |
<?php | <?php | ||
Línea 85: | Línea 85: | ||
=='''Route_to([params: valor])'''== | =='''Route_to([params: valor])'''== | ||
− | Hace el enrutamiento desde un controlador a otro, o desde una acción a otra. | + | Hace el enrutamiento desde un controlador a otro, o desde una acción a otra. Recibe los |
− | + | parámetros con nombre: | |
− | 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: | Ejemplo: | ||
− | <source lang=php> | + | <source lang=php line> |
return $this->route_to("controller: clientes", "action: consultar", "id:1"); | return $this->route_to("controller: clientes", "action: consultar", "id:1"); | ||
</source> | </source> | ||
Línea 102: | Línea 97: | ||
El tipo de enrutamiento que realiza es interno, es decir que lo usuarios no notan cuando | El tipo de enrutamiento que realiza es interno, es decir que lo usuarios no notan cuando | ||
están siendo redireccionados en la aplicación. | están siendo redireccionados en la aplicación. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=='''Redirect($url_controlador)'''== | =='''Redirect($url_controlador)'''== | ||
− | Realiza un redireccionamiento a otro controlador/accion mediante HTTP. | + | 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 | |
− | Es útil cuando queremos hacer una real redirección que incluso cambie la URL que aparece en el | ||
explorador. | explorador. | ||
− | |||
Ejemplo: | Ejemplo: | ||
− | <source lang=php> | + | <source lang=php line> |
$this->redirect(“/productos/query”); | $this->redirect(“/productos/query”); | ||
</source> | </source> | ||
Línea 127: | Línea 114: | ||
llamará cuando no encuentre definida alguna acción así es más fácil controlar este tipo | llamará cuando no encuentre definida alguna acción así es más fácil controlar este tipo | ||
de errores: | de errores: | ||
− | <source lang=php> | + | <source lang=php line> |
<?php | <?php | ||
Línea 151: | Línea 138: | ||
=='''Set_response($type)'''== | =='''Set_response($type)'''== | ||
− | Especifica el tipo de respuesta que va a generar el controlador. | + | 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 | |
− | 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. | + | cualquier cabecera html. Es ideal en salidas AJAX o PDF. Otro valor para $type es XML. |
− | + | <source lang=php line> | |
− | Es ideal en salidas AJAX o PDF. Otro valor para $type es XML. | ||
− | <source lang=php> | ||
<?php | <?php | ||
Línea 168: | Línea 153: | ||
=='''Is_alnum($valor)'''== | =='''Is_alnum($valor)'''== | ||
− | Evalúa si un campo es alfanumérico o no. | + | Evalúa si un campo es alfanumérico o no. Es útil para validar la entrada de datos al |
− | + | recibirlos por parte de usuarios. | |
− | Es útil para validar la entrada de datos al recibirlos por parte de usuarios. | + | <source lang=php line> |
− | <source lang=php> | ||
<?php | <?php | ||
Línea 192: | Línea 176: | ||
como parámetro $record ActiveRecord o string registro ActiveRecord a cargar, si es un | 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. | + | ==='''string: '''===este debe corresponder al nombre de un modelo Soporta argumento variable. |
− | '''field:''' campos a cargar separados por coma | + | ==='''field:'''=== campos a cargar separados por coma |
− | '''except:''' campos que no se cargaran separados por coma | + | ==='''except:'''=== campos que no se cargaran separados por coma |
− | '''suffix:''' sufijo para el atributo en el controlador | + | ==='''suffix:'''=== sufijo para el atributo en el controlador |
− | '''preffix:''' prefijo para el atributo en el controlador | + | ==='''preffix:'''=== prefijo para el atributo en el controlador |
− | <source lang=php> | + | <source lang=php line> |
//Ejemplo1: | //Ejemplo1: | ||
$usuario = $this->Usuario->find(1); | $usuario = $this->Usuario->find(1); | ||
$this->load_record($usuario); | $this->load_record($usuario); | ||
− | |||
//Ejemplo2: | //Ejemplo2: | ||
$usuario = $this->Usuario->find(1); | $usuario = $this->Usuario->find(1); | ||
$this->load_record($usuario, 'except: id, sexo'); | $this->load_record($usuario, 'except: id, sexo'); | ||
− | |||
//Ejemplo3: | //Ejemplo3: | ||
$usuario = $this->Usuario->find(1); | $usuario = $this->Usuario->find(1); | ||
$this->load_record($usuario, 'field: nombre, apellido'); | $this->load_record($usuario, 'field: nombre, apellido'); | ||
− | |||
//Ejemplo4: | //Ejemplo4: | ||
$usuario = $this->Usuario->find(1); | $usuario = $this->Usuario->find(1); | ||
$this->load_record($usuario, 'preffix: c_'); | $this->load_record($usuario, 'preffix: c_'); | ||
− | |||
//Ejemplo5: | //Ejemplo5: | ||
$this->load_record('Usuario'); | $this->load_record('Usuario'); | ||
− | |||
//Ejemplo6: | //Ejemplo6: | ||
$this->load_record('Usuario', 'field: nombre, apellido'); | $this->load_record('Usuario', 'field: nombre, apellido'); | ||
Línea 227: | Línea 206: | ||
=='''is_numeric($valor)'''== | =='''is_numeric($valor)'''== | ||
− | Evalúa si un campo es numérico o no. | + | Evalúa si un campo es numérico o no. Es útil para validar la entrada de datos al recibirlos |
− | + | por parte de usuarios. | |
− | Es útil para validar la entrada de datos al recibirlos por parte de usuarios. | + | <source lang=php line> |
− | <source lang=php> | ||
<?php | <?php | ||
Línea 247: | Línea 225: | ||
</source> | </source> | ||
− | [[ | + | ='''Obtener valores desde una de Kumbia'''= |
+ | |||
+ | 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: '''kumbia.org''' | ||
+ | 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 line> | ||
+ | <?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 line> | ||
+ | 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 line> | ||
+ | public function buscar(){ | ||
+ | $controlador = $this->controller_name; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | =='''¿Cómo saber el nombre de la acción actual?'''== | ||
+ | <source lang=php line> | ||
+ | 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 line> | ||
+ | <?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 line> | ||
+ | <?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 line> | ||
+ | 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 line> | ||
+ | <?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 line> | ||
+ | <?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 line> | ||
+ | <?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 | ||
+ | |||
+ | Ejemplo: El usuario trata de acceder a una acción que no existe y queremos enviarla a una válida. | ||
+ | |||
+ | Ejemplo: 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. | ||
+ | |||
+ | ='''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. |