Reputation: 85
I'm having problem with my Phalcon PHP project. I'm building single module app with multiple MVC directories inside.
Every each module has it's own "views" directory, which contains action templates. (index.volt, show.volt etc.). Layouts are loaded from modules/layout/ and then set with
$this->view->setLayout('index');
in main controller initialize().
That's how it looks like:
. ├── 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
This is my view service:
$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);
I want to set views directory right in the main controller (ControllerBase.php), beacuse it depends on current controllers name.
For example:
myapp.com => /modules/index/views/index.volt
myapp.com/page/show/2 => /modules/page/views/show.volt
So my question is: How can i set views directory and searching pattern to match my structure?
Upvotes: 3
Views: 2450
Reputation: 85
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/");
I'm simply picking current view by myself, using View::pick()
Upvotes: 4
Reputation: 4980
Not a 100% score answer, because you will have to take your time on this anyway, but your cold start should be something like this:
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())
);
}
this should make your phalcon seraching for views in modules directory, still its working struture will be something like:
.
├── application
│ └── modules
│ ├── index
│ │ ├── ControllerBase.php
│ │ ├── IndexController.php
│ │ └── views
│ │ └── Index
│ │ └──default.volt
not sure if there is more "global" way, but I kinda feel like there should one exist, most-possibly through exotic View definition in DI()
.
Upvotes: 1