
Cakephpではお問い合わせなどに使用するinputタグをそのまま使用することもできますし、Formヘルパーという機能を使って作成することもできます。
(セキュリティ観点、効率性から考慮すると、完全にFormヘルパーを使用することを推奨)
でも、Cakephpを触り始めた人が結構難儀するのが、各パーツをどのようにFormヘルパーで作成するのか?または、業務的によくあるケースだと、「素で書かれているinputフォームをFormヘルパーに置き換える」ということがあります。
単純なtextタイプとかだと、楽勝なんだけども、チェックボックス、ラジオボタン、セレクトとかどうすんだ?てな話。(ドキュメント読めば解決するんだけれども)
今回は、ラジオボタンを例にしてみます。
例①: 素のラジオボタンをCake4フォームヘルパーへ置き換え
こういう素のinputフォームがあるのは過去のシステムではよくある?ケースだとは思う。
// $typesには配列のデータがあるとする。[1 => '男性', 2 => '女性']とか。
<ul>
<?php // Formヘルパーを使うと入れ子でない<label><input>を出力できないので素のHTMLで書く?>
<?php foreach ($types as $key => $value) : ?>
<li>
<input type='radio' name='type' value=<?= h($key) ?>>
<label for='formselect' . h($key)><?= h($value) ?></label>
</li>
<?php endforeach ?>
</ul>
radioやcheckboxなど風変りのWEBパーツは結構使いこなすのに手間がかかる。
上記コメントアウトにあるように、特に<label><input>タグの入れ子に対応するマークアップの都合でFormヘルパーを使っていない場合とかよくあるケース。
これを以下のようにする。
<?php
// labelとinputの入れ変えはnestingLabelなどで設定する
$this->Form->setTemplates([
'nestingLabel' => '<li>{{hidden}}{{input}}<label{{attrs}}>{{text}}</label></li>',
'formGroup' => '{{input}}{{label}}',
]);
?>
<?php
$radioData = [];
$i = 0;
// $typesには配列のデータがあるとする。[1 => '男性', 2 => '女性']とか。
foreach ($types as $key => $value) {
// radioの配列データを作成
$radioData[$i] = [
'value' => h($key),
'text' => h($value),
'id' => 'formselect' . h($key),
];
$i++;
}
?>
<ul>
<?= $this->Form->radio('type', $radioData) ?>
</ul>
※for()でもええやんとか、まんまコピペで動かんやんのツッコミはムシ
もはや、inputパーツをforeach()でぶん回す必要は無くなります。
必要な属性やら値の配列を事前に作成しておき、radioにはフィールド名指定と、作成した配列データを渡すだけでよいのであります。(わかってしまえば、あら簡単)
余談として、必要なHTMLタグ(今回の例でいえば<li>)はsetTemplates()内で付与しておけばよい。これが理解できれば、おそらくどんな形のマークアップでも応用がきくんではなかろうかと勝手に思ってます。
例②: Cake2で書かれていたオプションのラジオボタンをCake4フォームヘルパーへ置き換え
Q. Cake2でのradioなどで使用するオプションseparator afterなど、どこいった?
(やってることは同じ。クラス属性などもsetTemplates()内で設定可。主にわし専用)
labelの指定の仕方
<?php $this->Form->setTemplates([
'nestingLabel' => '{{hidden}}{{input}}<label{{attrs}} class="label-radio">{{text}}</label>',
'formGroup' => '{{input}}{{label}}',
]); ?>
<?= $this->Form->control('sex', ['type' => 'radio', 'legend' => false, 'options' => [2 => '女性', 1 => '男性']]) ?>
■ Cakephp4: ラジオボタンの作成
https://book.cakephp.org/4/ja/views/helpers/form.html#create-radio-button
■ Cakephp4: チェックボックスとラジオのラベル外への移動
https://book.cakephp.org/4/ja/views/helpers/form.html#id48