2013-10-20 22 views
0

我在我的控制器中有這個工作函數。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  => '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秒的時間間隔?

+0

做一個ajax調用或實現這個計時器在JS –

+0

我希望yii有這樣做很酷和簡單的方法。 –

+0

保存數據庫中的時間戳,並與之相比較! – tinybyte

回答

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

那麼在您看來,您可以使用AJAX與JS方法setTimeout()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調用將POST中的數據發送到您的操作,並將結果追加到類別爲result的html元素中。過程完成後,調用setTimeout以在5000毫秒後再次啓動整個過程。

此代碼沒有經過測試,但它應該給你一個如何到達那裏的想法。

+0

會嘗試這一個,但我現在基本上得到的圖片,感謝兄弟。 –