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'));
        })

    })
Другие вопросы по тегам