Yii2:验证屏蔽输入

Yii2: validate masked input


我正在使用 Yii2 MaskedInput plugin 和一个整数字段模型。

<?= $form->field($model, 'phone')->widget(MaskedInput::classname()([
    'mask' => '(999) 999-9999'
]); ?>

当我在此字段中键入文本时,出现错误(Phone 必须是整数。

有没有什么方法可以在没有自定义验证掩码的情况下在客户端和服务器上验证它?

MaskedInput 只会生成一个文本字段。我假设您的 phone 字段被存储为一个整数。您必须将 phone 字段的验证更改为文本,而不是整数。您可能需要将数据库中的字段类型更改为 varchar(14)

您可以像这样将 MaskedInput removeMaskOnSubmit 设置为 true

<?= $form->field($model, 'phone')->widget(MaskedInput::classname()([
'mask' => '(999) 999-9999',
'clientOptions' => [
    'removeMaskOnSubmit' => true,
]); ?>

所以你必须在表单上禁用客户端验证

$form = ActiveForm::begin([
    'enableClientValidation'=>false,
]); ?>

我遇到了类似的问题,并使用 beforeValidateAttribute 事件和此代码轻松解决:

$('#w0').on('beforeValidateAttribute', function (e) {
    var paymentAmountElement = $('#w0').yiiActiveForm('find', 'payment-amount');
    var oldValidate = paymentAmountElement.validate;

    paymentAmountElement.validate = function (attribute, value, messages, deferred, form) {
        value = !value.length ? value : value.match(/\d+/g).join('');
        oldValidate(attribute, value, messages, deferred, form);
    }
});

我在 payment 模型中有一个 amount 输入,所以它的 ID 是 payment-amount。我保存了原始的验证函数(因为我有一些其他规则,如 requirednumber 我真的懒得再写一次)并用正则表达式删除掩码,然后 运行 original使用新值验证函数。你只需要为你的情况做一个正则表达式,然后用这个方法来解决问题。