ajax - Yii2: Bootstrap 模态表单验证 (Ajax) - 任何关于奇怪行为的见解?

标签 ajax forms validation yii2 bootstrap-modal

我一直致力于在 Yii2 的模式窗口中使用表单,并且我遇到了一个问题,即当表单位于引导模式窗口内时,标准的 Yii 表单 ajax 验证不起作用。

需要明确的是,当文件失去焦点时,会为每个字段触发 ajax 表单验证。这是标准的 Yii 表单验证,所以我通过点击一个必填字段,然后点击离开该字段来测试模态中的表单。这会触发 Yii ajax 验证,并应在字段下方显示一条红色错误消息,指出“‘字段’不能为空白”。

同样,我的问题是有时 ajax 验证有效,有时无效。

我设法将问题与模态代码放置在页面上的位置有关,但对我来说,以下内容将如何影响模态中表单的 ajax 验证行为是没有意义的。

首先,我将向您展示可以正常工作的代码。 Yii 表单验证在模态窗口中的表单上按预期工作。

<?php
use yii\helpers\Html;
use yii\helpers\Url;
use yii\grid\GridView;
use yii\bootstrap\Modal;    
?>
<div class="category-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <?= Html::button('Create Category', [
        'class' => 'btn btn-success btn-ajax-modal',
        'value' => Url::to('/category/create'),
        'data-target' => '#modal_category',
    ]); ?>

    <?php
    Modal::begin([
        'id' => 'modal_category',
        'header' => '<h4>Category</h4>',
    ]);
    echo '<div class="modal-content"></div>';
    Modal::end();
    ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            'id',
            'title',
            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>
</div>

上面代码中需要注意的地方:

1)这是我的类别/索引 View ,所以它有一个创建按钮,引导模式代码,然后是类别的 Yii gridview。

2) 创建按钮有btn-ajax-modal类(class)。该类由一个 JS 函数标识,该函数使用其他按钮属性来显示模态窗口并在模态中加载表单内容。按钮值属性标识应该加载的模型和表单。

这是处理显示模式和加载表单的 JS 函数:
$('.btn-ajax-modal').click(function (){
    var elm = $(this),
        target = elm.attr('data-target'),
        ajax_body = elm.attr('value');

    $(target).modal('show')
        .find('.modal-content')
        .load(ajax_body);
});

因此,上述所有代码都可以完美运行,我希望这对其他人有所帮助!

但是...如果我对上面的代码进行一些非常简单的更改,ajax 表单验证将不再有效,我也不知道为什么。

第一个变化:

1)将bootstrap modal代码移到gridview代码下方,ajax验证不再起作用。
<div class="category-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <?= Html::button('Create Category', [
        'class' => 'btn btn-success btn-ajax-modal',
        'value' => Url::to('/category/create'),
        'data-target' => '#modal_category',
    ]); ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            'id',
            'title',    
            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>

    <?php //*** SEE MODAL CODE IS NOW BELOW GRIDVIEW CODE
    Modal::begin([
        'id' => 'modal_category',
        'header' => '<h4>Category</h4>',
    ]);
    echo '<div id="modalContent"></div>';
    Modal::end();
    ?>

</div>

对我来说,为什么将模式代码移动到 gridview 代码下方会破坏 ajax 表单验证,这对我来说毫无意义。模态仍然显示并加载正确的表单,但是当我将焦点转移到必填字段时,不会触发 ajax 表单验证。

它变得更加奇怪......

第二个变化:

2)不用把modal代码移到gridview代码下面,直接把gridview全部删除,包括use yii\grid\GridView; .
<?php
use yii\helpers\Html;
use yii\helpers\Url;
use yii\bootstrap\Modal;    
?>
<div class="category-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <?= Html::button('Create Category', [
        'class' => 'btn btn-success btn-ajax-modal',
        'value' => Url::to('/category/create'),
        'data-target' => '#modal_category',
    ]); ?>

    <?php
    Modal::begin([
        'id' => 'modal_category',
        'header' => '<h4>Category</h4>',
    ]);
    echo '<div class="modal-content"></div>';
    Modal::end();
    ?>

</div>

此更改还会导致模式中的表单的 ajax 表单验证停止工作。

到底怎么回事?删除与模式/表单设置完全无关的gridview如何导致ajax表单验证停止工作?

我在浏览器控制台中没有看到任何错误,在 Yii 调试模块中也没有看到错误。但由于某种原因,没有显示 ajax 字段验证。

很抱歉这么长的帖子,但我想尽可能清晰和具体。我不确定这是否是一些奇怪的 Yii2 错误,我是否正在失去理智,或者对此是否有合理的解释。

如果有人有任何想法、答案或建议,请分享!谢谢你和我一起头脑 Storm !

最佳答案

这一挑战的解决方案是确保模式窗口中的表单具有 id 属性。表单 id 对于 Yii2 ajax 验证正常运行很重要。

关于ajax - Yii2: Bootstrap 模态表单验证 (Ajax) - 任何关于奇怪行为的见解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29404481/

相关文章:

javascript - array_key_exists() 期望参数 2 为数组,给定 null

javascript - 从用户个人资料页面只需为用户提取一个 JSON 字符串并使用 jQuery 显示

c# - 将参数传递给提供给属性的类型

php - 如何使用 SQL/PHP 验证日期的日期和月份是否在范围内

javascript - 如何保护我的登录页面

php - 为什么我的 ajax 不能与准备好的 mysqli 语句一起使用

html - 插入值时对齐文本区域和按钮,按钮不会向下移动

javascript - Bluebeam 基于下拉菜单自动填写表单字段

javascript - 没有提交按钮和 anchor 链接 onclick 重定向并输入值的 html 表单

regex - 如何在正则表达式中添加用户定义的字符串