Yii2添加到head()和endBody()

时间:2016-09-27 14:50:55

标签: yii2

在开发一个可以有多个前端主题的网站时,我正在寻找一种方法,允许后端用户手动将代码注入头部和主体。两个用例如下:

案例1 - 样式

  1. 在后端,用户选择主题。
  2. 用户喜欢这个主题,但希望链接的颜色不同。
  3. 用户可以将自定义代码设置为在<head>标记的末尾执行,而不是复制和修改主题。
  4. 案例2 - 脚本

    1. 用户希望将自定义JavaScript添加到文档末尾,但也需要一个额外的JavaScript库。
    2. 用户可以将自定义代码设置为在<body>标记处执行,而不是复制和修改主题。
    3. 我理解这些特定情况都可以使用registerCssregisterJs来完成(部分),但是这些情况会自动换行<style>或{{}}中传递给它们的内容。 {1}}标签。我希望有一种方法可以直接注入<script>head()方法中直接指出的内容。这背后的原因是我不希望限制用户可以注入的内容(可能在头部需要脚本标记)。

      目前,我只是将代码存储在params中,然后手动将它们包含在每个主题中,如下所示:

      endBody()

      这是不可取的,因为在创建主题时很容易忘记它。我想找到一种方法将我的param值自动附加到endBody()调用,因此每当调用endBody()时,我的代码都包含在内(对于head()调用也是如此)。

3 个答案:

答案 0 :(得分:2)

您可以使用自己的View组件来覆盖方法renderHeadHtml()renderBodyEndHtml()。在这些方法中,可以根据需要注入必要的代码:

namespace common/components;

class View extends \yii\web\View {

    /**
     * @var string Content that should be injected to end of `<head>` tag
     */
    public $injectToHead    = '';

    /**
     * @var string Content that should be injected to end of `<body>` tag
     */
    public $injectToBodyEnd = '';

    /**
     * @inheritdoc
     */
    protected function renderHeadHtml()
    {
        return parent::renderHeadHtml() . $this->injectToHead;
    }

    /**
     * @inheritdoc
     */
    protected function renderBodyEndHtml($ajaxMode)
    {
        return parent::renderBodyEndHtml(ajaxMode) . $this->injectToBodyEnd;
    }

}

在配置文件中:

// ...
'components' => [
    // ...
    'view' => [
        'class' => '\common\components\View',
    ]
]

控制器代码中的某处:

\Yii::$app->view->injectToHead = '...';
\Yii::$app->view->injectToBodyEnd = '...';

答案 1 :(得分:2)

Yii2已使用Block Widget

查看班级中提供此功能

您需要两个简单的步骤:

1-(在必需的视图文件中):在任何给定的视图中

<p>

2-(布局中):在布局页面中定义块名称及其位置

<?php $this->beginBlock('block1'); ?>

...content of block1...

<?php $this->endBlock(); ?>

...

<?php $this->beginBlock('block3'); ?>

...content of block3...

<?php $this->endBlock(); ?>

Referance:Yii2 Guide

http://www.yiiframework.com/doc-2.0/guide-structure-views.html#using-blocks

我希望这会对某人有所帮助。谢谢。

答案 2 :(得分:0)

根据您的用例,另一个也许更简单的选择是使用视图事件。您可以在页面的不同部分注入不同的项目。例如:

Yii::$app->view->on(View::EVENT_END_BODY, function () {
    echo date('Y-m-d');
});

您可以在此处了解更多信息:https://www.yiiframework.com/doc/guide/2.0/en/structure-views#view-events