Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii:如何设置活动计时器/运行时间_Php_Ajax_Yii - Fatal编程技术网

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::encode
echo返回该操作的输出,而不是返回该操作的输出

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);
        }
    });
})();