2017-11-19 6 views
0

ArrayDataProvider을 사용하여 모델을 혼합 한 다음 하나의 데이터 공급자로 병합했습니다. 그리드보기에서 데이터 공급자를 사용하고 모든 것이 잘 작동합니다. 하지만 그리드 뷰를 한 열씩 주문해야하는데 많은 솔루션을 시도했지만 그 중 아무 것도 작동하지 않았습니다.ArrayDataProvider를 사용하여 하나의 dataprovider로 혼합 모델 정렬

이 내 모델 코드 (item_order에 의해 순서)

public function getAllSelectedItemsInTheUnit($unitId, $grid = false) 
    { 
     $finalList = array(); 
     $storiesList = array(); 
     $activityList = array(); 
     $breakList = array(); 
     $stories = UnitStories::find()->joinWith(['story'])->where("unit_id=$unitId")->all(); 
     if (count($stories) > 0) { 
      foreach ($stories as $item) { 
       $storiesList[] = [ 
        'key' => self::TYPE_STORY . $item->id, 
        'id' => $item->id, 
        'title' => $item->story->title, 
        'type' => self::TYPE_STORY, 
        'item_order' => $item->unit_order, 
       ]; 
      } 
     } 

     $activities = UnitActivities::find()->joinWith(['activity'])->where("unit_id=$unitId")->all(); 
     if (count($activities) > 0) { 
      foreach ($activities as $item) { 
       $activityList[] = [ 
        'key' => self::TYPE_ACTIVITY . $item->id, 
        'id' => $item->id, 
        'title' => $item->activity->title, 
        'type' => self::TYPE_ACTIVITY, 
        'item_order' => $item->activity_order, 
       ]; 
      } 
     } 

     $breaks = UnitBreaks::find()->where("unit_id=$unitId")->all(); 
     if (count($breaks) > 0) { 
      foreach ($breaks as $item) { 
       $breakList[] = [ 
        'key' => self::TYPE_BREAK . $item->id, 
        'id' => $item->id, 
        'title' => $item->title, 
        'type' => self::TYPE_BREAK, 
        'item_order' => $item->unit_order, 
       ]; 
      } 
     } 
     $finalList = array_merge($storiesList, $activityList, $breakList); 
     $dataProvider = new ArrayDataProvider([ 
       'allModels' => $finalList, 'key' => 'key', 
       'sort' => [ 
        'attributes' => ['item_order'], 
       ], 

      ]); 

      return $dataProvider; 


    } 

모든 솔루션이 아주 좋은 것입니다 심지어 내가 문제가 해결됩니다 추측 순수 PHP에 의해 배열을 정렬 할 수 있습니다.

답변

1

당신은 usort()

usort($finalList, function ($a, $b) { 
    return $a['item_order'] < $b['item_order']; 
}); 

콜백 >, <, <= 등에 조건을 추가 사용할 수 있습니다