私がしようとしていることが、これを処理するための最良の Yii ソリューションであるかどうかはわかりません。だから私はより良い解決策を受け入れます。それを行うための最もYiiの方法は何でも。
ログインしているユーザーにのみ表示する必要がある左側のサイドバーがあります。それは問題ではありません。「Yii::$app->user->isGuest」をチェックして何かを表示する方法を知っています。
特定のページでは、ログインしている場合でも、このサイドバーは必要ありません。たとえば、「お問い合わせ」ページに左側のサイドバーを配置する必要はありません。サイドバーがあるかどうかは本当に気にしませんが、Bootstrap3 の列から外れています。
<div class="row">
<div class="col-lg-4 center-col">
<div class="site-contact">
<h1><?= Html::encode($this->title) ?></h1>
<p>
If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
</p>
<div class="row">
<div class="col-lg-12">
[contact form code truncated]
</div>
</div>
</div>
</div>
</div>
ページの中央に配置され、幅 4 列で見栄えがします。
ただし、私の Yii main.php (frontend/views/layouts/main.php) には、ユーザーがログインしているかどうかに応じて、2 つの別々のレイアウトがあります。
<div class="container-fluid mainpage">
<?= Alert::widget() ?>
<div class="row">
<?php if (!Yii::$app->user->isGuest) { ?>
<div class="col-md-3 sidebar">
<?= Menu::widget([
'options' => ['class' => 'nav nav-sidebar'],
'items' => [
['label' => 'Home', 'url' => ['site/index']],
['label' => 'About', 'url' => ['site/about']],
['label' => 'Contact', 'url' => ['site/contact']],
],
]);
?>
</div>
<div class="col-md-9">
<?= $content ?>
</div>
<?php } else { ?>
<div class="col-sm-12">
<?= $content ?>
</div>
<?php } ?>
</div>
</div>
このコードは、ゲストの場合は全幅のページを表示し、ユーザーがログインしている場合はサイドバーを表示します。
「お問い合わせ」ページのようなページで起こっていることは、サイドバーが原因でフォームがつぶれてしまうことです。正しい内容は 'col-md-9' で、コンタクト フォーム ('col-lg-4' がある) をその中に入れると、9 列の中で 4 だけを占めてしまい、結果として圧縮されてしまいます。
このページ (連絡先ページ) は一般に公開されている必要があるため (つまり、ユーザーがログインできない場合、サポートに連絡できず、問題が発生する可能性があります)、両方のケースが発生する可能性があります。ログインしているメンバーが見ると、フォームがくしゃくしゃになったり、ゲストが見たりすることがあります。
私のアプローチは、変数 $showSidebar を追加することでした。次に、contact.php に $showSidebar = false を設定します。変数のデフォルト アクションは isGuest によって設定され、ページはそれをオーバーライドして、ページごとにサイドバーをオフにすることができます。
isGuest が代替の div またはコードを表示するかどうかをチェックする大量の if チェックは本当にしたくないので、これが最善のアプローチだと思います。
ビューを拡張して独自の変数を追加するにはどうすればよいですか? ファイルは vendor/yiisoft/yii2/web/view にあると思います..
これは Yii2 の高度なテンプレートです。
PS:私は自分の問題に対するより良い解決策を受け入れています。私はハックしたくありませんが、それを行うための最も適切な Yii の方法です。