Как изменить вид сетки с помощью Pjax в yii2?

Хорошо, сначала объясню, что у меня есть,

—Таблица базы данных называется кейсами.

Это содержит все случаи, которые мне нужно отобразить в виде сетки

—Три таблицы под названием Категория, Подкатегория и Дочерняя категория

Случаи из таблицы case будут связаны с дочерней категорией.

Итак, я сделал три DropDownLists, которые заполняются из отдельных таблиц категорий в базе данных. Например:

_categories.php

 yii\widgets\Pjax::begin(['id' => 'categories']);
$form = ActiveForm::begin();

echo $form->field($searchModel, 'category')
->dropDownList(
ArrayHelper::map($allCategory, 'id', 'name'),
[
'onchange'=>'getSubcategory()',
]
);

//To stop errors, if first category not chosen make subcategory and empty drop down.
$subcategory = array(
"empty" => ""
);

echo $form->field($searchModel, 'subcategory')
->dropDownList(
ArrayHelper::map($subcategory, 'id', 'name'),
[
'onchange'=>'getChildcategory()',
]
);
//To stop errors, if second category not chosen make childcategory and empty drop down.
$childcategory = array(
"empty" => "");
echo $form->field($searchModel, 'childcategory')
->dropDownList(
ArrayHelper::map($childcategory, 'id', 'name'),
[
//'onchange'=>'getChildCategory()',
'onchange'=>'submitNow()',
]
);

ActiveForm::end();
yii\widgets\Pjax::end();

Итак, что происходит, когда выбирается первая категория, она запускает «onchange» => getSubcategory. Это в основном отправит Ajax-запрос на мой контроллер со значением выбранной опции. Затем он отзовет подкатегории, где subcategory_id = значение выбранного параметра. Затем он заполнил подкатегорию с этой информацией.

эта функция находится на _categories.php с раскрывающимися списками категорий выше

 function getSubcategory(){
//#casesearch-category is the first drop down list
var firstcategory = $('#casesearch-category').val();
var childcategory = document.getElementById('casesearch-childcategory');
childcategory.options.length = 0;
$.ajax({
url: '<?php echo \Yii::$app->getUrlManager()->createUrl('cases/subcategories') ?>',
type: 'POST',
dataType: 'json',
data: {
firstcategory: firstcategory
},
success: function(data) {

var subcategory = document.getElementById('casesearch-subcategory');
//if select is changed again, make the options length 0 so that it gets rid of previous appends.
subcategory.options.length = 0;for(var i=0; i<data.length; i++){
subcategory.options[i] = new Option (data[i].name);
subcategory.options[i].value = data[i].subcategory_id;
}
subcategory.options.selectedIndex = -1;

if(subcategory.options.length === 1){
getChildcategory();
}
}
});
}

Поэтому, когда этот запрос ajax достигает моего контроллера, он делает это:

CasesController.php

public function actionSubcategories()
{
if(isset($_POST['firstcategory'])){
$firstcategory = $_POST['firstcategory'];
// SELECT * FROM `subcategory` WHERE `parent_id` = $firstcategory
$subcategory = Subcategory::findSubcategory($firstcategory);

}

return \yii\helpers\Json::encode($subcategory);
}

Итак, это было немного, чтобы помочь вам понять категорию вещей. Теперь у меня есть сетка, которая заполняется из базы данных при отправке страницы. Однако, поскольку я сделал ajax, чтобы получить свои категории, мне нужно, чтобы gridview изменялось с помощью pjax при каждом изменении категорий.

Так что в моем контроллере actionIndex отправляет через searchModel и dataprovider для gridview следующим образом:

CasesController.php

public function actionIndex()
{

$model = new Cases;
$searchModel = new CaseSearch();
$allCategory = Category::find()->all();

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'allCategory' => $allCategory,
'model' => $model
]);
}

Тогда на моей странице индекса, где он отображает вид сетки, здесь:

NOTE :: Index.php отображает выпадающие списки категорий, показанные выше _categories.php

 <?= $this->render('_categories', [
'model' => $model,
'searchModel' => $searchModel,
'allCategory' => $allCategory
]) ?>

<?php Pjax::begin(['id' => 'cases']) ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'case_id',
'name',
'judgement_date',
'year',
'neutral_citation',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
<?php Pjax::end() ?>

Итак, вот часть, где я застрял! Я предполагаю, что я должен как-то обновить searchModel и dataProvider для gridview, но я не уверен, как это сделать. Как будто я посылаю ajax-запрос контроллеру, чтобы изменить его, он должен будет снова отобразить страницу, которая побеждает цель.

в верхней части _categories.php

function submitNow(){
$.pjax.reload({container:"#cases"});  //Reload GridView
}

Эта функция вызывается, когда выбрана последняя дочерняя категория. Я знаю, что здесь что-то должно произойти, чтобы сделать это, но я не знаю, что.
Кто-нибудь может помочь?

0

Решение

<?php use yii\widgets\Pjax; ?><?php Pjax::begin() ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'case_id',
'name',
'judgement_date',
'year',
'neutral_citation',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
<?php Pjax::end() ?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]