У меня есть модель с пользовательским методом проверки. Для тестирования всегда возвращается сообщение об ошибке.Проверка пользовательского клиента 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,
]);
}
}
}
Try 'enableAjaxValidation = > true' в формах. –
@InsaneSkull Да, это сработало! Я действительно думал, что пробовал это уже ... hrrr .. спасибо в любом случае! – Luc