【问题标题】:Yii2 form validation - compare password repeat only when password field is filledYii2 表单验证 - 仅在填写密码字段时比较密码重复
【发布时间】:2018-05-17 11:04:00
【问题描述】:

我的表单验证使用以下规则:

[['password', 'password_repeat'], 'required'],
['password_repeat', 'compare', 'compareAttribute' => 'password', 'message' => "Passwords don't match"],

只有在用户填写password 字段时,如何为password_repeat 编写规则以将其与password 进行比较。如果用户跳过password,则也应跳过对password_repeat 的验证。

【问题讨论】:

    标签: yii2 yii2-validation


    【解决方案1】:

    您可以为此使用scenarios

    public function rules() {
        return [
            [['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN],
            [['username', 'password', 'password_repeat'], 'required', 'on' => self::SCENARIO_REGISTER],
            [
                'password_repeat', 'compare', 'compareAttribute' => 'password',
                'message' => "Passwords don't match", 'on' => self::SCENARIO_REGISTER,
            ],
        ];
    }
    

    这允许您为不同的表单设置不同的规则(登录和注册时需要不同的字段)。

    您也可以考虑使用自己的rules() 为不同的表单创建不同的模型,例如LoginFormRegisterForm。这实际上是更干净的解决方案并提供更多控制。


    编辑

    对于条件规则,您应该使用when 属性:

    public function rules() {
        return [
            [['password', 'password_repeat'], 'string'],
            [
                'password_repeat', 'compare', 'compareAttribute' => 'password',
                'message' => "Passwords don't match", 'skipOnEmpty' => false,
                'when' => function ($model) {
                    return $model->password !== null && $model->password !== '';
                },
            ],
        ];
    }
    

    【讨论】:

    • password 和 passwrod_repeat 部分用户配置文件设置,如果用户要更改密码,请输入密码并重复此操作,否则,跳过 paasword 和 password_repeat,如果用户插入密码,请检查 password_repeat 字段。跨度>
    • 我使用了你的代码,但是当用户插入密码重复比较两个字段时,当用户插入密码并跳过密码重复时,不要比较两个字段,我什至使用自定义函数进行验证,但它也可以就在password_repeat不为空的时候!
    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多