Intereting Posts

Yii2 Pjax Удалить не работает

Я пытаюсь сделать 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, ]);