Akelos で、デフォルトのヘルパメソッドで form_options_helper というのがあります。
これは、HTML中のSELECTタグを効率的に出力することを助けてくれるヘルパですが、この中にある options_from_collection_for_select() というメソッドを使用するときにバグっぽいところを発見したのでさらします。
まず、このメソッドは次のように使用します。
たとえば foods テーブルがあって、次のようなスキーマだったとします。
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
これに、たとえば次のような値が入っているとします。
+-----+----------------+---------------------+------------+
| id | name | created_at | updated_at |
+-----+----------------+---------------------+------------+
| 1 | カレー | 2008-02-19 14:34:32 | NULL |
| 2 | ラーメン | 2008-02-19 14:34:32 | NULL |
| 3 | 牛丼 | 2008-02-19 14:34:32 | NULL |
| 4 | ナポリタン | 2008-02-19 14:34:32 | NULL |
| 5 | サンドイッチ | 2008-02-19 14:34:32 | NULL |
+-----+----------------+---------------------+------------+
このデータをHTMLのSELECTタグの中に表示させたい、とします。完成系の想定はこちら。
<select name="food_id">
<option value="">---</option>
<option value="1">カレー</option>
<option value="2">ラーメン</option>
<option value="3">牛丼</option>
<option value="4">ナポリタン</option>
<option value="5">サンドイッチ</option>
</select>
これをヘルパメソッドを使って実装してみる。
<select name="food_id">
<option value="">---</option>
<?php echo $form_options_helper->options_from_collection_for_select($Food->find(), 'id', 'name', $params['food_id']); ?>
</select>
options_from_collection_for_select() の引数の説明は次の通り。
- 第1引数
- 母体データオブジェクト。モデルをごっそりfind() した結果が入ってOK。
- 第2引数
- OPTIONタグのvalueにセットするカラム。この場合はidをセットします。
- 第3引数
- 選択肢表示用の文字列。今回はフード名を表示したいので、nameをセット。
- 第4引数
- デフォルトで SELECTED にするVALUE。
これで本来はうまく動くはずですが、実際には正しくSELECT〜OPTIONが生成されず、それどころかある件数(220件あたり)を超えるとPHPのfatal error でコードが途中終了してしまいました。ちなみに、第2引数を 'id' ではなく、'code' など別の文字列にすると、コードが途中で異常終了するようなことはなくなります。
これを修正するには、lib/AkActionView/helpers/form_options_helper.php の options_from_collection_for_select() を次のように修正する必要がありました。
lib/AkActionView/helpers/form_options_helper.php 194、195行目
■修正前
$name = method_exists($item,$text_column_name) ? $item->$text_column_name() : $item->get($text_column_name);
$collection_options[$name] = method_exists($item,$value_column_name) ? $item->$value_column_name() : $item->get($value_column_name);
■修正後
$name = method_exists($item,$text_column_name) ? $item->$text_column_name() : $item->get($text_column_name, false);
$collection_options[$name] = method_exists($item,$value_column_name) ? $item->$value_column_name() : $item->get($value_column_name, false);
最後の $item->get($value_column_name) の第二引数に false をつけた、というわけですね。どうもこの第二引数がtrueだと、再帰的になにかをしているようで、その何かの再帰呼び出しがPHPの上限数を超えて異常終了しているような感じ。
この修正方法が正しいかどうかを本家のフォーラムで問い合わせ中。問題なければ反映してもらおうかな、と思ってます。