Phalcon PHP - Каталоги с несколькими представлениями
У меня возникли проблемы с моим PHP-проектом Phalcon. Я создаю одномодульное приложение с несколькими каталогами MVC внутри.
Каждый модуль имеет свой собственный каталог "представления", который содержит шаблоны действий. (индекс.вольт, показать.вольт и т.д.). Макеты загружаются из модулей/макет/, а затем устанавливаются с помощью
$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 answers
Прикончил его!
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/");
Я просто выбираю текущий вид самостоятельно, используя Просмотр::выбор()
Не 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()
.