Проверка 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 не поддерживает его.

0 ответов

Другие вопросы по тегам