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.