从PHP函数返回内容并同时触发jQuery操作的最佳方法是什么?

时间:2010-06-13 10:37:36

标签: php ajax codeigniter jquery

所以标题有点含糊不清,但我会试着举个例子。基本上,我在我的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)。

非常感谢大家!

杰克

1 个答案:

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

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