Buenas,
Le doy vueltas y mas vueltas a esto de la clase vista y las plantillas y me gustaria saber una simple y buena manera de hacerlo.
Me explico. Estoy desarrollando un proyecto MVC y tengo dudas en algunas decisiones.
Tengo la clase vista
Código PHP:
abstract class ClaseVista{
private $_peticion;
private $_css;
private $_js;
private $_jsPlugin;
private $_acl;
private $_rutas;
public function __construct( Peticion $peticion ) {
$this->_peticion = $peticion;
$this->_css = array();
$this->_js = array();
$this->_jsPlugin = array();
//$this->_acl = $_acl;
$this->_rutas = array();
}
public function renderizar( $plantilla, $marco = 'default')
{
$rutaPlantilla = DIR_VISTAS . $this->_peticion->getControlador() . DS . $plantilla . '.phtml';
if( is_readable( $rutaPlantilla ) ){
$class_vars = get_class_vars( get_class( $this ) );
$class_properties = get_object_vars( $this );
$class_data = array_diff_key ( $class_properties , $class_vars );
foreach ($class_data as $key => $value)
$$key = $value;
// incluyo las plantillas phtml
include_once ( DIR_VISTAS . 'layout' . DS . 'cabecera_html.phtml' );
include_once ( DIR_VISTAS . 'layout' . DS . $marco . DS . 'cabecera.phtml' );
include_once ( $rutaPlantilla );
include_once ( DIR_VISTAS . 'layout' . DS . $marco . DS . 'pie.phtml' );
}else {
throw new MiExcepcion('Error de vista',array('rutaPlantilla' => $rutaPlantilla, 'plantilla' => $plantilla, 'marco' => $marco));
}
}
public function setCss(array $css, $url = URL_CSS )
{
if( is_array($css) && count($css) ){
for( $i=0; $i < count($css); $i++ ){
if ( is_readable( DIR_CSS . $css[$i] . '.css' ) )
$this->_css[] = $url . $css[$i] . '.css';
else
throw new MiExcepcion('Error en funcion Vista->setCss, parametros valor incorrecto.', array( css => $css, url => $url ) );
}
} else {
throw new MiExcepcion('Error en funcion Vista->setCss, parametros vacios.');
}
}
...
public function printCss(){
if(isset($this->_css) && count($this->_css))
for($i=0; $i < count($this->_css); $i++)
echo ' <link href="'.$this->_css[$i].'" rel="stylesheet" type="text/css" />'.PHP_EOL;
}
...
}
Luego defino una clase para mi BACKEND
Código PHP:
class Vista extends ClaseVista{
public function __construct( Peticion $peticion ) {
parent::__construct( $peticion );
$this->setCss( array('micss') );
$this->setJsPlugin(array('jquery','jquery.dataTables'));
$this->rutas = array(
'url_base' => URL_BASE,
'url_img' => URL_IMG,
);
$this->menu = array(
'inicio' => array(
'titulo' => 'Inicio',
'enlace' => URL_INICIO ),
'categorias' => array(
'titulo' => 'Categorías',
'enlace' => URL_CATEGORIAS ),
'productos' => array(
'titulo' => 'Productos',
'enlace' => URL_PRODUCTOS ),
'pedidos' => array(
'titulo' => 'Pedidos',
'enlace' => URL_PEDIDOS ),
'devoluciones' => array(
'titulo' => 'Devoluciones',
'enlace' => URL_DEVOLUCIONES ),
'clientes' => array(
'titulo' => 'Clientes',
'enlace' => URL_CLIENTES ),
'roles' => array(
'titulo' => 'Roles',
'enlace' => URL_ROLES ),
'usuarios' => array(
'titulo' => 'Usuarios',
'enlace' => URL_USUARIOS ),
'otros' => array(
'titulo' => 'Otros',
'enlace' => URL_OTROS )
);
$this->item = $peticion->getControlador();
}
}
archivo cabecera_html.phtml
Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
<meta name="author" content="chema" />
<title><?php if(isset($titulo)) echo $titulo; ?></title>
<?php $this->printCss();
$this->printJsPlugin();
$this->printJs();
?>
</head>
...
archivo cabecera.phtml
Código HTML:
<body>
<div id="web" class="contenedor">
<div id="cabecera_de_web" class="contenedor">
<div id="cabecera_de_web_titulo" class="contenido sin_margen">
<a href="<?php echo($rutas['url_base']);?>">Gestion MiMascota.com</a>
</div>
<div class="clear"></div>
</div>
<div id="navegador_de_web" class="contenedor">
<div id="navegador_de_web_enlaces" class="contenido sin_margen">
<ul>
<?php if( !empty( $menu ) ):
foreach( $menu as $key => $value ):
if ( !empty($item) && ( $key == $item )):?>
<li><a href="<?php echo $value['enlace']; ?>" class="selected"><?php echo $value['titulo']; ?></a></li>
<?php else: ?>
<li><a href="<?php echo $value['enlace']; ?>" ><?php echo $value['titulo']; ?></a></li>
<?php endif;
endforeach;
endif; ?>
</ul>
</div>
<div class="clear"></div>
</div>
<div id="cuerpo" class="contenedor">
Me gustaria saber si es buena practica usar metodos/funciones para escribir el html de los includes del css, js.
O por ejemplo si es buena practica, estaba pensando en crear una funcion tal que:
Código PHP:
public function printVar($var){
if (!empty($var))
echo $var;
}
para escribir
Código PHP:
<?php $this->printVar($titulo); ?>
en lugar de
Código PHP:
<?php if(!empty($titulo)) echo $titulo; ?>
Que podria tener muchas modificaciones tanto como para pasar una parametro con un valor opcional a escribir en caso de $var vacia o un parametro opcional para en caso de que la variable $var este vacia, recoger el error en un log y enviar un email al administrador.
¿ Es buena practica combinar este tipo de funciones con codigo php normal de condicionales if y bucles for, etc. en las plantillas ? ¿ Que contras tiene ? ¿ como lo deberia hacer ?
¿ Que otras mejores soluciones hay ? Ya se que muchos van a decir que aprender un framework, tal que Zenk, Symphony, ... etc pero yo simplemente busco una manera buena y sencilla manera de hacerlo sin tener que aprender un framework por el momento.
Gracias.