sábado, abril 17, 2010

Layouts en Codeigniter

En un layout generalmente se coloca todo aquello que es común a todas las paginas de nuestro sitio web (cabeceras, pies de pagina, menú principal,etc). Codeigniter no soporta layouts, esto significa que si en determinada etapa de un proyecto nos vemos obligados a cambiar el diseño de nuestro sitio tendremos que modificar todas nuestras vistas una por una. Algunos programadores solucionan este inconveniente por medio de ganchos (hooks en ingles).pero esto tiene el inconveniente de tener que habilitar los ganchos en cada proyecto que realizamos. Mi solucion para agregar layouts a Codeigniter consiste en extender la clase CI_Loader de codeigniter.para una mejor idea cuando al final de un controlador hacemos :

$this->load->view($mi_vista,$data);

estamos llamando al metodo view de la clase CI_Loader de Codeigniter. Ahora para extender una clase de Codeigniter debemos crear un archivo prefijado con  MY_ en la carpeta application/libraries, en nuestro caso el archivo sera MY_Loader.php El codigo es muy simple en verdad:

class MY_Loader extends CI_Loader
{   
function view($view, $vars = array(), $return = FALSE)
{     
$this->content = parent::view($view,$vars,TRUE);   
 parent::view('layout', $vars, $return);  
 }
 function content()   
{     
echo $this->content;   
}
}

La funcion view es la que re definimos en nuestra clase en ella inicialmente llamamos a la funcion view original pero pasando como tercer parámetro TRUE con esto hacemos que la salida no se imprima en pantalla , si no la capturamos en la variable $this->content  luego llamamos a la vista 'layout'( este es el nombre que, muy creativo yo, he dado a mi layout.) pero esta ves si permitimos que se imprima.
La función content permitirá escribir el contenido generado en el lugar de la pagina que nosotros deseamos
Evidentemente habra que crear un archivo llamado 'layout' en la carpeta views de nuestro proyecto.
Un ejemplo de este archivo seria el siguiente.

<html>
<head>
<title>Layout in Codeigniter</title>
</head>
<body> <?php $this->load->content()?> </body>
</html>

Y en nuestro controlador ya podemos seguir trabajando como siempre (es cierto ...no hay que modificar nada).Solo nos queda eliminar en nuestras vistas los menús,pies de pagina y todo aquello que siempre repetíamos.

2 comentarios:

  1. Excelente, lo probaré este fin de semana a ver que tal me va

    ResponderEliminar
  2. No me carga el layout, tengo que cargar la libreria creada?

    ResponderEliminar