Twitter bootstrap Yii2高级-扩展视图以添加自定义变量

Twitter bootstrap Yii2高级-扩展视图以添加自定义变量,twitter-bootstrap,twitter-bootstrap-3,yii2,yii2-advanced-app,Twitter Bootstrap,Twitter Bootstrap 3,Yii2,Yii2 Advanced App,我不确定我所追求的是不是处理这个问题的最佳Yii解决方案。因此,我愿意接受更好的解决方案。无论哪种方式最适合做这件事 我有一个左侧边栏,只需要显示给登录的用户。这不是问题所在,我知道如何通过选中“Yii::$app->user->isGuest”来显示某些内容 在特定页面上,我不想要这个侧边栏,即使他们已经登录。例如,“联系我们”页面不需要左侧边栏。我真的不在乎它是否有侧边栏,但它正在摆脱Bootstrap3列 <div class="row"> <div class=

我不确定我所追求的是不是处理这个问题的最佳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)中,根据用户是否登录,我有两个单独的布局

<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>

这段代码,如果是来宾,则显示一个全宽页面,如果用户登录,则显示一个侧栏

<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设置,页面可以覆盖它以关闭每页的侧边栏

我真的不想用大量的if检查来显示isGuest的备用div或代码,所以我觉得这是最好的方法

如何扩展视图以添加自己的变量?我想文件位于vendor/yiisoft/yii2/web/View中

这是Yii2高级模板


PS:我愿意为我的问题找到更好的解决方案。我不想要黑客攻击,但是最合适的Yii方式。由于视图是一个Yii组件,您可以像Yii配置文件中的其他组件一样设置它。 只需添加如下内容:

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

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

根据我的观点,最好的解决方案是创建一个数据库设置表,该表映射到用户和组织,并将该表中的菜单保存到特定用户的组织中。所以您可以根据特定于组织的每个用户来控制菜单


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

我已经解决了这个问题,尽管我不确定这是最容易解决的方法。要从布局(main.php)或视图页面(即:contact.php)访问Yii2中的控制器,请使用
$this->context->useSidebar
。同时将
public$useSidebar=true在控制器中。我的默认设置为true,因为我的大多数页面都会有侧边栏,只有在特殊情况下我才需要它。然后在contact.php或控制器的操作中,将其设置为true/false。-另一个选项是有2个带有/不带边栏的布局,并在视图(contact.php)中更改布局文件。PS:我没有添加我的注释作为答案,因为它没有回答我的问题。我仍然想知道如何在yii2advanced中扩展View类。我知道如何扩展文件,但它应该放在哪里?我知道我可以把它放在任何地方,但是为了开发人员之间的一致性,必须有一个常见的用法,就是把这些扩展类放在哪里。使用2个布局有什么错,如果需要,在控制器操作中更改布局?默认布局可以是带有侧边栏的布局,在不需要侧边栏的页面上,可以更改布局。但我知道,这只解决了你一半的问题:)确切地说:)正如我们都知道的,有很多条路把我们带到同一个目的地。许多解决方案只是为了完成工作,然后担心以后的后果。我知道正确的方法是,扩展类并根据需要对其进行自定义,并且不要在代码中有太多的条件if,我们以后会忘记这些。我已经在控制器“showSidebar”中设置了一个变量,但委派视图行为不是控制器的工作。-所以我的问题仍然是,如何/在哪里扩展视图类?我刚刚发现我正在研究的一个项目也在使用自定义视图。检查我的答案-视图是一个组件,因此您可以简单地将其设置为使用我们自己的自定义类。大多数人将扩展文件放在哪里?我注意到你把它放在了“扩展”目录中。此外,高级设置没有组件目录。我在寻找惯例,而不是在那天把它们扔到我想扔的任何地方;让我们一步一步走。请告诉我这是否适合你,然后我们再看看放在哪里。