Phalcon PHP - 多个视图目录
Phalcon PHP - Multiple views directories
我的 Phalcon PHP 项目有问题。我正在构建内部包含多个 MVC 目录的单模块应用程序。
每个模块都有自己的 "views" 目录,其中包含操作模板。 (index.volt、show.volt 等)。布局从 modules/layout/ 加载,然后用
设置
$this->view->setLayout('index');
在主控制器中initialize().
它是这样的:
.
├── 申请
│ └── 模块
│ ├── 索引
│ │ ├── ControllerBase.php
│ │ ├── IndexController.php
│ │ └── 浏览量
│ │ └── index.volt
│ ├── 布局
│ │ ├── index.volt
│ │ └── admin.volt
│ ├── 页
│ │ ├── Page.php
│ │ ├── PageAdminController.php
│ │ ├── PageController.php
│ │ ├── admin_views
│ │ │ ├── edit.volt
│ │ │ └── index.volt
│ │ └── 观看次数
│ │ └── 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
所以我的问题是:如何设置视图目录和搜索模式以匹配我的结构?
不是 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
不确定是否有更多 "global" 方法,但我有点 感觉 应该存在一个,最有可能通过 [=12= 中的奇异视图定义].
搞定了!
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()
我的 Phalcon PHP 项目有问题。我正在构建内部包含多个 MVC 目录的单模块应用程序。
每个模块都有自己的 "views" 目录,其中包含操作模板。 (index.volt、show.volt 等)。布局从 modules/layout/ 加载,然后用
设置$this->view->setLayout('index');
在主控制器中initialize().
它是这样的:
. ├── 申请 │ └── 模块 │ ├── 索引 │ │ ├── ControllerBase.php │ │ ├── IndexController.php │ │ └── 浏览量 │ │ └── index.volt │ ├── 布局 │ │ ├── index.volt │ │ └── admin.volt │ ├── 页 │ │ ├── Page.php │ │ ├── PageAdminController.php │ │ ├── PageController.php │ │ ├── admin_views │ │ │ ├── edit.volt │ │ │ └── index.volt │ │ └── 观看次数 │ │ └── 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
所以我的问题是:如何设置视图目录和搜索模式以匹配我的结构?
不是 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
不确定是否有更多 "global" 方法,但我有点 感觉 应该存在一个,最有可能通过 [=12= 中的奇异视图定义].
搞定了!
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()