CakePHP 登録フォームの実装 (なぜか)其の一

11月 21, 2007 · Posted in CakePHP, PHP 

いろいろと動かしては悩んでということを繰り返しています。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() を呼び出す。
電話番号などいくつかのテキストボックスに分けるような時も一工夫必要かもしれません。

なんだか長くなってしまったので、続く、、、


Comments

Leave a Reply