【CakePHP】Form::month()のの英語表記を数字にする
【CakePHP 1.3.2】
【通常の解決策と、その問題点】
Formヘルパーのmonthメソッドについて。上記だけでは、optionタグの中身がJanuary,February...と、
echo $form->month('month');
英語表記になってしまいます。
これを数字にする方法として、Cookbookでは'monthNames'属性を
falseにするようにと勧めています。
しかし、この方法では、optionタグの中身は01,02,03...と、
echo $form->month('month', null, array('monthNames' => false));
ひと桁の数字の頭にゼロがつけられてしまいます。
同じFormヘルパーのdayメソッドでは頭にゼロはつかないので、
生年月日を入力する場合などmonthとdayが並ぶ場合に、
どうにも統一が取れていなくて不恰好です。
【新たな解決策】
ライブラリのソースでは、下記のように、'monthNames'属性が配列だった場合は、そのままoptionタグ用の材料として使う
ように記述されています。
【/cake/libs/view/helpers/form.php】
if ($options['monthNames'] === true) {
$data['01'] = __('January', true);
$data['02'] = __('February', true);
$data['03'] = __('March', true);
$data['04'] = __('April', true);
$data['05'] = __('May', true);
$data['06'] = __('June', true);
$data['07'] = __('July', true);
$data['08'] = __('August', true);
$data['09'] = __('September', true);
$data['10'] = __('October', true);
$data['11'] = __('November', true);
$data['12'] = __('December', true);
} else if (is_array($options['monthNames'])) {
$data = $options['monthNames'];
} else {
//'monthNames' => falseの場合はこちらへ。
//『%m』は01〜12月のフォーマット指示子です。
for ($m = 1; $m <= 12; $m++) {
$data[sprintf("%02s", $m)] = strftime("%m", mktime(1, 1, 1, $m, 1, 1999));
}
}
ということで、自分の望む形式の配列を作り、monthメソッドに
渡します。
これで解決。
【ビュー】
$monthNames = array();
for ($m = 1; $m <= 12; $m++) {
$monthNames[sprintf("%02s", $m)] = $m;
}
echo $form->month('month', null, array('monthNames'=>$monthNames)).'月 ';
【感想】
ビューの中でいちいちfor文を書くのはめんどくさい…。でも、monthメソッドを使う場面はごく限られているでしょうから。
ライブラリのform.phpを書き換えてもいいのでしょうが、
それは最終手段という気もしますし…。
やらずに済ませられるなら、そちらを選ぶべきだと思いました。