У меня есть модель с пользовательским методом проверки. Для тестирования всегда возвращается сообщение об ошибке.
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(); ?>
Код js, который запускает все …
$(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 (…) больше не загружается в модальное окно; это отдельно.
Изображение, показывающее модальное загруженное, результат после отправки и модальный с проверкой по умолчанию.
Я нашел подобную проблему. Но добавление идентификатора в форму не решает проблему. Итак, как получить правильное подтверждение по умолчанию в модальном окне? У кого-нибудь есть ключ?
Решение
Спасибо за ответ. Для меня было решение: включить 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, ]); } } }
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