Подтвердить что ты не робот

Установите макет из контроллера модуля в 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
4b9b3361

Ответ 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
}