Introducción
Acabamos de ver cómo crear y usar un modelo en el framework CodeIgniter. Veamos ahora un ejemplo de cómo se usan los controladores en CodeIgniter. Vamos a definir un controlador y ver cómo se invoca.
Un controller se usa como pegamento entre el modelo y la vista. También se usa para conectar los datos que pone al usuario con la base de datos, a través del modelo.
Por ejemplo, reciben datos de un formulario y los pasan al modelo, dependiendo del resultado le devuelven un mensaje al usuario.
Más tutoriales de CodeIgniter
Aquí una pequeña lista:
- Configurar CodeIgniter para trabajar con PDO y MySQL
- Unión de tablas en CodeIgniter
- Introducción a CodeIgniter
Ubicación y nomenclatura de los controladores
Los controladores van en la carpeta application/controllers. Heredan de la clase CI_Controller y normalmente tienen un nombre amigable que se relaciona a veces con una entidad.
Por ejemplo, podemos tener el controller Productos, el cual gestionaría productos (valga la redundancia) a través del modelo ProductoModel.
Pero también podemos tener el controlador Vender, el cual no se relaciona con una entidad (tal vez se relacionaría si se llamara Ventas) pero es un controlador, y sirve para gestionar algunas cosas como el proceso de venta de un producto, el cual no se relaciona directamente con un modelo pero genera vistas o se encarga de algo.
Recordemos finalmente que un controller lleva el nombre de la clase que define. Es decir, si el nuestro se llama Vender, el archivo se llama Vender.php.
Llamada a los controladores
Los controladores son llamados a través de la URL, por eso es que digo que deben tener nombres amigables y no raros, para tener algo expresivo.
Esto lo logramos cargando el ayudante para url en el archivo config/autoload.php en donde dice algo como:
$autoload['helper'] = array();
Simplemente indicamos que queremos cargar el helper de url:
$autoload['helper'] = array('url');
Y listo. Más tarde accedemos a los controladores así:
rutadetuproyecto.com/index.php/nombreDelControlador/
Funciones del controlador
Técnicamente un controlador es una clase, y define funciones o métodos. Estos métodos pueden ser invocados a través del navegador.
Arriba mostramos una forma de acceder al controlador, pero eso sólo permitiría llamar a la función index
(ver más abajo la explicación), pero para llamar a una función simplemente ponemos su nombre después de una diagonal que va delante del nombre del controlador.
Por ejemplo, si tenemos la función todas
dentro del controlador Ventas
(esto quiere decir que queremos obtener todas las ventas), la URL queda así:
rutadetuproyecto.com/index.php/ventas/todas
Obviamente debemos definir la función en el controlador, si no, esto generará un error 404.
Argumentos
Las funciones reciben argumentos a veces. Por ejemplo, una función llamada detalle
dentro de nuestro controlador de ventas
podría recibir un id
como argumento. Algo así:
<?php
public function detalle($id){
# Magia aquí
}
El helper de la url se encarga de parsear la url y llamar a la función con los datos adecuados. La ruta para invocar a nuestra función quedaría así:
rutadetuproyecto.com/index.php/ventas/detalle/1
En ese caso el argumento $id
tendría el valor de 1. Y ya con eso podemos llamar a nuestro modelo y pasarle el ID.
La función index
Arriba mostramos cómo acceder a una función definida por el controlador, ¿pero qué pasa si no ponemos el nombre de la función y sólo ponemos el nombre del controlador? por ejemplo, esta ruta:
rutadetuproyecto.com/index.php/ventas/
Ahí indicamos que queremos el controlador Ventas, pero no indicamos método.
CodeIgniter ya sabe manejar esto, y cuando no pasamos el nombre de ninguna función entonces llama a la función index
dentro de nuestro controlador.
Esa función debe estar definida en nuestro controlador, la mayoría de veces carga la vista inicial. Si no la definimos sólo se muestra un error 404.
Cargar modelos
Un controlador se comunica con modelos la mayoría de veces. Para cargar un modelo hacemos esto dentro de cualquier función:
<?php
$this->load->model("NombreDelModelo");
# Ahora accedemos a él
$this->NombreDelModelo->algunMetodo();
Igualmente podemos hacerlo dentro del constructor. En el siguiente ejemplo cargamos al modelo VentaModel.
<?php
public function __construct(){
parent::__construct();
$this->load->model("VentaModel");
}
Nota: si defines el constructor, asegúrate de llamar al constructor del padre primero como se ve en el ejemplo de arriba con parent::_construct();
Por cierto, también podemos cargar librerías con $this->load->library("nombreDeLibrería");
Renderizar vistas
Esto es lo que la mayoría de veces hacen nuestros controladores. Para cargar una vista usamos esto:
$this->load->view("encabezado");
Podemos, por ejemplo, cargar el encabezado, el cuerpo y el pie. Así:
<?php
$this->load->view("encabezado");
$this->load->view("ventas/todas", $datos);
$this->load->view("pie");
En ese caso le pasamos datos a la vista llamada todas.php dentro de la carpeta ventas. Por cierto, no debemos especificar el nombre de la vista si es que es PHP; si tiene otro formato, sí es necesario.
De esta manera separamos vistas y también las reutilizamos.
La variable $datos
es un arreglo de datos que serán desempacados dentro de la vista. En la vista podremos acceder a ellos.
Redireccionar
En nuestro controlador, gracias al ayudante url podemos redireccionar. Para ello llamamos a la función redirect. Aquí un ejemplo:
redirect("ventas/");
Ahí, se hace una redirección a:
ruta.com/index.php/ventas/
Así podemos poner datos en la sesión para avisar de algo, y luego redireccionar; pero eso es otra historia.
Conclusión
Eso y más podemos hacer con nuestros controladores, pero espero que este ejemplo haya servido.
Pingback: Pequeño sistema de ventas con CodeIgniter y MVC - Parzibyte's blog