バリデートメソッドから別のバリデートメソッドを呼ぶビヘイビアをつくってみた
たとえば、全角スペースをすべて半角にしてそのあとにnotEmptyで調べたい場合、オリジナルメソッド mbNotEmpty を作成して、その中で $this->notEmpty() とコールしてもnotEmtpyを呼び出す事ができません。
まぁ、これくらいなら普通にソースに書けよ!って話なのですが、もし、isUniqueや、ちょっとチェック方法が複雑な場合は
オリジナルバリデートメソッドで値をちょっと整形 → 既存のバリデートメソッドでチェック
という流れが効率がいいと思います。
ちなみに、組み込みずみの email や、betweenの場合は Validation::email($check) のように直接呼べばいいわけですが、やはりModel内で定義してあるメソッド、Behavior 内のメソッドも呼びだしたい!と思うので久々につくってみました。
ちなみに以前も同様の記事を書きましたが、あれば全然ダメだったのでこちらでお願いしますw
| 1 | /** |
| 2 | * バリデートを個別に呼ぶ |
| 3 | * @access public |
| 4 | * @param array バリデートメソッドの第一引数(array('fieldname' => 'チェックする値')の形) |
| 5 | * @param mixed array validate配列のruleと同じ書式 |
| 6 | * @param |
| 7 | * @return |
| 8 | * @author PG103 |
| 9 | ---------------------------------------------------------------------------------------------- */ |
| 10 | |
| 11 | public function call_validate(&$Model, $check_data, $ruleParams) { |
| 12 | $valid = false; |
| 13 | $Validation =& Validation::getInstance(); |
| 14 | $data = $Model->data; |
| 15 | $methods = array_map('strtolower', get_class_methods($Model)); |
| 16 | $behaviorMethods = array_keys($Model->Behaviors->methods()); |
| 17 | |
| 18 | if (is_array($check_data)) { |
| 19 | list($fieldName) = each($check_data); |
| 20 | $check_data = array_shift($check_data); |
| 21 | } |
| 22 | |
| 23 | if (is_array($ruleParams)) { |
| 24 | $rule = $ruleParams[0]; |
| 25 | unset($ruleParams[0]); |
| 26 | $ruleParams = array_merge(array($check_data), array_values($ruleParams)); |
| 27 | } else { |
| 28 | $rule = $ruleParams; |
| 29 | $ruleParams = array($check_data); |
| 30 | } |
| 31 | |
| 32 | $validator = array( |
| 33 | 'allowEmpty' => null, |
| 34 | 'required' => null, |
| 35 | 'rule' => $rule, |
| 36 | 'last' => true, |
| 37 | 'on' => null, |
| 38 | 'message' => 'ERROR', |
| 39 | ); |
| 40 | |
| 41 | if (in_array(strtolower($rule), $methods)) { |
| 42 | $ruleParams[] = $validator; |
| 43 | $ruleParams[0] = array($fieldName => $ruleParams[0]); |
| 44 | $valid = $Model->dispatchMethod($rule, $ruleParams); |
| 45 | } elseif (in_array($rule, $behaviorMethods) || in_array(strtolower($rule), $behaviorMethods)) { |
| 46 | $ruleParams[] = $validator; |
| 47 | $ruleParams[0] = array($fieldName => $ruleParams[0]); |
| 48 | $valid = $this->dispatchMethod($Model, $rule, $ruleParams); |
| 49 | } elseif (method_exists($Validation, $rule)) { |
| 50 | $valid = $Validation->dispatchMethod($rule, $ruleParams); |
| 51 | } elseif (!is_array($validator['rule'])) { |
| 52 | |
| 53 | $valid = preg_match($rule, $data[$fieldName]); |
| 54 | } elseif (Configure::read('debug') > 0) { |
| 55 | trigger_error(sprintf(__('Could not find validation handler %s for %s', true), $rule, $fieldName), E_USER_WARNING); |
| 56 | } |
| 57 | |
| 58 | return $valid; |
| 59 | } |
ちなみにこれは ビヘイビア用に記述していますので、適当なビヘイビアを作って使用してみてください。
下記のような使いかたになります。
| 1 | public function mbNotEmpty($data, $array=array()) { |
| 2 | return $this->call_validate(str_replace(' ', '', $data), 'notEmpty'); |
| 3 | } |
おそらくこれで問題ないかと思います。
もし、普通にやり方用意されてるよ!という方は是非おしえてください。
バリデーションメソッド内で別のバリデーションメソッドを呼ぶ
→こちら
CakePHPで自前でバリデーションメソッドをつくるときに、その中でemailのバリデーションチェックを実行したい という時があります。
この場合、単純に
$this->email($data)
とやっても実行できません。
個人的に需要は結構あると思うのですが、実際にやり方がどこにも載っていない上に、ソースを追うと結構複雑なので
とりあえず、Behavior用のメソッドとしてつくってみました。
| 1 | public function call_validate_method(&$Model, $data, $rule) { |
| 2 | $CloneModel = clone $Model; |
| 3 | $CloneModel->validate = array( |
| 4 | 'check_data' => array( |
| 5 | 'method' => array( |
| 6 | 'rule' => $rule, |
| 7 | 'message' => 'error' |
| 8 | ), |
| 9 | ) |
| 10 | ); |
| 11 | |
| 12 | $CloneModel->set(array($CloneModel->name => array('check_data' => $data))); |
| 13 | if ($CloneModel->validates()) { |
| 14 | return true; |
| 15 | } |
| 16 | else { |
| 17 | return false; |
| 18 | } |
| 19 | } |
そしてvalidate実行。
その結果によって true または false を返却する。
ちなみに、これをBehaviorではなく、MODELに設置する場合は
| 1 | public function call_validate_method($data, $rule) { |
| 2 | $CloneModel = clone $this; |
| 3 | $CloneModel->validate = array( |
| 4 | 'check_data' => array( |
| 5 | 'method' => array( |
| 6 | 'rule' => $rule, |
| 7 | 'message' => 'error' |
| 8 | ), |
| 9 | ) |
| 10 | ); |
| 11 | |
| 12 | $CloneModel->set(array($CloneModel->name => array('check_data' => $data))); |
| 13 | if ($CloneModel->validates()) { |
| 14 | return true; |
| 15 | } |
| 16 | else { |
| 17 | return false; |
| 18 | } |
| 19 | } |
これでOKです。
で、モデルの独自のバリデーションメソッドで
| 1 | public function original_method($data, $mode) { |
| 2 | $str = array_shift($data); |
| 3 | //なんかのエラーチェック |
| 4 | //最後に実装済のメールアドレスチェック |
| 5 | return $this->call_validate_method($str, 'email'); |
| 6 | |
| 7 | } |
もし、他にいいやり方があれば是非教えてください!!!
ckeditor 背景色を変更
FCKeditorでは設定用変数があったようですけど、ckeditorには見当たりませんでした。。
でどうやるかというと /ckeditor/contents.css でbodyの色を変えるだけです。
/ckeditor/contents.cssは、ckeditorのiframeの中で読み込まれるcssですので、ここであれこれ変えればテキストエリア(正確にはプレビューしている場所)の色を変える事ができます。
ちなみにこのcssのパスを変える場合は、
| 1 | CKEDITOR.replace( '対象ID', |
| 2 | { |
| 3 | contentsCss:'cssのパス' |
| 4 | } |
| 5 | ); |
で変更できます。
また、カラーピッカーなどをつかって動的に色を変える場合はJQueryで
| 1 | $("iframe").contents().find("body").css("background-color", 'カラーコード'); |
とすればOKです。もし同一ページにiframeが複数ある場合はセレクタを変更してください。
ずっと探していてやっと解決できましたw




