在开发一个可以有多个前端主题的网站时,我正在寻找一种方法,允许后端用户手动将代码注入头部和主体。两个用例如下:
案例1 - 样式
<head>
标记的末尾执行,而不是复制和修改主题。案例2 - 脚本
<body>
标记处执行,而不是复制和修改主题。我理解这些特定情况都可以使用registerCss
和registerJs
来完成(部分),但是这些情况会自动换行<style>
或{{}}中传递给它们的内容。 {1}}标签。我希望有一种方法可以直接注入<script>
或head()
方法中直接指出的内容。这背后的原因是我不希望限制用户可以注入的内容(可能在头部需要脚本标记)。
目前,我只是将代码存储在params中,然后手动将它们包含在每个主题中,如下所示:
endBody()
这是不可取的,因为在创建主题时很容易忘记它。我想找到一种方法将我的param值自动附加到endBody()调用,因此每当调用endBody()时,我的代码都包含在内(对于head()调用也是如此)。
答案 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