将变量从Controller / Action传递给Layout时,如何避免重复

时间:2011-12-27 21:27:42

标签: zend-framework

我目前正在开发一个使用Zend Framework开发的项目,基于我的网页设计结构,我已经达到了一个点,我必须从每个Controller / Action将少量变量传递给我的布局。这些变量是:

<?php Zend_Layout::getMvcInstance()->assign('pageId', 'page1'); ?>
<?php Zend_Layout::getMvcInstance()->assign('headerType', '<header id="index">'); ?>

传递此信息的原因首先是,我传递了页面ID,因为多列布局可能会根据显示的内容而改变,因此body标签中的页面ID将相应的CSS链接到应该如何显示页面。其次,我只在索引页面上显示促销jQuery滑块,但我需要灵活地将它显示在可能的多个页面上,以防风改变并且客户改变主意。

我的实际问题:是否有更合适的方法将此信息传递给我忽略的布局?

我并不是在质疑是否必须发送信息,而是我有一些Zend Framework功能,我的匆忙,忽略了这将减少重复冗余代码的数量,这可能在多个动作中重复在同一个控制器内?

2 个答案:

答案 0 :(得分:1)

你不应该从视图到布局传递任何东西,因为一开始视图应该包含在布局中,而不是相反。

因此,设置页面标题应该使用与您拥有的代码相似的代码,但在调用的控制器操作中:

$this->view->headTitle()->append('Homepage');

另外两个问题 - 你需要重新思考,正如我所说的那样。也许你误解了布局/视图原理?如果您为每个操作包含不同的视图,那么您只需在需要时更改div ID,并仅在index.phtml文件中包含横幅的标题。

答案 1 :(得分:1)

您可以将该逻辑转换为动作助手,而不是以更直接的方式从控制器调用。你也可以创建一个视图助手来完成同样的事情,但是视图助手通常会为视图生成数据而不是设置属性。

// library/PageId.php
class Lib_PageId extends Zend_Controller_Action_Helper_Abstract
{
    public function direct($title, $pageId, $headerType)
    {
        $view = $this->getActionController()->view;


        $view->headTitle()->append($title);
        $view->pageId = $pageId;
        $view->headerType = $headerType;
    }
}

在您的控制器操作中,您现在可以执行此操作:

$this->_helper->PageId('Homepage', 'page1', 'index');
// now pageId and headerType are available in the view and
// Homepage has been appended to the title

您还需要在Bootstrap中注册帮助路径,如下所示:

protected function _initActionHelpers()
{
    Zend_Controller_Action_HelperBroker::addPrefix('Lib');
}

这样做可以减少重复代码的数量,并且无需从视图中分配值。您可以非常快速地在控制器中执行此操作。在未调用帮助程序的情况下,您也可以使用默认值。