admin generatorのfilterを独自定義したプルダウンにする。
@symfony1.4 + propel
ちょーはまったのでメモ。
外部キーを貼っておけば自動だけど、悔しいから頑張ってみた。
schema
propel: item: _attributes: { phpName: Item } id: ~ group_id: { type: integer, required: true } name: { type: varchar(128), required: true }
group_idはDBではなく、app.ymlとかで管理している
generator.yml
generator: class: sfPropelGenerator param: config: list: display: - '=id' #- group_id - group_name - name
lib/model/Item.php
<?php class Item extends BaseItem { public static function getGroups() { return sfConfig::get('app_item_group'); } public function __toString() { return $this->getId().":".$this->getName(); } public function getGroupName() { $g = self::getGroups(); return $g[$this->getGroupId()]; } }
ここまではさほどsymfony1.0と変わらないんだけど、ここからがさっぱりわからなくてハマった。
lib/filter/ItemFormFilter.class.php
<?php class ItemFormFilter extends BaseItemFormFilter { public function configure() { $groups = array('' => '') + Item::getGroups(); $this->setWidget('group_id', new sfWidgetFormChoice(array('choices' => $groups))); $this->setValidator('group_id', new sfValidatorChoice(array('required' => false, 'choices' => array_keys($groups)))); } protected function convertGroupIdValue($value) { // これがポイント return array('text' => $value); } }
sfWidgetFormChoiceを使うと$valueに直接入力値が入っているけど、numberとかは$value = {'is_empty':boolean, 'text':integer}
っていうのを期待していて、これを変換してあげないといけない。
propelの場合、入力値を一回convert
っていうのを通してくれるので(存在すれば)ここを使って変換してやる必要がある。
ソース追うのそろそろ卒業したい。。。