在开发可以具有多个前端主题的网站时,我正在寻找一种方法,以允许后端用户手动将代码注入头部和身体。两种用例如下:
案例1-样式
<head>
标签末尾执行,而不必复制和修改主题。情况2-脚本
<body>
标签处执行,而不必复制和修改主题。我了解这两个特定情况都可以通过和使用来部分完成registerCss
,registerJs
但这些情况会自动将传递给它们的内容包装在<style>
或<script>
标签中。我希望有一种方法可以直接将直接指示的内容直接注入head()
或endBody()
方法。其背后的原因是,我不希望限制用户可以注入的内容(也许头部需要脚本标签)。
当前,我只是将要添加的代码存储在params中,然后将它们手动包含在每个主题中,如下所示:
<?php $this->endBody() ?>
<?= $this->params['theme_include_body_end'] ?>
这是不希望的,因为在创建主题时很容易忘记它。我想找到一种自动将我的param值附加到endBody()调用的方法,因此无论何时调用endBody(),都包括我的代码(与head()调用相同)。
您可以使用自己的覆盖了方法renderHeadHtml()
和的View组件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 = '...';
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句