Web屋メモ

Web系エンジニアのメモです。

<< CakePHP バリデートの拡張  Webアプリケーションの運用について >>

スポンサーサイト

一定期間更新がないため広告を表示しています

- | - | - | 
blogram投票ボタン

CakePHP バリデートの拡張 その2

前回に続いて、CakePHPバリデートの拡張
今回は、文字列長バリデートを入れてみます。
app/app_model.php
<?php
// データバリデート追加
require_once( APP_PATH . 'validators_plus.php');
/**
 * Application model 基底クラス
 * アプリケーション全域で使用されるモデル基底クラス
 */
class AppModel extends Model{
 
    /// 文字列長チェック
    var $validLength = array();
 
    /**
     * データバリデート
     * 文字列長チェックも追加
     * @param array $data $_POST['data']
     * @return boolean true/false
     */
    function validates($data = array()) {
        if (empty($data)) {
            $data = $this->data;
        }
        // cake標準の正規表現での形式チェック
        $modelValid = parent::validates($data);
        // 文字列長チェック
        $errors = $this->invalidLengthFields($data);
        $lenValid = count($errors) == 0;
        if (!$modelValid || !$lenValid) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 文字列長チェック
     * cake/libs/model/model_php5.php のinvalidFieldsと同様に
     * $this->validationErrorsオブジェクトにエラーを残す。
     * エラーの項目名:フィールド名_len
     * @param array $data
     * @return array Array of invalid fields or boolean case any error occurs
     * @access public
     */
    function invalidLengthFields($data = array()) {
        if (empty($data)) {
            $data = $this->data;
        }
 
        if (!empty($data)) {
            $data = $data;
        } elseif (isset($this->data)) {
            $data = $this->data;
        }
 
        if (isset($data[$this->name])) {
            $data = $data[$this->name];
        }
 
        foreach ($this->validLength as $field_name => $validLen) {
            // 降順にソート
            //($validLen[0]が最大文字列長、$validLen[1]が存在したら$validLen[1]は最小文字列長)
            rsort($validLen);
            if (isset($data[$field_name])){
                if(mb_strlen($data[$field_name]) > $validLen[0]) {
                    // 文字列長オーバー
                    $this->invalidate($field_name . '_len');
                } else if(isset($validLen[1]) && (mb_strlen($data[$field_name]) < $validLen[1])) {
                    // 文字列長不足
                    $this->invalidate($field_name . '_len');
                }    
            }
        }
        return $this->validationErrors;
    }
}
?>
各モデルファイルでは、下記のように、
$validLengthという配列に
'フィールド名' => array(最低文字数,最大文字数)
という形式で文字数を定義
<?php
class User extends AppModel {
 
    var $name = 'User';
 
    var $validate = array(
        'id' => VALID_NUMBER,
        'name' => VALID_NOT_EMPTY,
        'pref_id' => VALID_NUMBER,
    );
 
    var $validLength = array(
        'name' => array(1,50),
    );
}
?>

使い方は、通常通り、コントローラのアクションメソッドで、
$this->モデル名->validates($this->data);
を実行すれば、フィールド名に"_len"をくっつけた名称で
controller->validationErrorsにエラーフラグが立つ。

ビューからは、
$html->tagErrorMsg("Modelname/fieldname_len", '1〜50文字で入力してください。');
という感じでエラーメッセージを表示できると思います。
CakePHP | comments(0) | trackbacks(0) | 
blogram投票ボタン

スポンサーサイト

- | - | - | 
blogram投票ボタン

COMMENTS

COMMENT?

 
 
 


TRACKBACK

TB URL :: http://sir2.jugem.jp/trackback/18
S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< October 2017 >>
求人情報サイト[ InterNext Career] スカウト登録
no alt string