【问题标题】:How do I use "Main Layout" views in a multi module Phalcon application?如何在多模块 Phalcon 应用程序中使用“主布局”视图?
【发布时间】:2012-10-18 09:10:41
【问题描述】:

我正在为我的 PhalconPHP 应用程序使用“多模块”MVC 结构。

我想弄清楚的一个问题是如何将“主布局”视图配置为 模块视图文件夹。

换句话说,我想要一个主“主布局”(as described here),并且我希望我的所有模块在该主布局视图中的“控制器视图”级别输出它们的视图。

默认情况下,主布局视图显示来自

[app]
 [module1]
    [controllers]
    [models]
    [views]
        (main layout is coming from here)
 [module2]
    [controllers]
    [models]
    [views]
        (main layout is coming from here)
 [views]
    (master main layout should come from here?)

我希望这是有道理的!

【问题讨论】:

    标签: phalcon


    【解决方案1】:

    在这个版本(0.5.0 稳定版)或下一个 0.6.0 版(因为它已被冻结,待发布)中无法完成您要查找的内容。

    在您的模块中注册您的视图

    // /module1/Module.php
    
    // Registering the view component
    $di->set(
        'view', 
        function () {
            $view = new \Phalcon\Mvc\View();
            $view->setViewsDir('../apps/module1/views/');
            return $view;
        }
    );
    
    // /module2/Module.php
    
    // Registering the view component
    $di->set(
        'view', 
        function () {
            $view = new \Phalcon\Mvc\View();
            $view->setViewsDir('../apps/module2/views/');
            return $view;
        }
    );
    

    等等。

    您还可以拥有一个对所有模块都通用的主视图,但不能是两者的组合。

    //Registering a shared view component
    $di->set(
        'view', 
        function() {
        $view = new \Phalcon\Mvc\View();
        $view->setViewsDir('../apps/views/');
        return $view;
        }
    );
    

    请参阅 Github 上的 this example

    这很可能是 0.7 版本的 NFR。

    【讨论】:

    • 嗨 Nikolaos,这实际上是我在使用 github.com/phalcon/mvc/tree/master/multiple 作为指导后目前的设置方式。在其当前形式中,它不查看应用程序/视图/文件夹。我需要在引导文件中添加一些内容吗?
    • 我尝试将以下内容添加到我的引导文件 $di->set('view', function () { $view = new \Phalcon\Mvc\View(); $view->setViewsDir ('../app/views/'); 返回 $view; }); $this->setDI($di);但不幸的是,它不起作用。
    • 蒂姆,我已经更改了回复。请看一看。
    • Nikolaos,非常感谢你继续忍受我!我查看了 github 示例并注意到这些模块在 module.php 文件中没有 di 视图集代码。我还注意到所有视图文件(包括模块)都在“common”目录中。我认为使用模块的目的是能够构建独立运行的独立“模块”。将所有视图文件放在一个公共目录中似乎没有抓住重点。难道没有别的办法了吗?我在哪里可以要求 1.7。非常感谢您的帮助!
    • 蒂姆,抱歉回复晚了。不幸的是,您的要求目前无法实现 - 我已经通过代码并与开发人员交谈确认了这一点。这很可能是一个有用的功能,所以我将为 0.7.0 及更高版本打开一个 NFR。 0.7.0 已经满了,但我们会看到我们能做些什么:)
    【解决方案2】:

    在 Phalcon 1.2.4 版(可能在早期版本中也是如此)一个主“主布局”是可能的。 Phalcon 相对于 ViewsDir 构建 lauout 的路径,设置如下

    $view->setViewsDir('../apps/views/');
    

    所以,如果设置lauout的路径相对那个,它会起作用

    $view->setLayoutsDir('./../../views/');
    

    也许是组织该结构以在应用程序初始化时以及在 Module.php 中设置 ViewsDir 时声明视图对象的最佳方式:

    // Application.php
    $di->set('view', function() use ($config) {
        $view = new View();
        $view->setLayoutsDir('./../../views/');
        $view->setLayout('index');
    }, true);
    

    // /module1/Module.php
    $di->get('view')->setViewsDir('../apps/module1/views/');
    

    【讨论】:

      【解决方案3】:

      您可以使用多个共享布局演示或下载以查看其工作原理 https://github.com/phalcon/mvc/tree/master/multiple-shared-layouts/apps

      或者只为每个 Module.php 添加 t

       $di['view'] = function () {
                  $view = new View();
                  $view->setViewsDir(__DIR__ . '/views/');
                  $view->setLayoutsDir('../../common/layouts/');
                  $view->setTemplateAfter('main');
                  return $view;
              };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 2014-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多