Что такое Layout и что такое View в ZF? Когда и какие переменные следует использовать и почему?

Я не могу понять, когда использовать переменные 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'; ?>