メインビューフォルダのレイアウトフォルダに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
この問題に対処するには、いくつかのオプションがあります。
以下の例は、レイアウト(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
コントローラーで別のレイアウトが必要な場合は、次のコードを追加するだけです
public function beforeAction($action)
{
$this->layout = 'layout'; //your layout name
return parent::beforeAction($action);
}
レイアウトが適切なフォルダーに存在することを確認してください
'@app/views/layouts/layout.php'
コントローラーで変数を設定できます。
class DefaultController extends Controller
{
public $layout = 'main.php';
}
または完全なパスを渡すことにより
public $layout = '@frontend/modules/idModule/views/layouts/main.php';
アプリケーションで異なるレイアウトを使用するもう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 { ... }
$ this-> layout = 'main';を追加できます。モジュールのinitメソッド内。 main.phpは、レイアウトの下のモジュールビューフォルダー内に配置する必要があります。
モジュール内でデフォルトで設定したい場合は、次のように記述します。
_$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
}
_
また、次のようにlayout
のconstrutor
プロパティを設定できます。
class ArticlesController extends Controller
{
public function __construct($id, $module, $config = array()) {
parent::__construct($id, $module, $config);
$this->layout='main4articles';
}
....