Primero que todo devemos tener claro que es
MVC.
La clase Vista que no es otra cosa que un contenedor de las vistas o codigo HTML agrupandolas en secciones que se corresponden a las designadas en el layout hasta que sea propicio volcarlas en el cliente.
view.php
code: php<?php
/**
* Esta obra está licenciada bajo la Licencia Creative
* Commons Atribución-CompartirIgual 4.0 Internacional.
* @license http://creativecommons.org/licenses/by-sa/4.0/deed.es_CL
* @author Richard Collao Olivares <http://www.richardcollao.cl>
*/
abstract class View
{
# Ruta donde se encuantras las vistas.
private static $_path_view;
# Este array contiene las distintas vistas agrupadas segun la seccion dentro del layout.
private static $_container;
# Nombre del layout, que por defecto es default
private static $_layout;
# Extencion usada para los archivos que contienen las vistas ejemplo .phtml o .php;
private static $_ext = '.php';
/**
* Inicializa la clase y establece la ruta donde se encuentran alojadas las vistas.
* $path_view, ruta donde se encuentran las vistas.
* $layout, establece el layout que mostrara la pagina por defecto su valor es default.
*/
public static function initialize($path_view, $layout = 'default')
{
self::$_container = array();
self::$_path_view = $path_view;
self::$_layout = $layout;
}
/**
* Captura las vistas, y las devuelve como un string.
* $file contiene el nombre del archivo o vista y $data los parametros que se le pasan a la vista.
*/
private static function _capture($file, $data)
{
ob_start();
require (self::$_path_view . $file . self::$_ext);
$view = ob_get_contents();
ob_end_clean();
return $view;
}
/**
* Si el archivo se recibe con la extencion que es opcional, esta se remueve.
*/
private static function _removeExtention($file)
{
if(substr($file, - strlen(self::$_ext)) == self::$_ext)
$file = substr($file, 0, strlen($file) - strlen(self::$_ext));
return $file;
}
/**
* Guarda la vista en un array contenerdor cuyo indice sera el nombre del archivo o $alias si es definido,
* ejemplo View::keep('head_1.phtml', $data, $alias = 'head')
*/
public static function keep($file, $data = array(), $alias = NULL)
{
# Si el archivo vista es enviado con la extencion esta sera removida;
$file = self::_removeExtention($file);
# Captura la vista.
$view = self::_capture($file, $data);
# Si no hay un alias toma el nombre del archivo.
empty($alias) ? $key = $file : $key = $alias;
# Guarda la vista en el contenedor.
self::$_container[$key][] = $view . PHP_EOL;
}
/**
* Devuelve el contenido de la vista como una cadena.
* ejemplo $footer = View::extract('footer.php', $data)
*/
public static function extract($file, $data)
{
$file = self::_removeExtention($file);
return self::_capture($file, $data);
}
/**
* Almacena una vista desde un string en un contenedor(el contenedor es compartido con el metodo keep)
* tambien se puede guardar una vista obtenida por extract() por lo que es posible hacer cambios sobre la marcha.
* ejemplo: View::insert(str_replace('&', '&', $footer), $alias)
*/
public static function insert($string, $alias, $important = FALSE)
{
if(empty(self::$_container[$alias]))
self::$_container[$alias] = array();
if ($important === FALSE)
self::$_container[$alias][] = $string;
else
array_unshift (self::$_container[$alias], $string);
}
/**
* Recupera el contenido de una vista que se ha almacenado previamente por los metodos keep o insert
* Al igual que el metodo extract devuelve un string.
* ejemplo echo View::show('head');
*/
public static function show($view)
{
if(key_exists($view, self::$_container))
return implode('', self::$_container[$view]);
}
/**
* Cambia el layout por defecto.
*/
public static function setLayout($layout)
{
$layout = self::_removeExtention($layout);
self::$_layout = $layout;
}
/**
* Muestra la pagina mediante el layout establecido, el cual volcara las vistas de forma organizada.
* Importante:la extencion del layout siempre debe ser .php ya que este invocara el metodo show de esta clase.
*/
public static function callLayout()
{
require (self::$_path_view . 'layouts' . DIRECTORY_SEPARATOR . self::$_layout . '.php');
}
}
?>