Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/12/2012, 14:22
chemajmb
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 9 meses
Puntos: 0
Mejor forma de implementar las vistas y las plantillas

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 
__constructPeticion $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_varsget_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_readableDIR_CSS $css[$i] . '.css' ) )
                    
$this->_css[] = $url $css[$i] . '.css';
                else
                    throw new 
MiExcepcion('Error en funcion Vista->setCss, parametros valor incorrecto.', array( css => $cssurl => $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 
__constructPeticion $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&iacuteas',
                  
'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.