Проверка Yii2 ActiveForm не работает с модальностью начальной загрузки при первой загрузке
"Проверка ActiveForm не будет работать при первой модальной загрузке, НО во второй раз, если вы не обновите страницу и просто закроете модальное окно и загрузите его снова".
Это происходит даже на свежей установке yii2-app-basic
,
Какие шаги воспроизведут проблему?
Создать вид views/site/modal.php
и добавьте модальный код, как показано ниже, с помощью дополнительной кнопки и js
код для открытия модального окна при нажатии кнопки и привязке события shown.bs.modal
загрузить представление внутри раздела модального контента, как только модальное показано
<?php
use yii\bootstrap\Modal;
use yii\helpers\Html;
Modal::begin([
'id' => 'contact',
]);
?>
<div class="modal-header">
<h4>Contact</h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<?php
echo Html::submitButton('Add Folder Now', ['class' => 'btn btn-primary']);
?>
</div>
<?php Modal::end() ;
echo Html::button('button', ['class'=>'btn btn-primary','id'=>'add-folder-button']);
$js=<<< js
$("#add-folder-button").on('click',function(){
$( '#contact' ).modal( {show:true});
$( '#contact' ).appendTo("body");
});
$( '#contact' ).on( 'shown.bs.modal', function ( event ) {
// var button = $(event.relatedTarget); // Button that triggered the modal
let modal = $( this );
modal.find( '.modal-header > h4' ).text( 'Contact Us' );
modal.find( '.modal-body' ).load( 'contact');
} );
js;
$this->registerJs($js,\yii\web\View::POS_READY);
Создать действие внутри SiteController
загрузить вышеуказанный вид
public function actionModal(){
return $this->render('modal');
}
Теперь измените actionContact
внутри SiteController
как показано ниже для загрузки внутри модального окна
/**
* Displays contact page.
*
* @return Response|string
*/
public function actionContact()
{
$model = new ContactForm();
if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted');
return $this->refresh();
}
return $this->renderAjax('contact', [
'model' => $model,
]);
}
Для просмотра вы можете использовать по умолчанию contact.php
смотреть внутрь views/site
папку просто добавьте приведенный ниже код в верхней части представления
$js=<<< js
alert("hello");
js;
$this->registerJs($js);
Каков ожидаемый результат?
при нажатии на кнопку должно загрузиться модальное окно, и как только представление загрузится, оно должно показать вам alert("hello")
и если я перебираю /TAB через поля, он должен запустить ActiveForm
проверка клиента.
Примечание: я даже пытался предоставить 'enableClientValidation'=>true
в настройках формы.
Что вы получаете вместо этого?
ничего не делает и не показывает alert
он также не запускает проверку, вместо этого, если вы закроете и снова нажмете кнопку, чтобы открыть модальное окно, тогда все будет работать правильно. Отображается предупреждение, и проверка клиента работает. но если вы обновите страницу снова, она не будет работать снова, пока вы не откроете модальное окно один раз, закроете его и снова откроете.
Приведенный выше сценарий прекрасно работает в версиях Yii 1.x, и он у меня работает. Я работаю над расширением yii1.x, чтобы преобразовать его в yii2.x
Дополнительная информация
| Q | A
| ---------------- | ---
| Yii version | 2.0.15.1
| PHP version | 5.6
| Operating system | windows
Примечание: я добавил проблему в GITHUB-yiisoft, но она была помечена как вопрос, хотя это самая базовая настройка для открытия формы внутри модального окна, и я использовал ее в прошлом, но в настоящее время она не работает, и это это не нормальное поведение, оно либо должно работать, либо вообще не должно работать, если Yii не поддерживает его.