Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Joomla模块中的jQuery AJAX_Jquery_Ajax_Joomla_Joomla2.5 - Fatal编程技术网

Joomla模块中的jQuery AJAX

Joomla模块中的jQuery AJAX,jquery,ajax,joomla,joomla2.5,Jquery,Ajax,Joomla,Joomla2.5,我已经成功地将AJAX添加到Joomla模块中(请参阅此处,了解我如何实现它的一个非常不完善的实现) 我的问题是返回错误,当我到目前为止抛出错误时,我只是抛出了一条JApplication消息,例如 JFactory::getApplication()->enqueueMessage('Some error message', 'error'); 然而很明显,这并没有让AJAX嗅到任何错误,所以每当我提交它时,它都称之为“成功”。这就是我的问题 太多我喜欢的用户仍然没有启用Javascr

我已经成功地将AJAX添加到Joomla模块中(请参阅此处,了解我如何实现它的一个非常不完善的实现)

我的问题是返回错误,当我到目前为止抛出错误时,我只是抛出了一条JApplication消息,例如

JFactory::getApplication()->enqueueMessage('Some error message', 'error');
然而很明显,这并没有让AJAX嗅到任何错误,所以每当我提交它时,它都称之为“成功”。这就是我的问题

太多我喜欢的用户仍然没有启用Javascript,我很高兴只添加一个直接的400头重定向(在任何情况下,我希望向用户显示错误消息)。我仍然希望JApplication在禁用javascript时通过PHP将一条错误消息排队,作为一种回退

我还看到了将错误消息回显到页面上的方法。但是由于Joomla模块处理AJAX的方式不是特别有用,因此回调数据结果实际上是页面的完整html代码!所以我必须在页面上特别选择一个元素,我想如果我这样做的话——我不知道该怎么做/如果可能的话


那么,为AJAX抛出一条错误消息,然后检索它,以便向用户显示它(但仍然保留一个很好的非javascript回退)的最佳方式是什么呢?谢谢

模块不能完全控制应用程序输出,还涉及组件和插件

您需要输出消息队列并关闭应用程序的东西

  • 独立组件
  • 它将位于模块文件夹中并连接到应用程序

Joomla开发人员一直在改变过去非常有用的东西,使它们更难使用。其中之一就是消息队列。目前,您只能阅读它

因此,如果您可以在消息队列中设置消息,那么使用AJAX响应将其移动到一个对AJAX更友好的位置进行显示—您就可以进行设置了。正确的?这样,它就在队列中等待下一个页面加载时显示,如果用户成功地发出AJAX请求(表明他们启用了JS),则消息将与AJAX响应一起移动到客户端

首先,您需要安装/启用反射的服务器。据我所知,它内置于PHP5.3及更高版本上。您可以在PHP5.2和一些以前的修订版上获得它。因为我的解决方案需要它,所以我假设你有它

此函数用于搜索错误消息的一部分。因此,您需要计划错误输出,以便在消息队列中找到它。您可以假设您的消息是队列中唯一的消息,但我不会。当h函数找到消息时,它会抓取消息,将其从消息队列中清除,并返回完整的消息

function getMessage($error) {
  $app=JFactory::getApplication();
  $appReflection = new ReflectionClass(get_class($app));
  $_messageQueue = $appReflection->getProperty('_messageQueue');
  $_messageQueue->setAccessible(true);
  $messages = $_messageQueue->getValue($app);
  foreach($messages as $key=>$message) {
      if(preg_match('/'.preg_quote($error,'/').'/',$message['message'])) {
          $return = $message;
          unset($messages[$key]);
      }
  }
  $_messageQueue->setValue($app,$messages);
  return $return;
}
使用此方法,可以设置ajax响应,将消息作为单独的数据值包含在其中,供客户端ajax处理程序使用。当用户关闭JS时,服务器上的ajax处理程序永远不会运行此代码,因此该消息显示为正常的系统消息。


<script>
  jQuery(window).load(function(){
   var data = {};
   display_result_data();
  });
function display_map_result_data() {
var ajaxUrl = "modules/mod_mapcontent/submit_form.php";
 jQuery.ajax({
              type: "POST",
              url: ajaxUrl,
              data: {category: 'simple'},
              dataType    : "json",
              async       : false,
              success : function(result){
                data = result;
               }
          });
}
 </script>
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_banners
 *
 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
*/
  defined('_JEXEC') or die;
  $baseurl = JURI::base();
?>
 <div id="mapcontent" class="mapcontent">
   <div id="map-canvas"></div>
 </div>
jQuery(window).load(函数(){ 变量数据={}; 显示结果数据(); }); 函数显示\映射\结果\数据(){ var ajaxUrl=“modules/mod\u mapcontent/submit\u form.php”; jQuery.ajax({ 类型:“POST”, url:ajaxUrl, 数据:{category:'simple'}, 数据类型:“json”, async:false, 成功:功能(结果){ 数据=结果; } }); }
Joomla javascript对象具有用于此目的的适当函数renderMessages

// available msg types: success, error, notice
var msg = {
    error: ['it is an error!<br />', 'it is enother error!'],
    success: ['It works!!']
};
Joomla.renderMessages( msg );
//可用消息类型:成功、错误、通知
var msg={
错误:[“这是一个错误!
”,“这是另一个错误!”, 成功:[“它起作用了!!”] }; Joomla.renderMessages(msg);
在您的功能中:

    $app = JFactory::getApplication();
    echo new JResponseJson(null, $app->enqueueMessage('Some errormessage','error'));

    //close the $app
    $app->close();
在javascript中:

    success: function(response) {
            var jMsgs = response.messages;  // You can stack multiple messages of the same type
            Joomla.renderMessages(jMsgs);
    }

我不一定需要它来连接消息函数!我只是想要一种显示这些信息的方式。如果我需要第二行,将错误消息传递到某个数组中,然后对其进行json_编码,这很好。我只是不知道如何访问json_编码的数据,你可能想做警告或注意,而不是错误。我最近在cli中遇到了一个问题,其中发送了错误页面的完整html。@Elin即使如此,我如何使AJAX失败?我只希望模块中的东西触发AJAX失败-否则我只需要在php中插入一个条件语句,并使用JFactory::getApplication()->getMessageQueue(),我无法在该消息的同时获得“x”符号(在右上角,以删除该页上剩余的消息),如setRedirect之后呈现的消息所示。有没有办法做到这一点?