Zend framework 在将变量从控制器/操作传递到布局时,如何避免重复

Zend framework 在将变量从控制器/操作传递到布局时,如何避免重复,zend-framework,Zend Framework,我目前正在从事一个使用Zend Framework开发的项目,基于我的网页设计结构,我已经达到了一个地步,我必须从每个控制器/操作向布局传递少量变量。这些变量是: <?php Zend_Layout::getMvcInstance()->assign('pageId', 'page1'); ?> <?php Zend_Layout::getMvcInstance()->assign('headerType', '<header id="index">')

我目前正在从事一个使用Zend Framework开发的项目,基于我的网页设计结构,我已经达到了一个地步,我必须从每个控制器/操作向布局传递少量变量。这些变量是:

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


您实际上不应该将任何内容从视图传递到布局,首先,视图应该包含在布局中,而不是相反

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

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

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

您可以将该逻辑转换为操作帮助器,而不必从控制器以更直接的方式调用。您也可以创建视图帮助器来完成相同的任务,但是视图帮助器通常为视图生成数据,而不是设置属性

// 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
您还需要在引导程序中注册助手路径,如下所示:

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

这样做可以减少重复代码的数量,并且不需要从视图中指定值。您可以在控制器中快速执行此操作。如果没有调用帮助程序,您也可以使用默认值。

谢谢Ashley,您是对的,我应该从控制器/操作而不是视图本身传递此信息。尽管标题出现在layout.phtml中的声明之前,因此我只能考虑通过变量将此信息传递给布局。除非有更好的办法?然后在布局中使用-if($this->layout()->headerType==''){echo$this->partial('index/_promotions.phtml');}来显示部分内容。很抱歉在这里粘贴代码。我更新了问题以避免这种混淆,并将我的代码移动到控制器/操作,如前所述,感谢Ashley的提示。干杯。谢谢德鲁,这更是我想要的,很好的回答,谢谢。