Я не могу понять, когда использовать переменные Layout
и когда использовать переменные View
для получения сегментов страницы на странице. Вот изображение формы их учебник по Layout
( $this
означает экземпляр View
везде):
Почему элементы Navigation
, Content
и Sidebar
получаются в виде переменных Layout
?
$this->layout()->nav;
Но HeadTitle
, HeadScript
, HeadStylesheet
получаются прямо из представления?
$this->headTitle(); // I know that this is a placeholder view helper. // But this segment of the page logically belongs to Layout. // and it has to be called smth like view->layout->placeholder
И почему Header
и Footer
– это partial
метод свойств View
но не Layout
?
$this->partial('header.phtml');
Я попытался их изменить, и оба способа работают нормально:
echo $this->nav; // I assigned navigation segment script to the View and it works;
Я попытался назначить сценарий сегмента Footer
для Layout
и он также работает:
$layout->footer = $footer; echo $this->layout()->footer; // it also works, it's displayed on the page
Любой из способов может быть применен к любой переменной на странице. Например, в Navigation
меня есть много переменных для отображения, и я могу их выводить с помощью обоих способов: одна переменная как свойство Layout
, другая – свойство « View
».
Итак, каково правило использовать их правильно? Когда я должен использовать переменные View
и когда Layout
?
Я согласен с тем, что это не очень понятно из документации, и я не думаю, что вообще-то объясняется это $this->layout()->nav
. Несколько моментов, которые могут помочь:
$this->layout()
на самом деле является вызовом помощника вида макета, который возвращает текущий экземпляр Zend_Layout
. Zend_Layout
регистрирует свой собственный помощник-заполнитель (с ключом «Zend_Layout») и по умолчанию создает в нем переменную «content». Zend_Layout
имеет волшебный метод __get()
который проксирует любую переменную-переменную участника в свой зарегистрированный контейнер-заполнитель. Поэтому вызов $this->layout()->content
– это еще один способ записи $this->placeholder('Zend_Layout')->content
Zend_Layout
также имеет волшебный __set()
который __set()
сохраненные данные в класс-заполнитель. Таким образом, $layout->footer = 'foo'
совпадает с вызовом $this->placeholder('Zend_Layout')->footer = 'foo' in the view
С этим в мыслях:
Почему элементы навигации, содержимого и боковой панели получаются в виде переменных макета?
Поскольку они получают доступ к данным, хранящимся в заполнитель Zend_Layout
. Вы также можете использовать $this->placeholder('Zend_Layout')->content
Но HeadTitle, HeadScript, HeadStylesheet получаются прямо из представления?
Это помощники просмотра.
И почему верхний и нижний колонтитулы – это частичный метод свойств View, но не Layout?
Это стандартный способ доступа к содержимому из других шаблонов.
В общем случае предположим, что использование объекта view является правильным способом доступа к данным. Используйте объект макета / помощник, только если вы знаете, что данные находятся в макете.
Преимущество использования заполнителей над частицами заключается в том, что вы можете получить доступ и изменить их в нескольких разных местах, в том числе в самом представлении. Например, у вас есть боковая панель, которая хранится в частичном. Если вы вместо этого сохранили это в Zend_Layout placeholder (например, в плагине контроллера), вы можете переопределить это для определенных действий в контроллере:
public function someAction() { $this->view->layout()->sidebar = 'Some other sidebar content'; }
или в самом скрипте вида:
<?php $this->layout()->sidebar = 'Content for this page only'; ?>