【问题标题】:Putting AJAX in a Joomla Module将 AJAX 放入 Joomla 模块
【发布时间】:2012-11-19 00:56:27
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ajax joomla joomla-module


    【解决方案1】:

    另外两个走上了正确的轨道,您需要记住,当您进行 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 监听的变量。

    【讨论】:

    • 仅供参考,我终于有时间实现这一点,因此提交了一些我需要的调整以使其工作!再次感谢您的帖子:)
    • @Cleanshooter 嗨,乔,我可以请您注意我的新问题吗? stackoverflow.com/q/49422168/2943403
    【解决方案2】:

    如果您需要在 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 doc查看更多信息

    【讨论】:

      【解决方案3】:
      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>
      

      【讨论】:

      • 但是你可以用 mod_modulename 替换 com_componentname 并在 helper.php 类中添加访问函数吗?正如我所说,这是访问模块而不是组件功能。我在 JED 链接中添加了我在原始帖子中试图理解的模块
      【解决方案4】:

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

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

      当您可以从模块中调用时:

      index.php?option=com_mycomponent&amp;task=getJson

      文章Generating JSON output 是一个很好的起点。

      【讨论】:

      • 我认为这个模块可以 :) 我可以通过一个组件来完成它 - 正如你所说的那样,这样做要简单得多。 extensions.joomla.org/extensions/communication/shoutbox/43
      • 你可以简单地做一个 $task = JRequest::getVar('task'); if($task == "getJson"){mySuperHelper::getJson();}
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-26
        • 2017-12-21
        • 2013-04-16
        • 2015-07-16
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多