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%">&nbsp;</td><td><input type="checkbox" name="save" value="" /> save my info?</td></tr>
<tr><td width="40%">&nbsp;</td><td><?php echo $html->submit('Let me in!'); ?></td></tr>
<tr><td width="40%">&nbsp;</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に関連しないときはヘルパーを使わずに書く派です :)

コメント / トラックバック

コメント / トラックバック 1 件

  1. shin1x1 より:

    ヘルパ使わない派にもう一票 ノ
    Cakeのヘルパはちょっとクセがあるので適材適所で。