我正在寻找一种方法来将一段JavaScript代码添加到我的插件所需的页面中。我知道您可以通过$this->addJs()
添加文件,但我需要通过插件的设置模型中的设置动态构建JavaScript。
我可以在default.htm中使用{% put scripts %}...{% endput %}
块来执行此操作,但如果我在页面中多次使用该组件,则会多次注入。
是否有办法只将代码注入页面一次,无论在页面上使用该组件多少次?
答案 0 :(得分:1)
想出这个。在我的组件中,我添加了一个属性$renderCount
,并在onRender()
方法中将其递增。我需要做的只是在组件的默认模板中检查__SELF__.renderCount
,并仅在脚本为1时输出脚本。
答案 1 :(得分:1)
我是通过Plugin.php中的私有功能(mapSettings
)来完成此操作的,以重新设置我的需求。
Event::listen('cms.page.beforeRenderPage', function($controller, $page) {
if($page->hasComponent('myComponentName')) {
Event::listen('cms.page.render', function($controller, $pageContents) {
$this->settings = \Acme\Plugin\Models\Settings::instance();
$script = "<script>let hounddd = {". json_encode($this->mapSettings()) ."};</script>";
return $pageContents . $script;
});
}
});
我最关心的是避免浏览器缓存某些基本页面的javascript数据。
也许存在更好的方法将“后端”编译数据注入十月份的{%scripts%}标签。
答案 2 :(得分:0)
要在使用{% put scripts %}...{% endput %}
和{% put styles %}...{% endput %}
时删除多次注入,可以通过Plugin.php函数中已处理的输出样式和脚本来删除重复项:
public function boot()
{
Event::listen('cms.block.render', function ($name, $result) {
if ($name == 'styles' || $name == 'scripts') {
$array = preg_split('/\n/', $result);
$items = array_filter(array_unique(array_map('trim', $array)));
return join(PHP_EOL, $items);
}
});
}