Yii2 Сортировка GridView нарушает фильтр множественного выбора, не может отменить выбор после сортировки
У меня есть столбец сетки yii2 с фильтром множественного выбора, на имеет много отношений:
в поисковой модели:
$dataProvider->sort->attributes['programSelect'] = [
'asc' => ['programs.name' => SORT_ASC],
'desc' => ['programs.name' => SORT_DESC],
];
Колонка в поле зрения:
$columns[]=[
'format' => 'raw',
'attribute' => 'programSelect',
'value' => function ($data) {return '...'},
'headerOptions' => [
'style' => 'width:100px',
'data-header-attrib'=>'programs',
],
'filter' => Html::activeDropDownList($searchModel, 'programSelect', $myPrograms,
[
'class' => 'form-control multiselect-filter',
'id' =>'programs-filter',
'multiple' => true,
]),
]
Вид сетки работает нормально до первой сортировки. Ссылки, которые генерирует сортировщик, содержат повторяющиеся элементы следующим образом.
При первой загрузке сетки URL-адрес чернил:
http://myurl?ModelSearch[programSelect]=&ModelSearch[programSelect][]=2&ModelSearch[programSelect][]=26
(обратите внимание на [] для множественного выбора параметров, что ожидается для параметров URL массива)
После нажатия на ссылку сортировки, параметры URL получают индексы массива следующим образом:
http://myurl?ModelSearch[programSelect][0]=2&ModelSearch[programSelect][1]=26&sort=programSelect
Это нарушает множественный выбор, и я больше не могу изменить параметры множественного выбора в фильтре.
Кто-нибудь из разработчиков yii2 знает, как решить эту проблему?
Спасибо
1 ответ
Закончилось, взламывая мой путь с этим с небольшим количеством JavaScript:
$('.grid-pjax').on('pjax:complete', function(event, xhr, options) {
// yii UrlManager does not handle array values properly for urls
// it adds array keys into the url when parsing- changes param[]=x to param[0]=x
// this breaks GridView filtering after clicking a grid column sort header link
// process the sort header links to remove such array indexes
//////////////////////////////////////////////////////////////////////////
var re = /%5D%5B\d+%5D/gi;
$(myGridSelector+' th>a').each(function(i){
var badUrl=$(this).attr('href');
$(this).attr('href',badUrl.replace(re, '%5D%5B%5D'))
//console.log('href is now:');
//console.log($(this).attr('href'));
})
})