Как сделать переменные доступными в шаблоне? - PullRequest
7 голосов
/ 04 декабря 2011

У меня есть следующий класс:

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

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

Файл шаблона представляет собой простой файл PHP:

<?php
echo $Message;
?>

Как сделать все переменные из TheView::$variables доступными в шаблоне (ключ каждого элемента должен быть именем переменной).

Я уже пытался добавить все переменные в $GLOBALS, но это не сработало (и я думаю, что это плохая идея).

Ответы [ 4 ]

5 голосов
/ 04 декабря 2011

Я всегда заканчиваю тем, что делаю это:

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);
}

Обратите внимание на анонимную функцию и вызов func_get_arg(); Я использую их для предотвращения передачи $this и других переменных "загрязнение" в шаблон. Вы можете сбросить $data перед включением тоже.

Если вы хотите, чтобы $this было доступно, просто extract() и include() прямо из метода.

Так что вы можете:

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

С path/to/view.php:

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

Если вы хотите, чтобы объект View передавался, но не из области действия метода render(), измените его следующим образом:

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 будет экземпляром объекта View. Он будет доступен в шаблоне, но будет отображать только открытые члены, так как он находится вне области действия метода render() (, сохраняя инкапсуляцию закрытых / защищенных членов )

3 голосов
/ 04 декабря 2011

Вы можете использовать extract():

public function display()
{
    extract($this->variables);
    include($this->template);
}
0 голосов
/ 04 декабря 2011

Вы можете использовать функцию extract для импорта переменных из массива в текущую таблицу символов.

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);
  }
}
0 голосов
/ 04 декабря 2011

Попробуйте это:

foreach($variables as $key => $value){
  $$key = $value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...