繁体   English   中英

Joomla模块中的jQuery AJAX

[英]jQuery AJAX in a Joomla module

我已经设法成功添加AJAX到一个Joomla模块(在这里看到的我是如何做的一个极不完善implentation 把AJAX在一个Joomla模块

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

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

但是很明显,这并没有给AJAX任何错误的嗅探,因此无论何时我提交它都称之为'成功'。 因此我的问题。

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

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

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

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

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

结果

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

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

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

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

在你的功能:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM