1

Yii で CActiveDataProvider を再ソートする方法を探しています。

現在、データ プロバイダーを使用して、並べ替えおよびページ分割されたデータを取得しています。

次に、特定のフィールドのデータを調整する foreach ループを使用してループしています。次に、新しく調整されたデータに基づいてデータを再ソートする必要があります。

afterFind を使用してモデル内のデータを並べ替えることができません。別の DB (MySQL) にクエリを実行して計算値を計算する必要があり、処理中の切り替えが気に入らないようです。

データの調整中にコントロールをループに入れない限り、返されるデータをページ分割する明確な方法がないため、CArrayDataProvider を使用したくありませんが、200 レコードなど、どれだけのデータが返されるかわかりません。 、しかし、ディスプレイの 20 だけを調整することは直感に反するようです。

これはすべて CGridView ウィジェットにプッシュされます。

たとえば、下の配列を昇順で再調整する必要があります。

$dataProvider = new CActiveDataProvider( blah );

foreach ( $dataProvider->getData() as $data ) {
 $data->Score += SomeModel::model()->findByPk(1)->NewScore;
}

array(
'Score' => 7
),
array(
'Score' => 6
)

$this->render('blah', array('data' => $dataProvider);
4

1 に答える 1

2

CDataProvider既存のをラップする独自の新しいものを単に実装する必要があるようですCDataProvider。いくつかのメソッドをオーバーライドする必要がありますが、ほとんどの場合、ラップされたデータプロバイダーに転送するだけです。コードは次のようになる可能性があります。

$dataProvider = new CActiveDataProvider(...);
$myProvider = new CustomDataProvider($dataProvider);

// you could make CustomDataProvider work like this:
$myProvider->dataMutator = function(&$row, $key) {
    $row->Score = SomeModel::model()->findByPk(1)->NewScore;
};

$this->render('blah', array('data' => $myProvider);

CustomDataProvider::fetchDataこのように見えるかもしれません:

protected function fetchData()
{
    $data = $this->wrappedProvider->fetchData();
    array_walk(&$data, $this->dataMutator);
    uasort($data, function($a, $b) { return $a->Score - $b->Score; });
    return $data;
}

私はここでソートを配線しました-これはプロトタイピングには機能しますが、後処理ソートをクリーンに指定することは簡単ではありません。理由は次のとおりです。

  • CDataProvidersort無視されるプロパティを公開します。そのプロパティを完全に統合することは、簡単な作業ではないか(複数のソート基準を尊重するコードを作成する必要があるなど)、またはその基本クラスCustomDataProvider.sortと比較してのセマンティクスを変更します。はと結婚しているので、OOの観点から最もクリーンなソリューションを求めている場合は、最初から実装するのが最善です。sortCDataProviderCSortIDataProvider
  • 単一の「 sortsort」がラップされたデータプロバイダーが行うことと「後処理」ソートが同時に行うことの両方を反映できないCustomDataProvider場合、ソートがどのように機能するかをユーザーが直感的に理解することはできません。property is used, becauseただし、上記の両方が最終結果に影響します。

プロトタイプを機能させてから、オブジェクトモデルがどうあるべきかをよく考えておくことをお勧めします。

于 2012-04-27T11:08:31.560 に答える