【问题标题】:jQuery AJAX in a Joomla moduleJoomla 模块中的 jQuery AJAX
【发布时间】:2013-04-16 09:30:38
【问题描述】:

我已经成功地将 AJAX 添加到 Joomla 模块中(请参阅此处了解我如何做到这一点的高度不完美的实现 Putting AJAX in a Joomla Module

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

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

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

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

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

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

【问题讨论】:

  • 您可能希望发出警告或通知而不是错误。我最近在 cli 中遇到了一些错误页面的完整 html 正在发送的内容。
  • @Elin 即便如此,我如何让 AJAX 失败?我只希望来自我的模块的东西触发 AJAX 失败 - 否则我只需在 php 中插入一个条件语句并使用 JFactory::getApplication()->getMessageQueue()

标签: jquery ajax joomla joomla2.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>

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我无法与此消息一起获得“x”符号(在右上角,以删除该页面上剩余的消息),因为它显示在 setRedirect 之后呈现的消息中。有什么办法可以做到吗?
    【解决方案3】:

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

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

    【讨论】:

    • 我不一定需要它来挂钩到消息功能!我只是想要一种显示这些消息的方式。如果我需要第二行,我将错误消息传递到某个数组中,然后 json_encode 将其返回,那很好。我只是不确定如何访问 JUST json_encoded 数据
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      在你的功能中:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-26
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        相关资源
        最近更新 更多