Я пытаюсь сделать Ajax GridView с помощью кнопки Pjax с удалением. Удаление происходит без Ajax. Я новичок в Yii2, поэтому любая помощь будет оценена. Спасибо.
index.php
<?php Pjax::begin(['id' => 'countries']) ?> <?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'title', ['class' => 'yii\grid\ActionColumn', 'buttons' => [ 'delete' => function ($url, $model, $key) { return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [ 'title' => Yii::t('yii', 'Delete'), 'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'), 'data-method' => 'post', ]); }, ] ], ], ]); ?> <?php Pjax::end() ?>
контроллер
public function actionDelete($id) { $model = new Category(); $this->findModel($id)->delete(); $dataProvider = new ActiveDataProvider([ 'query' => Category::find(), ]); return $this->render('index', [ 'dataProvider' => $dataProvider, 'model' => $model, ]); }
Это общедоступная функция actionIndex () в контроллере
public function actionIndex() { $model = new Category(); $dataProvider = new ActiveDataProvider([ 'query' => Category::find(), ]); if ($model->load(Yii::$app->request->post()) && $model->save()) { $model = new Category(); } return $this->render('index', [ 'dataProvider' => $dataProvider, 'model' => $model, ]); }
data-method
и data-confirm
не позволяют вам создавать ajax-запрос через pjax, вы должны реализовать свое собственное диалоговое окно подтверждения и удалить фильтр POST-глагола, или вы можете реализовать свой собственный плагин ajax с диалоговым окном подтверждения и указать метод http.
Кроме того, я думаю, должен быть способ расширить плагин pjax по диалоговому окну подтверждения, но Yii2 не предоставляет это по умолчанию.
прежде всего удалите 'data-confirm' и 'data-method' => 'post'. pjax не собирается работать. Если вы хотите реализовать окно подтверждения с кнопкой действия, вот что я хотел бы сделать в моем файле index.php.
<?php Pjax::begin(['id' => 'pjax-container']); echo GridView::widget([ 'test' => function ($url, $dataProvider) { return Html::a('Test', ['/site/test'], ['title'=>'Test', 'onclick' => "if (confirm('ok?')) { $.ajax('/site/test', { type: 'POST' }).done(function(data) { $.pjax.reload({container: '#pjax-container'}); }); } return false; ", ]); }, ]) Pjax::end(); ?>
и в моем контроллере
public function actionTest() { if (!Yii::$app->request->isAjax) { return $this->redirect(['index']); } }
Таким образом, у вас будет подтверждение и т. Д. Если вы хотите, вы можете использовать другое стороннее подтверждение загрузки и т. Д. И будете работать нормально.
<?php Pjax::begin(['id' => 'model-grid']); 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, //... [ 'class' => 'yii\grid\ActionColumn', 'template' => '{update} {delete}', 'contentOptions' => ['class' => 'action-column'], 'buttons' => [ 'delete' => function ($url, $model, $key) { return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [ 'title' => 'Delete', 'data-pjax' => '#model-grid', ]); }, ], ], ], ]); Pjax::end(); ?>
В контроллере
public function actionDelete($id) { $this->findModel($id)->delete(); $searchModel = new ModelSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); }
Сначала добавьте Pjax::end();
в конце gridview затем укажите:
'delete' => function ($url, $model, $key) { return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [ 'title' => Yii::t('yii', 'Delete'), 'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'), 'data-method' => 'post', ]); },
Обратите внимание, что вам не нужно указывать 'data-pjax' => '0'
потому что он отключает ссылку pjax.
Для получения дополнительной информации проверьте эту ссылку
Ваш контроллер должен быть:
public function actionDelete($id) { $this->findModel($id)->delete(); return $this->redirect(['index']); }
Попробуйте изменить actionDelete ()
public function actionDelete($id) { $this->findModel($id)->delete(); return \yii\web\Response::redirect(['index'] , 302 , false); // return $this->redirect(['index']); }
потому что Controller-> redirect () не может отключить ajaxCheck, для этого вам понадобится Response.
Я создал такую же проблему в https://github.com/yiisoft/yii2/issues/11058 .
Не устанавливайте data-method
data-confirm
потому что Pjax
не поддерживает это.
После того, как вы удалили все еще не обработанные, да, из-за кода ниже вашего контроллера не разрешается Pjax get Request.
return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['post'], // **remove this** ], ], ];
Вам нужно использовать метод Pjax Post. Примените это в своем Pjax
'clientOptions' => ['method' => 'POST']
Можно использовать так:
ввиду:
'delete' => function ($url, $model, $key) { $options = [ 'title' => Yii::t('common', 'delete'), 'aria-label' => Yii::t('common', 'delete'), 'data-pjax' => 'w0',//id 'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'), 'data-method' => 'post', 'class' => 'btn btn-xs btn-danger' ]; return Html:: a('<i class="fa fa-fw fa-trash"></i>', [ 'delete', 'id' => $model -> id ], $options); }
в контроллере:
$this -> findModel($id) -> delete (); $searchModel = new AdminSearch(); //get the referer url $url = Yii::$app -> request -> referrer; $arr = parse_url($url, PHP_URL_QUERY); parse_str($arr, $output);//get the $_GET array $dataProvider = $searchModel -> search($output); return $this -> render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]);