首页 文章

在yii2中设置模块控制器的布局

提问于
浏览
13

我在主视图文件夹的layouts文件夹中有三个布局 . 我添加了一个名为subDomain的模块 . 在我的子域模块中,我有一个名为HomeController的Controller . 在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

7 回答

  • 1

    您可以在控制器中设置变量 .

    class DefaultController extends Controller
    {
         public $layout = 'main.php';
    }
    

    或者通过完整的路径

    public $layout = '@frontend/modules/idModule/views/layouts/main.php';
    
  • 3

    你可以添加$ this-> layout ='main';在模块init方法中 . main.php应位于布局下的modules视图文件夹内 .

  • 4

    如果您想在模块内默认设置它,您可以通过写入来完成

    $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
    }
    
  • 1

    您也可以在 construtor 中设置 layout 属性,如下所示:

    class ArticlesController extends Controller
    {
      public function __construct($id, $module, $config = array()) {
        parent::__construct($id, $module, $config);
        $this->layout='main4articles';
      }
    ....
    
  • 0

    有几种方法可以解决这个问题 .

    在相应的模块目录中创建布局文件

    下面的示例显示了某些 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
    
  • 19

    如果我需要在控制器中使用不同的布局,我只需添加以下代码

    public function beforeAction($action)
     {
        $this->layout = 'layout'; //your layout name
        return parent::beforeAction($action);
     }
    

    确保您的布局存在于适当的文件夹中

    '@app/views/layouts/layout.php'
    
  • 3

    在应用程序中使用不同布局的另一种便捷方法是创建一个抽象类 . 例如:

    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 { ... }
    

相关问题