Макет модуля Yii

Я пытаюсь получить рабочий макет в модуле. Поэтому я создал макет в папке просмотра модуля под названием "adminLayout"

Предполагая макет в AdminModule.php в методе init(). Итак, теперь это выглядит так:

public function init()
{

    $this->layoutPath = Yii::getPathOfAlias('application.modules.admin.views.layouts');
    $this->layout = 'adminLayout';
    // this method is called when the module is being created
    // you may place code here to customize the module or the application

    // import the module-level models and components
    $this->setImport(array(
        'admin.models.*',
        'admin.components.*',
    ));


}

Но по какой-то причине макет не относится к модулю. Я попытался добавить "public $ layout" в контроллер, и это работает.

Не могу понять, в чем проблема.

Также я попытался добавить настройки макета в main.php в папке конфигурации, но все равно никаких действий. Буду благодарен, если кто-то может помочь.

3 ответа

Решение

Решением является установка макета beforeControllerAction в вашем модуле. Он должен работать.

 public function beforeControllerAction($controller, $action)
  {
    if(parent::beforeControllerAction($controller, $action))
    {
      $controller->layout = 'adminLayout';
      return true;
    }
    else
      return false;
  }

Есть много сообщений на эту тему, и ответ находится в документации Yii:

свойство макета

публичный смешанный макет;

макет, который используется контроллерами внутри этого модуля. Если контроллер явно объявил свой собственный макет, это свойство будет игнорироваться. Если это значение равно null (по умолчанию), будет использоваться макет приложения или макет родительского модуля (если доступен). Если это неверно, то макет не будет использоваться.

Просто определите модуль в вашем контроллере и настройте его соответственно:

class Controller extends CController
{

public function init(){

    //Set layout
    $this->layout = ($this->module->id=='admin') ? '//layouts/column2' : '//layouts/column1';
.........
}

Создайте папку ресурсов в вашем модуле. Добавьте следующий код для assetsURL:

private $_assetsUrl;

public function getAssetsUrl()
{
    if ($this->_assetsUrl === null)
        $this->_assetsUrl = Yii::app()->getAssetManager()->publish(
            Yii::getPathOfAlias('admin.assets') );
    return $this->_assetsUrl;
}

Создать beforeControllerAction функция и добавить $controller->layout:

public function beforeControllerAction($controller, $action)
{
    if(parent::beforeControllerAction($controller, $action))
    {   
        // this overwrites everything in the controller
        $controller->layout = 'adminLayout';
        // this method is called before any module controller action is performed

        return true;
    }
    else
        return false;
}

Импортируйте все свои CSS а также JS файлы как:

<link rel="stylesheet" type="text/css" href="<?php echo $this->module->assetsUrl; ?>/css/style.default.css" media="screen, projection" />
Другие вопросы по тегам