web-dev-qa-db-ja.com

Yii2:ActiveFormフィールドの数値、長さ=> 8

数値で8文字の長さのActiveFormフィールドを検証するためにyii2を作成しようとしています。

以下は、yii2/advanced/backendのデフォルトのLoginFormモデルで試したものですが、残念ながら、isNumericバリデーターは単純に機能しません。

public function rules()
{
    return [
        // username and password are both required
        [['username', 'password'], 'required'],
        // username should be numeric
        ['username', 'isNumeric'],
        // username should be numeric
        ['username', 'string', 'length'=>8],
        // password is validated by validatePassword()
        ['password', 'validatePassword'],
    ];
}

/**
 * Validates if the username is numeric.
 * This method serves as the inline validation for username.
 *
 * @param string $attribute the attribute currently being validated
 * @param array $params the additional name-value pairs given in the rule
 */
public function isNumeric($attribute, $params)
{
    if (!is_numeric($this->username))
        $this->addError($attribute, Yii::t('app', '{attribute} must be numeric', ['{attribute}'=>$attribute]));
}

/**
 * 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.');
        }
    }
}

関連する投稿( https://stackoverflow.com/a/27817221/2037924 )で提案されているようにシナリオを追加しようとしましたが、含めなかった場合にのみ機能しました(エラーが表示されたように)シナリオのpasswordフィールド。

これはこれを達成するための良い方法ですか、それとももっと良い方法を考えられますか?

注:usernamestringと定義する理由は、数字に先行0が含まれている可能性があるためです。

7
webeno

検証の詳細については、こちらをご覧ください: http://www.yiiframework.com/doc-2.0/guide-tutorial-core-validators.html#number

これは、yii2-basicの連絡フォームを使用して問題なく機能します

/**
 * @return array the validation rules.
 */
public function rules()
{
    return [
        // name, email, subject and body are required
        [['name', 'email', 'subject', 'body'], 'required'],
        // email has to be a valid email address
        ['email', 'email'],
        ['subject', 'is8NumbersOnly'],
        // verifyCode needs to be entered correctly
        ['verifyCode', 'captcha'],
    ];
}

public function is8NumbersOnly($attribute)
{
    if (!preg_match('/^[0-9]{8}$/', $this->$attribute)) {
        $this->addError($attribute, 'must contain exactly 8 digits.');
    }
}
8
Mihai P.

integerデータ型で試してください:

[['username'], 'integer'],
[['username'], 'string', 'min' => 8],

numericlengthの両方を検証します。これでうまくいきます。

9
Insane Skull
public function rules()
{
    return [
        // username should be numeric
        ['username', 'match', 'pattern' => '/^\d{8}$/', 'message' => 'Field must contain exactly 8 digits.],

        // ...
    ];
}
1
Anatolii Dev

これを試して:

public function rules()
{
return [
    // name, email, subject and body are required
    [['name', 'email', 'subject', 'body'], 'required'],
    // email has to be a valid email address
    ['email', 'email'],
    [['subject'], 'number'],
    [['subject'], 'string', 'max' => 8, 'min' => 8],
    // verifyCode needs to be entered correctly
    ['verifyCode', 'captcha'],
];
}
0