Сортировка по виртуальному полю

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

Сортировка по виртуальному полю

Сообщение iZacNT »

Доброго времени суток!

Подскажите как отсортировать данные по виртуальному полю.
Имеем:

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

<?= GridView::widget([
        'dataProvider' => $dataProvider,
     //   'filterModel' => $searchModel,
        'columns' => [
            [
                'attribute' => 'company_name',
                'format' => 'raw',
                'value' => function($data){
                    return Html::a($data->company_name, ['view', 'id' => $data->id],
                            ['style' => 'font-size: 20px; font-weight: bold;'])."<br>".
                        Html::a("Edit", ['update', 'id' => $data->id])."  ".
                        Html::a("Delete", ['delete', 'id' => $data->id],
                            [
                            'style' => 'color: red',
                            'title' => Yii::t('app', 'lead-delete'),
                            'alt' => 'Delete',
                            'aria-label'=> 'Delete' ,
                            'data-confirm'=> 'Are you sure you want to delete this item?' ,
                            'data-method'=> 'post' ,
                        ]);
                }
            ],
            'phone',
            'email',
            'fullAddress',
            'planInfo.name:raw:Plan Name',
            [
                'attribute' => 'payment',
                'format' => 'raw',
                'label' => 'Payment',
                'value' => function($data)
                {
                    if($data->isFreeAndCheck() || $data->isNotFreeAndCheck()){
                        return '<i class="fa fa-check" style="font-size: 20px; color: green"></i>';
                    }
                    if($data->isFreeAndPause()){ return $data->planInfo->description;}
                    if($data->isNotFreeAndPause()){ return Html::button('Pay', ['class' => 'btn btn-warning']);}

                    return '<i class="fa fa-bomb" style="font-size: 20px; color: red"></i> Error';
                }
            ],
        ],
        'tableOptions' => [
            'class' => 'table table-borderless table-hover'
        ],
    ]); ?>
Нужно отсортировать по атрибуту payment (Поле выводит требуемые действия для дальнейшей работы в зависимости от статуса компании и типа плана)
Как сделать сортировку по такому полю
ActiveDataProvider:

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

public function allCompanies(): ActiveDataProvider
    {
        return new ActiveDataProvider([
            'query' => $this->findByClientID()->leftJoin('plans', '`plans`.`id` = `companies`.`plan`'),
            'pagination' => [
                'pageSize' => 10
            ],
        ]);
    }

    public function setSort(ActiveDataProvider $dataProviderCompanies): void
    {
        $dataProviderCompanies->setSort([
            'attributes' => [
                'company_name',
                'phone',
                'email',
                'fullAddress' => [
                    'asc' => ['country' => SORT_ASC, 'state' => SORT_ASC, 'city' => SORT_ASC, 'address' => SORT_ASC],
                    'desc' => ['country' => SORT_DESC, 'state' => SORT_DESC, 'city' => SORT_DESC, 'address' => SORT_DESC],
                    'default' => SORT_DESC,
                    'label' => 'Full Address',
                ],
                'planInfo.name' => [
                    'asc' => ['plans.name' => SORT_ASC],
                    'desc' => ['plans.name' => SORT_DESC],
                ],
            ]
        ]);
    }
Ответить