Comunidad de diseño web y desarrollo en internet online

Interacción de plantilla con Controlador en patron MVC

Citar            
MensajeEscrito el 14 Ago 2010 10:13 pm
Estoy empezando con el modelo MVC y la POO. Y no me queda claro como hacer interactuar los objetos.

Lo que tengo es un archivo index.php que inicializa al controlador. El controlador inicializa la vista. Y la vista incluye la plantilla.

Como puedo hacer para acceder a los metodos del controlador desde la plantilla?

Código PHP :

include "Controller.php";
new Controller();


Código PHP :

class Controller {
   
   
   function __construct() {
   
      $View = new View();
    }
   
   function listContents(){
      echo "consultando contenidos en base de datos.";
   }
}

class View {
    
   function __construct($a) {       
      include $template; // vista.php
    }
}


Código PHP :

<div><?php echo x->listTutorials(); ?></div>


Se que con $this puedo acceder a los metodos del objeto View. Pero necesito acceder también a los del controlador. Y para acceder a sus variables casi no tuve problemas porque pasé un array con muchas variables. Ahora, con los metodos... que puedo hacer?

Por mayid

17 de clabLevel



 

opera
Citar            
MensajeEscrito el 14 Ago 2010 11:11 pm
Esta resuelto. Estoy pasando el objeto controller como un parametro ($this):

$View = new View($whichView, $this->phpvars, $this);

De esta manera, el objeto view y la plantilla pueden acceder a sus métodos.

Por mayid

17 de clabLevel



 

opera
Citar            
MensajeEscrito el 15 Ago 2010 01:43 am
Me voy a limitar a responder tu duda

Con este codigo

Código PHP :

$View = new View($whichView, $this->phpvars, $this);


Imagino que tienes el constructor asi


Código PHP :

class View
{
    private $view;
    private $vars;
    private $ctrl;

    public function __construct( $which, $vars, Controller $controller)
    {
         $this->view = $which;
         $this->vars = $vars;
         $this->ctrl = $controller;
         $this->crtl->algunMetodoControlador(); // aqui lo llamo
    }

}


saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 16 Ago 2010 01:41 am
Gracias por responder. Si, mi vista es muy parecida a eso. Salvo que incluye la plantilla y es en la plantilla en donde se llaman algunas funciones:
$this->crtl->algunMetodoControlador();

Lo que vos publicaste me reafirma que pasar el controlador como parametro está bien visto. Digo, porque hace poco ví un ejemplo en donde se guarda la plantilla en buffer, y se la ejecuta directamente desde el controlador en vez de imprimirla desde la vista. Con lo cual el resultado es el mismo: se puede acceder a metodos de controlador desde la plantilla.

Por mayid

17 de clabLevel



 

opera
Citar            
MensajeEscrito el 16 Ago 2010 06:11 am
No, no dije que pasar el controlador como parametro a la vista esta bien visto. Por eso dije: "Me voy a limitar a responder tu duda"

Ahora... sabes ingles? Lee esto:
Multitier architecture

También miras la imagen ;)

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 16 Ago 2010 02:50 pm
Mh... Si se ingles. Pero no entendí el link. Habla de una arquitectura que no es MVC. Y no aplicada a PHP :o(

Me parece más elegante usar buffers que pasar el objeto ($this)como parametro. Voy a probarlo así. Y además intentaré evitar hacer llamadas a métodos desde una plantilla, porque supuestamente desde ahí solo tendría que recorrer arrays, no?.

Por mayid

17 de clabLevel



 

opera
Citar            
MensajeEscrito el 16 Ago 2010 05:24 pm
Si quieres evitar pasar los parametros a la vista en el constructor puedes proporcionar metodos de acceso a los controladores disponibles para una vista determinada:

Código PHP :

class Controller { 
    
    
   function __construct() { 
    
      $View = new View(); 
      $View->setController($this);
    } 
    
   function listContents(){ 
      echo "consultando contenidos en base de datos."; 
   } 
} 
 
class View { 
     
   function __construct($a) {        
      include $template; // vista.php 
    } 
}

Donde setControler es un metodo de la clase View q establece la propiedad ctrl con un objeto Controller.

Por Lokhi

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Ago 2010 05:45 pm
Veo. Gracias. Entonces saco por conclusion que es valido que la vista (o la plantilla quizás) tengan acceso a un controlador.

Ahora ya estoy reestructurando la logica de mi MVC para enviar arrays con contenidos en vez de el objeto $this. Esto es lo que estoy haciendo con el buffer:

Código PHP :

class Controller {  
     
   ... // vars 

   function __construct() {  
      
      ... // llamada al modelo y a metodos que definen las variables

      include "View.php";
      $View = new View($whichView);
      $View->prepareContents($this->phpvars, $this->contentsArray);
      $View->render();
    }      
  
}  
... // falta publicar como armo los arrays phpvars y contentsArray



Código PHP :

class View {  
   
   var $template;
   var $CSS_filename;
   var $availableLanguages;
   var $contents;

   function __construct($whichTPL){
      
   $this->setTemplate($whichTPL);  
    }  
 
   
   public function setTemplate($whichTPL) {
      
      $this->template = "contents.".$whichTPL.".tpl.php";
   }
   
   public function prepareContents($phpvars, $contentsVars)
   {
      
      $tutorials = $contentsVars['tutorialsList']; // todas estas variables (o arrays)
      $mainLinks = $contentsVars['mainLinks'];     // van a ser usadas en la plantilla
      $relPages = $contentsVars['relPages']; 
      $theTags = $contentsVars['theTags'];
      
      ob_start();       
      $flagsDef = $this->printFlags();       
      include $this->template;
      $this->contents = ob_get_clean();
    }

   public function render() {
   
      echo $this->contents;
   }
} 


Me baso en este tutorial:
http://web2development.blogspot.com/2007/05/patron-mvc.html

Por mayid

17 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.