人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

cakephp2.0.5での年のプルダウンメニューの作成方法が知りたいです。
View内で
echo $this->Form->datetime('year', 'Y', null, array('minYear' => 1000, 'maxYear' => 2000));
と書いて何とか作成できたのですが、思うような動作をしてくれません。
data[hoge][year]とソース上で表示したいのですが、なぜかdata[hoge][year][year]と表示されてしまい、saveメソッドを作成しても「yearデータ」だけデータベースに保存されません。
また、<label for="HogeYear">Year</label>とラベル名を表示されません。
どなたかアドバイスを下さい。よろしくお願いします!

●質問者: チョロQ
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

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が使う構造のデータとして持っていたため、うまく動かなかったのかと。

何かの参考になれば。


チョロQさんのコメント
ご丁寧な回答ありがとうございます。 新しいヘルパーファイルを作成してもいいとはビックリしました。 奥が深いですね。cakephpは・・・。

チョロQさんのコメント
tdoiさんの?の方法を試させていただきました。 しかし、 >|| <option value="0">1900</option> ||< となってしまうので、1900ではなく0がデータベースに登録されてしまいます。 原因を究明中です!

tdoiさんのコメント
失礼。こうしたらどうです? >|php| function selectYear($field, $minYear, $maxYear) { $yearList = array(); for ($year = 1000; $year <= 2000; ++$year) { $yearList[$year] = $year; } return $this->Form->select('year', $yearList); } ||<

チョロQさんのコメント
2回もアドバイスをいただき、ほんとうにありがとうございます。 この方法で思い通りの操作ができました。 $yearList配列のキーと値に同じ年を入れていくんですね。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ