Автоотправка фильтра input date

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
pochchta
Сообщения: 17
Зарегистрирован: 2020.07.15, 09:28

Автоотправка фильтра input date

Сообщение pochchta »

В GridView в строку фильтров я добавил input type="date". Если начать печатать дату в поле, то до конца ее написать не получится. Запрос отправится с такой датой: 11.11.0001. Можно ли отключить onChange для определенного поля? Но если даже можно, то скорее всего не будет работать автоотправка при клике мышкой в календарь этого поля. Наверно, нужно сделать задержку (1 секунду, например) между изменением и отправкой. Как это можно сделать?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Автоотправка фильтра input date

Сообщение unknownby »

pochchta писал(а): 2020.12.03, 07:33 В GridView в строку фильтров я добавил input type="date".
Может лучше так добавить? Вместо картика, если не используете, можно использовать другой пикер

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

[
                'attribute' => 'your_column_date',
                'format' => 'date',
                'filterType' => '\kartik\widgets\DatePicker',
                'filterWidgetOptions' => [
            		'pluginOptions' => ['autoclose' => true],
        	],
],
pochchta
Сообщения: 17
Зарегистрирован: 2020.07.15, 09:28

Re: Автоотправка фильтра input date

Сообщение pochchta »

Спасибо. А если в фильтре (input = text) я использую autoComplete, то как сымитировать автоотправку после выбора (в pjax)?

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

// clientOptions
                'select' => new JsExpression("function(event, ui) {
                    $('#{$attribute}').val(ui.item.label);
                    e = $.Event('keydown', { keyCode: 13});
                    $('#{$attribute}').trigger(e);		// Так ошибка: Uncaught RangeError: Maximum call stack size exceeded

                    $('#{$attribute}').val(ui.item.label);
                    $('#{$attribute}').trigger('change')	// Так иногда дублируются запросы
                    
                    $('#{$attribute}').val(ui.item.label);
                    $('#{$attribute}').trigger('change')	// Так иногда не отправляются запросы

 *                  $.pjax.reload({
                    	container: '#my-pjax-container',
                    	url: '" . Url::to('') . "',
                   	type: 'GET',
                    	timeout: 5000,				// Придется вручную собирать все параметры
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Автоотправка фильтра input date

Сообщение unknownby »

pochchta писал(а): 2021.02.02, 11:07 Спасибо. А если в фильтре (input = text) я использую autoComplete, то как сымитировать автоотправку после выбора (в pjax)?

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

// clientOptions
                'select' => new JsExpression("function(event, ui) {
                    $('#{$attribute}').val(ui.item.label);
                    e = $.Event('keydown', { keyCode: 13});
                    $('#{$attribute}').trigger(e);		// Так ошибка: Uncaught RangeError: Maximum call stack size exceeded

                    $('#{$attribute}').val(ui.item.label);
                    $('#{$attribute}').trigger('change')	// Так иногда дублируются запросы
                    
                    $('#{$attribute}').val(ui.item.label);
                    $('#{$attribute}').trigger('change')	// Так иногда не отправляются запросы

 *                  $.pjax.reload({
                    	container: '#my-pjax-container',
                    	url: '" . Url::to('') . "',
                   	type: 'GET',
                    	timeout: 5000,				// Придется вручную собирать все параметры
Может стоит обернуть Grid и Pjax ?
pochchta
Сообщения: 17
Зарегистрирован: 2020.07.15, 09:28

Re: Автоотправка фильтра input date

Сообщение pochchta »

Все обернуто в grid и pjax.
При выборе пункта в autoComplete не происходит события "keydown". Нужно нажимать enter, а хочется сразу автоматически.
Еще в gridview есть событие "change", которое тоже не происходит. Как мне кажется происходит так:

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

// В "devtool elements" значение input в свойстве value не меняется, меняется только на самой странице.
$('#name').val('text')

// Если input value после applyFilter изменился, то происходит событие 'change' и повторно вызывается applyFilter.
$('#grid_id').yiiGridView('applyFilter');
Нашел как переопределить поведение (поиск после каждого введенного символа):
https://stackoverflow.com/questions/353 ... n-keypress

Ветвление в "select" решает такую проблему. Если предыдущее значение фильтра равно значению которое пользователь ввел в поиск autoComplete (а затем выбрал предложенное), то событие "change" не происходит и его нужно вызвать принудительно. Если, конечно, выбранное значение из предложенных не равно старому значению фильтра.
Вот так вроде работает:

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

    'select' => new JsExpression("function(event, ui) {
        searchParams = new URLSearchParams(location.search.substring(1));
        valueFromUrl = searchParams.get('$attribute');
        objectFilter = $('#{$attribute}');
        if (valueFromUrl === objectFilter.val()) {      // старый параметр поиска === начальное значение поиска autoComplete 
            if (valueFromUrl !== ui.item.label) {           // старый пп !== выбранное значение autoComplete
                objectFilter.val(ui.item.label);
                objectFilter.trigger('change');
            }
        } else {
            objectFilter.val(ui.item.label).blur();
        }
    }"),
Последний раз редактировалось pochchta 2021.02.03, 11:32, всего редактировалось 4 раза.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Автоотправка фильтра input date

Сообщение unknownby »

pochchta писал(а): 2021.02.03, 03:37 Все обернуто в grid и pjax.
При выборе пункта в autoComplete не происходит события "keydown". Нужно нажимать enter, а хочется сразу автоматически.
А можно увидеть контроллер, представление и модель поиска? :)
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Автоотправка фильтра input date

Сообщение unknownby »

pochchta писал(а): 2021.02.03, 03:37 Нашел как переопределить поведение (поиск после каждого введенного символа):
https://stackoverflow.com/questions/353 ... n-keypress

Ветвление в "select" решает такую проблему. Если предыдущее значение фильтра равно значению которое пользователь ввел в поиск autoComplete (а затем выбрал предложенное), то событие "change" не происходит и его нужно вызвать принудительно. Если, конечно, выбранное значение из предложенных не равно старому значению фильтра.
Вот так вроде работает:

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

    'select' => new JsExpression("function(event, ui) {
        searchParams = new URLSearchParams(location.search.substring(1));
        valueFromUrl = searchParams.get('$attribute');
        objectFilter = $('#{$attribute}');
        if (valueFromUrl === objectFilter.val()) {      // старый параметр поиска === начальное значение поиска autoComplete 
            if (valueFromUrl !== ui.item.label) {           // старый пп !== выбранное значение autoComplete
                objectFilter.val(ui.item.label);
                objectFilter.trigger('change');
            }
        } else {
            objectFilter.val(ui.item.label).blur();
        }
    }"),
Если вводить информацию в поля поиска и убрать фокус с поля, то найдет инфу. У вас поиск организован "налету". Если проблема решена, то отлично. А так у вас при вводе каждого символа должна была срабатывать отправка запроса. :)
pochchta
Сообщения: 17
Зарегистрирован: 2020.07.15, 09:28

Re: Автоотправка фильтра input date

Сообщение pochchta »

Нет, поиск после каждого введенного символа мне не нужен. Просто это понятный пример как переопределить поведение.
У меня не работала автоотправка при выборе "select". Но, если в pjax pushState будет отключен, то работать опять же не будет. :D
Лучше так получать GET параметр:

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

str = $('#grid_id').yiiGridView('data').settings.filterUrl;
searchParams = new URLSearchParams(str.substring(str.indexOf('?') + 1));
oldValueFilter = searchParams.get('$attribute');
pochchta
Сообщения: 17
Зарегистрирован: 2020.07.15, 09:28

Re: Автоотправка фильтра input date

Сообщение pochchta »

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

// чтобы отменить стандартный обработчик нужно дождаться, пока он установится
.off("change.yiiGridView keydown.yiiGridView", filter_selector);
Document ready не работает, обработчик еще не установлен.
Что нужно использовать? window.onload?
Ответить