2015-02-18 4 views
3

У меня есть много моделей, использующих created_time. И я хочу, чтобы все GridViews отображали модели, отсортированные по created_time DESC.Переопределить сортировку по умолчанию для ActiveDataProvider в Yii2

Прямо сейчас я пишу что-то вроде этого

$dataProvider = new \yii\data\ActiveDataProvider([ 
     'query' => MyModel::find(), 
     'sort' => [ 
      'defaultOrder' => [ 
       'created_time' => SORT_DESC 
      ] 
     ], 
    ]); 

Вместо того, чтобы писать все sort конфигурации я попытался пути ниже, но ничего не работает.

  1. Используя контейнер

    \Yii::$container->set(\yii\data\ActiveDataProvider::class, 
         [ 
        'sort' => [ 
         'defaultOrder' => [ 
          'created_time' => SORT_DESC 
         ] 
        ] 
    ]); 
    
  2. Переопределение sort в расширенном классе.

    class ActiveDataProvider extends \yii\data\ActiveDataProvider { 
    
        public $sort = [ 
         'defaultOrder' => [ 
          'created_time' => SORT_DESC 
         ] 
        ]; 
    
    } 
    
  3. Перекрытия перед тем init() в расширенном классе работает, но он не будет работать, если конкретизация пытается переопределить снова.

    class ActiveDataProvider extends \yii\data\ActiveDataProvider { 
        public function init() { 
         $this->sort = [ 
          'defaultOrder' => [ 
           'created_time' => SORT_DESC 
          ] 
         ]; 
         parent::init(); 
        } 
    
    } 
    
    //but this won't work if I want to use the ascending 
    $dataProvider = new \app\components\data\ActiveDataProvider([ 
        'query' => MyModel::find(), 
        'sort' => [ 
         'defaultOrder' => [ 
          'created_time' => SORT_ASC 
         ] 
        ], 
    ]); 
    

ответ

2

Вы должны сделать это для yii\data\Sort и не для yii\data\ActiveDataProvider. См. Документацию к объекту $sort.

1) с контейнером:

use Yii; 

... 

Yii::$container->set(\yii\data\Sort::className(), 
    'defaultOrder' => [ 
     'created_time' => SORT_DESC, 
    ], 
]); 

2) Перекрытие класса:

class Sort extends yii\data\Sort 
{ 
    public $defaultOrder' = [ 
     'created_time' => SORT_DESC, 
    ]; 
} 
+0

Первый не работает –

+1

Извините, мой плохой, он работает. Я должен использовать '\ yii \ data \ Sort' вместо' yii \ data \ Sort' –

+0

Как обрабатывать сортировку по умолчанию Если в некоторых моделях нет create_time? –

6

Чтобы сделать это для одного GridView, вы можете добавить 'defaultOrder' => ['created_time' => SORT_DESC] в массив, который принят по setSort():

$dataProvider->setSort([ 
     'attributes' => [ 
      'id', 
      ... 
     ], 
     'defaultOrder' => ['created_time' => SORT_DESC] 
    ]); 
+0

Да, но он хочет установить его глобально для всех GridViews. – arogachev

Смежные вопросы