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

时间:2014-01-29 08:28:38

标签: joomla joomla2.5 joomla3.0

我在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中解决此问题?

2 个答案:

答案 0 :(得分:0)

尝试

JURI::base(true) 

而不是

JURI::base()

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

将主机包含在脚本中是不好的做法,除非它们位于其他主机上。除了在多子域网站上缓存的问题,你只是无缘无故地使你的页面更大。

答案 1 :(得分:0)

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

您可以使用Singleton模式执行该操作,并使用initialize()方法创建类,该方法只需将所需数据添加到JDocument一次。

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

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

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

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