3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(cakePHP) selectタグを作りたい

HTMLヘルパーで select タグを表示させる方法です。マニュアルには載ってませんでした。
ほぼリンク的感じですが、cakepPHP先輩方に感謝です。

HTMLヘルパーに selectTag というのがあるのでこれを使うようです。

HtmlHelper::selectTag  ( 
  $fieldName,               // フィールド名。コントローラからは、$this->params['data']で取得できる。
  $optionElements,          // 選択項目の名称 'array("1","2","3")など。'
  $selected = null,         // 何番目が選択状態か(整数 or null)
  $selectAttr = array(),    // SELECTエレメントの属性'array('onChange'=>'return this.form.submit();', 'class' => 'cssclassname') など。'(これがよくわからん)
  $optionAttr = null,       // OPTIONエレメントの属性。$selectAttr と同じ方法。
  $showEmpty = true,        // 空項目を出力するか
  $return = false           // true にすると、echo ではなく、return でデータが返る。
 )


要は $optionElements に選択項目、 $optionAttr に optionタグの value が入るといった感じみたいですね。

そしてModel側から$optionElementsを使うには
$this->モデル単数名->generateList()
でできるみたいです。
ただし、これは cakePHP 1.1 の場合で 1.2 からはgenerateList()が非推奨になっているため find('list') を使う方法が推奨されてます。

1.1で find('list') を使ってみましたが、SQLのエラーが出ました。やはり1.2からじゃないと使えない?

generateList()は結構癖があるようです。
引数としては
$this->Model->generateList($conditions, $order,$limit, $keyPath, $valuePath);
$coditions :検索条件
$order :ソートの指定
$limit :取り出す数
$keyPath :配列のキーにするフィールド
$valuePath :配列の値にするフィールド
この$keyPath と $valuePath は {n}.Model.field というように {n} が必要だそうです。
ということが、CakePHP Model::generateList メソッドの {n}に書かれてます。

ということで都道府県テーブル(prefs)からselectタグを表示する例です。( generateList()の場合 )

//****コントローラ側の記述****
//検索条件、ソート、取り出す数は指定しない。キーはid , 値はname
$prefs = $this->Pref->generateList("", "" , "" , "{n}.Pref.id", "{n}.Pref.name");
//ビューにセット
$this->set('prefs', $prefs);
 
//****ビュー側の記述****
//特に指定してないため初期値は空白値。結果は Member/pref_idに 入る。
<?php echo $html->selectTag('Member/pref_id', $prefs , null , null, null); ?>


参考:
SelectTag の使い方 cakePHPのフォーラムにて、selectTagの引数説明や取得方法について投稿されてます。

CakePHP HTMLヘルパーで select タグを表示する
selectTagについてかなりわかりやすく書かれてます。
モデルの指定列からselectタグを作るのに便利な方法 1.2でselectタグ作るときの方法について分かりやすく説明されてます。
find('list')に少々ハマる1.2でfind('list')を使うときの注意点です。