▽1
●
tdoi ベストアンサー |
FormヘルパーのdateTimeメソッドはその名の通り日付を扱うためのものです。
そのため、
data[FormName][FieldName][year]
data[FormName][FieldName][month]
data[FormName][FieldName][day]
のような名前に自動で設定されます。
また、
$this->Form->dateTime('year', 'Y', ・・・);
あるいは、
$this->Form->year('year', 'Y', ・・・);
とした場合の第1引数は上記のFieldNameに相当する部分なので、このような動作をします。
では、どうするかですが、
1.ベタに書く
2.FormHelper::selectを直に使う
3.ヘルパーを書く
4.データを整形する
のいずれかではないでしょうか。
1はいいとして、2はこんな感じ。
<?php $yearList = array(); for ($year = 1000; $year <= 2000; ++$year) { $yearList[] = $year; } $this->Form->select('year', $yearList);
ただ、テンプレートファイルにコードあんまり書きたくないなぁって思えば、これをヘルパーに登録してしまえばいいでしょうってのが3です。
class TestHelper extends AppHelper { var $helpers = array('Form'); function selectYear($field, $minYear, $maxYear) { $yearList = array(); for ($year = 1000; $year <= 2000; ++$year) { $yearList[] = $year; } return $this->Form->select('year', $yearList); } }
のようなヘルパーを書いておいて、これを読むようにしておけば、
$this->Test->selectYear('year', 1000, 2000);
でいけます。
ここまでが、出力するHTMLをなんとかしようという方法で、逆にビュー側には手を加えずに受け取ったデータを加工してしまおうっていうのが4です。
とりあえず、動くだけなら、
if (!empty($this->data['FormName']['FieldName'])) { if (!empty($this->data['FormName']['FieldName']['year'])) { $this->data['FormName']['FieldName'] = $this->data['FormName']['FieldName']['year']; } else { $this->data['FormName']['FieldName'] = デフォルト値 } }
みたいなのをControllerなり、Modelなり、Behaviorなりに書いておけばよいかなと。
記憶が確かでしたら、DBの型がdatetimeとかになっていれば、上記のようなことは自動でCakePHPがやってくれたと思います。
恐らく今回は、DBの方がintで、それにdatetimeとしてCakePHPが使う構造のデータとして持っていたため、うまく動かなかったのかと。
何かの参考になれば。