2013-10-08 52 views
0

我使用Yii的Dataprovider基於列「points」輸出一羣用戶;Yii DataProvider更改每個結果中列的屬性

它現在工作正常,但我必須添加一個功能,所以如果用戶在線,他會得到額外的300分。

說傑克有100分,里士滿有300分,但傑克在線,傑克應該比里士滿高。

這裏是我現在的解決辦法:

$user=new Rank('search'); 
$user->unsetAttributes(); 
$user->category_id = $cid; 
$dataProvider = $user->search(); 
$iterator = new CDataProviderIterator($dataProvider); 
foreach($iterator as $data) { 

//check if online ,update points 

} 

然而,這似乎CDataProviderIterator直接改變我的分頁到最後一頁,我甚至不能再切換頁面。我該怎麼辦?

非常感謝!


這裏是列表視圖:

$this->widget('zii.widgets.CListView', array(
      'id'=>'userslist', 
      'dataProvider'=>$dataProvider, 
      'itemView'=>'_find', 
     'ajaxUpdate'=>false, 
      'template'=>'{items}<div class="clear"></div><div style="margin-right:10px;"><br /><br />{pager}</div>', 
      'pagerCssClass'=>'right', 
'sortableAttributes'=>array(
     // 'create_time'=>'Time', 
    ), 
)); 

在Rank.php模型

$criteria->with = array('user'); 
$criteria->select = '*, (IF(user.lastaction > CURRENT_TIMESTAMP() - 1800, points+300, points)) as real_points'; 
$criteria->order = 'real_points DESC'; 

然而更新的代碼,它拋出我的錯誤:

Active record "Rank" is trying to select an invalid column "(IF(user.lastaction > CURRENT_TIMESTAMP() - 1800". Note, the column must exist in the table or be an expression with alias. 
+0

您是否在此代碼之後使用CGridView或其他東西?我不相信你從迭代器對'$ data'所做的更改會影響你發送到網格或列表視圖的實際'$ dataProvider'。 – Pitchinnate

+0

@Pitchinnate你好我正在使用CListView。 – jackhao

+0

@Pitchinnate它們實際上只是將我的頁面定位到最後一頁,我根本無法更改頁面。 – jackhao

回答

1

CDataProviderIterator迭代每個dataprovider值,並在最後停止。我不知道這個類的全部內容,但認爲其原因在於一些內部迭代器,在您的foreach後停止在數據提供者的末尾。 當您不需要加載所有數據(對於大量數據),但需要處理每一行時,使用迭代器。

要解決您的問題,只需在您的視圖「_find」中處理數據。如果在線添加點。

或者,如果你想要把這個邏輯只在模型(以下MVC :)),添加方法模型:

public function getRealPoints() { 
    return ($this->online) ? ($this->points + 300) : $this->points; 
} 

你也可以使用$user->realPoints根據用戶在線狀態

拿分

更新:要通過「realPoints」來訂購你的清單,你需要在你的SQL中獲取它。 因此,請使用代碼:

$user=new Rank('search'); 
$user->unsetAttributes(); 
$user->category_id = $cid; 
$dataProvider = $user->search(); 

和修改$user->search()功能,加入:

$criteria->select = '*, (IF(online='1', points+300, points)) as real_points'; 
$criteria->order = 'real_points DESC'; 

其中onlinepoints - 你的表列。

+0

感謝您的幫助!所以通過這樣做,基於新的點,列表是否也會更新?我懷疑它......我需要按點排序的列表。 – jackhao

+0

@jackhao,更新了我的答案。希望它有幫助;) –

+0

嗨,謝謝你的幫助。對此,我真的非常感激。 – jackhao

相關問題