Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Mejor forma de implementar las vistas y las plantillas

Estas en el tema de Mejor forma de implementar las vistas y las plantillas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 15/12/2012, 14:22
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 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.
  #2 (permalink)  
Antiguo 18/12/2012, 07:10
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Mejor forma de implementar las vistas y las plantillas

sé que estás cansado de que te lo digan pero : el agua tibia ya se inventó

bueno, el tema es que veo que tratas de crear una clase para las vistas, cuando lo común en MVC es que la parte de la vista sea delegado a los famosos "template engines".

Una vista no tiene que ser necesariamente Orientada a Objetos (bueno en TWIG se logra de una manera brillante) porque básicamente se representan en archivos HTML y como tal deben de tener código HTML, es allí donde entra el template engine, el cual sólo toma la plantilla (template con html) y los arrays construidos por el controlador o modelo y lo cambia, algo como un str_replace aunque suele ser más complejo.

es por ello que no le veo sentido a tu clase de vistas, lo ideal es implementar un modelo realmente probado y que funciona como los template engines, tienes a twig, smarty y muchos otros.

si ves el ejemplo de como se implementan las vistas en Codeigniter, notarás que NO existen clases para las vistas, sólo las plantillas, y en controlador lo genera así:

Código PHP:
Ver original
  1. //dentro del controlador
  2. $this->load->view('miplantilla.php', array(
  3.      'links' => $array_de_links
  4. ));

y la vista (plantilla):

Código PHP:
Ver original
  1. <ul class="links">
  2. <?php foreach ($links as $label => $link): ?>
  3.     <li><a href="<?=$link?>"><?=$label?></a></li>
  4. <?php endforeach; ?>
  5. </ul>

si usaras un motor como twig o smarty, tendrías algo como esto:

Código twig:
Ver original
  1. <ul class="links">
  2. {% for link in links %}
  3.     <li><a href="{link.link}">{link.label}</a></li>
  4. {% endfor %}
  5. </ul>

vistas o plantillas pulidas libres de los bloques de <?PHP?>
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Última edición por maycolalvarez; 18/12/2012 a las 07:16
  #3 (permalink)  
Antiguo 18/12/2012, 08:32
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Mejor forma de implementar las vistas y las plantillas

No se si te sigo maycol, creo que fuera de si la implementacion esta bien o mal lo que intenta hacer el OP es algo bastante común en los fw's, una clase base para las vistas, de hecho TWIG hace lo mismo, y no creo que los template engines sean lo normal, fuera de SF2 cual utiliza un engine por defecto ?

Una nota aparte sobre TWIG, a alto nivel me parece increíble ahora a bajo nivel es otra historia, crear clases al vuelo que solo contienen echo's y poco mas me parece que esta lejos de ser agradable.
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: clase, framework, implementar, php, plantillas, vistas, usuarios, formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:58.