Вместо того, чтобы использовать стек действий и помощник вида action()
, вы можете создать «скрипт частичного представления», который включает в себя элементы боковой панели.
# in your layout.phtml
<div id="sidebar">
<?php echo $this->render('blog/_sidebar.phtml'); /*relative to your view scripts directory*/ ?>
</div>
# in blog/_sidebar.phtml
<div id="blog_categories">
<?php foreach ($this->categories as $category): ?>
<?php echo $category->name; ?>
<?php endforeach; ?>
</div>
Помощник вида render()
используется для визуализации содержимого другого скрипта представления. Он имеет ту же область действия, что и все остальные сценарии представления, поэтому, если переменная назначена представлению, они будут доступны для вашей части. Таким образом, в приведенном выше примере переменная категории была установлена в контроллере.
Существует еще один помощник вида, называемый partial()
помощник вида. Эта функция немного дороже, поскольку создает собственную переменную область видимости. Другими словами, ни одна из ваших текущих переменных представления не будет доступна. У вас будет чистый лист для работы, что означает, что вы должны передать любые переменные, которые вам нужны:
# in your layout.phtml
<div id="sidebar">
<?php echo $this->partial('blog/_sidebar.phtml', array('categories2'=>$this->categories)); ?>
</div>
# in blog/_sidebar.phtml
<div id="blog_categories">
<?php foreach ($this->categories2 as $category): ?>
<?php echo $category->name; ?>
<?php endforeach; ?>
</div>
Я не часто использую partial()
, потому что это дороже, и мне редко нужно создавать отдельный контекст.
Что касается настройки переменных для использования в частичной части боковой панели ($this->categories
в этом примере), я использовал несколько различных методов в зависимости от конкретной проблемы. Если это относится к действию контроллера, я напишу код и назначу его в скрипте вида:
# controller
public function somethingAction()
{
$this->view->categories = $this->_getCategoriesForThisParticularAction();
// other controller code
}
Если мой код более универсален для всех действий контроллера, я буду использовать функцию контроллера preDispatch()
. Если он более универсален для нескольких контроллеров, я помещу код в init()
моего базового контроллера (контроллер, который расширяет большинство моих контроллеров).
Иногда я даже не помещаю код в мой контроллер. Если это достаточно просто, я просто вставляю код в частичное. Если это немного сложнее, я перенесу его в помощник вида. Это может нарушить схему MVC, но я думаю, что это действительно зависит от конкретного случая, чтобы определить наилучшее размещение.