0

我已经成功地将 AJAX 添加到 Joomla 模块中(请参阅此处了解我如何将 AJAX 放入 Joomla 模块的非常不完美的实现

我遇到的问题是返回错误,因为当我抛出错误时,我刚刚抛出了一条 JApplication 消息,例如

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

但是很明显,这并没有给 AJAX 任何错误的嗅觉,所以每当我提交它时,它都称它为“成功”。因此我的问题。

太多我喜欢的用户仍然没有启用 Javascript,让我很高兴只添加一个直接的 400 标头重定向(无论如何我希望向用户显示错误消息)。我仍然希望 JApplication 在禁用 javascript 时通过 PHP 将错误消息排入队列作为后备。

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

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

4

5 回答 5

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>
于 2013-12-20T06:40:04.563 回答
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 );

结果

于 2014-07-12T09:36:05.683 回答
0

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

您需要一些可以输出消息队列并关闭应用程序的东西。

  • 单独的组件
  • 将位于模块文件夹中并连接到应用程序的独立应用程序
于 2013-04-23T10:14:46.180 回答
0

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

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

首先,您需要一个安装/启用反射的服务器。据我所知,它内置于 PHP 5.3 及更高版本。您可以在 PHP 5.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 处理程序永远不会运行此代码,因此该消息显示为正常的系统消息。

于 2013-04-26T06:49:40.493 回答
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);
    }
于 2015-10-05T07:33:16.093 回答