カスタムValidation(メアドが入力された場合のみ書式チェック)

2007/03/21 | cakePHP

cakePHPに限ったネタではないのだが、メアドの書式チェックについてメモ。
とあるクライアントから入力フォームのメアドは任意入力の項目としてほしい、という依頼があった。単にvalidationをはずしてもいいのだが、後々活用できそうなので、試行錯誤してみた。

cakePHPでは”VALID_EMAIL”と指定することでメールアドレスの書式チェックをしてくれるが、未入力でもエラーになってしまう。よってこれを「未入力はOKで、かつ入力された場合のみ書式チェック」というふうに書き換える。

/(¥¥A(?:^([a-z0-9][a-z0-9_¥¥-¥¥.¥¥+]*)@([a-z0-9][a-z0-9¥¥.¥¥-]{0,63}¥¥.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)¥¥z)/i

デフォルトはこのような正規表現になっている。正規表現は苦手なのだが、なんとなく雰囲気で以下のように書き換えた。

/(¥¥A(?:^([a-z0-9][a-z0-9_¥¥-¥¥.¥¥+]*)@([a-z0-9][a-z0-9¥¥.¥¥-]{0,63}¥¥.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)¥¥z)|(¥¥A¥¥z)/i

うしろに”|(¥¥A¥¥z)”をつけただけ。なんとも安直だが、とりあえずこれで動いているのでよしとする。

validation機能が貧弱

2007/03/20 | cakePHP

ウェブのプログラミングとユーザからの入力は切り離せない。というかプログラミングって「ユーザから与えられたデータを適切に処理する」ということが基本だ(何を今更・・・)。
ユーザから与えられた(例えばフォームで入力された)値をチェックするのは基本中の基本だが、実はcakePHP、バージョン1.1ではこの機能(validationという)が貧弱だ。cakePHPのコード中で関係ある記述は以下の部分のみ。

(cakePHPインストールディレクトリ)/cake/libs/validators.php

ファイルの中身を見れば一目瞭然だが正規表現のみ、だ。しかも設定してあるのは4つだけ。自分で作らなければいけないわけね(例えばメールアドレスのチェックでVALID_EMAILを指定すると、書式のチェックはいいとして、必然的に必須となってしまう)。
ウェブをいろいろあさっていて見つけたが、どうもバージョン1.2からvalidation機能が強化されるらしい。バージョン1.2の機能を1.1に組み込むことにチャレンジしていらっしゃる方もいるようだが、今回はそこまでチャレンジしない。最低限の正規表現だけ、考えてみることにする。

カスタマイズしたとしても、cakePHPのコアファイル(cakeディレクトリ以下)は基本的に変更とか追加とかしたくない。アプリケーション用ディレクトリ(app/)以下に配置したいのだが、こういうのはどこにおけばいいんだろう。お作法がよくわからない。そもそも設定ファイルをおかない、というスタンスがあるせいか、自分で書いたスクリプトに関しても設定ファイル配置のためのお作法というのがどこにも書いてない。
どうせ書くなら、誰が見てもわかるように書きたいのだけれど・・・。お作法がまだまだしっかりしていないのだろうか。まぁ、まだできて間もないものだから、やむをえない面ではあるのだが・・・。

コードを自動生成するスクリプト

2007/03/16 | cakePHP

cakePHPはコントローラーで$scaffold変数をセットすることで、基本的なツール(追加、編集、削除、閲覧、一覧)の機能を全て提供してくれる。しかし、さすがにそれをそのまま納品するわけにはいかない。もう一手間かけてやる必要がある。
cakePHPには上記で提供されるスクリプトのスケルトンをファイルに書き出してくれる機能がある。それがbake.phpだ。bake.phpで書き出したファイルにはすでに基本的な機能は全て実装されているので、書き出されたファイルを編集するだけで、相当レベルのウェブアプリケーションになる。ちなみにbake.phpは以下のディレクトリに存在する。

(cakePHPのインストールディレクトリ)/cake/scripts/bake.php

上記ファイルをPHP実行ファイルの引数として実行すればよい。

これだけでも高機能だが、さらにこのbake.phpを拡張して、より便利にした
ツールがdecorate.phpだ。こちらはbake.phpの機能に、一覧表示の際のページング、ソート、検索機能を追加したものだ。これでもう「お腹いっぱい」なくらいすばらしいツールだ。

ダウンロードはこちら

使い方は、ダウンロードしたファイルを解凍し、できたファイル(decorate.php)をbake.phpと同じディレクトリに配置し、bake.phpと同様の呼び出し方で、引数をdecorate.phpとするだけ。

そして、さらに便利なツールがある。decorate.phpを拡張したmasterbake.phpだ。こちらはまだ使ったことがないんだけど、なんとテーブルの自動生成までやってくれる。

ダウンロードはこちら。

世の中には賢人がいるものだ。

デフォルトのコントローラーとアクションを設定

2007/03/15 | cakePHP

cakePHPで引数なしで起動された場合に動作するコントローラー&アクションの組み合わせを設定したい場合がある(「http://○○/index.php」といった具合に)。この設定はcakePHPでは「ルーティング」という。マニュアルでは「最低限のmod_rewriteのようなもの」と書いてある。

この場合cakePHPでは以下のファイルで設定をおこなう。
(インストールディレクトリ)/app/config/routes.php

ここで、デフォルトの設定で以下の記述がある。
$Route->connect(‘/’, array(‘controller’ => ‘pages’, ‘action’ => ‘display’, ‘home’));

これは’/’でアクセスした(フロントエンドのindex.phpにアクセスした)場合に、コントローラー「pages」、アクション「display」、第一パラメータ「home」を呼び出しなさい、ということらしい。これを自分の好きなものに変更すればよい。
例えば、引数なしでアクセスした場合にコントローラー「notes」アクション「memo」を起動したい、と思ったら、上記の行をコメントアウトして以下のように記述すればよい。

$Route->connect(‘/’, array(‘controller’ => ‘notes’, ‘action’ => ‘memo’));

これだけでOK。

デザインの枠(layout:レイアウト)を変更

2007/03/10 | cakePHP

デフォルトで使用されるデザインの枠組み(これをlayoutという)は$scaffoldを使用する場合はいいのかもしれないが、普通にウェブアプリを作っていくうえではNGだ。たいていの場合はちゃんとしたデザインをするはずなので、その枠を別途用意してやる必要がある。「cakephp layout」等で検索すると、いろいろなページが出てくるがやり方は一つ。

(インストールディレクトリ)/app/views/layouts/default.thtml

このファイル中では以下の2つの変数を設定しておく必要がある(正確には少なくとも本体用の変数を1つ:もう片方はタイトル用)。
<?php echo $title_for_layout;?>
<?php echo $content_for_layout;?>

いつも思うが、名前の付け方が無頓着。「$subject_for_layout」ってすれば文字数が同じになって美しいのに。まぁ、<title>タグにあわせているんだろう。

さて、ここまでの記述はどこのサイトでも書いてある。でも、これだと一つのサイトはすべて同じレイアウトでしか表現できなくなる。基本は同じにすべきだろうが、やはり複数のレイアウトが必要になる場合というのは少なからずある。この記述方法がほとんど書いていなかった。

どこかで見た記憶が・・・と思ったのでマニュアルを調べてみると書いてあった。
コントローラーの記述で、

var $layout=’default';

等として、拡張子を省略して指定すれば、各コントローラー毎に個別にレイアウトを指定できるようになる。
また一つ賢くなった♪。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net