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

Итак, мой вопрос: как я могу настроить каталог представлений и шаблон поиска в соответствии с моей структурой?

Author: jpawlowski, 2015-03-08

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/");

Я просто выбираю текущий вид самостоятельно, используя Просмотр::выбор()

 4
Author: jpawlowski, 2015-03-10 21:48:34

Не 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().

 1
Author: yergo, 2015-03-09 13:11:04