覆盖Yii2中ActiveDataProvider的默认排序

Eri*_*ock 3 yii2

我有很多模特使用created_time.我希望所有的GridViews都能显示按created_timeDESC 排序的模型.

现在我写这样的东西

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

sort我没有编写所有配置,而是尝试了以下方法,但没有任何效果.

  1. 使用容器

    \Yii::$container->set(\yii\data\ActiveDataProvider::class,
            [
        'sort' => [
            'defaultOrder' => [
                'created_time' => SORT_DESC
            ]
        ]
    ]);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 覆盖sort扩展类.

    class ActiveDataProvider extends \yii\data\ActiveDataProvider {
    
        public $sort = [
            'defaultOrder' => [
                'created_time' => SORT_DESC
            ]
        ];
    
     }
    
    Run Code Online (Sandbox Code Playgroud)
  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
            ]
        ],
    ]);
    
    Run Code Online (Sandbox Code Playgroud)

dea*_*acs 6

要为单个GridView执行此操作,您可以添加'defaultOrder' => ['created_time' => SORT_DESC]到以下接受的数组setSort():

    $dataProvider->setSort([
        'attributes' => [
            'id',
            ...
        ],
        'defaultOrder' => ['created_time' => SORT_DESC]
    ]);
Run Code Online (Sandbox Code Playgroud)