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