【问题标题】:Compare rule yii2 doesn't work correctly比较规则 yii2 无法正常工作
【发布时间】:2016-04-08 13:53:01
【问题描述】:

我有这样的规则方法:

public function rules()
{
    return [
        [['username', 'email', 'password'],'filter', 'filter' => 'trim'],
        [['username', 'email', 'password'],'required', 'message' => '{attribute} can not be empty'],
        ['username', 'string', 'min' => 2, 'max' => 255],
        ['password', 'string', 'min' => 6, 'max' => 255],
        ['password_repeat', 'required', 'message' => 'This field can not be empty'],
        ['password_repeat', 'compare', 'compareAttribute'=>'password', 'message'=>"Passwords don't match", 'skipOnError' => true],
        ['username', 'unique',
            'targetClass' => User::className(),
            'message' => 'This name is already used.'],
        ['email', 'email'],
        ['email', 'unique',
            'targetClass' => User::className(),
            'message' => 'This name is already used.'],
    ];
}

而我的视图代码是这样的:

<?php $form = ActiveForm::begin(['action' => 'login/register']); ?>
        <?= $form->field($registration, 'username',
            ['template' => '<div class="uk-form-row">
                                {input}{error}
                                </div>'])
            ->textInput(['id' => 'register_username', 'class' => 'md-input']) ?>

        <?= $form->field($registration, 'password',
            ['template' => '<div class="uk-form-row">
                            {input}{error}
                            </div>'])
            ->passwordInput(['id' => 'register_password', 'class' => 'md-input']) ?>

        <?= $form->field($registration, 'password_repeat',
            ['template' => '<div class="uk-form-row">
                            {input}{error}
                            </div>'])
            ->passwordInput(['id' => 'register_password_repeat', 'class' => 'md-input']) ?>

        <?= $form->field($registration, 'email',
            ['template' => '<div class="uk-form-row">
                            {input}{error}
                            </div>'])
            ->textInput(['id' => 'register_email', 'class' => 'md-input']) ?>
        <div class="uk-margin-medium-top">
            <button class="md-btn md-btn-primary md-btn-block md-btn-large">Sign in</button>
        </div>
        <?php ActiveForm::end(); ?>

当我填写所有给定字段时,即使在第一次输入正确的情况下,重复密码时也会出现错误Passwords don't match。是我的验证规则有问题还是 Yii Validator 中的错误?

UPD:我试过'skipOnError' =&gt; true。我发现它是类似问题的答案,但它仍然无法按预期工作。

UPD:我在控制台中做了一些验证:

var a = $('#register_password')
undefined
a.val()
"Halloha"
var b = $('#register_password_repeat')
undefined
b.val()
"Halloha"

但它仍然显示Passwords don't match错误信息

【问题讨论】:

  • beforeValidate() 中他们有什么事吗?此外,如果您没有它,请添加此操作和 var_dump 两个模型属性,以查看它们是否真的不匹配。 Yii2 中没有错误比较验证它是别的东西。
  • @peaceman 我没有创建beforeValidate() 方法。好的,但是如果 vad_dump 值没有发送到后端,我怎么能(提交按钮不做任何事情)。

标签: php validation yii yii2 client-side-validation


【解决方案1】:

尝试使用这样的规则

 // validates if the value of "password" attribute equals to that of 
 ['password', 'compare', 'message'=>"Passwords don't match"],

它会自动将密码值与属性 password_repeat 进行比较,而不是按照文档中说明的其他顺序进行。

http://www.yiiframework.com/doc-2.0/guide-tutorial-core-validators.html#compare

【讨论】:

  • 这个答案有帮助吗?
【解决方案2】:

尽量避免密码输入中的id(id是yii2自动生成的)

 <?= $form->field($registration, 'password',
        ['template' => '<div class="uk-form-row">
                        {input}{error}
                        </div>'])
        ->passwordInput(['class' => 'md-input']) ?>

<?= $form->field($registration, 'password_repeat',
        ['template' => '<div class="uk-form-row">
                        {input}{error}
                        </div>'])
        ->passwordInput([ 'class' => 'md-input']) ?>

【讨论】:

  • 一开始我尝试了所有没有skipOnError的代码。您提供的所有以下代码似乎与我现在所拥有的相似。不是吗?
  • 是的..我的建议也主要基于需要密码。
  • 我认为你提出了我的建议:[['username', 'email', 'password'],'required', 'message' =&gt; '{attribute} can not be empty'],
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多