Как в GridView сделать самописный фильтр?

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

Как в GridView сделать самописный фильтр?

Сообщение Kreng »

По-умолчанию в grid view фильтр просто как input строка. Мне непонятно как нацепить на неё виджет выбора даты(ибо при обычном джиквери навешивании не срабатывает, т.к при клике на дату теряется фокус и таблица сразу обновляется). И ещё хочу узнать как сделать нестандартный фильтр(ну в нём будет несколько полей-фильтров(inxut,checkbox итд итп))
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как в GridView сделать самописный фильтр?

Сообщение Dominus »

Я делал так, для User:
View:

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

//...
[
    'attribute' => 'last_visit',
    'filter' => \yii\jui\DatePicker::widget([
       'model' => $searchModel,
       'attribute' => 'date_from',
       'dateFormat' => 'dd.MM.yyyy',
       'options' => [
           'class' => 'form-control',
           'placeholder' => 'Select Date',
           'data' => [
                'pjax' => true,
           ],
        ]
    ]),
    'format' => 'datetime',
 ],
//...
UserSearch:

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

//...
class UserSearch extends User
{
    public $date_from;

    public function rules()
    {
        return [
            [['id', 'status', 'created_at', 'updated_at'], 'integer'],
            [['username', 'date_from', 'email'], 'safe'],
        ];
    }

    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

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

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            $query->where('0=1');
            return $dataProvider;
        }
        
        $query->andFilterWhere([
            'id' => $this->id,
            'status' => $this->status,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ]);

        $query->andFilterWhere(['like', 'username', $this->username])
            ->andFilterWhere(['like', 'email', $this->email])
            ->andFilterWhere(['>=', 'last_visit', $this->date_from ? strtotime($this->date_from . ' 00:00:00') : null])
            ->andFilterWhere(['<=', 'last_visit', $this->date_from ? strtotime($this->date_from . ' 23:59:59') : null]);

        return $dataProvider;
    }
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Kreng
Сообщения: 202
Зарегистрирован: 2017.02.16, 10:11

Re: Как в GridView сделать самописный фильтр?

Сообщение Kreng »

Спасибо, а нестандартный можно ли сделать?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как в GridView сделать самописный фильтр?

Сообщение Dominus »

Kreng писал(а): 2017.08.23, 00:25 Спасибо, а нестандартный можно ли сделать?
Что значит не стандартный?
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как в GridView сделать самописный фильтр?

Сообщение Dominus »

Вот я делал для темизированной адмники фильтр с bootstrap-datepicker

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

$language = Yii::$app->language;
$js = new \yii\web\JsExpression("
    $(document).on('ready pjax:success', function() {
        $('#datepicker').datepicker({
            language: '{$language}',
            autoclose: true,
            format: 'dd.mm.yyyy'
        });
    });
");

$this->registerJs($js, \yii\web\View::POS_END);

//...
[
   'attribute' => 'last_visit',
   'filter' => '<div class="form-group"><div class="input-group date"><div class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></div>'
    . Html::activeInput('text', $searchModel, 'date_from', [
        'id' => 'datepicker',
        'class' => 'form-control',
        'placeholder' => 'Select Date',
        'data' => [
          'pjax' => true,
        ],
     ]) . '</div></div>',
    'format' => 'datetime',
     'headerOptions' => [
             'style' => 'width: 165px;'
     ]
],
//...
UserSearch тот же.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Kreng
Сообщения: 202
Зарегистрирован: 2017.02.16, 10:11

Re: Как в GridView сделать самописный фильтр?

Сообщение Kreng »

Прикольно,спасибо.
Ответить