0

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.
4

1 に答える 1

1

CDataProviderIterator はすべての dataprovider 値を反復し、最後で停止します。私はこのクラスについてすべて知っているわけではありませんが、その理由は foreach の後に dataprovider の最後で停止する内部イテレータにあると思います。イテレータは、(大量のデータの) すべてのデータをロードする必要はないが、各行を処理する必要がある場合に使用されます。

問題を解決するには、ビュー「_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';

whereonlinepoints- テーブルの列。

于 2013-10-09T07:30:32.857 に答える