Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Formヘルパーのラジオボタンの吐き出しがちょっとおかしい

$cakephp->version = "1.2.6";

フォームヘルパーでラジオボタンをグループで出そうと思いまして、初めはこう書いた。

<?php e($form->radio('sample.flg', array('0' => 'なし', '1' => 'あり'), array('legend' => false,'value' => '1'))); ?>

そうするとこういうHTMLが吐き出された。

<input type="radio" name="data[sample][flg]" id="SampleFlg0" value="0"  /><label for="SampleFlg0">なし</label>
<input type="radio" name="data[sample][flg]" id="SampleFlg1" value="1" checked="checked"  /><label for="SampleFlg1">あり</label> 

が、表示がコレだ。

f:id:aroundthedistance:20100424144950j:image

斬新なラジオボタンの配置を提案してくれた。OH MY GOD.

ラベルを諦めると普通に表示されます。諦めるってのはこういうこと。

<?php e($form->radio('sample.flg', array('0' => 'なし', '1' => 'あり'), array('legend' => false,'value' => '1','label'=>false))); ?>

こう吐き出してくれたらいいのに~と思って、ソース追いかけてみた。

<label for="SampleFlg0">なし</label><input type="radio" name="data[sample][flg]" id="SampleFlg0" value="0"  />
<label for="SampleFlg1">あり</label><input type="radio" name="data[sample][flg]" id="SampleFlg1" value="1" checked="checked"  />

<?php
//form.php 940行目

if ($label) {
    $optTitle =  sprintf($this->Html->tags['label'], $tagName, null, $optTitle);
}
$out[] =  sprintf(
    $this->Html->tags['radio'], $attributes['name'],
    $tagName, $parsedOptions, $optTitle
);

//html.php 57行目
var $tags = array(.....
'radio' => '<input type="radio" name="%s" id="%s" %s />%s'

デフォルトはラベルを出力する。で、見ての通りsprintfで最後に整形した文字列を出すので、ラベルが最後に出力されるようになっている。そうすると、表示が崩れたラジオボタンが出てしまうようです。

解決するにはHelperのソースに手を入れるか、自分でHelperでも書くか、ベタにHTMLに書くしかないと思います。

僕はラベルに強い情熱が無かったので、今回は諦めちゃったけど><