OctoberCMS:如何仅将 javascript 从组件添加到页面一次

Posted

技术标签:

【中文标题】OctoberCMS:如何仅将 javascript 从组件添加到页面一次【英文标题】:OctoberCMS: How can I add javascript to page from component only once 【发布时间】:2017-09-18 05:30:24 【问题描述】:

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

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

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

【问题讨论】:

为什么不在 document.ready() 中 pyt IT? 【参考方案1】:

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

【讨论】:

【参考方案2】:

我在 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 数据。 也许有更好的方法将“后端”编译数据注入 10 月份的 % scripts % 标签。

【讨论】:

【参考方案3】:

要在使用 % 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);
        
    );

【讨论】:

以上是关于OctoberCMS:如何仅将 javascript 从组件添加到页面一次的主要内容,如果未能解决你的问题,请参考以下文章

Octobercms:如何翻译Flash消息?

在 OctoberCMS 中如何找到提示路径?

你如何在 OctoberCMS 的局部渲染组件?

OctoberCMS - 如何在组件内调用函数

如何制作功能性 octobercms FlatUI 主题

如何在 OctoberCMS 中获取基本网址?