如何向从文章加载的Joomla模块传递参数

5

之前我在Joomla文章中添加模块的方式是这样的:{loadmodule mod_name},但这次我需要向其中传递参数。

如何从文章中向Joomla模块传递参数?


你的意思是什么?参数在后端/模块管理器中,而不是文章中。 - Lodder
1
是的,它们是从后端传递的,但我想知道是否有一种方法可以从文章内部传递它们...我之前见过一个插件mod_refresh,当我们{refresh 600}时,我们可以将600毫秒传递给插件,所以我想知道是否有类似的方法可以将其传递给模块,如果有,如何在参数中检索数据... - JSFan
3个回答

5
你需要修改或克隆Joomla插件loadmodule,因为它不能处理除模块名称之外的参数。如果你熟练掌握PHP(假设你不介意使用一些正则表达式),这并不是特别困难的事情,但我建议你克隆它,并以以下方式使用:
1. 复制文件夹\plugins\content\loadmodule到\plugins\content\Myloadmodule(和它的所有文件); 2. 在新文件夹中,将loadmodule.php和loadmodule.xml重命名为myloadmodule.php和myloadmodule.xml。这些是你要完成所有工作的文件; 3. 在两个文件中,将出现的loadmodule替换为myloadmodule(大小写敏感); 4. 在myloadmodule.php中,从大约第36行开始使用正则表达式来去除正在处理的{loadposition xxx}中的内容。当在文章中使用{myloadmodule blah-blah-blah}时,你需要调整此正则表达式以获取要提供的参数; 5. 找到_table'_extensions'中loadposition的数据库条目,并为myloadposition创建一个相同的记录。(除非你想编写安装程序); 6. 最后,你需要使用新的参数来呈现模块——我无法帮助你,因为我不知道你将要渲染哪些模块或做哪些参数工作,但这个renderModule文档将对你有所帮助。
我想我已经覆盖了所有内容,但这应该足以为你完成大部分工作。完成后,请改用{myloadposition ...}而不是{loadposition ...}。

另外,你可以在我刚开始研究正则表达式时的问题中查看相关内容,链接为http://stackoverflow.com/questions/11675691/preg-match-all-with-space-and-comma-delimiters/11675712#11675712。 - GDP

2
我将详细说明之前的答案,以便能够使用标记{loadmodule mod_name,param}向模块传递参数。GDP提供的解决方案很好:只需按照先前答案中的步骤1到5轻松快捷地重写内容插件(例如myloadmodule)即可。对于我来说,问题出在第6步:如何将参数放入模块中,以及如何在模块内检索参数。
步骤7:如何为模块的“渲染”提供参数
在创建的插件(基于loadmodule)中,您必须找到以下代码行:
echo $renderer->render($module, $params);

在这行代码之前,您可以将参数放入$params参数中,但是模块的“render”仅使用json格式检索键为'params'的参数。 因此,要将参数传递给渲染函数,您可以这样做:
$param = array('param_name' => 'value');  // param_name = value
$params = array('params' => json_encode($param)); // 'params' (String) should be decoded by the render of the module
echo $renderer->render($module, $params);

步骤8:如何在模块中检索参数

在您的模块帮助程序中,您可以使用$params变量检索参数:

$value = $params->get('param_name');

要了解助手,请阅读本教程:http://docs.joomla.org/J3.3:Creating_a_simple_module/Developing_a_Basic_Module

(本文主要介绍如何创建简单模块并开发基础模块。)

0

我在谷歌上搜索了同样的问题,并找到了你的提问。我知道这已经过时了,但我的发现可能会帮助其他人。现在有一些插件可以嵌入模块并允许您传递参数给它。我的选择是Module Plant


你回答中的链接已经过时,而且也没有模块工厂扩展。 - tung
谢谢 @tung 指出一个五年前的回答已经不再适用 :) 即使我没有被指出,我也会检查回答的日期,因为 Joomla! 的核心自2014年以来已经进行了数次更新。 - Daydah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接