OctoberCMS:如何只从组件页面添加一次javascript

时间:2017-04-21 09:24:50

标签: octobercms octobercms-plugins

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

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

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

3 个答案:

答案 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);
        }
    });
}