模块能否知道它所在的位置。例如,我能否像这样做:
如果(modulePosition =='left'){ 做这个... }否则{ 做那个... }看起来很容易,但我已经搜索了几个小时,找不到任何可以帮助我的东西。我知道有一个countModules函数,但从我所了解的情况来看,它只是检查模块是否处于活动状态。
谢谢你的帮助!
$class = '';
if($module->position == 'position1'){
$class = 'class1';
}
and so on...
很简单,对吧?
想要了解全局变量$module还能做什么,只需在代码中加入以下内容即可查看可用信息:
echo(print_r($module));
我尝试在John的解决方案下进行评论,但是我的声望点数不够--我想补充一点,无论您在模板中如何命名模块位置,$module->position返回的位置名称始终是小写,与您在模板中命名的方式无关...例如,在您的模板XML文件中,可能会将顶部栏位置命名为“topBar”,但在尝试使用时,其名称将变为“topbar”,而不是“topBar”。
if($module->position == 'topBar') //always false... use instead
if($module->position == 'topbar') //what you need to use
if(modulePosition == '1'){$class = 'class1'}elseif(modulePosition == '2'){$class = 'class2'}
等等。有什么想法吗?谢谢! - john我不同意Hanny的观点。我认为答案是否定的,不是你描述的那样。
模板知道它何时到达了一个模块位置,并获取分配给该位置的模块列表,然后调用它们进行渲染。但是它不会传递那些信息。它也不存储在JApplication或JDocument中(就像没有任何东西存储渲染模板的位置或其他任何内容)。
尽管如此,有一些hacky方法可以实现类似于您想要的功能。如果您知道需要搜索的模板位置(遗憾的是,没有从模板获取这个的简单方法-否则您可以解析模板的.XML文件以获取<position>
元素...),然后您可以做类似以下的操作:
<?php
$positions = array('left', 'right', 'top', 'bottom')
$found_in = false;
foreach ($positions as $cur_position)
{
$module_positions = JModuleHelper::getModules($cur_position);
foreach ($module_positions as $cur_module_in_pos)
{
if ($cur_module_in_pos->module == 'mod_MYMODULE')
{
$found_in = $cur_position;
}
}
}
if ($found_in)
...
JDispatcher :: trigger()
调用,设置某些变量等。不幸的是,在核心中没有此类事件(例如pre_module_render
)。一个模块实例只能被分配到一个位置,并且存储在数据库中,通常您会在模板中为该位置设置样式。因此,虽然这是一个有趣的问题,但实际上并不实用。
以下是一些例外情况: loadposition ... 您可能想知道是否使用插件加载了模块,因为这可能会将其放置在位置的样式区域之外。尽管如此,我建议始终创建一个新实例,以便您拥有更多控制权。
loadmodule ... 使用插件按名称加载的模块。在这种情况下,您最好再创建一个模块实例并进行样式设置。此外,无论是 span 还是 div,我都会将其放置在其中,具体取决于它是什么。
jdocinclude:module ... 直接在模板中加载模块。同样,如果您这样做,我会将其包装在 span 或 div 中。在这种情况下,您还可以包含一串内联样式字符串,如果您喜欢这种方式的话。
将模块渲染为字符串并回显它,这基本上是一个非常定制化的解决方案,您需要设置样式和选项。
$this
来实现这一点。但是模块是函数式调用的,所以那样行不通。没想到会尝试像全局变量这样老派的方法 ;o。 - KingJackaL