【发布时间】:2015-10-12 19:40:12
【问题描述】:
登录表单:
public function rules()
{
return [
// username and password are both required
[['username', 'password'], 'required'],
// username should be a number and of 8 digits
[['username'], 'number', 'message'=>'{attribute} must be a number'],
[['username'], 'string', 'length' => 8],
// password is validated by validatePassword()
['password', 'validatePassword'],
];
}
/**
* Validates the password.
* This method serves as the inline validation for password.
*
* @param string $attribute the attribute currently being validated
* @param array $params the additional name-value pairs given in the rule
*/
public function validatePassword($attribute, $params)
{
if (!$this->hasErrors()) {
$user = $this->getUser();
if (!$user || !$user->validatePassword($this->password)) {
$this->addError($attribute, 'Incorrect username or password.');
}
}
}
如上所示,我为同一个字段设置了 2 条规则:
[['username'], 'number', 'message'=>'{attribute} must be a number'],
[['username'], 'string', 'length' => 8],
我希望表单针对以下 3 个场景 情况显示不同的错误消息:
- 提供的值既不是数字,也不是 8 个字符(数字)。
- 提供的值是一个数字,但不是 8 个字符(数字)。
- 提供的值不是数字,而是 8 个字符(数字)。
我的问题是 2 倍:
A.有没有办法以任何标准组合这些规则,Yii2 方式。
B. In my previous question 我试图设置一个自定义验证器(解决这个问题的明显方法),但它被简单地忽略了。我可以使它验证的唯一方法是如果我将username 字段添加到场景中。但是,一旦我也添加了password,它又被忽略了。你能想到什么原因吗? 编辑:skipOnError = false 在这种行为中没有任何改变。
所以,当您回答时,请确保您最好在yii2/advanced 中进行测试;我几乎没有碰过默认设置,所以应该很容易测试。
编辑:为清楚起见,我只想允许 8 个字符(数字)的数字,因此它们可能有一个前导 0,例如。 00000001 或 00000000 就此而言。这就是为什么它必须是一个数字字符串。
【问题讨论】:
-
默认情况下,如果值为空,Yii2 会忽略验证器(与 Yii1 不同)。要对空属性强制执行验证,请设置 skipOnEmpty = false (与您的 B. 部分相关 - 忽略自定义验证器)。
-
@lubosdz 抱歉,但这并没有改变任何行为;我在用户名中添加了
skipOnEmpty = false,无论该字段是否为空,只有当场景中的唯一字段是username时才会启动(当然,在这种情况下,validatePassword验证器没有启动在)... -
skipOnError怎么样,也许这就是验证器被跳过的原因? -
@Beowulfenator 在另一个问题中提出了建议,但不幸的是它没有改变任何事情......我将编辑我的问题以包含它。
-
据我所知,您无法使用现有的 yii2 验证器解决此问题。但是,我认为您的自定义验证器的问题在于它在前端不起作用。因此,如果任何前端检查失败,您的表单永远不会被提交,因此您的自定义验证器没有机会运行。尝试开启 ajax 验证。
标签: php yii2 yii2-advanced-app