バリデーション条件の追加

現在使用可能なバリデーションでは対応できない入力チェックが必要になった時、バリデーションの条件追加が可能です。この項目ではバリデーションの追加の手順について説明します。

バリデーションクラスファイルの作成

Testというバリデーションを追加する事を例にとって説明します。下記のディレクトリの位置にバリデーションクラスファイルを作成します。

  • library
    • My
      • Validate
        • Test.php

ファイルのコードは次の通りです。

class My_Validate_Test extends Zend_Validate_Abstract
{
    const NOT_TEST = 'notTest';

    protected $_messageTemplates = array(
        self::NOT_TEST => "'%value%' is invalid"
    );

    public function isValid($value){
        $this->_setValue($value);

        // 文字列が「test」ならばよい。空白の場合は許容する。
        if($value != '' && $value != 'test'){
            $this->_error(self::NOT_TEST);
            return false;
        }

        return true;
    }

}

My_Validateへの追加

追加したファイルを、My_Validateへと登録します。My_Validate内のメソッド「getValidator」に処理を追加します。追加方法は次の通りです。

private function getValidator($validation, $name, $key){
    if(is_array($validation)){
        $param = $validation[0];
    }
    else{
        $param = $validation;
    }

    switch ($param){
        // 空欄チェック
        case 'NotEmpty':
            $validator = new Zend_Validate_NotEmpty();
            $validator = $this->setMessage($validator, $param, $name, 'IS_EMPTY', Zend_Validate_NotEmpty::IS_EMPTY);
            break;

/*** 中略 ***/

        // ファイル名として適正かチェック
        case 'FileName':
            $validator = new My_Validate_FileName();
            $validator = $this->setMessage($validator, $param, $name, 'INVALID_NAME', My_Validate_FileName::INVALID_NAME);
            break;
        /*** 追加する行 ***/
        case 'Test':
            $validator = new Zend_Validate_Test();
            $validator = $this->setMessage($validator, $param, $name, 'NOT_TEST', Zend_Validate_TEST::NOT_TEST);
            break;
        /*** 追加する行ここまで ***/
        default:
            break;
    }

    return $validator;
}

表示メッセージの作成

My_Validateに条件を追加したら、次は表示メッセージを追加します。下記の位置にあるcode.iniを開きます。

  • application
    • messages
      • jp
        • code.ini

code.ini中のvalidateキーに次の行を追加します。

Test.NOT_TEST = "%s%がtestという文字列と一致しません。"

Modelでの条件追加

これらの設定を完了させれば、バリデーションが追加されています。これをModelに追加する事で入力チェックの処理が行われます。Model中の任意のフィールドにTestと設定し、正常に判定される事を確認します。

protected $fields = array(
                        array('key'      => 'test',
                              'validate' => array('NotEmpty', 'Test')
                        )
);