【问题标题】:Joomla 2.5.x: Multiple instances of a module not working in the same page?Joomla 2.5.x:一个模块的多个实例不在同一页面中工作?
【发布时间】:2014-01-29 08:28:37
【问题描述】:

我正在 Joomla 2.5.x 中测试我的模块,我注意到在同一页面中复制模块似乎不起作用。我注意到这是因为我的模块有一个共同的addScript()addStyleSheet() 函数。例如,我的模块中有以下代码:

$document->addScript(JURI::base() . 'modules/mod_mymodule/js/abc.js');
$document->addStyleSheet(JURI::base() . 'modules/mod_mymodule/css/xyz.css');

看起来每次我复制一个模块时,Joomla 2.5.x 都会尝试重新包含这些,因为它们已经包含在第一个模块中,它会失败并且多个模块不会在页面中正确呈现。

然而,Joomla 3.x 似乎足够聪明,可以仅在标题中检测和包含这些脚本一次。有没有办法在 2.5.x 中解决这个问题?

【问题讨论】:

    标签: joomla joomla2.5 joomla3.0


    【解决方案1】:

    试试

    JURI::base(true) 
    

    而不是

    JURI::base()
    

    所以不会包括方案、主机和端口,这应该足以让 J 2.5 看到脚本是一回事。

    将主机包含在脚本中是不好的做法,除非它们位于另一台主机上。除了在多子域网站上缓存的问题之外,你只是无缘无故地让你的页面变大。

    【讨论】:

    • 我想是的。但是我检查了 addScript() 和 head.php:render() 的实现,它应该也适用于完整的 url,令人费解。
    【解决方案2】:

    如果您想避免添加两次,则需要跟踪您已经添加了该内容的事实。

    您可以使用单例模式来执行此操作,并使用 initialize() 方法将所需数据添加到 JDocument 中一次。

    或者,您可以在JDocument 对象本身中添加一个属性,以便稍后进行测试。 (不理想,因为这种做法可能会导致属性名称冲突)。

    最后,您可以尝试检查JDocument 的样式和脚本列表(如果它是公开可见的),看看您是否已经添加了它们。我认为这不是很有效。

    所以我会采用 Singleton 方法,其中模块代码调用 initialize() 方法,该方法只会添加一次样式和脚本。

    另一个可能的问题是检查模块模板是否使用元素 ID 而不是类。然后你可能也会有 ID 冲突。

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 2012-09-04
      • 2013-07-25
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2023-03-26
      • 2017-05-05
      • 2017-04-08
      相关资源
      最近更新 更多