如何在多模块Phalcon应用程序中使用“主要布局”视图?

时间:2012-10-18 09:10:42

标签: phalcon

我正在为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?)

我希望这是有道理的!

3 个答案:

答案 0 :(得分:2)

你要找的东西不能在这个版本(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。

答案 1 :(得分:1)

在Phalcon ver 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/');

答案 2 :(得分:0)

您可以使用多个共享布局演示或下载以查看其工作原理 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;
        };