我对Joomla很新(我更像是一个Wordpress人),我对模块位置有疑问。
模块可以知道它所处的位置。例如,我可以做这样的事情:
if(modulePosition =='left'){ Do this... }else{ Do that... }
这似乎很容易,但我已经搜索了几个小时,找不到任何可以帮助我的东西。我知道有一个countModules函数,但据我所知,只是检查模块是否处于活动状态。
感谢您的帮助!
答案 0 :(得分:9)
我找到了答案!主要是感谢@Hanny。他使用模块ID的想法让我用Google搜索,我遇到了答案。对于其他任何碰巧想在这里做类似事情的人来说,它就是。
你使用全局变量$ module(谁想到了,对吧?)
所以我的代码现在看起来像这样:
$class = '';
if($module->position == 'position1'){
$class = 'class1';
}
and so on...
很简单,是吗?
要了解使用全局变量$ module可以做什么,只需将其放入代码中,看看您可以使用哪些信息:
echo(print_r($module));
感谢您的帮助!
答案 1 :(得分:1)
简短回答是“是”,您将根据模板为模块指定一个位置。当它出现时你可以有关于那个位置的条件(不同的模板对于位置有不同的命名约定,所以在编码之前要确保你知道它们是什么)。
例如,一些使用“Position12”,其他人可能使用“leftcol”等。您只需要检查模板文件以查看(您可以检查模板目录中的.xml文件以查看列出的位置)模板,或查看index.php文件中的jdoc包含)。
在我的一些经验中,你真正需要这样的代码的唯一时间是在模板的核心布局文件中(例如,如果你有不同的列宽度,具体取决于模块是否存在),否则你真的不会'或许没有'出现一个模块 - 因为你明确告诉他们在哪里以及何时在后端。
答案 2 :(得分:1)
我尝试在john的解决方案下发表评论,但我没有足够的重复点 - 我想添加它并不重要你在模板中命名模块位置的情况下,你从后面找到的位置名称无论你如何命名模板中的位置,$ module->位置总是全部小写...即。在您的模板xml某处,当您尝试使用
进行检查时,您可能将topBar位置命名为“topbar”而不是“topBar”if($module->position == 'topBar') //always false... use instead
if($module->position == 'topbar') //what you need to use
答案 3 :(得分:0)
我不同意 Hanny 。我认为答案是否定的,不像你描述的那样。
模板知道它何时到达模块位置,并获得分配给该位置的模块列表,然后调用它们进行渲染。但它没有传递这些信息。它也没有存储在JApplication或JDocument等中(比如,什么都不存储渲染所在的模板或其他任何东西)。
虽然有一些hacky方法几乎可以获得你想要的东西。如果您知道需要搜索的模板位置(遗憾的是,没有简单的方法可以从模板中获取此模板 - 否则您可以解析模板的<position>
元素的.XML文件...),那么您可以执行类似的操作:
<?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()
调用,设置一些var等等。不幸的是,核心中没有这样的事件可以启动({{1等等。)
答案 4 :(得分:0)
将模块实例分配给单个位置,并将其存储在数据库中,通常您可以在模板中设置位置样式。模块实例只能分配给一个位置。因此,尽管这是一个有趣的问题,但它并不是一个真正的问题。
以下是例外情况: loadposition ...您可能想知道是否正在使用插件加载模块,因为这可能会使其位于该位置的样式区域之外的某处。我建议总是为此准备一个新的实例,以便你有更多的控制权。
loadmodule ...使用插件按名称加载的模块。在这种情况下,您可能最好还是创建模块的新实例并设置样式。不管怎么说,我还是把它放在一个跨度或div中。取决于它是什么。
jdocinclude:module ...直接在模板中加载模块。再次,如果你这样做我会把它包装在span或div中。在这种情况下,如果你喜欢这种东西,你也可以包含一串内联样式。
将模块渲染为字符串并回显它,这基本上是一个非常自定义的解决方案,您可能希望设置样式和选项。