FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

バリデートメソッドから別のバリデートメソッドを呼ぶビヘイビアをつくってみた

CakePHPの便利な機能のバリデート。拡張性にかなり長けていますがバリデートメソッド内で別のバリデートメソッドを呼ぶ方法がないんですね。

たとえば、全角スペースをすべて半角にしてそのあとに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 }

おそらくこれで問題ないかと思います。
もし、普通にやり方用意されてるよ!という方は是非おしえてください。
スポンサーサイト

バリデーションメソッド内で別のバリデーションメソッドを呼ぶ

2012/2/7 こりゃダメだったので新たに作りなおしましたw
こちら

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 }
ポイントは、バリデートメソッド内で、MODELを複製し、そのMODELに新しくvalidate配列を設定。
そして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 背景色を変更

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
プロフィール

pg103

Author:pg103
とりあえず、いろいろ作ってみようと思っているプログラマーです。

【僕がお気に入りの本】

CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用

Web制作の現場で使う jQueryデザイン入門 (WEB PROFESSIONAL)

MySQL全機能バイブル ~現場で役立つAtoZ~

プロのための Linuxシステム構築・運用技術 (Software Design plus)

最新記事
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。