我为我的网站制作了一个基本的Joomla模块,作为一个shoutbox。但我想把AJAX放进去(我知道JED上已经存在一个类似的AJAX模块,但这对我来说更像是一个学习AJAX如何在Joomla模块中工作的项目)。
重定向到新php文件的常见AJAX内容显然不起作用,因为该文件不会被定义为
defined('_JEXEC') or die('Restricted access');
将在新页面中失败。正如我在Joomla Docs上读到的那样,将_JEXEC定义为等于1(正如我在SO上的几篇帖子中所读到的)是一个安全风险,因为它提供了进入网站的入口。
我看到的另一个shoutbox模块的做法是指向helper.php文件中的一个函数。这对我来说很有意义,因为这是所有函数通常应该存储的地方。然而,我不清楚模块是如何访问onSubmit()(或相关)命令上的helper.php文件的,我希望有人能对此有所了解。
实际上,我不需要任何特定于我的shoutbox模块的东西——这更多的是一个如何在Joomla模块中获得AJAX功能以及如何安排的问题
其他两个都是正确的,你需要记住,当你进行AJAX调用时,你不能直接访问Joomla中的php文件。因此,最好调用您的模块。在这种情况下,让模块在POST或URL中检查变量。
我是JQuery的ajax的忠实粉丝,它比构建shoutbox的人使用的方法更具自包含性。
$( "#addShout" ).click( function(event, ui) {
$.ajax({
type: 'GET',
url: "<?php echo JURI::base() . "index.php?option=mod_mymodule&task=getCustomerJson&selectedCustomer="?>" + encodeURIComponent(value),
success:function(data){
$('#shouts').append(data);
},
error:function(){
$('#errors').html('<p class="error"><strong>Oops!</strong> Try that again in a few moments.</p>');
}
});
});
然后,正如我在给Valentin的评论中提到的那样:
$task = JRequest::getVar('task');
if($task == "getCustomerJson"){mySuperHelper::getCustomerJson();}
只有当变量存在时,才能调用必要的函数。
为了解释这个过程的一部分,它有点像这样:
- 如果POST或URL中没有变量,它只会按照Joomla期望的方式显示模块
- 如果检测到变量,则调用方法将其添加到数据库,并调用javascript函数将其添加至显示器。还要防止正常显示
您引用的模块非常有趣。主文件引用的辅助函数做了模型在MVC中通常会处理的事情,Javascript也有点过时了。如果你真的想了解这个是如何工作的,你真的需要深入了解fatAjax.js文件,因为它包含了所有的AJAX,并设置了mod_shoutbox.php监听的变量。
Fron Joomla 3.2如果您需要在Joomla中发出AJAX请求!从自定义模块或插件,您可以构建如下URL。
index.php?option=com_ajax&module=your_module_name&method=YourMethodName&format=json
各参数说明
1/index.php?option=com_ajax:所有请求都必须通过com_ajax路由。
2.module=your_module_name:第一部分是您正在使用的扩展类型。这可以是"模块"或"插件"。第二部分是扩展名。请注意不要包含前缀"mod"或"plg",只包含名称。
3.method=YourMethodName:这是您试图调用的方法名称。如果在模块中使用此方法,则该方法必须附加"Ajax"。因此,这里表示的方法将是YourMethodNameAjax。如果您在插件上使用此方法,则该方法必须以"onAjax"开头。因此,这里表示的方法将是onAjaxYourMethodName。
查看更多Joomla doc
jQuery(document).ready(function () {
jQuery(".btnshow").click(function () {
var pagename, pid;
pid=jQuery(this).attr('rel');
pagename="<?php echo JURI::root();?>index.php?option=com_componentname&view=result&Id="+pid;
jQuery.get(pagename, function (data) {
jQuery('.para1').html(data);
});
});
});
<a href="JavaScript:void(0);" rel="<?php echo $id; ?>" title="<?php echo $id; ?>"><img src="<?php echo $image; ?>" alt="" /></a>
据我所知,您不能从模块对模块本身(或类似模块)中的函数进行AJAX调用。
您可以构建一个组件并创建一个返回RAW或JSON作为响应的视图。因为Joomla!它本身就会被称为你可以使用Joomla!API&这也是一个安全问题,因为如果你需要获取敏感数据,你也可以进行ACL/用户检查。
当你可以从模块调用类似的东西时:
index.php?option=com_mycomponent&task=getJson
生成JSON输出这篇文章是一个很好的起点。
您可以通过以下方式获得所需的结果:
$( "#addShout" ).click( function(event, ui) {
$.ajax({
type: 'GET',
url: "<?php echo JURI::base() . "index.php?option=com_ajax&module=module_name_withot_prefix&method=methodName&anyparams="?>" + encodeURIComponent(anyparamsvalue) + "&format=json",,
success:function(data){
$('#shouts').append(data);
},
error:function(){
$('#errors').html('<p class="error"><strong>Oops!</strong> Try that again in a few moments.</p>');
}
});
});
在模块帮助程序文件中,您需要有一个名为"methodName"的方法。