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

Mau*_*suf 13 php layout views yii2

我在主视图文件夹的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
Run Code Online (Sandbox Code Playgroud)

Ole*_*hov 21

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

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

下面的示例显示了某个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
Run Code Online (Sandbox Code Playgroud)

遵循这个简单的结构,您可以在模块的控制器中按名称设置任何布局:

namespace myApp\modules\subDomain\controllers;

class HomeController extends Controller {
    public function actionGetDomain() {            
        $this->layout = 'domain'; // equals 'myApp/modules/subDomain/views/layouts/domain'
    }
}
Run Code Online (Sandbox Code Playgroud)

这是最优选的方式,因为模块是独立的软件单元,由其自己的模型,布局,控制器等组成.

指定包含布局文件的目录的完整路径

在某些情况下,您可能希望使用位于模块目录之外的布局文件:

class HomeController extends Controller {
    public function actionGetDomain() {
        $this->layout = '@app/views/layouts/main';
    }
}
Run Code Online (Sandbox Code Playgroud)

其中@app是当前运行的应用程序的基本路径,例如:

myApp/frontend
Run Code Online (Sandbox Code Playgroud)

在这种情况下,请确保main.php布局文件存在于以下目录中:

myApp/frontend/views/layouts/main.php
Run Code Online (Sandbox Code Playgroud)


zhi*_*sme 5

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

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

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

'@app/views/layouts/layout.php'
Run Code Online (Sandbox Code Playgroud)


小智 5

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

class DefaultController extends Controller
{
     public $layout = 'main.php';
}
Run Code Online (Sandbox Code Playgroud)

或者通过传递完整路径

public $layout = '@frontend/modules/idModule/views/layouts/main.php';
Run Code Online (Sandbox Code Playgroud)