Joomla 2.5.x:一个模块的多个实例不在同一个页面中工作?

Joomla 2.5.x:一个模块的多个实例不在同一个页面中工作?,joomla,joomla2.5,joomla3.0,Joomla,Joomla2.5,Joomla3.0,我正在Joomla2.5.x中测试我的模块,我注意到在同一页面中复制模块似乎不起作用。我注意到这是因为我的模块有一个公共的addScript()和addStyleSheet()函数。例如,我的模块中有以下代码: $document->addScript(JURI::base() . 'modules/mod_mymodule/js/abc.js'); $document->addStyleSheet(JURI::base() . 'modules/mod_mymodule/css/x

我正在Joomla2.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都试图重新包含这些模块,因为第一个模块已经包含了这些模块,所以它失败了,并且多个模块不能在页面中正确呈现

然而,Joomla3.x似乎足够聪明,只在头中检测并包含这些脚本一次。有没有办法在2.5.x中解决这个问题?

试试看

JURI::base(true) 
而不是

JURI::base()
因此,方案、主机和端口将不包括在内,这应该足以让j2.5看到脚本是相同的


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

如果你想避免添加这两次,你需要跟踪你已经添加的事实

您可以使用单例模式来实现这一点,并使类具有一个
initialize()
方法,该方法将只向
JDocument
添加一次所需的数据

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

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

因此,我将使用单例方法,其中模块代码调用一个
initialize()
方法,该方法将只添加一次样式和脚本


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

我想是的。但是我检查了addScript()和head.php:render()的实现,它应该也适用于完整的URL,这令人费解。