Joomla模块中的jQuery AJAX

时间:2013-04-23 08:41:34

标签: jquery ajax joomla joomla2.5

我已经成功地将AJAX添加到Joomla模块中(请参阅此处,了解我是如何完成的Putting AJAX in a Joomla Module

我遇到的问题是返回错误,因为当我向日期投掷错误时,我刚刚抛出一条JApplication消息,例如。

JFactory::getApplication()->enqueueMessage('Some error message', 'error');

然而很明显,这并没有给AJAX任何错误的嗅探,所以每次我提交它都称之为“成功”。因此我的问题。

根据我的喜好,太多的用户仍然没有启用Javascript让我感到高兴只是添加一个直接的400头重定向(并且在任何情况下我都希望向用户显示错误消息)。我仍然希望JApplication只是通过PHP将错误消息排入队列,当javascript被禁用时作为后备。

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

那么最好的方法是为AJAX抛出错误消息然后检索它以便我可以将它显示给用户(但仍保留一个不错的非javascript后备?)谢谢!

5 个答案:

答案 0 :(得分:1)

<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>

答案 1 :(得分:1)

为此,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 );

Result

答案 2 :(得分:0)

模块无法完全控制应用程序输出,也包含组件和插件。

您需要输出消息队列和关闭应用程序的内容。

答案 3 :(得分:0)

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

因此,如果您可以在消息队列中设置消息,那么使用您的AJAX响应将其移动到更加AJAX友好的位置进行显示 - 您将被设置。对?这样,它在队列中显示在下一页加载上,如果用户成功发出AJAX请求(表明它们已启用JS),则消息将通过其AJAX响应移动到客户端。

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

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

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处理程序永远不会运行此代码,因此该消息显示为正常的系统消息。

答案 4 :(得分:0)

在你的功能中:

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