2017-02-22 43 views
0

У меня есть yii2 GridView колонки с множественным выбором фильтром, на имеет много соотношения:Yii2 GridView сортировка брейков множественного выбор фильтр, не в силах отменить выбор после сортировки

в модели поиска:

$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-адрес из lsorting чернил:

http://myurl?ModelSearch[programSelect]=&ModelSearch[programSelect][]=2&ModelSearch[programSelect][]=26 

(обратите внимание на [] для мульти-выберите Params, который, как ожидается для массива URL-адрес Params)

После нажатия сортировать ссылку, то URL PARAMS получить индексы массива следующим образом:

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

    })