Установите макет из контроллера модуля в yii2
У меня есть три макета в папке макетов в папке основных представлений. Я добавил модуль под названием subDomain. В моем модуле subDomain у меня есть контроллер, называемый HomeController. В HomeController есть действие под названием getDomain()
.
В действии getDomain()
я хочу изменить основной макет на getDomainLayout
. Но есть ошибка, когда я использую код:
$this->layout = "getDomainLayout";
Yii2 бросает:
Invalid Parameter – yii\base\InvalidParamException
The view file does not exist: \myyii2\modules\subDomain\views\layouts\bersih.php
Ответы
Ответ 1
Существует несколько вариантов решения этой проблемы.
Создайте файл макета в соответствующем каталоге модуля
В приведенном ниже примере показана каноническая структура каталогов некоторого модуля subDomain
, включая его макеты (domain.php):
subDomain/
Module.php the module class file
controllers/ containing controller class files
HomeController.php the home controller class file
models/ containing model class files
views/ containing controller view and layout files
layouts/ containing layout view files
domain.php the domain layout file
home/ containing view files for HomeController
index.php the index view file
Следуя этой простой структуре, вы можете установить любой макет по имени в контроллере модуля:
namespace myApp\modules\subDomain\controllers;
class HomeController extends Controller {
public function actionGetDomain() {
$this->layout = 'domain'; // equals 'myApp/modules/subDomain/views/layouts/domain'
}
}
Это наиболее предпочтительный способ, поскольку модули представляют собой автономные программные модули, которые состоят из собственных моделей, макетов, контроллеров и т.д.
Укажите полный путь к каталогу, в котором содержится файл макета
В некоторых случаях вам может потребоваться использовать файл макета, расположенный за пределами каталога модуля:
class HomeController extends Controller {
public function actionGetDomain() {
$this->layout = '@app/views/layouts/main';
}
}
Где @app является базовым путем для текущего запуска приложения, например:
myApp/frontend
В этой ситуации убедитесь, что файл макета main.php существует в следующем каталоге:
myApp/frontend/views/layouts/main.php
Ответ 2
Еще один удобный способ использования разных макетов в вашем приложении - создать абстрактный класс. Например:
abstract class AdminBaseController extends Controller
{
public function beforeAction($action)
{
$this->layout = '@app/views/admin/layouts/main.php';
return parent::beforeAction($action);
}
...
}
А затем просто extends
ваш контроллер.
class ArticlesController extends AdminBaseController { ... }
Ответ 3
Если мне нужен другой макет в контроллере, я просто добавлю следующий код
public function beforeAction($action)
{
$this->layout = 'layout'; //your layout name
return parent::beforeAction($action);
}
убедитесь, что ваш макет существует в соответствующей папке
'@app/views/layouts/layout.php'
Ответ 4
Вы можете установить переменную в контроллере.
class DefaultController extends Controller
{
public $layout = 'main.php';
}
Или, пройдя полный путь
public $layout = '@frontend/modules/idModule/views/layouts/main.php';
Ответ 5
Вы можете добавить $this- > layout = 'main'; в модуле init. Main.php должен находиться внутри папки просмотра модулей по макетам.
Ответ 6
Также вы можете установить свойство layout
в construtor
следующим образом:
class ArticlesController extends Controller
{
public function __construct($id, $module, $config = array()) {
parent::__construct($id, $module, $config);
$this->layout='main4articles';
}
....
Ответ 7
Если вы хотите установить его по умолчанию внутри модуля, вы можете сделать это, написав
$this->layout = '@frontend/modules/user/views/layouts/main';
внутри функции init()
вашего класса модуля ваш полный код будет выглядеть следующим образом
public function init() {
parent::init();
$this->layout = '@frontend/modules/user/views/layouts/main';
// custom initialization code goes here
}