Как настроить макет для всех контроллеров в модуле Yii?

В моем приложении Yii у меня есть один модуль с именем admin, поэтому классом модуля является AdminModule, он расширяет класс CWebModule и находится в файле AdminModule.php. Согласно документации, CWebModule имеет layout свойство, которое является общим для всех контроллеров модуля в случае, если для самих контроллеров не определен макет.

Мой контроллер не имеет никакого определенного макета и в AdminModule.php я положил это:

$this->layout='webroot.themes.bootstrap.views.layouts.column2';
$this->layoutPath = Yii::getPathOfAlias('webroot.themes.bootstrap.views.layouts');

Тем не менее, мои контроллеры в модуле администратора все еще используют какой-то другой макет, я думаю, что это тот, который определен в Controller.php в каталоге компонентов. Это почему? Как настроить общий макет для определенного модуля?

5 ответов

Решение состоит в том, чтобы немного изменить мой код, например так:

$this->layoutPath = Yii::getPathOfAlias('webroot.themes.bootstrap.views.layouts');
$this->layout = 'column2';

Как и в случае с указанным путем, мне не нужно указывать псевдоним всего пути для макета. У меня есть эти строки в init() функции моего AdminModule.php, и он работает нормально.

Попробуйте установить путь макета, как показано ниже

$this->layout="webroot/themes/bootstrap/views/layouts/column2";

Если вы используете Module и Theme(например, начальную загрузку) одновременно , это означает, что Yii сначала найдет файл представления (включая файл макета, специальный файл представления) в папке Theme , в CController есть важная функция под названием resolViewFile, вы можете добавить отладка на этом, чтобы посмотреть, как это работает, и ниже мое решение:

1. У меня есть модуль с именем "admin".

2. В функцию init AdminModule добавьте:

 $ this-> layout = 'column2'; 

3. удалить все файлы просмотра модуля в папку темы

Решением является установка макета beforeControllerAction в вашем модуле. Он должен работать. Я ответил на аналогичный вопрос, пожалуйста, обратитесь к нему макет модуля Yii

Вы можете поместить следующий код в свой контроллер.

public function init()
{
    Yii::$app->setLayoutPath($this->module->getBasePath().'/views/layout');
}

или вы можете поместить следующий код в класс начальной загрузки вашего модуля

public function init()
{
    parent::init();

    Yii::$app->setLayoutPath($this->getBasePath().'/views/layout');
}
Другие вопросы по тегам