Yii2 Advanced - 扩展视图以添加自定义变量

时间:2015-04-19 05:09:47

标签: twitter-bootstrap twitter-bootstrap-3 yii2 yii2-advanced-app

我不确定我要用的是最好的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设置,并且页面可以覆盖它以关闭每页的侧边栏。

我真的不想要大量的ifGuest检查显示替代div或代码,所以我觉得这将是最好的方法。

如何扩展视图以添加我自己的变量?该文件位于vendor / yiisoft / yii2 / web / view我认为..

这是Yii2高级模板。

PS:我愿意更好地解决问题。我不想要黑客,但最合适的Yii方式。

3 个答案:

答案 0 :(得分:3)

由于View是Yii组件,您可以像yii配置文件中的其他组件一样进行设置。 只需添加如下内容:

 'components'     => [
        'view'         => [
            'class' => 'app\components\extended\View',
        ],

答案 1 :(得分:2)

我认为最好的解决方案是创建两个布局。一个带侧边栏,另一个没有侧边栏,并使用所需的布局。

答案 2 :(得分:0)

根据我的最佳解决方案是,创建一个数据库设置表,该表映射到用户和组织,并在该表中为特定用户保存关于组织的菜单。因此,您可以根据组织的特定用户控制菜单。

还可以在您可以向未登录用户显示的设置中保存默认菜单(因为这是每个人的默认设置)