[自分用メモ] CakePHPでラジオボタンの実装をしようとしてドキュメントを見ながら作業したが非効率なので次回忘れることを危惧して備忘録的に書き残しておく

仕事でCakePHPを使うことがあるが、しばらく使わないでいるといろいろなことを忘れてしまう。Formヘルパーのラジオボタンの実装をする場面に出くわしたのだが、ドキュメントを見ても説明がまばらというか、あっち読みこっち読みとつまみ食いしながら実装していると、時間が無駄に経過してしまう。なので、自分用メモとしてある項目を残すようにときどき記事を書いている。今回はCakePHPでのラジオボタンの実装。

ある選択項目のうち1つだけを選ばせるのがラジオボタンの主たる機能である。この点ではチェックボックスや複数選択型リストのような複雑さはないので実装上それほど苦労することはないのだが、いざ実装となると特にController部分をどう実装すればよかったのかがぱっと浮かばないときがある(私がヘタレなので)。

View部分の実装はそれほど面倒はない。他のinput()メソッドとほとんど変わり映えの無い設定だろう。強いて言えば、ラジオボタンの複数項目をoptionsでオプション指定するのがselectタグを実装する場合に似通っているということか。チェックボックスの実装では1つ1つinput()を書いていたが、ラジオボタンはこれを1行で実装する。

[php]
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="Generator" content="Powered by Vim7">
<title>radio test</title>
</head>
<body>
<?php
echo $this->Form->create(‘Form’, array(‘url’ => array(‘controller’ => ‘formtests’, ‘action’ => ‘radio’)))."\n";
echo $this->Form->input(‘radio’, array(‘type’ => ‘radio’, ‘div’ => false, ‘label’ => false, ‘legend’ => false, ‘options’ => array(1=>’ラジオ1′, ‘ラジオ2’, ‘ラジオ3’, ‘ラジオ4’)));
echo $this->Form->end(‘submit’)."\n";
?>
</body>
</html>
[/php]

HTML部分の解説は飛ばす。

ラジオボタンのコードは、10~14行目である。
10行目はFormヘルパーのcreate()メソッドを呼び出している。これはformタグを生成するものだ。第1引数ではController側で受け取るPOSTパラメータ連想配列$this->dataの1次元目の添字となる。このフォーム内のPOSTパラメータは、Controller側では$this->data[‘Form’]を起点に参照されることになる。
第2引数は配列でformタグへの属性などを指示することができる。ここではaction時のURLを指定していて、array(‘url’ => array(‘controller’ => ‘formtests’, ‘action’ => ‘checkbox’)のように指定している。CakePHPであればおなじみのURL表記法なのでいまさら説明もいらないだろうけれど、controllerにformtests、actionにcheckboxを指定している。つまり、このページを最初に開いた時と同じactionにPOSTすることになる。
12行目はsubmitボタンの実装だ。これも特段の説明は不要だろう。

ラジオボタンは、チェックボックスと同様に専用のメソッドradio()が用意されているようだが、ここではinput()で実装してみたい。基本的には第2引数で「’type’ => ‘checkbox’」を指定するかしないかぐらいで大差がないはずだが、詳細はマニュアルを参考に。

ラジオボタンは全部で4個出していて、その実装が11行目である。どういうHTMLが生成されるかを以下に示しておく。

[html]
<input type="hidden" name="data[Form][radio]" id="FormRadio_" value=""/>
<input type="radio" name="data[Form][radio]" id="FormRadio1" value="1" />ラジオ1
<input type="radio" name="data[Form][radio]" id="FormRadio2" value="2" />ラジオ2
<input type="radio" name="data[Form][radio]" id="FormRadio3" value="3" />ラジオ3
<input type="radio" name="data[Form][radio]" id="FormRadio4" value="4" />ラジオ4
[/html]

input()の第1引数に指定した文字列は、Controller側でPOSTパラメータを受け取った際の2次元目の連想配列の添字になる。上記HTMLのname属性を見ると、さきほどのcreate()の第1引数で指定した文字列と、input()で指定した第1引数の関連が見えるだろう。Controller側では$this->data[‘Form’][‘radio’]として利用できる。

第2引数の配列には、ラジオボタンへの属性指定や、input()メソッドへの指示オプションを指定する。

複数あるが、簡単なところから手早く解説すると、’type’ => ‘radio’は、まさにラジオボタンタイプを使うための指示、’div’ => falseと’label’ => falseは、それぞれCakePHPのinput()メソッドへの指示で、チェックボックスタグに付帯させるdivタグやlabelタグなどの「余計だな」と思われるタグを出力しないように指示している(使い方によっては便利だと思うが今回は不要)。

ここでは指定していないが、input()メソッドへの指示として’hiddenField’ => falseがあるが、これはcheckboxとradioの2つのHTML要素にのみ影響するオプションだ。checkboxもradioも、チェックされていない場合はPOSTされる要素が存在しないため、Controller側で$this->data[‘Form’][‘radio’]といったふうに配列が存在しなくなるか、値がまったく入っていないパラメータが存在することになってしまう。これを回避するためにhidden属性のinputタグを自動的に生成してくれる。が、これが余計な生成となる場合もある(便利な場合もある)。チェックボックスの自分用メモで説明しているのでそちらを参考にしてもらうといいだろう。なおhiddenFieldが未指定の場合、デフォルトで0が指定されている扱いになる。

ところでCakePHPのFormHelperは、$this->request->dataというPOSTパラメータを格納する変数を自動的に解析してフォームのデフォルト値に反映させるようにしている。たとえばテキスト入力などの値が$this->request->data[‘Form’][‘text’]などとして入っている場合、この配列が保持している値を$this->Form->input(‘text’, array(‘type’ => ‘text’))が認識してデフォルト値としてHTMLに記述する。

ラジオボタンもこの恩恵にあずかることができるため、実はController側で処理するものはほとんどない。もちろん値のチェックが必要になる場合などはController側でいくつか実装したりしなければならないのだが、View側のために特段にデータをあつらえてやる必要はない。

したがって、パラメータ入力のチェックや保存をする必要のないradio()アクションの内容は実にシンプルになる。

[php]
App::uses("AppController", "Controller");

class FormtestsController extends AppController {

public function radio()
{
$this->autoLayout = false;
}
}
[/php]

Webアプリ開発を加速する CakePHP2定番レシピ119詳解CakePHP辞典―2.0/2.1/2.2/2.3対応オープンソース徹底活用 CakePHP 2.1によるWebアプリケーション開発PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)初めてのPHP、MySQL、JavaScript&CSS 第2版

コメントを残す

メールアドレスが公開されることはありません。