我在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中解决此问题?答案 0 :(得分:0)
尝试
JURI::base(true)
而不是
JURI::base()
所以不包括方案,主机和端口,这应该足以让J 2.5看到脚本是同一个。
将主机包含在脚本中是不好的做法,除非它们位于其他主机上。除了在多子域网站上缓存的问题,你只是无缘无故地使你的页面更大。
答案 1 :(得分:0)
如果你想避免添加两次,你需要跟踪你已经添加的事实。
您可以使用Singleton模式执行该操作,并使用initialize()
方法创建类,该方法只需将所需数据添加到JDocument
一次。
或者,您可以在JDocument
对象本身中添加一个属性,然后可以测试该属性。 (不理想,因为通过这种做法可能会导致财产名称冲突)。
最后,你可以尝试检查JDocument
的样式和脚本列表(如果它是公开可见的),看看你是否已经添加了它们。我认为这不是很有效。
所以我选择Singleton方法,模块代码调用initialize()
方法,只会添加一次样式和脚本。
另一个可能的问题是检查模块模板是否使用元素ID而不是类。那么你可能也会发生ID冲突。