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の場合、入力値を一回convertValues()っていうのを通してくれるので(存在すれば)ここを使って変換してやる必要がある。


ソース追うのそろそろ卒業したい。。。