模块化的网站与zend框架,一堆行动

时间:2009-02-24 21:12:31

标签: php zend-framework

如何使用Zend框架构建模块化网站。我在db中有页面,每个页面都表示为url。每个页面都有1到N个内容。每个内容都有控制器,动作和位置(+其他现在不重要的列)。因此,一个请求是一个页面和多个内容(多个动作)。如何在输出之前构建所有操作?我希望布局设计像示例bellow,其中内容放在容器中(操作在布局打印输出之前运行)。

<div id="left">
   <?= $this->layout()->left_container ?>
</div>
<div id="center">
   <?= $this->layout()->center_container ?>
</div>
<div id="right">
   <?= $this->layout()->right_container ?>
</div>

到目前为止,我从布局视图中调用了操作,但我不喜欢这种方法:

foreach ($contents as $item) {
    echo $this->action($item['action'], $item['controller'], null, array('content' => $item));
}

感谢。

P.S。

adepretis的代码与我类似,我的操作视图在布局中运行,这意味着当出现错误时,它会在调用动作的布局中打印。在布局输出之前是否没有建立动作的乳清?另一件坏事是,我必须在每一个动作中运行...-&gt; setResponseSegment,我希望这是自动化的。

P.S。 #2

我找到了答案,下面列出了答案。如果有乳清我可以做到这一点,请写下来。

3 个答案:

答案 0 :(得分:1)

您可以使用ActionStack helper。例如:

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');
    }
}

/ somemodule / my / index 的请求导致执行 / somemodule / somecontroller / left / somemodule / somecontroller / right / somemodule / somecontroller / center 最终出现在对应的布局段中。

答案 1 :(得分:1)

我在其他论坛上找到了答案。这是asnwer:

<强>为myplugin

class MyPlugin extends Zend_Controller_Plugin_Abstract
{

    public function routeStartup(Zend_Controller_Request_Abstract $request)
    {
        $action_stack = new Zend_Controller_Action_Helper_ActionStack();
        // here I will read actions from db and run it in loop, but for example few are staticly added bellow
        $action_stack->actionToStack('index', 'content', 'default', array('position' => 'left'));
        $action_stack->actionToStack('index', 'content', 'default', array('position' => 'center'));
        $action_stack->actionToStack('index', 'edo', 'default', array('position' => 'center'));
        $action_stack->actionToStack('left', 'edo', 'default', array('position' => 'left'));
        $action_stack->actionToStack('right', 'edo', 'default', array('position' => 'right'));
    }

}

BaseController ,每个控制器都扩展

class BaseController extends Zend_Controller_Action
{

    public function preDispatch()
    {
        $position = $this->_request->getParam('position', false);
        if ($position) {
            $this->_helper->viewRenderer->setResponseSegment($position);
        }
    }

}

<强>布局一个.phtml

<div>
    <h2><u>LEFT:</u></h2>
    <?=$this->layout()->left?>
</div>
<div>
    <h2><u>CENTER:</u></h2>
    <?=$this->layout()->center?>
</div>
<div>
    <h2><u>RIGHT:</u></h2>
    <?=$this->layout()->right?>
</div>

这就是我想要的,如果有人有更好的解决方案,请回答问题,我会接受他的回答。

答案 2 :(得分:0)

嗨我也遇到同样的问题。你建议的解决方案工作正常。但我的baseController是在模块基础。代码与baseController顺利工作,但当我在另一个模块中扩展控制器时出现错误作为基础控制器无法在其他控制器中识别 例如:        modules / base / Controller / baseController      modules / user / Controller / userController

任何解决方案?