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>とラベル名を表示されません。
どなたかアドバイスを下さい。よろしくお願いします!

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2012/02/17 19:02:12
  • 終了:2012/02/20 10:17:08

ベストアンサー

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752012/02/17 21:17:34

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

何かの参考になれば。

他2件のコメントを見る
id:tdoi

失礼。こうしたらどうです?

    function selectYear($field, $minYear, $maxYear) 
    {
        $yearList = array();
        for ($year = 1000; $year <= 2000; ++$year) {
            $yearList[$year] = $year;
        }
        return $this->Form->select('year', $yearList);
    }
2012/02/18 14:30:11
id:sryou1985

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

2012/02/20 10:16:33

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません