2012-04-27 2 views
1

CATIiveDataProvider를 다시 정렬하는 방법을 Yii에서 찾고 있습니다. CActiveDataProvider 다시 정렬

은 현재 내가 정렬 페이지가 매겨진 데이터를 가져 오도록 데이터 공급자를 사용하고 있습니다.

그때 특정 필드에 대한 데이터를 조정 foreach 루프로 통해 반복하고, 지금은 다시 정렬 할 필요가 새로 조정 된 데이터를 기반으로. 나는 계산 된 값을 해결하기 위해 다른 DB (MySQL의) 쿼리해야하고 처리하는 동안 스위칭을 좋아하지 않는 것 때문에

나는 afterFind를 사용하여 모델의 데이터를 정렬 할 수 없습니다.

CArrayDataProvider를 사용하고 싶지 않습니다. 왜냐하면 데이터를 조정하는 동안 컨트롤을 루프에 넣지 않으면 데이터가 페이지 매김을하지 못하기 때문에 데이터가 얼마나 돌아올 지 모릅니다 200 레코드를 말하지만 디스플레이를 조정하는 데는 20 직관이 어긋납니다.

이 모두 다음 CGridView 위젯에 푸시됩니다.

은 이제 I는, 예를 들면 오름차순으로 이하 어레이 재조정 할 필요가있다. 당신은 단순히 기존 CDataProvider 래핑 자신의 새로운 CDataProvider를 구현해야처럼

$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); 

답변

2

는 소리가 난다. 몇 가지 메서드를 재정의해야하지만 대부분의 경우 래핑 된 데이터 공급자에게 전달할 수 있습니다. 이 프로토 타입을 위해 작동하지만 포스트를 지정합니다 - 나는 정렬 여기에 고정 배선이 맞는지

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

:

$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은 다음과 같습니다 코드는 다음과 같은 것을 찾고 끝낼 수 있습니다

  • CDataProvider 무시하는 sort 속성을 노출 : 때문에 처리는 일종의 깨끗하게 사소한 없습니다. 이 속성을 완전히 통합하는 것은 중요한 작업 (여러 정렬 기준 등을 고려한 코드를 작성해야 함) 또는 기본 클래스의 sort과 비교하여 CustomDataProvider.sort의 의미를 변경해야합니다. CDataProviderCSort과 결혼 했으므로 OO 관점에서 가장 깨끗한 솔루션을 원한다면 IDataProvider을 처음부터 구현하는 것이 가장 좋습니다.
  • 그것은 작품을 선별 한 '종류 property is used, because sort`은, 랩 된 데이터 공급자가 할 무엇은 "후 처리"종류가 같은 시간에 할 것입니다 무슨 모두를 반영 할 수없는 경우 어떻게 CustomDataProvider의 사용자에게 직관적 아니다; 그러나 위의 두 가지 모두 최종 결과에 영향을 미칩니다.

프로토 타입을 작동시킨 다음 개체 모델이 무엇인지 생각하는 것이 좋습니다. 이것에 대한

+0

덕분에, 그러나 나는 데이터가 의지 도착하는 시점에서하거나 점수에 정렬되도록 내 사용자 지정 공급자에 구현하는 방법을 모르겠습니다. –

+0

@DamianCrawford : 대답이 상당히 수정되었습니다. 이제 더 유용할까요? heads up : 이제'getData' 대신에'fetchData'를 오버라이드합니다. – Jon

관련 문제