2017-02-22 2 views
1

У меня есть модель с пользовательским методом проверки. Для тестирования всегда возвращается сообщение об ошибке.Проверка пользовательского клиента Yii2 с рендерингом ajax в модальном

public function rules() 
{ 
    return [ 
    ... 
     ['staff_ids', 'each', 'rule' => ['string']], 
     [['staff_ids'], 'validateStaffIds'], 
    ... 
    ]; 
} 

public function validateStaffIds($attribute, $params, $validator) { 
    $this->addError($attribute, 'There is an error in the staff ids'); 
} 

В view.php является модальный элемент

<p>  
    <?= Html::button('Add Ensemble Staff', 
      ['value' => Url::to(['ensemble/add', 'id' => $model->id]), 
      'title' => 'Adding New Ensemble Staff', 
      'class' => 'showModalButton btn btn-primary']); 
    ?> 
</p> 

<?php 
    Modal::begin([ 
     'closeButton' => [ 
       'label' => 'x', 
     ], 
     'headerOptions' => ['id' => 'modalHeader'], 
     'id' => 'modal', 
     'size' => 'modal-lg', 
    ]); 
    echo "<div id='modalContent'></div>"; 
    Modal::end(); 
?> 

, ИС-код, который запускает все вверх ...

$(function(){ 
    $(document).on('click', '.showModalButton', function(){ 

     if ($('#modal').data('bs.modal').isShown) { 
      $('#modal').find('#modalContent') 
        .load($(this).attr('value')); 
     } else { 
      //if modal isn't open; open it and load content 
      $('#modal').modal('show') 
        .find('#modalContent') 
        .load($(this).attr('value'));  
     } 

     //dynamiclly set the header for the modal 
     ... 
    }); 
}); 

И контроллер ensemble который обрабатывает add действие

public function actionAdd($id) 
{ 
    $model = $this->findModel($id); 

    // in the post ('ensembleStaff_ids' => [0 => '2']); where the id actually is staff_id 
    if ($model->load(Yii::$app->request->post()) && $model->save()) { 
     return $this->redirect(['view', 'id' => $id]); 
    } else { 
     return $this->renderAjax('add', [ 
      'model' => $model, 
     ]); 
    } 
} 

И форма, которая вводится с помощью JS в модели (Url::to(['ensemble/add', 'id' => $model->id]),)

<?php $form = ActiveForm::begin(['id' => 'add-theater-stuff-form']); ?> 

<?= $form->field($model, 'staff_ids')->widget(Select2::className(), [ 
     'model' => $model, 
     'data' => ArrayHelper::map(app\models\TheaterStaff::find()->where(['theater_id' => $model->theater_id])->all(), 'staff_id', 'staff.fullname'), 
     'options' => [ 
      'multiple' => true, 
      'prompt' => 'Ensemble Staff', 
     ], 
     'pluginOptions' => [ 
      'tags' => true 
     ] 
    ]); ?> 

<div class="form-group"> 
    <?= Html::submitButton('Add', ['class' => 'btn btn-primary']) ?> 
</div> 

<?php ActiveForm::end(); ?> 

При нажатии на кнопку Add Ensemble Staff отлично работает и воспитывает модальное окно. Форма сама по себе хорошо работает; также работает проверка по умолчанию. Вызывается даже пользовательская валидация, но возвращает $ this-> renderAjax (...) больше не загружается в модальное окно; это отдельно.

Я нашел аналогичную проблему here. Но добавление идентификатора в форму не решает проблему. Итак, как получить правильное подтверждение по умолчанию в модальном окне? У кого-нибудь есть ключ?

Решение

Спасибо за ответ. Для меня решение было: Включить Ajax в виде

<?php $form = ActiveForm::begin(['id' => 'add-ensemble-stuff-form', 'enableAjaxValidation' => true]); ?> 

И добавить следующую логику в контроллере

public function actionAdd($id) 
    { 
     $model = $this->findModel($id); 

     if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { 
      Yii::$app->response->format = Response::FORMAT_JSON; 
      return ActiveForm::validate($model); 
     } else { 
      // in the post ('ensembleStaff_ids' => [0 => '2']); where the id actually is staff_id 
      if ($model->load(Yii::$app->request->post()) && $model->save()) { 
       return $this->redirect(['view', 'id' => $id]); 
      } else { 
       return $this->renderAjax('add', [ 
        'model' => $model, 
       ]); 
      } 
     } 
    } 
+0

Try 'enableAjaxValidation = > true' в формах. –

+0

@InsaneSkull Да, это сработало! Я действительно думал, что пробовал это уже ... hrrr .. спасибо в любом случае! – Luc

ответ

0
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { 
      Yii::$app->response->format = Response::FORMAT_JSON; 
      return ActiveForm::validate($model); 
    }else{/* your code */} 

добавить этот контроллер use yii\web\Response

+0

добавлено; ничего не меняет; request-> isAjax возвращает false; мой js не завершен? – Luc

+0

да .. я пропустил это. Загрузите файл вида с помощью ajax. –

+0

«Форма» находится в вашем «модальном»? –

Смежные вопросы