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

Set layout from module controller in yii2

我在主视图文件夹中的布局文件夹中有三个布局。我添加了一个名为 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

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

在适当的模块目录中创建布局文件

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

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

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

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

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

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

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

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

在应用程序中使用不同布局的另一种便捷方式是创建抽象 class。例如:

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

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

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

或者传递完整路径

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

如果你想在模块中默认设置它,你可以通过写

$this->layout   =   '@frontend/modules/user/views/layouts/main';

在模块的 init() 函数中 class 您的完整代码如下所示

 public function init() {

    parent::init();
    $this->layout = '@frontend/modules/user/views/layouts/main';
    // custom initialization code goes here
}