如何将变量传递给多模块/布局Zend Framework应用程序中的布局?

时间:2012-04-09 14:24:30

标签: php zend-framework module zend-view zend-layout

在我将Zend Framework应用程序转换为基于模块的结构之前,它只有一个布局,我可以从控制器传递变量,如下所示:

// Controller action
$this->view->foo = 'Something';

// Layout
<?= $this->foo ?>

然而,由于将所有内容都移动到默认模块并创建一个单独的“管理”模块,我再也无法使其工作,很可能是因为我将“视图设置”移出我的引导文件并进入控制器插件我在哪里切换基于模块的布局。我的插件看起来像这样:

class KW_Controller_Plugin_LayoutSelector extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $layout = Zend_Layout::getMvcInstance();
        $layout->setLayout($request->getModuleName());

        $view = $layout->getView();
        $view->doctype('HTML5');
        $view->setEncoding('UTF-8');
        $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8');
        $view->headScript()->appendFile('/js/jquery-1.7.1.min.js');

        switch ($request->getModuleName()) {
            case 'admin':
                $view->headTitle('Admin Area')->setSeparator(' - ');
                $view->headLink()->appendStylesheet('/css/admin/global.css');
                $view->headScript()->appendFile('/js/admin/common.js');
                break;
            default:
                $view->headTitle('Main Site')->setSeparator(' - ');
                $view->headLink()->appendStylesheet('/css/global.css');
                $view->headScript()->appendFile('/js/common.js');
                break;
        }
    }
}

如果我将所有这些方法调用移回到我的引导程序中,我可以再次将变量传递给布局;所以我猜测某些事情发生在错误的顺序,也许我的布局正在切换后,我已经将变量传递给我的控制器的视图,他们没有进入我的布局? (我已经尝试通过将代码放在preDispatch()和postDispatch()等中来改变上面运行的点。)

值得注意的是,我可以在我的个人视图脚本中访问这些变量,而不是它们所包含的布局。

任何指针都会非常感激。

2 个答案:

答案 0 :(得分:1)

我在当前的项目中做了类似的事情,并且它在很大程度上正常工作。

我注意到的一个区别是我使用标准应用程序资源在应用级别引导布局和视图。

然后在我的插件中,我使用以下方式访问视图:

$front = Zend_Controller_Front::getInstance();
$view = $front->getParam('bootstrap')->getResource('view');

这似乎保证我在bootstrap,插件和控制器中访问相同的视图实例。

答案 1 :(得分:0)

也许这不会解决整个问题,但它会帮助你解决这个丑陋的问题: - )

public function preDispatch(Zend_Controller_Request_Abstract $request)
{

    $module = $request->getModuleName();
    $layout = Zend_Layout::getMvcInstance();

    // check module and automatically set layout
    $layoutsDir = $layout->getLayoutPath();
    // check if module layout exists else use default
    if(file_exists($layoutsDir . DIRECTORY_SEPARATOR . $module . ".phtml")) {
        $layout->setLayout($module);
    } else {
        $layout->setLayout("layout");
    }
}

}