CakePHPでDBに関連しないパラメータはヘルパーで書くべきか? (Re:CakePHP修行! | idea*idea)
CakePHP修行! | i d e a * i d e aが更新されました。少々長くなるので2回に分けます。
まずはURIについて。
初期状態のURIの規則は /コントローラー名/アクション名/パラメータ1/パラメータ2...
モックアップ画面をいろいろ作る(CakePHP修行 #010)より。
URL的には http://www.codexcode.com/users/25 とかかな。
単なる書き間違いのような気もしますが、空気を読まずにつっこんでいきます。
Cake(けーく)の初期状態でのURIの規則は /コントローラー名/アクション名/パラメータ1/パラメータ2... なので、このURIは使えません。RewriteRuleや app/config/routes.php の設定次第では可能ですが、最初は初期状態で通るURIを使っておきましょう。
この場合は /users/summary/25 などですね。(アクション名にもっと適している単語があればそれで)
さて、今回の本題。
DBに関連しないパラメータはヘルパーで書いてもいいし書かなくてもいい
ログイン画面を作っていくぞ、と(CakePHP修行 #011)より、ログイン画面のテンプレートがあがってきました。(テーブルレイアウトかよとか言わない)
<form action="<?php echo $html->url('/users/login'); ?>" method="post">
<?if ($error): ?>
<div id="sys_msg">email and password do not match!</div>
<? endif; ?>
<table border="0" cellspacing="2" cellpadding="2">
<tr><td width="40%" align="right">email</td><td><?php echo $html->input('User/email', array('size' => 30)); ?></td></tr>
<tr><td width="40%" align="right">password</td><td><?php echo $html->input('User/pwd', array('size' => 20)); ?></td></tr>
<tr><td width="40%"> </td><td><input type="checkbox" name="save" value="" /> save my info?</td></tr>
<tr><td width="40%"> </td><td><?php echo $html->submit('Let me in!'); ?></td></tr>
<tr><td width="40%"> </td><td><a href="">forgot your password?</a></td></tr>
</table>
</form>
おおむね問題無さそうです。しかし中の人は納得が行かない様子です。
「save my info?」のところをどう処理したらいいかわかりません。checkboxの表現もわからなければ、データとしてどう持つべきかもよくわかりません。そういうときは「ザ・後回し!」。
checkboxの値がモデルと関連せず、checkboxがhtmlヘルパーを使わずに書かれていること言っているのだと思いますが、実はこれでもよかったりします。
まず、この書き方のときのcheckboxの値は $this->params['form']['save'] で参照できます。
次にcheckbox用のヘルパーとして$html->checkbox()がありますが、Cakeのフォーム用のヘルパーに渡せるキー名は「モデル名/フィールド名(例:$html->checbox('Example/example', null, array('checked' => $example_checked);)」に限られています。モデル名もフィールド名も必須です。
むりやり $html->checkbox('save', null, array('checked' => false)); と書いた場合、ヘルパーの中でNoticeエラーが発生してしまいます。ただ、一応inputタグは出力されるので、app/config/core.php のDEBUG値を0にしているとエラーが出ず正常に動作しているように見えてしまいます。異常に気付くためにDEBUG値は開発中は2にしておくことをおすすめします。
まとめ
というわけで、DBに関連しないようなパラメータをヘルパーで扱うときは存在しないモデル名を指定して書くことになります。例えば $html->checkbox('Param/save'...といった感じで書けば、$this->data['Param']['save'] で参照できます。存在しないモデル名を書くことが何となく気持ち悪ければヘルパーを使わずに書いてもよいです。このあたりはTPOと好みで判断してください。
ちなみに僕はDBに関連しないときはヘルパーを使わずに書く派です :)
ヘルパ使わない派にもう一票 ノ
Cakeのヘルパはちょっとクセがあるので適材適所で。