Автоотправка фильтра input date
Автоотправка фильтра input date
В GridView в строку фильтров я добавил input type="date". Если начать печатать дату в поле, то до конца ее написать не получится. Запрос отправится с такой датой: 11.11.0001. Можно ли отключить onChange для определенного поля? Но если даже можно, то скорее всего не будет работать автоотправка при клике мышкой в календарь этого поля. Наверно, нужно сделать задержку (1 секунду, например) между изменением и отправкой. Как это можно сделать?
Re: Автоотправка фильтра input date
Может лучше так добавить? Вместо картика, если не используете, можно использовать другой пикер
Код: Выделить всё
[
'attribute' => 'your_column_date',
'format' => 'date',
'filterType' => '\kartik\widgets\DatePicker',
'filterWidgetOptions' => [
'pluginOptions' => ['autoclose' => true],
],
],
Re: Автоотправка фильтра input date
Спасибо. А если в фильтре (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, // Придется вручную собирать все параметры
Re: Автоотправка фильтра input date
Может стоит обернуть Grid и Pjax ?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, // Придется вручную собирать все параметры
Re: Автоотправка фильтра input date
Все обернуто в grid и pjax.
При выборе пункта в autoComplete не происходит события "keydown". Нужно нажимать enter, а хочется сразу автоматически.
Еще в gridview есть событие "change", которое тоже не происходит. Как мне кажется происходит так:
Нашел как переопределить поведение (поиск после каждого введенного символа):
https://stackoverflow.com/questions/353 ... n-keypress
Ветвление в "select" решает такую проблему. Если предыдущее значение фильтра равно значению которое пользователь ввел в поиск autoComplete (а затем выбрал предложенное), то событие "change" не происходит и его нужно вызвать принудительно. Если, конечно, выбранное значение из предложенных не равно старому значению фильтра.
Вот так вроде работает:
При выборе пункта в 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 раза.
Re: Автоотправка фильтра input date
А можно увидеть контроллер, представление и модель поиска?
Re: Автоотправка фильтра input date
Если вводить информацию в поля поиска и убрать фокус с поля, то найдет инфу. У вас поиск организован "налету". Если проблема решена, то отлично. А так у вас при вводе каждого символа должна была срабатывать отправка запроса.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(); } }"),
Re: Автоотправка фильтра input date
Нет, поиск после каждого введенного символа мне не нужен. Просто это понятный пример как переопределить поведение.
У меня не работала автоотправка при выборе "select". Но, если в pjax pushState будет отключен, то работать опять же не будет.
Лучше так получать GET параметр:
У меня не работала автоотправка при выборе "select". Но, если в pjax pushState будет отключен, то работать опять же не будет.
Лучше так получать GET параметр:
Код: Выделить всё
str = $('#grid_id').yiiGridView('data').settings.filterUrl;
searchParams = new URLSearchParams(str.substring(str.indexOf('?') + 1));
oldValueFilter = searchParams.get('$attribute');
Re: Автоотправка фильтра input date
Код: Выделить всё
// чтобы отменить стандартный обработчик нужно дождаться, пока он установится
.off("change.yiiGridView keydown.yiiGridView", filter_selector);
Что нужно использовать? window.onload?