2010-11-22 21 views
0

J'ai fait un petit cadre MVC, mais j'ai besoin que ma vue Classe puisse renvoyer la page sous forme de chaîne mais avant cela, appliquer toutes les variables. Comment cela peut-il être fait?RenderToHtml viewfile et retourne une chaîne?

class View{ 
    private $registry; 
    private $vars = array(); 
    private $file; 
    public function __set($index, $value){ 
     $this->vars[$index] = $value; 
    } 

    public function __construct($controller, $action){ 
     $this->file = "Views/".$controller."/".$action.".php"; 
     $this->registry = new Registry(); 
    } 

    public function renderToHtml(){ 
     try{ 
      if(file_exists($this->file)){ 

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

       /** include $this->file; **/ 
//apply vars on file 
       return $html; 
      }else{ 
       throw new Exception("No such View file"); 
      } 
     }catch (Exception $e) { 
      echo '<h1>Caught exception: ', $e->getMessage(), "</h1>"; 
      exit; 
     } 
    } 

Controller:

public function indexAction(){ 
    $html = new View('SomeController', 'htmlview'); 
    $html->somevar = "blabla"; 
    $this->View->fubar = $html->renderToHtml(); 
    $this->View->render() //this will render the current action/view (index) 
} 

de sorte que le HtmlView sera une partielle indexView régulière

Répondre

1

Utilisez output buffering

Exemple:

ob_start(); 
/* your error catch */ 
$render_html = ob_get_flush(); 
return $render_html; 
+0

Oui, cela fonctionne, mais include $ this-> fichier comprendra toujours le fichier de vue dans la vue parent, il sera affiché 2x –

+0

Pass un paramètre à '$ html-> renderToHtml ($ ob = true); ' peut donc décider quand faire ob_start()? – ajreal

+0

J'ai utilisé ob_get_clean() au lieu de ob_get_flush() et ça marche !!! Merci mon pote –

0

On dirait que vous nee pour obtenir le contenu du fichier et remplacer toutes les variables là.