我目前正在开发一个使用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功能,我的匆忙,忽略了这将减少重复冗余代码的数量,这可能在多个动作中重复在同一个控制器内?
答案 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');
}
这样做可以减少重复代码的数量,并且无需从视图中分配值。您可以非常快速地在控制器中执行此操作。在未调用帮助程序的情况下,您也可以使用默认值。