CakePHP 登録フォームの実装 其の二
続きです。続けられました(1週間空いたけど)w
登録フォームの次は確認画面の表示です。厳密に言えば入力チェックが挟みますが、ひとまず確認画面ってことで。
- 確認画面の表示
- <input type=”hidden” …/> の自動生成
といった内容になっています。
確認画面、それは入力した内容を確認のため表示するという至極単純なページ。
単純なわりに、フォームと似て非なるものをつくるため工数がかさみます。
CakePHPではそこがちょっとは楽になるかなーと思ったのですが、特にこのありがちな流れを補完するような機能はないようですね。orz
とはいえ楽な部分もあります。
フォーム表示では、テキストボックスなどを表示するのに Htmlヘルパーを利用して、
氏名: < ?php echo $html->input('Member/name'); ?>
フリガナ: < ?php echo $html->input('Member/kana'); ?>
などとしますが、確認画面を表示する際はこのフォームの*.thtmlファイルをコピペして
氏名: < ?php echo $html->tagValue('Member/name'); ?>
フリガナ: < ?php echo $html->tagValue('Member/kana'); ?>
とすれば事足りる模様。これは置換すればいいだけで楽。 <input /> タグを強引に正規表現で置換してちょっと直すよりはずっといけてます。
プルダウンの表示などはこれだけでは済みませんが、これはこれで大分作業が楽ですね。
もう一つ必要な処理が、次の実行処理に必要なフォーム入力値の引き渡し。
今までは、<input type=”hidden” … /> を使ってたのですが、たくさんの入力項目があったりすると、すべてを記述していくのは面倒なもんです。
で、世の識者はどういう風にしているのかを調べてみると・・・
- 確認画面表示時にセッションに保存し、実行時にセッションから引っ張る
- 登録内容をひとまとめにして base64 などにエンコードして一つの hidden タグにまとめ、実行時にデコードして解析
- 普通に hidden タグをゴリ書き
といったところのようです。どれも一長一短ですかね?セキュリティ面では2番目などがよいのかもしれません。セッションは何となく気分が悪いです(好みの問題)。
ま、自分は軽くオヤジはいっている古い人間なので、結局 3つめの方法に落ち着くことにした。
とはいえ、一つ一つ書くのはバカバカしいわけで考えてみたところ、POSTされた値から自動生成出来ますよね?(Ethnaではそういうメソッドがあるようでした)
というわけで独自にヘルパー作りました。内容は以下の通り
class HigeHelper extends Helper { var $helpers = array('Html'); // < -- Htmlヘルパー利用するため /** * 確認画面用の Hiddenタグを返す * * @param String $modelName モデル名 * @return String */ function hiddenVars($modelName) { $ret = ""; foreach ($this->data[$modelName] as $key => $val) { $ret .= $this->Html->hidden("$modelName/$key")."\n"; } return $ret; } }
超簡単でした。ヘルパー名は適当。髭
はじめの氏名・フリガナの用にモデル名を Member としてフォームを生成している場合は、
< ?php echo $hige->hiddenVars('Member'); ?>
でOK。
たぶんこれでいけているはず。不具合あればご連絡下さい。またご利用は計画的に。
CakePHP 登録フォームの実装 (なぜか)其の一
いろいろと動かしては悩んでということを繰り返しています。CakePHP。
それなりに使えてきたのではと思います。
さて、CakePHP習得まずはじめに何をしたかというと
Webアプリの基本のフォーム送信ですね。会員登録でメール送信というアレ。
ちまたのCakePHPの解説とかホントか読むと、コントローラーで add() メソッド作って、 $this->data が送られてきたらフォームからの送信と見なして処理実行・・・というのが多く、フォーム > 確認 > 完了 という流れはあまりサンプルがなかった。
次のような感じですね。
class HigeContoroller extends AppController { 略 function add() { if (empty($this->data)) { // フォームデータからDB登録 } ・・・・フォーム表示処理 } }
まあ、限られたスペースでの解説というのもありますが、上記の通りに作った場合、http://do.ma.in/hige/add というURL一つでフォーム表示・登録実行がなされます。二つの処理が同じURLだとログ解析時に同じ各処理が同じURLとして処理されるためあまりうまくない。フォームまで表示しても、その後の実行がないなどが分かれば、フォームに問題があるなどがわかるからね。従って、ここを分けるようにする。で、単なる会員登録ということで、registForm > registConf > registComplete としてみた。
毎回こういう英語で悩むのよね。Confと略すかConfirmとするか、Completeでいいの?とか。あとはキャメルケースでいいのか?アンダーバー(regist_formのように)で結んだ方がよいのか・・・などなど。誰かがこうせいというのを出してくれれば真似するのですがw
さて、フォーム表示ですが Htmlヘルパーを利用してがりがりと書いています。
DreamWeaverなどで見ようとするとうまくなさそうですが、結構便利ですね。
毎回 < ?php echo $html->なんちゃら(); ?> のように echo しないといけないのが何となくめんどくさい。とおもったら、AUTO_OUTPUT定数で変えられる模様。AUTO_OUTPUT = true にしてみたら、 $html->formTag がきちんと出力されないんですけど...
Htmlヘルパーでまずつまづいたのが、日付のプルダウン表示。
$html->dateTimeOptionTag(‘Member/birth’, ‘YMD’, ‘NONE’); としてみたところ、月は英語表記 orz。つかえねー
調べてみたところいくつかやり方はあるようですが、ま、日本語日付ようのヘルパーメソッドを作るというのが基本のようで、あとは
- もとの Htmlヘルパー(/cake/libs/view/helpers/html.php)を直接いじる
- /app/views/helpers に上記 html.php をコピっていじる。/app/views/helpers/html.php を優先して呼ぶ模様(未検証)
- 独自のヘルパーを作る
1番目の元をいじるのは嫌だし、2番目は元は残ってるとはいえ、CakePHPがバージョンアップして Htmlヘルパーが改善した時にめんどくさそう。ということで3番目を採用。
とりいそぎ、HtmlJp というヘルパー(名前適当)を作るということで、、、以下のようになりました。
ま、Htmlヘルパーの monthOptionTag, dateTimeOptionTag の一部を変更しただけです。
class HtmlJpHelper extends Helper { // < -- HtmlHelper を extends してもよいのかしら? var $helpers = array('Html'); // Htmlヘルパー利用するので // 月のプルダウン表示 function monthOptionTagJp($tagName, $value = null, $selected = null, $selectAttr = null, $optionAttr = null, $showEmpty = true) { if (empty($selected) && ($this->Html->tagValue($tagName))) { // < -- このあたり $this->tagValue を $this->Html->tagValueに。 $selected = date('m', strtotime($this->Html->tagValue($tagName))); } $monthValue = empty($selected) ? ($showEmpty ? NULL : date('m')) : $selected; $months = array('01' => '1', '02' => '2', '03' => '3', '04' => '4', '05' => '5', '06' => '6', '07' => '7', '08' => '8', '09' => '9', '10' => '10', '11' => '11', '12' => '12'); // < -- 英語表記やめ return $this->Html->selectTag($tagName . "_month", $months, $monthValue, $selectAttr, $optionAttr, $showEmpty); } function dateTimeOptionTagJp($tagName, $dateFormat = 'DMY', $timeFormat = '12', $selected = null, $selectAttr = null, $optionAttr = null, $showEmpty = true) { // ------ 略 ------ 上記と同じく $this->なんちゃら は $this->Html->なんちゃらに・・・ switch($dateFormat) { case 'DMY': // so uses the new selex $opt = $this->Html->dayOptionTag($tagName, null, $day, $selectDayAttr, $optionAttr, $showEmpty) . '日' . $this->monthOptionTagJp($tagName, null, $month, $selectMonthAttr, $optionAttr, $showEmpty) . '月' . $this->Html->yearOptionTag($tagName, null, null, null, $year, $selectYearAttr, $optionAttr, $showEmpty).'年'; // 以下同じように単純に、年月日というのを付けるだけ }
といったところでしょうか。
あとは、コントローラーで忘れずに
var $helpers = array('HtmlJp');
をつけて、Viewファイルで $htmlJp->dateTimeOptionTagJP() を呼び出す。
電話番号などいくつかのテキストボックスに分けるような時も一工夫必要かもしれません。
なんだか長くなってしまったので、続く、、、
CakePHPを習得中
自分で構築する場合、PHPのフレームワークはMapleで落ち着こうかと思っていたのだけど、いろいろあって現在CakePHPに手を出している。
もともとMapleを選択したのは、自作していたフレームワークと設定ファイル等の扱い方・考え方が近かったのと、日本純正という理由からだった。Ethnaも合ったけどいまいち肌に合わなかった。ようは相性の問題である。
何げに使えていたのだが、最近の動向を見るにMaple周りの動きがほとんどないというのと、CakePHPの話題をあちこちで見るようになり「うーむ、つかいやすそうだなー」と感じたため、乗り換えるかーと思った次第である。
丁度、大分前に作ったシステムを作り直すという仕事が入っているため、そいつをぶっつけ本番でCakePHP化すんべ!!と現在鋭意制作中だったりする。
ここ1〜2週間他の仕事もこなしつつコーディングをしているのだが感触としては「うんそれなりに使いやすいね」といったところである。
バリデーションなんかはMapleの方が便利だったりするが、設定ファイルを使わないというのは結構楽なんだなーと実感した次第である。
現在のところ、登録フォーム〜完了までとかメールの送信とか認証機能とか、試行錯誤しつつCakePHPのソース見つつ調べつ実装してきたので、大分時間かかった感はあるが、以後はそんなに頭を悩ますこともないだろうから、実際の開発スピードを実感できるのはこれからかもしれない。
しかし、本格的なコーディングは1年ぶりくらいだったりするので、開発スピード結構落ちてるね。リハビリ、リハビリ。
今のところの実感としては
- URLによって動作振り分けられるのは快適〜
- コーディングする分量は確かに減るかもしれない
- View にPHPのソースを詰め込んでいくと、DreamWeaverなどでソースを見る時にどうもなーと思う点。かといって、元々持っている便利なヘルパーを使わないのもどうもなーという感じ
- Model の部分が個人的には微妙。findAll() とか確かに便利だが今一歩かゆいところに手が届かない〜
などなどいろいろと感じることがあったので、以後、CakePHPネタ続くかもしれません。
BGM
今週からなんだか仕事が詰まっている。
・とある会社の業務システムのドキュメント書き
・とあるサイトに実装するシステムの御見積
・とあるサイトのシステム構築
・とあるサイトの掲示板機能改良依頼
・とあるサイトのフォーム不具合修正とページ更新
などなど・・・
今日はこいつとこいつを交互に、今日はこいつをメインに・・・と頭は混乱してきている。
特に久々にまじめにドキュメントなど作っていると思うのだが
つくづくドキュメント書くのは気が乗らないなーと思うことだ。
システム構築は今回から Mapleはやめて CakePHPを使っていこうと言うことで、使いはじめの調べもので結構大変ではあるがやっぱりコーディングは楽しいのである。しかし、ドキュメント書きはとんと気が乗らない・・・
そんな今週
いつもは iTunes でシャッフルして適当に音楽を聴きながら仕事をするわけところを
趣向を変えてみている。
ニコニコ動画にはいろいろ動画があるが、「作業用」と銘打って約1時間くらいの動画があったりする。動画というか作業用のBGMとしてご利用下さいというノリだ。
そこはニコ動。神曲アニソンとか結構偏りがあるわけだが、ここのところのお気に入りが、ゲーム音楽を集めたやつだ。
ドラゴンクエスト、ファイナルファンタジー などを聴いていると心が奮い立つ。
マザー なんかを聴いていると、心が洗われる。
今日は1日これ。オススメである。懐かしさ爆発。仕事にも気合い入りまくり。
ドラクエは堀井雄二・すぎやまこういち・鳥山明・中村光一などの才能が組み合わさった産物であるが、音楽はもうすぎやまこういち以外考えられないですね。
ここ最近はゲームをあまりやっていないが、またやりたくなりますね。
DSゼルダとか買ってしまいましたよ。
さて、今日は仕事はかどったのでしょうか・・・
何となくドラクエII, III 以外のストーリーをよく憶えていないため気になってはかどらなかったような気も・・・
Mac OS X Leopard – その他いろいろ
Mail以外のあれこれ。
●Spaces
まず便利に使ってるのがこれですね。VirtueDesktopsも一時使ってたんだけど。
システム開発とホームページ製作とかしている時に、Photoshopは4番目・DreamWeaverは3番目・Eclipseは2番目とかしてると画面が一気に広がる感じ。
ちょっと気になるのは Safari とかをいくつかの場所に分けて開いていると、コマンド+Tab でアプリを切り替える時に思ったウインドウに切り替えられないこと。1番目のSpaceのウインドウに入ってほしいのに 4番目のSpaceのウインドウが開いたりと、結局自分でSpace切り替えないといけないのだ。
●Finder
タブウインドウ対応してほしかったorz
基本機能としてやはり PathFinder に劣るため PathFinder を使い続けるとは思うんだけど、CoverFlow表示(は今のところ真新しさから)とクイックルックが使いたい。クイックルックPathFinder で使えるようにならないかな〜
Finderを開いてしまうもう1点。今回 Dockに追加された新機能 Stacks 便利なんだけど当然ながら Finderで開くようになっている。これを PathFinderにする方法って無いかしらね・・・
■Safari
ベータバージョンが以前にも出ていた Safari3
無事 SafariStandも Leopardに対応しひとまず安心。
タブの移動だとかが出来るようになってちょっと使い勝手があがるも、フラッシュ関係でバグがあるのか Flashのあるページを開くとたまーに落ちる。いきなり固まるんだよね〜
便利なのが「部分きりだしで Dashboardに表示」出来る機能。
自分はとあるサイトのラッキーナンバー抽選をやっている。毎日番号が変わり自分の番号が出たら1万円当たるというやつだ。最近はめんどくさくて見ていなかったのだが、これ、毎日チェックをしないといけなかった。
チェックするのになんかダッシュボード作らんといけないかなーと思っていたところ、Safariのこの新しい機能ですべて実現可能。
■ターミナル
まあiTermを使う自分には関係ないけど、ちょっと使い勝手があがっている。
タブウインドウ化、ウインドウの色分け定義など便利になっている。
接続先の登録って出来ないのかしらね?出来れば完璧なのだが。
Safariが落ちる以外は今のところ大きなトラブルもなく快適Leopard生活。
あ゛〜〜〜!? – 4歳4ヶ月と18日
今日の夕食の時間のこと。
娘がうちのかみさんに聞いている「し」は?「か」は?「れ」は?と
「し」⇒「じ」
「か」⇒「が」
「れ」⇒「れ゛」ねーよ
という会話が目の前を飛び交う。濁点付いたら何になるか聞いてるんですね。
ひとしきり聞き終わったみたいなので逆に聞いてみた・・・
そしたらきちんと濁点ついたらなんて言うか言い当てる!!
オヤバカ発揮して天才!?この子とか思っちゃうわけだが
実際この濁点の認識ってのはどーなってるんだろう?
とくに「あいうえお」を教えているわけではないので、ハ行・バ行の認識などはないわけで
不思議だな〜と思う今日この頃
最近はこういう質問が多いのだが困っているのがテレビに出てくる人を必ず
「この人、なになになにさん?」
と名前を聞いてくることだ。それもフルネームを求めるのだ。
テロップで漢字の名前が出てくるので、おそらくそれが読めないので聞いてくるんだろうけど、
毎回答えるこちらはそろそろめんどくさくなっているのだよ。
聞いてくるたびにテレビで何言ってるのか分からなくなるので、イライラするのだよ。