2017-01-04 104 views
0

Проблема: я хочу обновить GridView в стиле pjax, но перенаправить его на страницу создания формы.yii2 loading pjax form динамически

Что ниже код делает:

  • Имея индексную страницу с GridView для отображения списка данных и открыть форму в модальном окне, чтобы создать новую запись. Код формы добавляется в модальный динамически.
  • Когда вы нажимаете кнопку «Создать страну» на индексной странице, она вызывает страну/создать, чтобы получить код HTML формы и вставить его в модальный, затем отобразится модальное окно.
  • Нажмите на кнопку «Создать» в форме, чтобы отправить форму в страну/создать. Это вернет HTML-код индексной страницы, и я хочу, чтобы он обновил часть GridView, но это не так.

Код:

Контроллер CountryController.php

class CountryController extends Controller 
{ 

    public function actionIndex() 
    { 
     return $this->renderIndex(); 
    } 

    public function actionCreate() 
    { 
     $model = new Country(); 

     if ($model->load(Yii::$app->request->post()) && $model->save()) { 
      return $this->renderIndex(); 
     } else { 
      return $this->renderAjax('_form', [ 
       'model' => $model, 
      ]); 
     } 
    } 

    private function renderIndex() 
    { 
     $searchModel = new CountrySearch(); 
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

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

Просмотр index.php

<?php 

use yii\helpers\Html; 
use yii\grid\GridView; 
use yii\widgets\Pjax; 
use yii\web\View; 

$this->title = Yii::t('app', 'Countries'); 
$this->params['breadcrumbs'][] = $this->title; 

yii\bootstrap\Modal::begin(['id' => 'modal']); 
yii\bootstrap\Modal::end(); 
?> 
<div class="country-index"> 

    <h1><?= Html::encode($this->title) ?></h1> 
    <div>Current Time: <?= date('Y/m/d H:i:s') ?></div> 

    <p><?= Html::a(Yii::t('app', 'Create Country'), 
     ['create'], 
     ['class' => 'btn btn-success show-modal']) ?> 
    </p> 
    <?php Pjax::begin(['id' => 'pjax-grid']); ?> 
     <?= GridView::widget([ 
      'dataProvider' => $dataProvider, 
      'filterModel' => $searchModel, 
      'columns' => [ 
       ['class' => 'yii\grid\SerialColumn'], 
       'id', 
       'name', 
       ['class' => 'yii\grid\ActionColumn'], 
      ], 
     ]); ?> 
    <?php Pjax::end(); ?> 
</div> 
<?php 
$this->registerJs("$(function() { 
    $('.show-modal').click(function(e) { 
    e.preventDefault(); 
    $('#modal').modal('show').find('.modal-body') 
    .load($(this).attr('href')); 
    }); 
});", View::POS_READY, '.show-modal'); 
?> 

Посмотреть _form.php

кнопка
<?php 

use yii\helpers\Html; 
use yii\widgets\ActiveForm; 
use yii\web\View; 
?> 
<?php 
$this->registerJs(
    '$("document").ready(function(){ 
     $("#pjax-create").on("pjax:end", function() { 
      $.pjax.reload({container:"#pjax-grid"}); //Reload GridView 
     }); 
    });' 
, View::POS_READY, 'pjax-create-end'); 
?> 

<div class="country-form"> 
    <?php yii\widgets\Pjax::begin(['id' => 'pjax-create']) ?> 
     <?php $form = ActiveForm::begin(['options' => ['data-pjax' => TRUE]]); ?> 

     <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?> 

     <div class="form-group"> 
      <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 
     </div> 

     <?php ActiveForm::end(); ?> 
    <?php yii\widgets\Pjax::end() ?> 
</div> 

ответ

0

Использование Html :: вместо Html :: а и просто перезаписать содержимое модального:

yii\bootstrap\Modal::begin(['id' => 'modal']); 
echo '<div id="modal-content"></div>'; 
yii\bootstrap\Modal::end(); 

echo Html::button('Create Country', [ 
    'onClick' => 'createCountry("' . Url::to([create]) . '")', 
    'class' => 'btn btn-primary' 
]); 

$script = <<< JS 
function createCountry(url) { 
    $('#modal').modal('show').find('#modal-content').load(url); 
} 
JS 

$this->registerJs($script, View::POS_END);