2013-03-06 2 views
0

Это еще одна из тех утилит, где каждый blogger \ tutor предполагает, что все мы знаем, что это такое, поэтому они никогда не удосуживаются объяснить, что он на самом деле делает. Они просто продолжают использовать его в своих примерах, полагая, что мы все знаем, что происходит.Что делает render() в Zend Framework

От того, как люди используют или ссылаются на render(), это предполагает, что он отображает контент (например: просмотр содержимого), но если это так, то почему мы используем echo для фактического отображения его содержимого?

Другие виды использования предполагают, что он форматирует контент, используемый в декораторах форм, где мы используем sprintf() для ввода переменных в строки.

Так что же делает render() в таких случаях, как Zend_View, Zend_Layout и т. Д.? Может кто-то объяснить, что это работает на фундаментальном уровне (под капотом). Благодарю.

ответ

3

Он загружает сценарий вида и выводит его как строку.

Упрощение бит, Zend_View принимает файл сценария вида (например, index.phtml) и включает его внутренне для создания вывода HTML. Используя метод render(), можно взять дополнительный скрипт вида (например, nav.phtml) и вывести его внутри родительского сценария просмотра. Идея состоит в том, чтобы отображать элементы, которые повторяются на многих страницах всего за один раз, вместо повторения одного и того же HTML снова и снова.

Код для метода визуализации можно найти в Zend_View_Abstract классе и является следующее:

/** 
* Processes a view script and returns the output. 
* 
* @param string $name The script name to process. 
* @return string The script output. 
*/ 
public function render($name) 
{ 
    // find the script file name using the parent private method 
    $this->_file = $this->_script($name); 
    unset($name); // remove $name from local scope 

    ob_start(); 
    $this->_run($this->_file); 

    return $this->_filter(ob_get_clean()); // filter output 
} 

Реализация метода _run() можно найти в классе Zend_View и заключается в следующем:

/** 
* Includes the view script in a scope with only public $this variables. 
* 
* @param string The view script to execute. 
*/ 
protected function _run() 
{ 
    if ($this->_useViewStream && $this->useStreamWrapper()) { 
     include 'zend.view://' . func_get_arg(0); 
    } else { 
     include func_get_arg(0); 
    } 
} 

Как вы можете видеть, render() берет имя сценария вида, разрешает его имя файла, инициирует буферизацию вывода, включает файл сценария вида (это то, что _run() метод делает внутренне), затем передает выход через необязательные фильтры и, наконец, возвращает сгенерированную строку.

Умная вещь в том, что он сохраняет свойства (переменные) объекта вида, из которого он вызван (потому что это тот же объект Zend_View, только с загруженным сценарием другого вида). В этом отношении он отличается от метода partial(), который имеет свой собственный диапазон переменных, и вы можете передавать в него переменные (что делает его полезным для рендеринга меньших элементов, таких как отдельные строки данных, когда вы используете foreach по набору данных).

Смежные вопросы