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

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

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

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

【问题讨论】:

  • 为什么不在 document.ready() 中 pyt IT?

标签: octobercms octobercms-plugins


【解决方案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);
              }
          });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        • 2014-04-25
        • 1970-01-01
        相关资源
        最近更新 更多