Php Yii:如何设置活动计时器/运行时间
我的控制器中有这个工作功能Php Yii:如何设置活动计时器/运行时间,php,ajax,yii,Php,Ajax,Yii,我的控制器中有这个工作功能 public function time_elapsed_string($ptime) { $etime = time() - $ptime; if ($etime < 1) { return '0 seconds'; } $a = array( 12 * 30 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60
public function time_elapsed_string($ptime)
{
$etime = time() - $ptime;
if ($etime < 1)
{
return '0 seconds';
}
$a = array( 12 * 30 * 24 * 60 * 60 => 'year',
30 * 24 * 60 * 60 => 'month',
24 * 60 * 60 => 'day',
60 * 60 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach ($a as $secs => $str)
{
$d = $etime / $secs;
if ($d >= 1)
{
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago';
}
}
}
输出很好,但是如何在不刷新页面的情况下以5到10秒的间隔更新特定视图呢?这里有一种方法,您可以通过jQuery的ajax调用实现类似计时器的功能,该调用每5秒更新一次值 将
time\u appeased\u string()
方法放入控制器中的一个操作中,并使用JSON::encodeecho返回该操作的输出,而不是返回该操作的输出
public function actionAjaxElapsedTime()
{
$ptime = $_POST['ptime'];
$etime = time() - $ptime;
if ($etime < 1)
{
$data = '0 seconds';
echo CJSON::encode($data);
Yii::app()->end();
}
....
foreach ($a as $secs => $str)
{
$d = $etime / $secs;
if ($d >= 1)
{
$r = round($d);
$data = $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago';
echo CJSON::encode($data);
Yii::app()->end();
}
}
}
在这种情况下,ajax调用将POST
中的数据发送到您的操作,并将结果附加到带有类result
的html元素中。当进程完成时,将调用setTimeout
,以在5000毫秒后再次启动整个进程
这段代码没有经过测试,但它应该能让您了解如何实现这一点。进行ajax调用或在JSi中实现此计时器。我希望yii有一种很酷且简单的方法来实现这一点。将时间戳保存在数据库中,并与之进行比较!是的,它被保存并创建了一个字段名,我希望在视图中,该值每秒钟或5秒更新/更改一次。就像这里的这个评论,在用户名“1分钟前”之后,即使我不刷新整个页面,它也会改变。我会试试这个,但我现在基本上明白了,谢谢老兄。
public function actionAjaxElapsedTime()
{
$ptime = $_POST['ptime'];
$etime = time() - $ptime;
if ($etime < 1)
{
$data = '0 seconds';
echo CJSON::encode($data);
Yii::app()->end();
}
....
foreach ($a as $secs => $str)
{
$d = $etime / $secs;
if ($d >= 1)
{
$r = round($d);
$data = $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago';
echo CJSON::encode($data);
Yii::app()->end();
}
}
}
(function update() {
$.ajax({
type: "POST",
url: "<?php echo Yii::app()->createUrl('yourController/ajaxElapsedTime'); ?>",
data: {ptime : <?php echo strtotime($model->created_on); ?>},
success: function(data) {
$('.result').html(data);
},
complete: function() {
setTimeout(update, 5000);
}
});
})();