Posts tagged ec

CakePHP1.2 バリデーションで共通ルールを作成するときに便利な userDefined

0

CakePHP1.2 バリデーションのルールを調べているときに気になっていた Validation クラスにある userDefined に関して調べてみました。
cake/libs/validation.php

function userDefined($check, $object, $method, $args = null) {
    return call_user_func_array(array(&$object, $method), array($check, $args));
}

と定義されています。

call_user_func_array は PHP の関数で、関数やクラスのメソッドをコールすることができます。

つまり独自バリデーションがこれを使用して実装できるということです。
使用方法はモデルに以下のようにバリデーションを定義します。

var $validate = array(
    'field' => array('rule' => array('userDefined',  'Model',  'method_name')),
);

function method_name ($data) {
    /*
      バリデーションのチェック
      エラーなら false 、エラーなしなら true を返す
    */
}

ただこれだと下記のように書けるのであまりありがたみがない。

var $validate = array(
    'field' => array('rule' => array('method_name'),
);

何に使えばいいのかと考えたところ、クラス名、メソッド名が指定できるのでシステムで共通のバリデーションを設定するときに使えるのではと思いました。多分これが一番うれしいところではないかと思います。

※ただ、app_model.php に共通にしたいバリデーションチェック用のメソッド名を書けばそれでいけるような気もする。

PHP5.2 DateTime クラスのメモ

1

PHP5.2 以降から日付の処理に DateTime クラスが使用できるようになりました。
PHP5.2 で開発していて DateTime クラスを使用する機会があったのでメモしておきます。

DateTime オブジェクトの生成

$date = new DateTime();または、
$date = date_create();
で生成します。
引数には strtotime 関数が理解できる形式を指定することができます。
指定しないとデフォルトは “now” です。つまり現在の日時になります。

日付の操作

strtotime と同じようなことが DateTime::modify() でできます。
$data->modify('+1 day');
指定方法は strtotime と同じです。

日付のフォーマット

date(‘Y-m-d’) のように出力する日付のフォーマットを指定できます。
$date->format('Y-m-d');
指定できる形式は date 関数と同じです。

まとめ

2008年3月12日の翌日を Y-m-d 形式で出力するには下記のようになります。

$date = new DateTime("2008-03-12");
$date->modify("+1 day");
echo $date->format("Y-m-d");

yetibot@naver.com対策

1

最近サーバが少し重かったので調べてみると

Yeti/0.01 (nhn/1noon, yetibot@naver.com, check robots.txt daily and follow it)

という UserAgent が激しくアクセスしていました。このボットはあまり行儀のよいボットではないようですのでブロックすることにしました。

httpt.conf

<Directory />
    SetEnvIf User-Agent Yeti badrobot
    Order Allow,Deny
    Allow from all
    Deny from env=badrobot
</Directory>

ただ、よく UserAgent を変更するボットのようですが、これでしばらく様子みることにします。

CakePHP1.2 バリデーションのルール

2

CakePHP1.2 のバリデーションのメモです。
詳しくは cake/libs/validation.php を見ると分かりやすいです。

半角英数字のみ

alphaNumeric

var $validate = array('field' => array('rule' => array('alphaNumeric')));

文字列の長さ

between

var $validate = array('field' => array('rule' => array('between', 6, 8)));
半角で6文字以上8文字以内

文字列が空

blank

var $validate = array('field' => array('rule' => array('blank')));

クレジットカード番号

cc

var $validate = array('field' => array('rule' => array('cc')));

比較

comparison

var $validate = array('field' => array('rule' => array('comparison', '>', 10)));
‘==’, ‘!=’, ‘< =’, など使用できる

正規表現

custom

var $validate = array('field' => array('rule' => array('custom', '/^[0-9]{3}\-[0-9]{4}$/')));
例として NNN-NNNN 形式の郵便番号のバリデーション

日付

date

var $validate = array('field' => array('rule' => array('date', 'ymd')));
‘dmy’, ‘mdy’, ‘ymd’, ‘dMy’, ‘Mdy’, ‘My’, ‘my’ が使用可

小数点の桁数チェック

decimal

var $validate = array('field' => array('rule' => array('decimal', 2)));

var $validate = array('field' => array('rule' => array('decimal', null, '/^[0-9]{2}\.[0-9]{2}$/')));
正規表現を指定してチェックすることも可。

メールアドレス

email

var $validate = array('field' => array('rule' => array('email')));

=== での比較

equalTo

var $validate = array('field' => array('rule' => array('equalTo', 'hoge')));
型も含めて等しいかチェック

拡張子

extension

var $validate = array('field' => array('rule' => array('extension', array('gif', 'jpg')));
ファイルの拡張子をチェック。許可したい拡張子を配列で指定。デフォルトは array(‘gif’, ‘jpeg’, ‘png’, ‘jpg’)

IPアドレス

ip

var $validate = array('field' => array('rule' => array('ip')));

最小文字数

minLength

var $validate = array('field' => array('rule' => array('minLength', 6)));

最大文字数

maxLength

var $validate = array('field' => array('rule' => array('maxLength', 12)));

数字

numeric

var $validate = array('field' => array('rule' => array('numeric')));

数字の範囲チェック

range

var $validate = array('field' => array('rule' => array('range', 0, 100)));
注意点は指定した数字は含まれない
上の例では 1?99 までが true

var $validate = array('field' => array('rule' => array('range')));
とすると有限数かどうかのチェック

URL

url

var $validate = array('field' => array('rule' => array('url')));

朝4時に起床する習慣

3

Amazon ではずうと在庫切れで変えなかったのですが、昨日秋葉原のヨドバシの上にある有隣堂に行ったら1冊だけ置いてあったので早速購入して読みました。

朝9時までの「超」仕事術

朝9時までの「超」仕事術
見田村 元宣
¥ 1,575
単行本
インデックス・コミュニケーションズ

著者のブログ:朝4時起きの税理士 見田村元宣のビジネス成功宣言!!

著者のブログに書いてありましが現在2刷りでもうすぐ3刷りも決定したそうです。もうすぐアマゾンへも入荷するそうです。

私も朝4時に起きるようになって丸2年たち3年目に突入しました。今年は正月も4時起きでした。先月風邪を引き2日ほど7時に起きたほかは今のところ4時起き、たまに3時に目が覚めて3時起きのときもあります。今では完全にリズムが出来上がり目覚ましなしで4時に自然と目が覚めます。

朝4時に起きるようになったきっかけは子供が産まれ自分の時間を夜に取るのが難しくなってきたためです。そのため朝少し早く起きて勉強の時間に当てようと考えてやってみました。それまでは2時、3時に寝ることが通常だったので劇的な変化でしたね。

朝早く起きるようになって、4時から7時までみっちり3時間自分の自由な時間が取れ、読書や勉強する時間にあてています。急ぎの仕事があるときはそれをやったりもしますが。

また早起きするようになったもうひとつの利点として、朝食を食べられるようになったことです。それまでは朝起きてから2時間くらいしないと食欲が出なかったのですが、今は起きた瞬間からお腹が減っているような状態です。

起きてからやることは、トイレ行って、洗顔して、コンタクト入れて、コーヒーの豆をひいてコーヒーを入れる、軽食を食べながらメールチェック、その後読者や勉強という流れですね。この軽食が結構楽しみで、早起きのモチベーションにもなります。今は冷凍のちまきを食べてます。他にはドーナツ、冷凍の焼きおにぎり、冷凍の肉まんなどですね。欠点は太ることですが。。。まあそこは適当に運動しましょう。

この本の著者は早起きの習慣は夏から始めることを薦めています。しかし著者は冬にはじめたそうです。私も実は1月に始めました。なのでようはやるかやらないかのやる気の問題なのかなと思います。

この本を読んで気になった言葉をメモしておきます。

これは著者の考えた言葉だそうです。

気持ちが違うから行動が違う、行動が違うから結果が違う

これは「はじめの一歩」の鴨川会長の言葉だそうです。マンガといえども侮れないですね。

努力したものが全て報われるとは限らん。しかし、成功した物は皆すべからく努力しておる。

1月に読んだ 「朝30分」を続けなさい!人生勝利へのスピード倍増!朝勉強のススメ もオススメです。

「朝30分」を続けなさい!人生勝利へのスピード倍増!朝勉強のススメ
「朝30分」を続けなさい!人生勝利へのスピード倍増!朝勉強のススメ古市 幸雄
¥ 1,365
単行本
アスコム

CakePHP1.2 モデルの generateList は非推奨メソッドなので find(’list’) を使用する

3

CakePHP で select タグを作成する際に CakePHP1.1 ではモデルの generateList メソッドを使用しましたが、このメソッドは CakePHP1.2 では非推奨メソッドになっているようです。その代わりに find メソッドを使用します。

$this->Model->generateList();
と書く代わりに
$this->Model->find('list');
と書きます。

find メソッドのこの書き方は他に

find(‘count’)
レコード数を取得する。COUNT(*) の SQL を実行する
find(‘first’)
最初のレコードを取得する。 LIMIT 1 で SQL を実行する
find(‘all’)
全てのレコードを取得する。findAll と同等。
findAll は内部で find(‘all’) を実行している。

などがあります。

CakePHP1.2 Form ヘルパーで日付のフォームを作る

1

CakePHP1.2 の Form ヘルパーを使用して日付のフォームを作成したときのメモです。

$attr = array('minYear' => 2000, 'maxYear' => date('Y'), 'separator' => ' / ');
echo $form->dateTime('Model/field', 'YMD', 'NONE', date('Y-m-d'), $attr);

とすると下のような日付を選択するフォームができます。

Form Helper Date

第2引数の ‘YMD’ で年月日の並び順を指定します。日付を表示しない場合は ‘NONE’ を指定します。

NONE
非表示
YMD
年月日の順に表示
DMY
日月年の順に表示
MDY
月日年の順に表示

第3引数で時間表示の指定をします。

NONE
非表示
12
時間を12時間表示
24
時間を24時間表示

第4引数でデフォルトの日時を指定します。

第5引数で属性を指定します。

separator
日付の select タグの間に表示する文字
minYear
開始する年
maxYear
終了する年
interval
分を何分刻みで表示するか

2月に読んだ本

0

オススメは「成功本50冊「勝ち抜け」案内」です。成功本50冊を丹念に解説しています。こういう内容でぜひブログを書いて欲しいです。

あと野球の開幕が近いのもあるけど野球関連の本を2つ。
あぁ、阪神タイガース―負ける理由、勝つ理由 (角川oneテーマ21 A 77)
不動心 (新潮新書 201)
私は阪神ファンですが、松井のことは好きです。巨人は大嫌いですが、桑田や松井のように真摯に野球に取り組んでいる選手はやはり野球ファンとしては好きですね。阪神に入って欲しかった。この本を読んで松井の考え方などよく理解でき、また少し好きになりました。

野村監督の本は面白いのですが、微妙な心境です。敗軍の将は兵を語らずでいて欲しかった。どうしても自分の責任ではなく阪神というチームのせいでうまくいかなかったと言いたいのかもしれませんが、野村監督が名監督なのはこんな言い訳をしなくても分かっていることだと思います。

なにげに面白かったのは「字幕屋は銀幕の片隅で日本語が変だと叫ぶ」です。字幕の英語が変だという方にはぜひ一度読んで欲しいです。字幕屋さんの苦労がにじみ出てます。ここまで書いてこの後仕事に影響しないか心配です。

WEB+DB PRESS Vol.43


WEB+DB PRESS Vol.43

¥ 1,554
大型本
技術評論社

美容院と1000円カットでは、どちらが儲かるか?―できるビジネスパーソンになるための管理会計入門!


美容院と1000円カットでは、どちらが儲かるか?―できるビジネスパーソンになるための管理会計入門!
林 總
¥ 1,575
単行本
ダイヤモンド社

成功本50冊「勝ち抜け」案内 How to Improve Your Reading Skills for Success in Life (Kobunsha Paperbacks Business (013))


成功本50冊「勝ち抜け」案内 How to Improve Your Reading Skills for Success in Life (Kobunsha Paperbacks Business (013))
水野 俊哉
¥ 1,000
ペーパーバック
光文社

決算書の暗号を解け! ダメ株を見破る投資のルール


決算書の暗号を解け! ダメ株を見破る投資のルール
勝間和代
¥ 1,680
単行本(ソフトカバー)
ランダムハウス講談社

インテリジェンス 武器なき戦争 (幻冬舎新書)


インテリジェンス 武器なき戦争 (幻冬舎新書)
手嶋 龍一
¥ 777
新書
幻冬舎

FFmpegで作る動画共有サイト


FFmpegで作る動画共有サイト
月村 潤
¥ 2,940
単行本(ソフトカバー)
毎日コミュニケーションズ

「食い逃げされてもバイトは雇うな」なんて大間違い 禁じられた数字〈下〉 (光文社新書)


「食い逃げされてもバイトは雇うな」なんて大間違い   禁じられた数字〈下〉 (光文社新書)
山田 真哉
¥ 735
新書
光文社

世界一愚かなお金持ち、日本人


世界一愚かなお金持ち、日本人
マダム・ホー
¥ 1,050
新書
ディスカヴァー・トゥエンティワン

ぐんぐん実力がつく! 逆算式SQL教科書


ぐんぐん実力がつく! 逆算式SQL教科書
小野 哲
¥ 2,289
単行本(ソフトカバー)
技術評論社

ケータイでGoogle


ケータイでGoogle
佐野 正弘
¥ 1,344
単行本(ソフトカバー)
技術評論社

IKEAファンブック


IKEAファンブック
森井 ユカ
¥ 1,680
単行本
河出書房新社

右脳でわかる!株式投資力トレーニング


右脳でわかる!株式投資力トレーニング
窪田 真之
¥ 840
単行本
日本経済新聞出版社

あぁ、阪神タイガース―負ける理由、勝つ理由 (角川oneテーマ21 A 77)


あぁ、阪神タイガース―負ける理由、勝つ理由 (角川oneテーマ21 A 77)
野村 克也
¥ 720
新書
角川書店

不動心 (新潮新書 201)


不動心 (新潮新書 201)
松井 秀喜
¥ 714
新書
新潮社

字幕屋は銀幕の片隅で日本語が変だと叫ぶ (光文社新書)


字幕屋は銀幕の片隅で日本語が変だと叫ぶ (光文社新書)
太田 直子
¥ 735
新書
光文社

ウェブ国産力―日の丸ITが世界を制す (アスキー新書 047)


ウェブ国産力―日の丸ITが世界を制す (アスキー新書 047)
佐々木 俊尚
¥ 790
新書
アスキー

決断力 (角川oneテーマ21)


決断力 (角川oneテーマ21)
羽生 善治
¥ 720
新書
角川書店

できる人の英語勉強法


できる人の英語勉強法
安河内 哲也
¥ 1,365
単行本(ソフトカバー)
中経出版

個人事業・自由業者のための会社をつくるメリット・デメリット本当のところズバリ!


個人事業・自由業者のための会社をつくるメリット・デメリット本当のところズバリ!
井上 修
¥ 1,470
単行本
すばる舎

牛丼一杯の儲けは9円―「利益」と「仕入れ」の仁義なき経済学 (幻冬舎新書 さ 5-1)


牛丼一杯の儲けは9円―「利益」と「仕入れ」の仁義なき経済学 (幻冬舎新書 さ 5-1)
坂口 孝則
¥ 756
新書
幻冬舎

CakePHP1.2 のバリデーション

12

CakePHP 1.2 を使用してフォームを作成してバリデーションを使用したメモです。

下記サイトを参考にさせていただきました。
cakePHP 1.2のバリデーションを理解する – cakephp – クロアチアで働くプログラマー日記

例としてメールアドレスを2回入力させるフォームを考えて見ます。
バリデーションルールとして

  • 必須項目
  • メールアドレスとして正しい
  • メールアドレスがユニーク
  • 2回入力したメールアドレスが一致する

モデルにバリデーションを定義する

var $validate = array(
    'email' => array(
        'unique' => array(
    	    'rule' => array('checkUnique', 'email'),
    	    'message' => 'メールアドレスは既に登録されています'
    	),
        'rule1' => array(
       	    'rule' => array('email'),
       	    'message'=>'メールアドレスが正しくありません'
      	 ),
        'required' => array(
       	    'rule'=>VALID_NOT_EMPTY ,
       	    'message' => '必須項目です'
       	),
    ),
    'email_confirm' => array(
        'rule1' => array(
    	    'rule'=> array('checkCompare'),
    	    'message'=>'一致しません'
    	),
    ),
);

私はエラーメッセージをバリデーション定義にまとめておきたいので、上記のように各ルールに
'message' => 'エラーメッセージ'
として定義しています。
ここで定義しておけば、後でビューに書くフォームヘルパーでフォームを出力するときに引っかかったエラーを自動的に出力することができます。

また、自分でバリデーション関数を作成してチェックすることもできます。それが checkUnique と checkCompare です。

メールのユニークチェックは参考サイトを参考にさせていただきました。

function checkUnique($field){
    foreach( $field as $key => $value ){
        $this->recursive = -1;
        $found = $this->find(array("{$this->name}.$key" => $value));
        return !$found;
    }
}

次にメールアドレスを2回入れたものが一致するかのチェックです。
これはパスワードなどでもたまに使用するので汎用性を持たせてあります。
例えばメールアドレスのフィールド名が email の場合、確認用のフィールド名は ‘_confirm’を付けて email_confirm としておけばこの2つが一致するかチェックします。

function checkCompare($field) {
    foreach( $field as $key => $value ){
        if (preg_match('/^(.+)_confirm$/', $key, $regs)) {
            return $this->data[$this->name][$regs[1]] == $this->data[$this->name][$key];
        }
    }
}

ビューでフォームを設定

<?php echo $form->input('User/email', array('type'=>'text')); ?>
<?php echo $form->input('User/email_confirm', array('type'=>'text')); ?>

このように書いておけばバリデーションエラーがある場合は、モデルのバリデーションに定義したエラーメッセージを自動的に出力してくれます。

ちなみに上記のように書くと input タグの前に email などのフィールド名が出力されます。これを消したい場合は
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>'')); ?>
と書くと表示されなくなります。

追記:
コメントで教えていただきました。label=>” だと表示されないが、label タグは残るので
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>false)); ?>
とするとラベルタグも出力されなくなります。

コントローラでバリデーションチェック

以下のようになります。

function action() {
    if ($this->data) {
        if ($this->User->create($this->data) && $this->User->validates()) {
	    // バリデーションOK
	}
    }
}

他にもいろいろフォーム気がついた点があったのでそれはまた後でまとめます。

CakePHP Ajax のフォームを作成する

5

今さらなのですが CakePHP1.1 で Ajax のフォームを作成するというのをやったのでメモしておきます。

Ajax , Javascript ヘルパーを使用できるようにする

コントローラで Ajax, Javascritp ヘルパーを使用できるようにする。
var $helpers = array('Ajax', 'Javascript');

prototype.js を読み込む

webroot/js に prototype.js を配置し、ビューで読み込みます。
<?php echo $javascript->link('prototype'); ?>

ビューでフォームを作成する

今回は submit ボタンを押した後、更新中には submit ボタンを消して変わりに「更新中」というメッセージを表示し、更新終了後にメッセージをボタンの下の id=ajax_message に表示するようにしました。

<?php
$options = array(
    "update" => "ajax_message",
    "loading" => "Element.hide('ajax_button'); Element.show('ajax_loading');",
    "complete" => "Element.show('ajax_button'); Element.hide('ajax_loading');",
    );
echo $ajax->form("/controller/action/", "post", $options);
?>
<?php echo $html->input('Model/Field', array('type'=>'text')); ?><br>
<input type="submit" id="ajax_button">
<div id="ajax_loading" style="display:none;">更新中...</div>
<div id="ajax_message"></div>

$ajax->form の $options の
“update” で更新するメッセージ領域を指定し、
“loading”でアップロード中の動き、
“complete” で処理終了後の動き
を指定しています。

コントローラに Ajax で処理するアクションを作成

function action() {
    $this->layout = 'ajax';
    /* $this->data にフォームの内容が渡るので必要な処理を書く */
    $this->Model->id = $this->data['Model']['id'];
    $this->Model->saveField("Field", $this->data['Model']['Field'], true);
}

$this->layout で ‘ajax’ を指定して余計なヘッダ、フッタが出ないようにします。

Ajax で出力するビューを作成する

上のコントローラのアクションで出力するビューを作成します。
上の例では saveField でフォームから送られてきたデータを使用して更新処理しています。その結果によってメッセージを送信します。

<?php
if($msg=$error->messageFor('Model/Field')) {
    echo $msg;
} else {
    echo "更新しました";
}
?>
Go to Top