技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

CakePHP 4 で特定のラジオボタン出力だけでレイアウトをフルカスタムする

通常であればフォームヘルパー経由でラジオボタンを作成するはず。
しかし、通常のフォームは以下の様な構造で出力されてしまう。

<div class="input radio">
    <label for='xxx1'>
        <input type='radio' id='xxx1' name='xxx1' />
        Hoge
    </label>
</div>

これをどうにか

<div class="input radio">
    <div class='wrapper'>
        <input type='radio' id='xxx1' name='xxx1' value='Hoge' />
        <label for='xxx1'>
            Hoge
        </label>
    </div>
</div>

こうしたい。
そこで、実際にこんな出力が出るように調査してみたログ。

で、目をつけたのが これ です。

book.cakephp.org

で、具体的にどう書くのかをペタリ。
明日コピペできるコードをあなたに

$this->Form->control(
    'xxx', // Id 値
    {
        'type' => 'radio',  // input タイプはラジオボタン
        'options' => ['Hoge', 'Fuga'],    // 選択値
        'nestedInput' => false, // ネストレイアウト(label の中に input タグを置く設定)を false
        'templates' => [ // 出力するテンプレートの上書き
            // input タグの出力テンプレート上書き
            'radio' => '<input type="radio" name="{{name}}" value="{{value}}"{{attrs}} />',

            // ラベルの出力上書き。
            'nestingLabel' => '{{hidden}}{{input}}<label {{attrs}}>{{text}}</label>',

            // 上2つのラッパー
            'radioWrapper' => '<div class='wrapper'>{{label}}</div>'
        ]
    }
);

とりあえずこれで意図通りの出力ができるようになった。
というか公式が「暗黙の了解でわかるんだろう?」的な説明不足で、初見では具体的な設定方法がマジ読み取れん(汗