2011-12-04 22 views
7

Mam następujące klasy:Jak udostępnić zmienne w szablonie?

abstract class TheView 
{ 
    public $template = NULL; 
    public $variables = array(); 

    public function set($name, $value) 
    { 
    $this->variables[$name] = $value; 
    } 
    public function display() 
    { 
    include($this->template); 
    } 
} 

Plik szablonu jest prosty plik PHP:

<?php 
echo $Message; 
?> 

Jak mogę zrobić wszystkie zmienne w TheView::$variables dostępnych w szablonie (tonacji każdej pozycji powinna być nazwą zmiennej).

Próbowałem już dodać wszystkie zmienne do $GLOBALS, ale to nie zadziałało (i myślę, że to zły pomysł).

Odpowiedz

5

I zawsze kończy się w ten sposób:

public function render($path, Array $data = array()){ 
    return call_user_func(function() use($data){ 
     extract($data, EXTR_SKIP); 
     ob_start(); 
     include func_get_arg(0); 
     return ob_get_clean(); 
    }, $path); 
} 

Uwaga Funkcja anonimowe i func_get_arg() połączenia; Używam ich, aby zapobiec przeniesieniu $this i innych zmiennych "zanieczyszczeń" do szablonu. Przed włączeniem możesz też usunąć ustawienie $data.

Jeśli chcesz $this dostępne, tylko extract() i include() bezpośrednio z metody.

więc można:

$data = array('message' => 'hello world'); 
$html = $view->render('path/to/view.php', $data); 

Z path/to/view.php:

<html> 
    <head></head> 
    <body> 
     <p><?php echo $message; ?></p> 
    </body> 
</html> 

Jeśli chcesz Zobacz obiekt przeszedł, ale nie z zakresu metody render(), zmienić ją w następujący sposób:

public function render($path, Array $data = array()){ 
    return call_user_func(function($view) use($data){ 
     extract($data, EXTR_SKIP); 
     ob_start(); 
     include func_get_arg(1); 
     return ob_get_clean(); 
    }, $this, $path); 
} 

$view będzie instancją obiektu View. Będzie on dostępny w szablonie, ale ujawni tylko publicznych członków, ponieważ jest poza zakresem metody render() (zachowując enkapsulację prywatnych/chronionych członków)

+0

Dzięki, działa dobrze! – user897029

+0

Widzę ** - 1 **; ciekawy dlaczego? Co zrobiłbyś inaczej, tajemnica ** - 1 ** 'er? – Dan

+0

Hmmm Nie widzę -1, może on/ona zmienił swoją opinię;) – user897029

3

Można użyć extract():

public function display() 
{ 
    extract($this->variables); 
    include($this->template); 
} 
+0

Działa również dobrze, dziękuję! Ale myślę, że będzie czystszy, jeśli po prostu uwzględnię zmienne widoku, a nie $ this. – user897029

0

Spróbuj tego:

foreach($variables as $key => $value){ 
    $$key = $value; 
} 
+1

To jest to samo co 'extract ($ variables, EXTR_OVERWRITE);'. – user897029

+0

Ahh, okej! Nie znam jeszcze wszystkich ciekawych funkcji PHP. – ThatOtherPerson

+0

Słyszałem o 'extract()', ale nie znalazłem rozwiązania dla (teraz rozwiązanego) mojego problemu. To jest życie programistów - zawsze ucząc się przez działanie;) – user897029

0

Można użyć funkcji extract importowania zmiennych z tablicy do bieżącej tablicy symboli.

abstract class TheView 
{ 
    public $template = NULL; 
    public $variables = array(); 

    public function set($name, $value) 
    { 
    $this->variables[$name] = $value; 
    } 
    public function display() 
    { 
    extract($this->variables); 
    include($this->template); 
    } 
}