Intereting Posts
Передача нескольких переменных в представление? Каков наилучший способ обработки сеансов для PHP-сайта на нескольких хостах? Правильно отформатированный оператор даты date MySQL возвращает все 0 Передача переменной Javascript на PHP с использованием Ajax Использование PHP для заполнения <select> </ select>? как перебирать свойство JSON, не зная, массив или нет? Экспорт данных csv php mysql – все данные экспортируются в один столбец PHP – вызов функции из img src Первая буква – это номер в строке Symfony 2 – UploadedFile, метод переноса не удалось – невозможно создать каталог … php-код, необходимый для приложения Android, который запрашивает базу данных php как хранить и читать данные json через mysql? Динамически заменить атрибуты «src» всех тегов <img> Решение PDF в HTML и HTML в PDF в php найти блок xml и заменить все, регулярное выражение, чтобы соответствовать и перезвонить, чтобы перезаписать

Валидация пользовательского клиента 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(); ?> 

Код 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