所以标题有点含糊不清,但我会试着举个例子。基本上,我在我的PHP / CodeIgniter网站上有一个'奖励'系统(类似于StackOverflow的徽章),我希望,一旦获得奖励,就会向用户显示通知。
现在我很高兴在下一页加载时出现这个问题,但是,理想情况下,我希望在获得奖励后立即出现,因为我的网站主要是基于Ajax的,并且可能没有页面重新加载经常。
系统当前的工作方式是:
1)如果用户做某事来触发获奖,CodeIgniter会这样做:
$params['user_id'] = $this->tank_auth->get_user_id();
$params['award_id'] = 1; // (I have a database table with different awards in)
$this->awards->award($params);
2)我的自定义库$this->awards
运行award
函数:
function award($params)
{
$sql = $this->ci->db->query("INSERT INTO users_awards (user_id, award_id)
VALUES ('".$params['user_id']."','".$params['award_id']."')
ON DUPLICATE KEY UPDATE duplicate=duplicate+1");
$awardinfo = $this->ci->db->query("SELECT * FROM awards WHERE id = ".$params['award_id']);
// If it's the 'first time' the user has gotten the award (e.g. they've earnt it)
if ($awardinfo->row('duplicate') == 0) {
$params['title'] = $awardinfo->row('title');
$params['description'] = $awardinfo->row('description');
$params['iconpath'] = $awardinfo->row('iconpath');
$params['percentage'] = $awardinfo->row('percentage');
return $params;
}
}
因此,它奖励用户(如果他们已经两次获得,将一个无用的重复字段更新为一个),然后检查它是否是他们第一次获得它(因此它可以提醒他们奖励) 。如果是这样,它会获得变量(奖项的标题,奖项描述,奖励显示图标的路径,以及最终获得此奖项的用户的百分比)并将其作为数组返回。
所以......就是这样。现在我想知道,最好的方法是什么?目前我的奖励位是从控制器调用的,但我想如果我想通过Ajax触发它,那么代码应该放在一个View文件中......?
总结一下:我需要在没有页面刷新的情况下显示返回的奖励数据。这样做的最佳方法是什么? (我已经在我的页面上使用了jQuery)。
非常感谢大家!
杰克
答案 0 :(得分:4)
您需要实施推送通知系统。有几种方法可以做到这一点。您可以简单地轮询更改:
setInterval(check_awards, 30000);
function check_awards() {
$.getJSON('/awards.php', function(result) {
...
});
}
每30秒检查一次新的奖励。如果需要新的东西,PHP脚本会返回一个关于奖励类型的适当JSON对象,依此类推。
另一种方法是使用虚假推送通知:
$(function() {
check_awards();
});
function check_awards() {
$.ajax({
url: '/awards.php',
success: function(data) {
// update awards
},
complete: function() {
check_awards();
}
});
}
这有时被称为长轮询。您需要更改它,以便您的PHP脚本不会结束,直到有东西返回。每当AJAX请求返回时(由于成功或超时或其他错误),您都会再次启动请求。