Posts tagged generateList

CakePHP1.2 モデルの generateList は非推奨メソッドなので find(’list’) を使用する

2

CakePHP で select タグを作成する際に CakePHP1.1 ではモデルの generateList メソッドを使用しましたが、このメソッドは CakePHP1.2 では非推奨メソッドになっているようです。その代わりに find メソッドを使用します。

$this->Model->generateList();
と書く代わりに
$this->Model->find('list');
と書きます。

find メソッドのこの書き方は他に

find(‘count’)
レコード数を取得する。COUNT(*) の SQL を実行する
find(‘first’)
最初のレコードを取得する。 LIMIT 1 で SQL を実行する
find(‘all’)
全てのレコードを取得する。findAll と同等。
findAll は内部で find(‘all’) を実行している。

などがあります。

CakePHP select タグの選択していないときの状態を指定する

0

Cute CakePHP Trick of the Day – GenerateList Empty Slot In List | Web Development 2.0: Web Design, CakePHP, Javascript
で select タグの選択していないときの状態の値を指定する方法が書かれていますが、この方法は間違っています。

元のエントリのコメントでも指摘されていますが、ヘルパーのメソッドの使い方が違います。コードを実際に書いて検証してみれば、動かないのがすぐに分かります。

元の紹介されている方法はそもそも PHP の文法的におかしいのでそこは適当に修正して紹介します。(変数名に $ がなかったり、generateList() を出力をどこにも保存していないかったりします。)

コントローラで下記のように generateList でリストを取得して
$state_id = $this->State->generateList();
ビューで
echo $form->input($state_id, array('empty' => '--'));
と紹介されています。

CakePHP1.1 の Formヘルパーには input メソッドがないので CakePHP 1.2 でのやり方だと思いますが、実際に Form ヘルパーの input メソッドは
function input($fieldName, $options = array())
と定義されています。上記のように書くと

で、実際にはどう書けばいいかというと
echo $form->input('Model/Field', array('empty'=>'---', 'type'=>'select', 'options'=>$state_list));
または、
echo $form->select('Model/Field', $state_list, null, null, array('empty'=>'---'));
と書けば select タグの先頭に
<option value=''>---</option>
と入ります。

CakePHP1.1 では 「CakePHP HTMLヘルパーで select タグを表示する」のエントリで書いたように結構面倒だったので新しい Form ヘルパーは使いやすいですね。

CakePHP Model::generateList メソッドの {n}

1

CakePHP で select タグを生成する際に generateList メソッドをよく使います。

ちなみに使い方は下記の通りです。
$this->Model->generateList($conditions, $order,$limit, $keyPath, $valuePath);
$coditions :検索条件
$order :ソートの指定
$limit :取り出す数
$keyPath :配列のキーにするフィールド
$valuePath :配列の値にするフィールド

この $keyPath と $valuePath の指定方法が曲者で
{n}.Model.field
のようにモデル名の前に「{n}.」をつけなくては正しくデータを取得できません。

この「{n}」というのがなんなのかが気になり調べてみました。
詳しくは下記リンク先を参照していただくと分かります。
{n} ? – Cake PHP | Google グループ

以下実際に CakePHP のコードを調べてみたことをまとめます。

  • generateList メソッドでは検索条件などによって findAll する
  • findAll したデータから Set::extract メソッドを使用して該当するフィールドデータのみ抜き出す
  • Set::extract メソッドは配列以外にもオブジェクトからも extract できるように設計されている
  • 配列の場合はモデル名の前に「{n}」があるかどうかで判定している

という感じのようです。

ちなみに Set クラスは /cake/libs/set.php で定義されていて、コメントを見ると配列用のライブラリクラスのようです。

また、generateList で $keyPath, $valuePath を指定しなかった場合は下記のようになるようです。

  • $keyPath には モデルで指定した $primaryKey を使用
  • $primaryKey の指定がなければ ‘id’ フィールドを使用
  • $valuePath には モデルで指定した $displayField を使用
  • $displayField の指定がなければ ‘title’ フィールドが存在すれば ‘title’ フィールドを使用
  • ‘title’ フィールドが存在しなければ ‘name’ フィールドを使用
  • ‘title’ フィールドも ‘name’ フィールドも存在しなければ ‘id’ フィールドを使用

フィールド名の付け方も重要ですね。

Go to Top