Foros del Web » Programación web » PHP » Frameworks y PHP orientado a objetos »

MVC:¿ Como cargar las plantillas ?

Estas en el tema de MVC:¿ Como cargar las plantillas ? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 15/02/2012, 09:55
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 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.
  #2 (permalink)  
Antiguo 15/02/2012, 10:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

No entiendo exactamente cual es tu duda, ¿el cargar plantillas parciales?
  #3 (permalink)  
Antiguo 15/02/2012, 10:19
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

Si, como puedes ver en el primer ejemplo que explico, simplemente hacen un "include($path)", es decir, meten un fichero al completo que es una plantilla php en ese caso.

Yo lo hacia de otra forma, tal y como lo explico, y asi podia meter plantillas parciales dentro de otras plantillas y renderizar datos, pero no se si es una buena practica.

Pero el punto en cuestion es, ¿ cual es una buena forma de hacerlo ? ¿ como lo hacia yo estaba bien ?

Muchas gracias por responder tan pronto. Un saludo.

PD: He metido la pata, no se que he hecho, queria editar algunas cosas en el mensaje anterior e hice un QUOTE. Lo siento, disculpa las molestias.
  #4 (permalink)  
Antiguo 15/02/2012, 11:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

Ah ya entendí, pues sí es buena práctica y no veo porque no lo puedas hacer, en lugar de hacer el include directo podrías cambiar tu método por algo así:
Código PHP:
Ver original
  1. function render($name, $vars) {
  2.         $path = __SITE_PATH . '/views' . '/' . $name . '.php';
  3.  
  4.         if (file_exists($path) == false)
  5.         {
  6.                 throw new Exception('Template not found in '. $path);
  7.                 return false;
  8.         }
  9.  
  10.         // Load variables
  11.         foreach ($vars as $key => $value)
  12.         {
  13.                 $$key = $value;
  14.         }
  15.  
  16.         ob_start();
  17.         include ($path);
  18.         return ob_get_clean();
  19. }

Entonces en tu controller podrías hacer:
Código PHP:
Ver original
  1. $productos = $this->registry->template->render('productos', $productos_array);
  2. echo $this->registry->template->render('index', $productos);

Saludos
  #5 (permalink)  
Antiguo 15/02/2012, 11:06
 
Fecha de Ingreso: octubre-2008
Ubicación: Plasencia
Mensajes: 109
Antigüedad: 6 años
Puntos: 6
Respuesta: MVC:¿ Como cargar las plantillas ?

Yo creo que si quieres programar siguiendo el patrón MVC lo mejor es que utilices alguno de los muchos frameworks existentes (codeigniter, simfony 2, zend, etc), ya que te ofrecen una metodología a seguir a la hora de desarrollar aplicaciones y además cuentan con muchas funciones auxiliares ya desarrolladas que te facilitarán mucho la vida (upload de archivos, validación de formularios, etc). Además estos frameworks cuentan con una ámplia comunidad de desarrolladores por lo que están en constante evolución. Creo que desarrollar tu propia arquitectura/metodología es como volver a inventar la rueda...
  #6 (permalink)  
Antiguo 15/02/2012, 11:28
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

@GatorV: Ok, muchas gracias por la idea, y creo que has dado en el clavo. Creo que una forma de hacerlo es usando esas funciones. Que por cierto, despues de leer el mensaje, cambie de pantalla y que coincidencia, tenia abierto en el navegador un ejemplo utilizando esas mismas funciones.

Código PHP:
<?php 
   
class Sistema{

      var 
$rutaBase;
      var 
$rutaView;
      function 
Sistema(){ 
         
$this->rutaBase'http://www.mihosting.com/'
         
$this->rutaView$rutaBase.'sistema/view/';
      }
      function 
view($archivo,$return=false){
         if(
$return){
            
ob_start();
              include(
"{$this->rutaView}$archivo");
              
$salida ob_get_contents();
              
ob_end_clean();
              return 
$salida;
         }else{
            include(
"{$this->rutaView}$ruta");
         }
      }
   }
?>
ob_start(): detiene el flujo de salida a pantalla.
ob_get_contents(): mueve a la izquierda lo que ha sido detenido desde que se detuvo el flujo de salida, osea pasa todo a una variable o lo que quieras.
ob_end_clean(): fin para detener el flujo de salida, ahora ya podemos escribir en pantalla.

Asi que indagare en estas funciones y todo lo relacionado.
Lo primero que me llama la atencion y no entiendo es por que escribe esto con llaves y de esa forma
Código PHP:
include("{$this->rutaView}$archivo"); 

@beni0888
Estoy haciendo el PFC ( Proyecto Fin de Carrera ) y no se si utilizar un patrón es una buena forma de hacerlo. Creo que deberia consultar con mi tutor de PFC. A parte, no se hasta que punto, siendo la primera vez que uso este patrón para hacer una aplicacion web y siendo mi primera aplicacion web, no se hasta que punto es buena idea usar un patrón, quizas es mejor hacer la rueda para saber como funciona. Y entonces ya luego utilizarla.

Ademas, lo de la rueda se ha dicho hasta la saciedad, a mi me daria verguenza decirlo xD hehehe.

Tambien he leido por ahi, que por que usar una rueda de tractor para un monopatin, cuando tu mismo mas facilmente te puedes hacer la rueda para el monopatin.


Un saludo.
  #7 (permalink)  
Antiguo 15/02/2012, 12:30
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

Cita:
Iniciado por GatorV Ver Mensaje
Ah ya entendí, pues sí es buena práctica y no veo porque no lo puedas hacer, en lugar de hacer el include directo podrías cambiar tu método por algo así:
Código PHP:
Ver original
  1. function render($name, $vars) {
  2.         $path = __SITE_PATH . '/views' . '/' . $name . '.php';
  3.  
  4.         if (file_exists($path) == false)
  5.         {
  6.                 throw new Exception('Template not found in '. $path);
  7.                 return false;
  8.         }
  9.  
  10.         // Load variables
  11.         foreach ($vars as $key => $value)
  12.         {
  13.                 $$key = $value;
  14.         }
  15.  
  16.         ob_start();
  17.         include ($path);
  18.         return ob_get_clean();
  19. }

Entonces en tu controller podrías hacer:
Código PHP:
Ver original
  1. $productos = $this->registry->template->render('productos', $productos_array);
  2. echo $this->registry->template->render('index', $productos);

Saludos
Mas o menos lo he entendido pero no contemplas el caso de imprimir N plantillas de productos y meter sus N datos. Tu simplemente metes una plantilla y los datos del vector de $productos_array.

Si por ejemplo en mi controler hago un bucle llamando a la funcion render('productos', $productos_array[i]) para todos los posibles valores de productos_array, es una buena solucion, o este tipo de codigo no deberia de ir en el controlador, si no en la vista ?

Muchas gracias por las respuestas.
  #8 (permalink)  
Antiguo 15/02/2012, 12:48
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

Exacto todo eso debería de ir en la vista, la idea es que desde el controller simplemente le pases a la vista los datos que va a necesitar, y todo lo que use la vista (loops y eso) lo haces ahí.

Saludos.
  #9 (permalink)  
Antiguo 15/02/2012, 14:43
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

Gracias por ayudarme y orientarme, me esta viniendo muy bien.

Pero aun sigo teniendo dudas referente al tema de plantillas que hemos hablado.

La cosa es que estoy haciendo una aplicacion web de una tienda online.

Ahora voy con la vista, en el ejemplo solo tiene una clase vista llamada template, que carga las plantillas html.

Pero mi web hay partes de codigo html que varian dependiendo en que pagina de la web este, como usualmente pasa con las webs.

En la columna de la izquierda tengo las categorias con los productos.
En la columna de la derecha tengo el carrito de la compra y los datos de login de usuario, que varian si el usuario esta logueado.

Podria hacer una clase base vista con un metodo para cada parte de la web que es dinamica, como las columnas y el cuerpo, y luego otro metodo general que llame a estos metodos para formar el todo de la pagina html e imprimirlo. Y entonces para las distintas paginas de la web, solo tendria que extender de esta clase y sobreescribir el metodo que escribe el cuerpo y programarlo para que escriba lo especifico a esa pagina.

no se si me sigues, espero que si.

Casi prefiero que me digas si hay otra manera mejor de enfocarlo. Con que me orientes un poco me vale.

Tambien otra duda que tengo es que en el ejemplo que yo tengo usan una clase registry referenciada por el controlador y la vista para tener acceso a los datos, sin utilizar variables globales. ¿ Esta bien hacer esto ? ¿ se utiliza para guardar todo tipo de datos de las variables $_POST, $_SERVER .. y reclamarlos ahi tambien ?

A ver si podeis ayudarme para tenerlo un poco mas claro, muchas gracias a todos.
  #10 (permalink)  
Antiguo 15/02/2012, 15:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

En esos caso se recomienda realmente usar un Framework que tenga ya herramientas más especializadas, lo que yo te recomendaría es ver por ejemplo como lo hace Zend que te permite usar viewHelpers que son fragmentos que te permiten inyectar código en tu plantilla general que tenga diferentes parámetros.

Saludos.
  #11 (permalink)  
Antiguo 15/02/2012, 17:26
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

Cita:
Iniciado por GatorV Ver Mensaje
En esos caso se recomienda realmente usar un Framework que tenga ya herramientas más especializadas, lo que yo te recomendaría es ver por ejemplo como lo hace Zend que te permite usar viewHelpers que son fragmentos que te permiten inyectar código en tu plantilla general que tenga diferentes parámetros.

Saludos.
pfff, que me deprimo dios mio!! yo que pensaba que empezaba a tener un poco de idea y le he echado un vistazo a un manual de Zend y es para morirte.

Yo tengo una web con cabecera, 3 columnas y pie.
En la columna de la izquierda simplemente va un listado de las categorias y productos.
En la columna de la derecha van los datos del carrito y otra caja van los datos del login.
Luego el cuerpo en medios con la informacion de cada modulo.

No se si tengo que hacer una clase vista para cada pagina de la web con sus metodos para escribir el html. O como hacerlo. ¿ Alguna idea ?

El framework Zend me queda un poco lejos, quizas pudiera pero tiene muchas cosas y yo estoy haciendo el Proyecto Fin de Carrera, luego la documentacion no se ..
Prefiero hacerlo yo pero de una forma simple y elegante.

Gracias por la ayuda.
  #12 (permalink)  
Antiguo 15/02/2012, 18:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

Me refería a que vieras como integra los view Helpers, la idea es que dentro de tu layout general puedas hacer algo como:
Código PHP:
Ver original
  1. <div id="header"></div>
  2. <div id="container">
  3.       <div id="left"><?php echo $this->leftSidebar(); ?></div>
  4.       <div id="main"><?php echo $this->content; ?></div>
  5.       <div id="right"><?php echo $this->rightSidebar(); ?></div>
  6. </div>

Luego ya sea que definas leftSideBar o rightSideBar en tu clase view o algo así...

Saludos.
  #13 (permalink)  
Antiguo 16/02/2012, 02:53
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

Gracias por la respuesta,

A ver, asi pensando, si lo hago asi como tu dices, ¿ mas especificamente como se haria ? Es decir, puesto que no le pasas parametros con los datos de por ejemplo la barra izquierda, leftsidebar(), lo que haria seria tener un metodo para cargar los datos en una variable global de la clase view/template o como quieras que se llame, y entonces en leftsidebar(), en el codigo de este metodo, poner que siempre coja y cargue los datos de esa variable global en la plantilla de la columna izquierda, osea que devuelva un flujo de salida con los datos de la variable esta global ya puestos con la plantilla y todo para la columna izquierda.
Perdona si me he liado al explicarlo, espero que me entiendas.


Yo venia haciendolo de otra manera hasta que vi un manual bastante decente de MVC y decidi enfocar el controlador de otra manera, y no se si tambien hare lo mismo con la vista. Yo lo que hacia era:
Código PHP:
<div id="header"></div>
<
div id="container">
* * * <
div id="left">{leftsidebar}</div>
* * * <
div id="main">{content}</div>
* * * <
div id="right">{rightsidebar}</div>
</
div
y luego
Código 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();

¿ No quedan mas limpias las plantillas de esta forma siendo estas ficheros html ?, parece una manera un poco mas elegante de hacerlo. Aunque no se.

Última edición por chemajmb; 16/02/2012 a las 03:13
  #14 (permalink)  
Antiguo 16/02/2012, 07:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

Pues tiene sus pros, y sus contras, la desventaja es que no puedes usar ningún condicional ni función de control, solamente puedes reemplazar tags, y sí es válido tener un poco de condicionales en la vista.

Saludos.
  #15 (permalink)  
Antiguo 16/02/2012, 14:59
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

Cita:
Iniciado por GatorV Ver Mensaje
Pues tiene sus pros, y sus contras, la desventaja es que no puedes usar ningún condicional ni función de control, solamente puedes reemplazar tags, y sí es válido tener un poco de condicionales en la vista.

Saludos.
Aunque agradezco mucho tu respuesta, es un poco corta para alguien como yo, hehehe. Te agradeceria me explicaras u orientaras un poco mas.
¿ Que es eso de condicionales y funcion de control en la vista ?
Yo si es mejor hacerlo como en ese ejemplo que tu me pusiste, por mi no hay problema, total, tampoco es tan dificil.


No se, estoy un poco rayado con este tema, quiero enfocarlo bien para ponerme a trabajar, pero no llego a comprender una buena manera de hacerlo.

Yo tengo una plantilla base para la web, y por poner un ejemplo, tengo un navegador. En ese navegador van las categorias, subcategorias y productos que hay en la base de datos. Ya se como se cogen los datos y se inflan las clases modelo de php, pero ¿ Como se hace para cargar los datos ( los nombre y enlace de las las n categorias, los nombre y enlace de las x subcategorias que hay por cada categoria...los productos ) en la plantilla ?

Voy a seguir buscando informacion por internet, pero si alguien se digna a explicarmelo un poco o orientarme, se lo agradeceria mucho. No soy mal entendedor. heheh :)

Última edición por chemajmb; 16/02/2012 a las 15:10
  #16 (permalink)  
Antiguo 16/02/2012, 16:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

Me refiero a cosas simples, imaginate que pasas un array de cosas y quieres desplegar uno por uno ej:
Código PHP:
Ver original
  1. <div class="personas">
  2.     <?php foreach ($personas as $persona) { ?>
  3.             <div class="persona"><?php echo $persona; ?></div>
  4.     <?php } ?>
  5. </div>

Como lo estas haciendo tu, no es posible hacerlo ya que solamente puedes reemplazar {} y forzas a hacer toda esa lógica en el controller.

Saludos.
  #17 (permalink)  
Antiguo 17/02/2012, 03:28
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

Yo tenia pensado hacerlo tal que asi, pero en verdad quiero aprender a hacerlo bien. Si como yo lo hago tiene algun pero, me gustaria saber la manera comun y elegante de hacerlo.
Como lo iba a hacer yo:
Código HTML:
...
<body>
...
<div class="personas">
{loc_personas}
</div>
...
</body>
</html> 
Teniendo un metodo para colocar N plantillas, pasandole la plantilla que se tiene que repetir, los datos que van en esa plantilla, y la localizacion de donde van esas plantillas.
La llamada seria:
Código PHP:
vista->coloca_N_plantillas('plantilla_personas','loc_personas',$personas
La plantilla plantilla_personas que seria un archivo de tal manera:
Código HTML:
<div class="persona">
<span>{nombre_persona} tiene {edad_persona} años.</span>
</div> 
El metodo seria:
Código PHP:
function coloca_N_plantillas($nombre_plantilla,$localizacion,$multi_datos
{
    foreach ( 
$multi_datos each $datos 
    {
        
// simplemente coloca una plantilla
        
$this->coloca_plantilla ($nombre_plantilla,$localizacion); 
        
// reemplaza las localizaciones {key} con el valor value
        // mirar el metodo abajo, para entender mejor
        
$this->coloca_datos(  $datos );
    }

Definicion de los metodos utilizados, que ya antes habia comentado en este hilo, pero que pongo aqui para que quede mas claro.
Código PHP:
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_datos$datos) {
    if ( 
$datos )
        foreach ( 
$datos as $clave => $valor )
            
$this->html str_replace('{'.$clave.'}'$valor$this->html);

No se como hacerlo y empiezo a estar un poco desesperado. QQ

Y no sera por que no le estoy dando vueltas.

La cosa es que yo tengo en la base de datos las Categorias, cada categoria con 0, 1 o mas subcategorias, cada subcategoria con 0, 1 o mas productos.

No se ni que tipo de datos pasar a la vista para que imprima el navegador con sus categorias, subcategorias y productos. Ni como imprimirlo realmente. Estoy ya desesperado por que llevo 3 dias y no avanzo. Y por ahora llevaba buen ritmo hasta que me he topado con esto.

Y me raya el hecho de pensar que no debe de ser tan complicado, pues en otras webs se pueden dar casos mucho mas complicados con tipos de datos mucho mas enrevesados, y sin embargo ahi estan funcionando.

Espero ayuda desesperadamente.

Última edición por chemajmb; 17/02/2012 a las 04:42
  #18 (permalink)  
Antiguo 17/02/2012, 08:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

Pues es una forma, si no es la más sencilla, ya que como te he dicho más arriba la idea es que todo eso lo gestiones desde la vista, no en el controlador, el controlador es un simple "puente" entre el modelo y la vista.

Entiendo tu apuro, pero al hacerlo de la forma que estas haciendo (todo a mano) es más complicado que si hubieras tomado un framework ya establecido que ya tuviera todas estas herramientas para ti, si tu premura es el tiempo, pues hazlo de esa manera y en un futuro evalúa usar una herramienta ya estable.

Saludos.
  #19 (permalink)  
Antiguo 17/02/2012, 11:01
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 2 años, 8 meses
Puntos: 0
Respuesta: MVC:¿ Como cargar las plantillas ?

Por poner un ejemplo:
El controlador consulta en la base de datos(nombre e id para formar el enlace especifico para cada elemento) las categorias, subcategorias y productos.

¿ El controlador coge los datos por separado ? quiero decir, la lista de las categorias, luego la lista de subcategorias, y otra variable para los productos, o coge todos los datos en un unico objeto, ¿ que estructura tiene este objeto ?

¿ la vista sabe que tipo de estructura le llegara ? ¿ como sabe la vista la estructura de este objeto ?

¿ la creacion de la plantilla desde el controlador se hace con una unica llamada y un unico paso de parametros ? ¿ o se hace con varias llamadas, escribiendo en cada llamada, por ejemplo, las categorias, luego las subcategorias, luego los productos ?

No lo entiendo la metodologia a seguir para crear la plantilla html del navegador con las categorias, subcategorias y productos corresponientes.


Última edición por chemajmb; 17/02/2012 a las 11:09
  #20 (permalink)  
Antiguo 17/02/2012, 11:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.529
Antigüedad: 8 años, 5 meses
Puntos: 2109
Respuesta: MVC:¿ Como cargar las plantillas ?

No, recuerda que el controlador solo extrae los datos del modelo, por ejemplo, este es un ejemplo usando Zend Framework:
Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace Album\Controller;
  4.  
  5. use Album\Model\DbTable\AlbumTable,
  6.     Zend\Mvc\Controller\ActionController,
  7.     Zend\Paginator\Paginator,
  8.     Zend\View\Helper\PaginationControl;
  9.  
  10.  
  11. class ListController extends ActionController
  12. {
  13. // snip
  14.     public function indexAction()
  15.     {
  16.         $albums = $this->getAlbumTable()->fetchAll();
  17.         $matches = $this->getEvent()->getRouteMatch();
  18.         $nPage = $matches->getParam('page', 1);
  19.        
  20.         PaginationControl::setDefaultViewPartial('paginator.phtml');
  21.        
  22.         $paginator = Paginator::factory($albums);
  23.         $paginator->setDefaultItemCountPerPage(5);
  24.         $paginator->setCurrentPageNumber($nPage);
  25.        
  26.         return array('albums' => $paginator);
  27.     }
  28. }

El controlador simplemente esta consultando un modelo, creando un paginador y regresa los datos a la vista, donde ya son procesados:
Código PHP:
Ver original
  1. <h1>Albums</h1>
  2. <ul>
  3. <?php foreach ($this->albums as $album) { ?>
  4.     <li><?php echo $album->album_id; ?> - <?php echo $album->album; ?></li>
  5. <?php } ?>
  6. </ul>
  7. <?php echo $this->paginationControl($this->albums, 'Sliding'); ?>

Te recomiendo leer esto: http://weblog.jamisbuck.org/2006/10/...ller-fat-model

La idea es que el controlador sea lo más sencillo posible para que puedas cambiar el resultado de tu aplicación de la forma más sencilla en base a parámetros de entrada.

Saludos.

Etiquetas: clase, mvc, php, plantillas
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 18:20.
SEO by vBSEO 3.3.2