2010-06-13 35 views
2

所以标题有点模棱两可,但我会试着举个例子。基本上,我在我的PHP/CodeIgniter网站上有一个“奖励”系统(类似于StackOverflow的徽章),我希望一旦获得奖励,就会向用户显示一条通知。什么是从PHP函数返回东西并同时触发jQuery动作的最佳方式?

现在我很高兴在下一页加载时出现这种情况,但理想情况下,我希望在奖励交易后立即出现,因为我的网站大部分采用Ajax技术,并且可能没有页面经常重新加载。

系统工作目前的方法是:

1)如果用户没有什么触发奖励的收入,笨做到这一点:

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

所以,奖励用户(如果他们已经earnt两次,通过一个更新一个无用的重复字段),该ñ检查它是否是他们第一次收到它(因此它可以提醒他们奖励)。如果是这样,它会得到变量(奖励的标题,奖励描述,奖励显示图标的路径,以及最终获得此奖项的用户的百分比)并将其作为数组返回。

所以......就是这样。现在我想知道,做这件事的最好方法是什么?目前我的授奖位是从控制器调用的,但我想如果我想通过Ajax触发它,那么代码应该放在View文件中...?

总结一下:我需要返回的奖励数据不会刷新页面。这样做的最好方法是什么? (我已经在我的页面上使用jQuery)。

非常感谢大家!

插孔

回答

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请求返回时(由于成功或超时或其他错误),您再次启动请求。

有关详细示例,请参见How to show popup message like in stackoverflow

+0

非常好,谢谢!我采用推送通知/轮询的第一种方法。感谢您的帮助,Cletus! :) – Jack 2010-06-13 19:30:52

相关问题