LoginForm的:Yii2:的ActiveForm:在一個字段合併的規則/多個驗證
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
@lubosdz對不起,但這並沒有改變任何行爲;我向用戶名添加了'skipOnEmpty = false',並且該字段是否爲空,如果場景中唯一的字段是'username'(在這種情況下,'validatePassword'驗證程序沒有'踢入)... – webeno
'skipOnError'如何,也許這就是驗證者跳過的原因? – Beowulfenator