【问题标题】:Set layout from module controller in yii2在 yii2 中从模块控制器设置布局
【发布时间】:2015-10-29 08:42:50
【问题描述】:

我在主视图文件夹的布局文件夹中有三个布局。我添加了一个名为 subDomain 的模块。在我的子域模块中,我有一个名为 HomeController 的控制器。在 HomeController 中有一个名为 getDomain() 的操作。

getDomain() 操作中,我想将主布局更改为getDomainLayout。但是使用code的时候出现错误:

$this->layout = "getDomainLayout";

Yii2 抛出:

Invalid Parameter – yii\base\InvalidParamException    
The view file does not exist: \myyii2\modules\subDomain\views\layouts\bersih.php

【问题讨论】:

    标签: php layout views yii2


    【解决方案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
    

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

    myApp/frontend/views/layouts/main.php
    

    【讨论】:

    • 在渲染模板之前在控制器中设置$this->layout 对我不起作用。也许是因为它是一个 .twig 模板?
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

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

            或者通过传递完整路径

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

            【讨论】:

              【解决方案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
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-04-29
                • 1970-01-01
                • 2022-07-01
                • 1970-01-01
                • 1970-01-01
                • 2015-02-21
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多