如何在没有动作堆栈的情况下执行此操作

时间:2010-10-17 05:28:43

标签: php zend-framework

我在尝试理解动作堆栈的作用以及为什么它们应该如此糟糕的时候发现了这段代码here。我认为actionstack只是一种动作助手(就像flashmessenger或redirector或ViewRenderer一样)。

但是,无论如何,有没有人理解这段代码的作用以及如何在没有actionstack的情况下做同样的事情?

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 个答案:

答案 0 :(得分:3)

我将这些操作实现为re-usalbe小部件(使用preDispatch()方法的动作助手),如下所述:

Using Action Helpers To Implement Re-Usable Widgets - 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>");
    }

另一种解决方案是使用视图助手访问模型数据,并在布局中运行它们。