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

因此标题有点含糊,但我会尝试举一个例子。基本上,我的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)。

非常感谢大家!

插口

参考方案

您需要实现推送通知系统。有两种方法可以做到这一点。您可以简单地轮询更改:

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。

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP-从最后一个循环中删除逗号 - php

我在循环时有一个PHP,如果是最后一个循环,我想从,中删除​​最后一个逗号echo '],'; while($ltr = mysql_fetch_array($lt)){ echo '['; echo $ltr['days']. ' ,'. $ltr['name…