我已经成功地将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后备?)谢谢!
答案 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 );
答案 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);
}