这是我目前的问题。我正在使用chat module,我正在构建一个模块,通过AJAX通知用户他们已被邀请参加聊天。邀请表的当前表结构如下所示:
|-------------------------------------------------------------------------| | CCID | NID | INVITER_UID | INVITEE_UID | NOTIFIED | ACCEPTED | |-------------------------------------------------------------------------| | int | int | int | int | (0 or 1) | (0 or 1) | |-------------------------------------------------------------------------|
我正在使用JQuery的periodical updater插件不断轮询服务器以检查邀请。当找到邀请时,我将通知从0设置为1.但是,我的问题是定期更新程序。当我第一次看到有邀请时,我通知用户,并将通知设置为1.在下一个选择中,我之前得到相同的结果,就像更新不起作用一样。但是,当我检查数据库时,我可以看到它工作得很好。就像查询正在查询缓存一样,但我无法弄明白。
我的定期更新程序代码如下:
window.onload = function() {
var uid = $('a#chat_uid').html();
$.PeriodicalUpdater(
'/steelylib/sites/all/modules/_chat_whos_online/ajax/ajax.php', //url to service
{
method: 'get', //send data via...
data: {uid: uid}, //data to send
minTimeout: '1000', //min time before server is polled (milli-sec.)
maxTimeout: '20000', //max time before server is polled (milli-sec.)
multiplyer: '1.5', //multiply against curretn poll time every time constant data is returned
type: 'text', //type of data recieved (response type)
maxCalls: 0, //max calls to make (0=unlimited)
autoStop: 0 //max calls with constant data (0=unlimited/disabled)
},
function(data) //callback function
{
alert( data ); //for now, until i get it working
}
);
}
我的ajax调用代码如下:
<?php
#bootstrap Drupal, and call function, passing current user's uid.
function _create_chat_node_check_invites($uid)
{
cache_clear_all('chatroom_chat_list', 'cache');
$query = "SELECT * FROM {chatroom_chat_invite} WHERE notified=0 AND invitee_uid=%d and accepted=0";
$query_results = db_query( $query, $uid );
$json = '{"invites":[';
while( $row = db_fetch_object($query_results) )
{
var_dump($row);
global $base_url;
$url = $base_url . '/content/privatechat' . $uid .'-' . $row->inviter_uid;
$inviter = db_fetch_object( db_query( "SELECT name FROM {users} WHERE uid = %d", $row->inviter_uid ) );
$invitee = db_fetch_object( db_query( "SELECT name FROM {users} WHERE uid = %d", $row->invitee_uid ) );
#reset table
$query = "UPDATE {chatroom_chat_invite} "
."SET notified=1 "
."WHERE inviter_uid=%d AND invitee_uid=%d";
db_query( $query, $row->inviter_uid, $row->invitee_uid );
$json .= '[';
$json .= '"' . $url . '",';
$json .= '"' . ($inviter->name) . '",';
$json .= '"' . ($invitee->name) . '"' ;
$json .= '],';
}
$json = substr($json, 0, -1);
$json .= ']}';
return $json;
}
?>
我无法弄清楚出了什么问题,非常感谢任何帮助!
答案 0 :(得分:0)
浏览器可能正在缓存GET调用。尝试将cache-buster值添加到AJAX请求的URL(当前时间效果很好),以便每次都强制重新加载。
答案 1 :(得分:0)
嗯,已经有一段时间了,我终于弄明白了我的问题,但我意识到,如果其他人找到这个页面并想要一个答案,那么他们就不走运了。所以这就是问题所在。
正确的AJAX调用的处理程序使用Drupal函数,我不得不引导Drupal(上面使用但未显示)。但是,当我引导Drupal时,我做了一个完整的bootstrap。这导致聊天模块调用检查邀请的钩子。我没有意识到这是被调用的,因为在正常使用中,没有任何通知我...无论如何,钩子是为了检查通知并提醒用户(不知何故......我不知道怎么做)以及何时它选中后,它会将通知标志设置为true。
因此,在调用我的AJAX处理程序时,邀请已被设置为ChatRoom模块通知。所以,我的解决方案只是部分引导程序。引导程序的代码如下。我在其他人的网站上找到了该脚本,但我不确定它是什么。无论如何......这是代码:
<?php
#bootstrap drupal to get access to drupal functions
define('STRIP_LEN', -41); #length of path to use (strip off stuff like /sites/all/...)
$base_url = substr(getcwd(), 0, STRIP_LEN);
chdir($base_url);
global $base_url;
$base_root = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';
$base_url = $base_root .= '://' . preg_replace('/[^a-z0-9-:._]/i', '', $_SERVER['HTTP_HOST']);
if( $dir = trim( dirname( $_SERVER['SCRIPT_NAME'] ), '\,/' ) )
{
$base_path = "/$dir";
$base_url .= $base_path;
}
$base_url = substr($base_url, 0, STRIP_LEN);
require_once './includes/bootstrap.inc';
require_once './includes/common.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
require_once drupal_get_path('module', '_chat_whos_online') . '/_chat_whos_online.inc';
#END BOOTSTRAPPING
?>