Diferencia entre revisiones de «Application controller»

De KumbiaPHP Framework Wiki
 
(No se muestran 3 ediciones intermedias del mismo usuario)
Línea 247: Línea 247:
 
</source>
 
</source>
  
='''Obtener valores desde el controller'''=
+
[[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>
 

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