Phalcon PHP - 多个视图目录

时间:2015-03-08 13:01:39

标签: php directory views phalcon

我的Phalcon PHP项目有问题。我正在构建具有多个MVC目录的单个模块应用程序。

每个模块都有自己的“views”目录,其中包含操作模板。 (index.volt,show.volt等)。布局从 modules / layout / 加载,然后使用

进行设置
$this->view->setLayout('index');
主控制器中的

初始化()

它的样子如下:     

    .
    ├── application
    │   └── modules
    │       ├── index
    │       │   ├── ControllerBase.php
    │       │   ├── IndexController.php
    │       │   └── views
    │       │       └── index.volt
    │       ├── layout
    │       │   ├── index.volt
    │       │   └── admin.volt
    │       ├── page
    │       │   ├── Page.php
    │       │   ├── PageAdminController.php
    │       │   ├── PageController.php
    │       │   ├── admin_views
    │       │   │   ├── edit.volt
    │       │   │   └── index.volt
    │       │   └── views
    │       │       └── show.volt
    

这是我的观看服务:

$di->set('view', function () use ($mainConfig) {

    $view = new View();

    $view->setLayoutsDir(APPLICATION_PATH . "/modules/layout/");

    $view->registerEngines(array(
        '.volt' => function ($view, $di) use ($mainConfig) {

            $volt = new VoltEngine($view, $di);

            $volt->setOptions(array(
                'compiledPath' => $mainConfig->application->cacheDir,
                'compiledSeparator' => '_'
            ));

            return $volt;
        },
        '.phtml' => 'Phalcon\Mvc\View\Engine\Php'
    ));

    return $view;
}, true);

我想在主控制器中设置视图目录 (ControllerBase.php),因为它取决于当前的控制器名称。

例如:

myapp.com => /modules/index/views/index.volt
myapp.com/page/show/2 => /modules/page/views/show.volt

所以我的问题是:如何设置视图目录和搜索模式以匹配我的结构?

2 个答案:

答案 0 :(得分:4)

Nailed it!

ControllerBase.php

$moduleName = $this->dispatcher->getControllerName();
$actionName = $this->dispatcher->getActionName();

// set view for current Controller and Action
$this->view->setMainView('layout/index');
$this->view->pick($moduleName."/views/".$actionName);

Services.php

$view->setViewsDir(APPLICATION_PATH . "/modules/");

我只是自己选择当前视图,使用 View :: pick()

答案 1 :(得分:1)

不是100%得分答案,因为无论如何你都要花时间,但你的冷启动应该是这样的:

class ControllerBase extends \Phalcon\Mvc\Controller 
{
    // initialization for all controllers in module
    protected function initialize() {

        $this->view->setViewsDir(
            sprintf('../application/modules/%s/views/', $this->router->getModuleName())
        );
    }

这应该让你的phalcon在模块目录中搜索视图,它的工作结构仍然是这样的:

.
├── application
│   └── modules
│       ├── index
│       │   ├── ControllerBase.php
│       │   ├── IndexController.php
│       │   └── views
│       │       └── Index
│       │           └──default.volt

不确定是否有更多的“全球”方式,但我有点感觉就像应该存在一样,最有可能通过DI()中的异域视图定义。