CakePHPで二次元配列のチェックボックス

CakePHPのFormヘルパーに二次元配列を渡してチェックボックスを出力した時のメモです。

モデリング

親カテゴリ(CategoryParent)、子カテゴリ(Category)それぞれテーブルに分かれてて、親カテゴリが子カテゴリにhasManyでアソシエーションしてると仮定します。

Controller

$catagory_options =  $this->Category->find( 'list', array(
    'fields' => array('Category.id', 'Category.category', 'CategoryParent.skill')
));

Controllerの処理で下記の配列が返ってきます。

array(
	'親カテゴリhoge' => array(
		(int) 2 => 'ajax',
		(int) 6 => 'backbone.js',
		(int) 8 => 'Bootstrap',
		(int) 13 => 'CoffeeScript',
	),
	'親カテゴリfoo' => array(
		(int) 11 => 'CentOS',
		(int) 30 => 'UNIX'
	),
	...
)

view

echo $this->Form->input('category_id',array(
    'type' => 'select',
    'multiple' => 'checkbox',
    'options' => $category_options
));

Formヘルパーで、multiplecheckboxを指定、optionsに先ほどの配列を指定すると下記のようなHTMLが出力されます。

<fieldset>
<legend>親カテゴリhoge</legend>
	<label for="CategoryId2" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="2" id="CategoryId2" /> ajax</label>
	<label for="CategoryId6" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="6" id="CategoryId6" /> backbone.js</label>
	<label for="CategoryId8" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="8" id="CategoryId8" /> Bootstrap</label>
	<label for="CategoryId13" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="13" id="CategoryId13" /> CoffeeScript</label>
	<label for="CategoryId27" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="27" id="CategoryId27" /> Foundation</label>
	<label for="CategoryId44" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="44" id="CategoryId44" /> json</label>
	<label for="CategoryId116" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="116" id="CategoryId116" /> レスポンシブWebデザイン</label>
</fieldset>
<fieldset>
	<legend>親カテゴリfoo</legend>
	<label for="CategoryId11" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="11" id="CategoryId11" /> CentOS</label>
	<label for="CategoryId30" class="checkbox-inline"><input type="checkbox" name="data[category_id][]" value="30" id="CategoryId30" /> CentOS</label>
</fieldset>

このような具合に親カテゴリ毎にfieldsetでグループ分けして出力されます。

B!

Comment

コメント(0)

コメントはまだありません。

コメントする

Trackback(0)