Код: Выделить всё
Pjax::begin(['id' => "test-grid-pjax", 'enablePushState' => false, 'enableReplaceState' => false]);
echo GridView::widget([
'id' => "test-grid",
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => $columns,
]);
Pjax::end();
Код: Выделить всё
$columns = [
'id',
[
'attribute' => 'start_guarantee_period',
'value' => function ($model) {
return $model->start_guarantee_period;
},
'filter' => kartik\date\DatePicker::widget(['value' => $searchModel->start_guarantee_period, 'name' => 'ItemSearch[start_guarantee_period]', 'pluginOptions' => [
'format' => 'dd.mm.yyyy',
'todayHighlight' => true
],
]),
],
];
- Если инициализацию переменной $columns поместить внутрь Pjax, т.е. ПОСЛЕ тега Pjax::begin, то можно кликнуть иконку даты, выбрать дату, данные отфильтруются. Потом ещё раз нажать, выбрать дату, отфильтруются и т.д.
- Если инициализацию переменной $columns поместить за Pjax, т.е. ДО тега Pjax::begin, то можно выбрать дату только первый раз. После перезагрузки таблицы клик по иконкам не вызывают никаких событий. Просто мертвы.
Да, JS отваливается после перезагрузки контента. Да, можно это починить либо поместив $columns внутрь тега Pjax или после перезагрузки таблицы выполнить js код для перезапуска пикера:
Код: Выделить всё
$('#w0-kvdate').kvDatepicker(window.kvDatepicker_33d8ead7);
Но основной вопрос: почему такая магия происходит? Почему позиция переменной в конкретном выше коде PHP на сервере каким-то образом влияет на поведение JS? Я понимаю, если бы происходил echo переменной, а pjax буферизировал бы этот вывод и выводил после навешивания слушателей в JS. Но здесь всего лишь меняется позиция определения переменной.
Как влияет? Почему перестаёт работать?