Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/02/2012, 10:55
chemajmb
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
MVC:¿ Como cargar las plantillas ?

Buenas, ya hace 1 mes que estoy dandole al tema de desarrollar una web en php.
He visto unos manuales muy buenos de MVC. Usando una clase Router capturamos la $_GET['route'] y la vamos checkeando y dividiendo en fichero, controlador y accion.
La cosa es, cuando lanzamos el controlador y su metodo ( la accion equivale al metodo del controlador ), no se que sistema utilizar para mostrar la vista.

Código PHP:
<?php
Abstract Class baseController {
/*
 * @registry object // este se utiliza para no usar variables globales.
 */
protected $registry;

function 
__construct($registry) {
        
$this->registry $registry;
}

/**
 * @all controllers must contain an index method // la accion/metodo que lanzaremos por defecto
 */
abstract function index();
}
?>
Código PHP:
<?php
class indexController extends baseController {

public function 
index() {
    
/*** set a template variable ***/
        
$this->registry->template->welcome 'Welcome to PHPRO MVC';
    
/*** load the index template ***/
        
$this->registry->template->show('index');
}
}
Código PHP:
<?php

Class Template {
/*
 * @the registry
 * @access private
 */
private $registry;

/*
 * @Variables array
 * @access private
 */
private $vars = array();

/**
 *
 * @constructor
 *
 * @access public
 *
 * @return void
 *
 */
function __construct($registry) {
        
$this->registry $registry;

}

 
/**
 *
 * @set undefined vars
 *
 * @param string $index
 *
 * @param mixed $value
 *
 * @return void
 *
 */
 
public function __set($index$value)
 {
        
$this->vars[$index] = $value;
 }

function 
show($name) {
        
$path __SITE_PATH '/views' '/' $name '.php';

        if (
file_exists($path) == false)
        {
                throw new 
Exception('Template not found in '$path);
                return 
false;
        }

        
// Load variables
        
foreach ($this->vars as $key => $value)
        {
                $
$key $value;
        }

        include (
$path);
}

}
?>
Claro, aqui lo que hacen es simplemente al final include($path); con lo que incluiria la plantilla que no es mas que un archivo html con un poco de php para colocar los datos.
Código PHP:
<h1><?php echo $welcome?></h1>
Mi problema o duda es, si yo por ejemplo hago una web de una tienda online y tengo que colocar plantillas dinamicas dentro de otras plantillas para mostrar por ejemplo productos, que tendre que colocar X plantillas de html de los X productos que haya en ese momento en la base de datos dentro de la plantilla mas general del documento web, ¿ cual es una buena practica para poner, estructurar la plantilla ? por que de esta forma y tal como lo hacen aqui no deduzco la forma de hacerlo la verdad. Podria ponerlo todo en partes y ponerlo con includes, pero me parece una chapuza y poco reutilizable.

Yo lo que venia haciendo, aunque no se si es una practica aconsejable, es lo siguiente:
una clase vista o plantilla, que contiene un parametro llamado html, que es un string que contiene los datos html.
Con varios metodos, uno para cargar la plantilla html general, entonces cargo en la variable html la plantilla general desde un fichero. Este fichero es una plantilla de la web. En algunas zonas donde queremos colocar datos dinamicos, esta escrito {cuerpo} o cualquier otra etiqueta del estilo {etiqueta} que luego puedo reemplazar con datos dinamicos u otras plantillas.
tambien hay metodos para colocar datos.
Código PHP:
<?php
    
require_once($_SERVER['DOCUMENT_ROOT'].'/mimascota/constantes/configuracion.php');

abstract class 
clase_vista {

    private 
$nombre;
    private 
$html;
    
    public function 
__construct(){
        
//$this -> html = $this->dame_plantilla( NOMBRE_PLANTILLA_BASE );
    
}
    
    private function 
dame_plantilla$nombre_plantilla ) {
        
$file $_SERVER['DOCUMENT_ROOT'].URL_HTML.$nombre_plantilla.'.htm';
        
$plantilla file_get_contents($file);
        return 
$plantilla;
    }
    
    protected function 
carga_plantilla_principal$nombre_plantilla ) {
        
$this->html $this->dame_plantilla$nombre_plantilla );
    }
    
    protected function 
coloca_plantilla$nombre_plantilla$localizacion_html ) {
        if ( 
$nombre_plantilla && $localizacion_html ){
            
$plantilla $this->dame_plantilla$nombre_plantilla );
            
$this->html str_replace('{'.$localizacion_html.'}'$plantilla$this->html);
        }
    }
    
    protected function 
coloca_dato$datos$localizacion_html ) {
        if ( 
$datos ){
            
$this->html str_replace('{'.$localizacion_html.'}'$datos$this->html);
        }
    }
    
    protected function 
coloca_datos$datos) {
        if ( 
$datos )
            foreach ( 
$datos as $clave => $valor )
             
$this->html str_replace('{'.$clave.'}'$valor$this->html);
    }

    protected function 
imprime_plantilla() {
        print (
$this->html);
    }
    
    abstract public function 
dame_vista();
    
    public function 
__destruct(){
        unset(
$this->nombre);
        unset(
$this->html);
    }
    
    
}
?>
Me gustaria saber si esto es una buena practica, o alguna buena forma de hacerlo.