覆盖Yii2中ActiveDataProvider的默认排序

时间:2015-02-18 10:07:13

标签: yii2

我有很多使用created_time的模型。我希望所有的GridView都显示按created_time DESC排序的模型。

现在我写这样的东西

$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 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

您应该为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,
    ];
}