ActiveRecord defaultSort overwriting

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
GHopper
Сообщения: 83
Зарегистрирован: 2017.06.05, 10:53

ActiveRecord defaultSort overwriting

Сообщение GHopper »

Приветсвую.

Есть модель ActiveRecord поверх таблицы с Nested Sets деревом. Запилил, ноды добавляются/удаляются, все работает. Теперь хочу сделать сортировку по умолчанию для корректного отображения дерева. Добавляю defaultOrder:

Код: Выделить всё

    public function search($params)
    {
        $query = Category::find();

        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
                'defaultOrder' => [
                    'lft' => SORT_ASC,
                ]
            ],
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        $dataProvider->setSort([
            'attributes' => [
                'title' => [
                    'asc' => ['name' => SORT_ASC],
                    'desc' => ['name' => SORT_DESC],
                    'default' => SORT_ASC
                ],
            ]
        ]);

        $query->andFilterWhere(['ilike', 'name', $this->title]);

        return $dataProvider;
    }
    
Смотрю на страницу и понимаю, что ничего не изменилось. Дебажу некоторое время и обнаруживаю, что выражение $dataProvider->setSort() обнуляет значение defaultOrder, выставленное выше по коду. Погуглил и нашел решение:

Код: Выделить всё

$dataProvider->sort->attributes['title'] =  [
                    'asc' => ['name' => SORT_ASC],
                    'desc' => ['name' => SORT_DESC],
                    'default' => SORT_ASC
                ]
Но блин. Виртуальное свойство, прямое обращение, массив... Подозреваю что я что-то делаю не так? Как правильно задать defaultOrder в данном кейсе? Да так, чтобы сортировка по title (это вычисляемое поле) сохранилась.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: ActiveRecord defaultSort overwriting

Сообщение urichalex »

А если так?
$dataProvider->sort->attributes['title']['default'] = SORT_ASC
GHopper
Сообщения: 83
Зарегистрирован: 2017.06.05, 10:53

Re: ActiveRecord defaultSort overwriting

Сообщение GHopper »

Все дело в том, что мой вариант

Код: Выделить всё

$dataProvider->sort->attributes['title'] =  [
                    'asc' => ['name' => SORT_ASC],
                    'desc' => ['name' => SORT_DESC],
                    'default' => SORT_ASC
                ]
работает корректно.
Меня смущает сама конструкция $dataProvider->sort->attributes['title'] И то, что в офф. документации предлагается добавить

Код: Выделить всё

            'sort' => [
                'defaultOrder' => [
                    'lft' => SORT_ASC,
                ]
            ],
при создании объекта ActiveDataProvider и нигде не говорится о том, что последующий вызов setSort() может перезаписать это значение.
В общем, моя задача решена и мне хотелось бы уточниться, насколько оптимальное решение я выбрал.
Ответить