如何在Gridview中使用Pjax和自定义按钮

时间:2016-01-11 12:12:01

标签: yii2 yii2-advanced-app pjax

这是我的 gridview

<?php Pjax::begin(['id' => 'vouchers']) ?>
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
        ['header'=>'Cancel Voucher',
            'value'=> function($data)
                    { 
                       return  Html::a(Yii::t('app', ' {modelClass}', [
                                'modelClass' =>"Cancel",
                            ]), ['generalentries/cancel_voucher','voucher_no'=>$data->voucher_no], 
                            ['class' => 'btn btn-xs btn-danger',
                            'onclick'=>"return confirm('Are you Sure you want to CANCEL this Voucher?');"]
                            );  
                    },
            'format' => 'raw'
            ],
        ],
    ]); ?><?php Pjax::end() ?>

这是我的 cancel_voucher 操作

public function actionCancel_voucher( $voucher_no )
    {
      $entries = TabGLEntry::find()->where(['voucher_no' => $voucher_no])->all();
      foreach($entries as $entry)
      {
        $entry->update_note  = FALSE;
        $entry->is_deleted = 1;
        $entry->save();
      }
      $this->redirect( Yii::$app->request->referrer );
    }

当我点击取消按钮时,如何使用pjax更新网格视图?

我尝试给按钮一个ID然后在按钮的 onClick 事件中我尝试使用$.pjax.reload({container:"#vouchers"});更新gridview但是它没有工作

修改

这是我试过的方式

<?php 
        \yii\widgets\Pjax::begin([
        'id' => 'countries', 
        'timeout' => false, 
        // 'enablePushState' => false, 
        'clientOptions' => ['method' => 'POST']]) 
    ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

        ['header'=>'Cancel Voucher',
            'value'=> function($data)
                    { 
                       return  Html::a(Yii::t('app', ' {modelClass}', [
                                'modelClass' =>"Cancel",
                            ]), ['generalentries/cancel_voucher','voucher_no'=>$data->voucher_no], 
                            ['class' => 'btn btn-xs btn-danger','id' =>'cancel_voucher',
                            'onclick'=>"return confirm('Are you Sure you want to CANCEL this Voucher?');"]
                            );  
                    },
            'format' => 'raw'
            ],

<?php
$this->registerJs(
    'jQuery(document).ready(function($){
                $(document).ready(function () {
                    $("#cancel_voucher").on("click", function(){
                        alert("hai");
                        $.pjax.reload({container:"#countries"});
                    });
                });
            });'
            );
?>

Issue

1 个答案:

答案 0 :(得分:2)

您必须返回内容,该内容将以Pajax块显示,而不是$ this-&gt; redirect(Yii :: $ app-&gt; request-&gt; referrer);

public function actionCancel_voucher( $voucher_no )
{
  $entries = TabGLEntry::find()->where(['voucher_no' => $voucher_no])->all();
  foreach($entries as $entry)
  {
    $entry->update_note  = FALSE;
    $entry->is_deleted = 1;
    $entry->save();
  }
 if (Yii::$app->getRequest()->getIsPjax()) {
    //render part of view with grid
    return $this->renderAjax($url, $params);
 }
 else { $this->redirect( Yii::$app->request->referrer ); }
}

要获得正确的pajax重定向,您必须设置X-Pjax-Url标头。

if (Yii::$app->getRequest()->getIsPjax()) {
        $response = Yii::$app->getResponse();
        $destination = Url::to($url);
        $response->getHeaders()->set('X-Pjax-Url', $destination);
        $response->getHeaders()->set('Location', $destination);
        return null;
    }