2015-04-03 22 views
6

Ich versuche, eine Ajax GridView mit Pjax mit Lösch-Taste zu machen. Löschen geht ohne Ajax. Ich bin neu bei Yii2, also würde jede Hilfe geschätzt werden. Vielen Dank.Yii2 Pjax Löschen funktioniert nicht

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() ?> 

-Controller

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, 
    ]); 
} 

Dies ist public function actionIndex() in der -Controller

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, 
    ]); 
} 
+0

Haben Sie haben Pjax :: end(); In Ihrem obigen Code fehlt es nach der Gridview. – Chinmay

+0

Meine Lösung funktioniert wie ein Charme .... ich persönlich in meinem Projekt –

Antwort

0

Erste Pjax::end(); am Ende des Gridview hinzufügen dann angeben:

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

Beachten Sie, dass Sie benötigen, um 'data-pjax' => '0' nicht angeben, weil es den pjax Link deaktiviert.

Für weitere Informationen überprüfen diese link

sollte Ihr Controller sein:

public function actionDelete($id) 
{ 
    $this->findModel($id)->delete(); 
    return $this->redirect(['index']); 
} 
+0

Ich habe diese Fehler behoben, aber keinen Effekt. –

+0

Erhalten Sie einen Fehler? – Chinmay

+0

kein Fehler, nur Löschen ohne Ajax –

3

data-method und data-confirm lassen Sie nicht Ajax-Request über pjax erstellen, sollten Sie Ihre eigenen Bestätigungsdialog implementiert und POST-Drop Verb-Filter, oder Sie können Ihr eigenes Ajax-Plugin mit Bestätigungsdialog implementieren und http-Methode angeben.

Auch ich denke, es muss Möglichkeit geben, pjax Plugin durch Bestätigungsdialog zu erweitern, aber Yii2 bieten dies nicht standardmäßig.

+0

Minus? Lol. Bitte lesen Sie zuerst die yii.js. – xskif

0

Bitte versuchen actionDelete ändern()

public function actionDelete($id) 
{ 
    $this->findModel($id)->delete(); 
    return \yii\web\Response::redirect(['index'] , 302 , false); 
    // return $this->redirect(['index']); 
} 

weil Controller-> Umleitung() kann ajaxCheck nicht deaktivieren, müssen Sie Antwort, dies zu tun.

Ich habe das gleiche Problem in https://github.com/yiisoft/yii2/issues/11058 erstellen.

0

Setzen Sie data-method und data-confirm nicht, weil Pjax dies nicht unterstützt.

Nach dem Entfernen beide noch nicht funktioniert, ja wegen unten Code Ihres Controllers erlaubt Pjax nicht Request.

return [ 
      'verbs' => [ 
       'class' => VerbFilter::className(), 
       'actions' => [ 
        'delete' => ['post'], // **remove this** 
       ], 
      ], 
     ]; 

Sie benötigen Pjax Beitrag Methode Wenden Sie diese in Ihre Pjax

'clientOptions' => ['method' => 'POST'] 
2

allererst entfernen 'Daten-confirm' und 'Daten-Methode' => 'Post' zu verwenden. Pjax geht nicht zur Arbeit. Wenn Sie eine Bestätigungsbox mit Aktionsschaltfläche implementieren möchten, hier ist, was ich in meiner Ansicht index.php Datei tun würde ..

<?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(); 
?> 

und in meinem Controller

public function actionTest() 
{ 

    if (!Yii::$app->request->isAjax) { 
     return $this->redirect(['index']); 
    } 
} 

diese Weise können Sie auch eine Bestätigung usw. haben. Wenn Sie möchten, können Sie eine andere Bootstrap-Bestätigung von Drittanbietern verwenden und es wird gut funktionieren.

2
<?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(); ?> 

In Controller

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, 
    ]); 
} 
0

wie diese verwenden:

im Blick:

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

in Controller:

$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, 
]);