【问题标题】:How do I pass variables to a layout in a multiple module / layout Zend Framework application?如何将变量传递给多模块/布局 Zend Framework 应用程序中的布局?
【发布时间】:2012-04-21 21:53:50
【问题描述】:

在我将 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() 等中来更改上述运行的点)

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

任何指针将不胜感激。

【问题讨论】:

  • 我假设以上只是一个错字:在控制器中:$this-&gt;view-&gt;foo = 'Something'; 和布局中&lt;?= $this-&gt;something ?&gt;。我假设您的意思是布局中的&lt;?= $this-&gt;foo ?&gt;,对吧?

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


【解决方案1】:

也许这不能解决整个问题,但它会对你有这个丑陋的开关有所帮助:-)

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

}

【讨论】:

    【解决方案2】:

    我在当前的项目中做类似的事情,它基本上工作正常。

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

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

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

    这似乎可以保证我在引导程序、插件和控制器中访问相同的视图实例。

    【讨论】:

    • 啊哈!谢谢大卫,这对我有用。我现在正在应用程序级别引导视图,并通过前端控制器实例在我的插件中获取布局资源,就像您演示的那样。
    • 我想您可以从另一个资源(例如 viewrenderer)或布局实例接收视图,并且它将使用相同的视图资源。请注意,但这也是一个很好的答案。
    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2011-06-19
    • 2010-12-04
    • 2011-06-22
    相关资源
    最近更新 更多