Help us understand the problem. What is going on with this article?

CakePHP 2系のFormヘルパーの小ネタ(separatorらへん)

More than 3 years have passed since last update.

作業的・形式的に作るのと、実際の使用感を想像しながら作るのって違うなと強く感じた一つなのでまとめておきます。(ある意味こだわらなければすごいシンプルなのかもなーとか思ったり)
ここでは編集用のフォームを題材にします。主にViewのお話です。

CakePHPのFormヘルパー

edit.ctp
<div class="form-group col-xs-12">
<?= $this->Form->input('meeting_datetime', [
    'label' => ['text' => '希望日', 'class' => 'col-xs-5'],
    'type'  => 'datetime',
    'dateFormat' => 'YMD',
    'timeFormat' => '24',
    'monthNames' => false,
    'separator' => array('年', '月', '日 '),
    'empty' => '-',
    'maxYear' => date('Y') + 1,
    'minYear' => date('Y') - 3
    ]); ?>
</div>

こんな感じ。一行目のやつを作るのに色々調べました。
スクリーンショット 2016-11-08 14.58.32.png

これで手間取った部分を解消された、という話なのですが、少し細かく書いておきます。

  • typeを「date」とか「datetime」とかで勝手にCakephp側で体裁を整えてくれる。
  • ○○formatとかmonthNamesのところを調整すれば、月の英語表記や24時間表記とか上手く整えてくれる。
  • separator(※これ後述します)をわかりやすく設定できる。
  • maxとかminYearを指定してセレクトしやすいようにできる。

ライブラリをいじった
lib/Cake/View/Helper/FormHelper.phpを app/View/Helper/FormHelper.phpにコピーして、

app/View/Helper/FormHelper.php
$opt = implode($separator, $selects);

この部分を、

app/View/Helper/FormHelper.php
// $opt = implode($separator, $selects);
$opt = "";
$i = 0;
if (is_array($separator)) {
    foreach($selects as $select) {
    $opt .= $select.$separator[$i];
    $i++;
}
} else {
    $opt = implode($separator, $selects);
}

こんな感じに修正。
'separator' => '/' で年・月・日ごとに分けらんないと思ってたら行けたーという発見でした。

daigon
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away