6

我已经为我的网站制作了一个基本的 Joomla 模块作为一个喊话框。但我想将 AJAX 放入其中(我知道 JED 上已经存在一个类似的 AJAX 模块,但这更像是一个让我了解 AJAX 如何在 Joomla 模块中工作的项目)。

您重定向到新 php 文件的常用 AJAX 内容显然不起作用,因为该文件不会被定义为

   defined('_JEXEC') or die('Restricted access');

将在新页面中失败。就我在 Joomla Docs 上阅读的内容而言,将 _JEXEC 定义为等于一(正如我在 SO 上的几篇文章中阅读的那样)是一种安全风险,因为它提供了网站的入口点。

我见过的另一个喊话框模块的方式是指向 helper.php 文件中的一个函数。这对我来说很有意义,因为这是所有功能通常应该存储的地方。但是,我不清楚该模块如何通过 onSubmit() (或相关)命令访问 helper.php 文件,并希望有人能对此有所了解。

我实际上并不需要任何特定于我的喊话框模块的东西——这更多是关于如何在 Joomla模块中获得 AJAX 功能以及如何安排它的问题

4

5 回答 5

5

另外两个走上了正确的轨道,您需要记住,当您进行 AJAX 调用时,您不能直接访问 Joomla 中的 php 文件。因此,最好调用您的模块。在这种情况下,让模块检查您的 POST 或 URL 中的变量。

我是 JQuery 的 ajax 的忠实粉丝,它比构建那个喊话框的人使用的方法更加独立。

$( "#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();}

只有在变量存在时才调用必要的函数。

为了解释部分过程,它有点像这样:

  1. 如果 POST 或 URL 中没有变量,它将以 Joomla 期望的方式简单地显示模块。
  2. 如果检测到变量,则调用该方法将其添加到数据库中,然后调用将其添加到显示器的 javascript 函数。也防止正常显示的发生。

您引用的模块非常有趣。主文件引用的辅助函数完成了模型通常在 MVC 中处理的工作,并且 Javascript 也有点过了。如果你真的想了解它是如何工作的,你真的需要深入研究 fatAjax.js 文件,因为它包含所有 AJAX 并设置 mod_shoutbox.php 监听的变量。

于 2012-11-20T17:10:23.617 回答
3

如果您需要在 Joomla 中发出 AJAX 请求,请使用 Joomla 3.2!从自定义模块或插件,您可以构建如下 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 文档中查看更多信息

于 2017-04-14T08:09:09.963 回答
0

据我所知,您不能从模块对模块本身(或类似)中的函数进行 AJAX 调用。

您可以构建一个组件并创建一个返回 RAW 或 JSON 作为响应的视图。因为Joomla!本身会调用你可以使用Joomla!API 和它的所有好处。这也是一个安全的事情,因为如果你需要获取敏感数据,你也可以做 ACL/用户检查。

当您可以从模块调用时:

index.php?option=com_mycomponent&task=getJson

生成 JSON 输出一文是一个很好的起点。

于 2012-11-19T07:36:43.107 回答
0
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>
于 2012-11-19T08:44:23.483 回答
0

您可以通过以下方式达到预期的效果:

$( "#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”的方法。

于 2020-08-26T06:32:43.023 回答