6

我不确定我想要的是否是处理这个问题的最佳 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 进行大量 if 检查来显示备用 div 或代码,所以我觉得这将是最好的方法。

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

这是 Yii2 高级模板。

PS:我愿意为我的问题提供更好的解决方案。我不想要黑客,而是最合适的 Yii 方法。

4

3 回答 3

4

由于 View 是一个 Yii 组件,你可以像其他组件一样在 yii 配置文件中设置它。只需添加如下内容:

 'components'     => [
        'view'         => [
            'class' => 'app\components\extended\View',
        ],
于 2015-04-23T14:21:47.120 回答
2

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

于 2015-05-20T21:51:33.697 回答
0

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

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

于 2016-05-06T10:59:12.210 回答