Как реализовать боковую панель в Zend Framework - PullRequest
5 голосов
/ 10 августа 2009

Как мне реализовать боковую панель в Zend Framework? Я знаю, что я могу использовать заполнитель или что-то подобное в Zend_layout, но как мне автоматически сгенерировать код для боковой панели в моих контроллерах без необходимости вызывать класс боковой панели в каждом контроллере? Моя установка выглядит следующим образом

Application
- modules
  - blog
  - other modules

Мне нужна только боковая панель для моего блога.

Я нашел это http://www.zfforums.com/zend-framework-components-13/model-view-controller-mvc-21/how-layout-sidebar-etc-2677.html, но я не понимаю последнюю часть "просто введите свой макет, зарегистрируйте его на фронт-контроллере ..."

Ответы [ 3 ]

6 голосов
/ 10 августа 2009

Вы можете просто выполнить действие и просмотреть один из ваших контроллеров, который отображает боковую панель.

из макета для модуля блога, который вы просто называете:

<? echo $this->action('action','controller','module',array('optionalparams'=>1); ?>

на позиции, где вы хотите его иметь. Итак, один призыв к одному действию.

4 голосов
/ 24 июня 2011

Вместо того, чтобы использовать стек действий и помощник вида 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, но я думаю, что это действительно зависит от конкретного случая, чтобы определить наилучшее размещение.

3 голосов
/ 10 августа 2009

Если вы используете Zend_Layout, просто добавьте боковую панель с видовой подсказкой Action, как сказал Руфинус.

в вашем скрипте макета:

<div id="sidebar">
<?php echo $this->action('action', 'controller', 'module', array('optionalparams'=>1)); ?>
</div>
<div id="content">
<?php echo $this->layout()->content; ?>
</div>

Это должно соответствовать требованиям, указанным в вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...