Diferencia entre revisiones de «Application controller»

De KumbiaPHP Framework Wiki
 
(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.
 

Revisión actual del 02:13 6 jun 2009

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
  • Es sencilla de usar

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;
    }
    /* ..*/
  }
}
?>