0

我的控制器中有这个工作功能。

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

并在我看来称之为:

$this->time_elapsed_string(strtotime($model->created_on))

输出很好,但是如何在不刷新页面的情况下更新特定视图,间隔为 5 到 10 秒?

4

1 回答 1

1

这是一种方法,您可以使用 jQuery 的 ajax 调用实现类似计时器的功能,每 5 秒更新一次值。

将您的time_elapsed_string()方法放入控制器中的操作中,而不是返回该操作的输出,而是使用JSON::encode

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

setTimeout()然后在您看来,您可以在参数中使用带有 js 方法的 ajax 调用completed,如下所示:

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

在这种情况下,ajax 调用将 a 中的数据发送POST到您的操作,并将结果附加到带有 class 的 html 元素中result。进程完成setTimeout后,5000 毫秒后调用再次启动整个进程。

此代码未经测试,但它应该让您了解如何到达那里。

于 2013-10-20T16:07:36.000 回答