PR

[CakePHP] 値の検証(バリデーション)

$model->validateに設定したメッセージが一切表示されない。
保存コードがSJISにいつの間にか・・・。

独自のもので正規表現できないものはモデルに書く

function limitDuplicates($data, $limit){
 $existing_promo_count = $this->find( 'count', array('conditions' => $data, 'recursive' => -1) );
 return $existing_promo_count < $limit;
 }

スポンサードリンク

検証

    #########################################################################
    /**
     * 全角チェック
     */
    #########################################################################
    function valid_zen(&$model, &$data) {
        list($k, $v) = each($data);
        if($v === '') return TRUE;
        $v = mb_convert_encoding($v, 'UTF-8');
        if (!preg_match("/(?:\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F])|[\x20-\x7E]/", $v)) {
            return TRUE;
        }
        return FALSE;
    }
    #########################################################################
    /**
     * カタカナチェック
     */
    #########################################################################
    function valid_kana(&$model, &$data) {
        list($k, $v) = each($data);
        if($v === '') return TRUE;

        $v = mb_convert_encoding($v, 'UTF-8');
        if (preg_match("/^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6]|ー)+$/", $v)) {
            return TRUE;
        }
        return FALSE;
    }

    #########################################################################
    /**
     * ひらかなチェック
     */
    #########################################################################
    function valid_hirakana(&$model, &$data) {
        list($k, $v) = each($data);
        if($v === '') return TRUE;
        $v = mb_convert_encoding($v, 'UTF-8');
        if (preg_match("/^(?:\xE3\x81[\x81-\xBF]|\xE3\x82[\x80-\x93])+$/", $v)) {
            return TRUE;
        }
        return FALSE;
    }

    #########################################################################
    /**
     * 環境依存文字・旧漢字などJISに変換できない文字チェック
     */
    #########################################################################
    function valid_jis(&$model, &$data) {
        list($k, $v) = each($data);
        if($v === '') return TRUE;
        $myEnc = Configure::read('App.encoding');
        // 対象外
        $v = str_replace(array('~', 'ー', '-', '∥', '¢', '£', '¬'), "", $v);
        $v2 = mb_convert_encoding($v, 'iso-2022-jp', $myEnc);
        $v2 = mb_convert_encoding($v2, $myEnc,'iso-2022-jp');
        if ($v == $v2) {
            return TRUE;
        }
        return FALSE;
    }

参考文献

  • CakePHP Behaviorでバリデーション周りの効率化を図る : エクスギア Blog
  • 漠なままで行こうъ( ゜ー^) – 全角のvalidate
  • 12章 データバリデーション
  • [CakePHP]validateでエラーメッセージが表示されない – わんコロ餅。
  • 組み込みのバリデーションルール(Validation Rules) :: データのバリデーション(Data Validation) :: CakePHPによる作業の定石 :: マニュアル :: 1.2 Collection :: The Cookbook
  • 1個のフィールドに複数のルールを定義する :: データのバリデーション(Data Validation) :: CakePHPによる作業の定石 :: マニュアル :: 1.2 Collection :: The Cookbook
  • 【CakePHP】バリデーションルールの自動作成:『私的』 Bake Modelツール
  • CakePHP guide  » required と allowEmpty の違い

コメント