我正在寻找一种将一段 JavaScript 代码添加到我的插件所需的页面的方法。我知道您可以通过包含文件,$this->addJs()
但我需要从插件设置模型中的设置动态构建 JavaScript。
我可以使用{% put scripts %}...{% endput %}
我的 default.htm 中的一个块来执行此操作,但是如果我在页面中多次使用该组件,则会多次注入。
有没有办法只将代码注入页面一次,无论该组件在页面上使用了多少次?
我正在寻找一种将一段 JavaScript 代码添加到我的插件所需的页面的方法。我知道您可以通过包含文件,$this->addJs()
但我需要从插件设置模型中的设置动态构建 JavaScript。
我可以使用{% put scripts %}...{% endput %}
我的 default.htm 中的一个块来执行此操作,但是如果我在页面中多次使用该组件,则会多次注入。
有没有办法只将代码注入页面一次,无论该组件在页面上使用了多少次?
想出了这个。在我的组件中,我添加了一个属性$renderCount
并在onRender()
方法中增加它。我需要做的就是检查__SELF__.renderCount
组件的默认模板并仅在脚本为 1 时才输出脚本。
mapSettings
我在 Plugin.php中的私有函数 ( ) 的帮助下这样做,以根据我的需要重写设置。
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 数据。
也许有更好的方法将“后端”编译数据注入 10 月的 {% scripts %} 标签。
要在使用时删除多重注入{% 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);
}
});
}