Как это сделать без стека действий - PullRequest
0 голосов
/ 17 октября 2010

Я нашел этот код здесь , пытаясь понять, что делает стек действий и почему они должны быть такими плохими. Я думал, что actiontack - это всего лишь один из типов помощников действий (как flashmessenger, перенаправитель или ViewRenderer).

Но в любом случае, кто-нибудь понимает, что делает этот код и как сделать то же самое без стека действий?

class MyController_Action extends Zend_Controller_Action {
    function init() {
        /** you might not want to add to the stack if it's a XmlHttpRequest */
        if(!$this->getRequest()->isXmlHttpRequest()) {
            $this->_helper->actionStack('left', 'somecontroller', 'somemodule');
            $this->_helper->actionStack('center', 'somecontroller', 'somemodule');
            $this->_helper->actionStack('right', 'somecontroller', 'somemodule');
        }
}

class MyController extends MyController_Action {
    function indexAction() {
        // do something
    }
}

class SomecontrollerController extends MyController_Action {
    function leftAction() {
        // do something

        $this->_helper->viewRenderer->setResponseSegment('left_container');
    }

    function centerAction() {
        // do something

        $this->_helper->viewRenderer->setResponseSegment('center_container');
    }

    function rightAction() {
        // do something

        $this->_helper->viewRenderer->setResponseSegment('right_container');
    }
}

1 Ответ

3 голосов
/ 17 октября 2010

Я бы реализовал действия как повторно используемые виджеты (помощники действий с preDispatch() методами), как описано здесь:

Использование помощников действий для реализации многократно используемых виджетов - phly, boy, phly

Виджеты могут отображать выходные данные в placeholder помощниках вида и, таким образом, использоваться в любом месте макета

Они также могут отображать содержимое в другие placeholder, например, боковая панель, как описано в руководстве:

protected function _initSidebar()
    {
        $this->bootstrap('View');
        $view = $this->getResource('View');

        $view->placeholder('sidebar')
             // "prefix" -> markup to emit once before all items in collection
             ->setPrefix("<div class=\"sidebar\">\n    <div class=\"block\">\n")
             // "separator" -> markup to emit between items in a collection
             ->setSeparator("</div>\n    <div class=\"block\">\n")
             // "postfix" -> markup to emit once after all items in a collection
             ->setPostfix("</div>\n</div>");
    }

Другое решение заключается в использовании помощников вида, которые получают доступ к данным модели и запускают их в макете.

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