t-alexashka
@t-alexashka
Сразу пишу legacy код

Checkbox как gridview фильтр?

Привет товарищи друзья. Давненько я вас не мучал глупыми вопросами, но время пришло.

В GridView хедере добавляю контент чтобы отображались записи только с меткой в базе is_own = 1|0

[
    'content' => '
        <div class="checkbox">
            <label>
                <input type="checkbox" id="isownonly" name="SetsSearch[is_own]" class="grid-filter" ' . ($searchModel->is_own == 'on' ? 'checked' : '') . '>
                Только наш КЦ
            </label>
        </div>',
],


5bbb849bf1b93604858964.png

Так вот этот чекбокс получается внутри pjax контейнера, и не знаю связанно это с этим или нет, но он после установки уже не пропадает и всегда остается чекнутым, даже если пытаться снять, и всегда показывает записи is_own = 1. как его починить чтобы он переключался?
  • Вопрос задан
  • 689 просмотров
Решения вопроса 1
t-alexashka
@t-alexashka Автор вопроса
Сразу пишу legacy код
вопрос решен таким костылем как мокирование чекбокса скрытым полем:

php
[
    'content' => '
        <div class="checkbox">
            <label>
                <input type="checkbox" id="isownonly" class="" ' . ($searchModel->is_own == '1' ? 'checked' : '') . '>
                Только наши
            </label>
        </div>
        <input type="hidden" class="grid-filter" name="SetsSearch[is_own]" value="' . ($searchModel->is_own == '1' ? '1' : '0') . '">
        ',
],


js
$(document).on('change', '#isownonly', function (e) {
	$('[name*=is_own]').val(
		$(this).is(':checked') ? 1 : 0
	).trigger('change');
});


Если кто знает более элегантное решение заставить чекбокс-фильтр работать с pjax - дайте знать, всем пригодится.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kaliyan
@kaliyan
php-developer, wordpress-developer
У меня такая ситуация (yii2 + GridView + Pjax):
5dc3d8fadb423473696690.png
Изначально было как у вас. Применил ваше решение - заработало.

Появилась другая проблема: если перейти на другую страницу пагинации (например, &page=12), а после этого отфильтровать любым фильтром, то _GET параметр оставался, а после фильтрации переходило сразу на последнюю страницу. Получалось &page12, а пагинатор показывал последнюю страницу после фильтрации.

Обе проблемы решились путем добавления в GridView
'filterUrl' => Url::to(['/orders']),

При этом, нужно указывать 'uncheck' => null, если пользуетесь Html::activeCheckbox, так как задваиваются _GET параметры в адресной строке при чекнутом чекбоксе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы