web-dev-qa-db-ja.com

yii2のモジュールコントローラーからレイアウトを設定する

メインビューフォルダのレイアウトフォルダに3つのレイアウトがあります。 subDomainというモジュールを追加しました。私の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
13
Maulana Yusuf

この問題に対処するには、いくつかのオプションがあります。

適切なモジュールディレクトリにレイアウトファイルを作成します

以下の例は、レイアウト(domain.php)を含む、いくつかのsubDomainモジュールの標準的なディレクトリ構造を示しています。

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
20

コントローラーで別のレイアウトが必要な場合は、次のコードを追加するだけです

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

レイアウトが適切なフォルダーに存在することを確認してください

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

コントローラーで変数を設定できます。

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

または完全なパスを渡すことにより

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

アプリケーションで異なるレイアウトを使用するもう1つの便利な方法は、抽象クラスを作成することです。例えば:

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 { ... }
3
Russell Sk.

$ this-> layout = 'main';を追加できます。モジュールのinitメソッド内。 main.phpは、レイアウトの下のモジュールビューフォルダー内に配置する必要があります。

2
Opad

モジュール内でデフォルトで設定したい場合は、次のように記述します。

_$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

また、次のようにlayoutconstrutorプロパティを設定できます。

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