2

我正在寻找一种将一段 JavaScript 代码添加到我的插件所需的页面的方法。我知道您可以通过包含文件,$this->addJs()但我需要从插件设置模型中的设置动态构建 JavaScript。

我可以使用{% put scripts %}...{% endput %}我的 default.htm 中的一个块来执行此操作,但是如果我在页面中多次使用该组件,则会多次注入。

有没有办法只将代码注入页面一次,无论该组件在页面上使用了多少次?

4

3 回答 3

2

想出了这个。在我的组件中,我添加了一个属性$renderCount并在onRender()方法中增加它。我需要做的就是检查__SELF__.renderCount组件的默认模板并仅在脚本为 1 时才输出脚本。

于 2017-04-21T10:43:54.017 回答
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 %} 标签。

于 2020-04-23T16:15:20.400 回答
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);
        }
    });
}
于 2020-05-04T19:11:09.730 回答