web-dev-qa-db-ja.com

Yii2のビュー内でレイアウトファイルを変更する

私はYii2を使用して小さなプロジェクトをしています。

ビューに同じレイアウト(ヘッダー、フッター)があります(たとえば、site)がlogin.phpこのビュー。このファイルに別のヘッダーまたはフッターがないことを希望します。このビューファイルからのみヘッダー/フッターを削除できますか?.

さまざまなビューでレイアウトを変更できました。ビューの単一ファイル内のレイアウトを変更することは可能ですか?

17
Moid Mohd

相対アクション内:

public function actionYourAction($id)
{

    $this->layout = 'yourNewLayout';

    return $this->render('yourView', [
        'model' =>$model,
    ]);
}
32
scaisEdge

私はパーティーに少し遅れましたが、あなたは[〜#〜] can [〜#〜]ビュー内からレイアウトを変更します。コントローラで宣言する必要はありません。個人的には、後で何が起こっているかを簡単に確認できるため、ビューで実行する方が良いと思います。 HTMLを編集する場合は、ビューファイルに移動し、使用しているレイアウトを簡単に確認できます。これをコントローラーに入れると、あなた(または後で誰か)がコントローラーのアクションにネストされたレイアウトの変更を見逃す可能性があります。

$thisはYii1のようにコントローラーではなくYii2のビューを参照するため、古い$this->layoutはビュー内からはもう機能しません。

Yii2では、$this->contextを使用してビューからコントローラーを参照します。

$this->context->layout = 'your-layout';
14
Wade

私のプロジェクトでは、サイト用とwebapp用の2つのレイアウトが必要でした。 main.phpファイルがデフォルトのレイアウトであるため、site.phpレイアウトを作成し、siteControllerの最初に、クラス宣言の直後に、

public $layout = 'site';

その結果、siteControllerでレンダリングされたビューのみがsite.phpレイアウトを使用します。それは私のために働いた。

5
xav

私もパーティーに少し遅れていますが、今日このようなことに苦労しています...私にとって、フッターやヘッダーをスキップしたいという理由だけで別のレイアウトを作成することは、ほとんど勝てない多くのコードのようです。メインレイアウトに固執できる場合は、コントローラーと現在ロードされているアクションを取得し、この方法を省略できます(これをmain.phpに記述します)。

$contr   = Yii::$app->controller->id;
$action  = Yii::$app->controller->action->id;
$skipFooter = $contr == 'site' && $action == 'login'; //...or enter here   what U want

...そしてその後:

<?php if (!$skipFooter): ?> //Never at login...
    <footer class="footer">
        <div class="container">
            <p class="pull-left">&copy; YourSite.com <?= date('Y') ?></p>

            <p class="pull-right"><?= Yii::powered() ?></p>
        </div>
    </footer>
<?php endif; ?>
0
Perry J