Как настроить макет для всех контроллеров в модуле 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');
}