29
Мар

Symfony: Фильтры формы – выпадающий список для текстового поля

Так получилось, что у одной модели имеется текстовое поле с не очень большим количеством вариантов значения. По идее можно сделать по правильному и вывести все в отдельную таблицу, но по некоторым причинам этого не делается.
Следовательно в админке при фильтрации, не очень охота писать значения этого поля ручками, легко можно сделать выпадающий список со всеми вариантами.
Сначала сделал так:


// SomeModelFormFilter.class.php
// ...
  public function configure()
  {
    $this->setWidget('status', new sfWidgetFormChoice(
      array('choices'=>self::getStatuses())
    ));

    $this->setValidator('status', new sfValidatorChoice(array(
      'choices'=>array_keys(self::getStatuses()),
      'required'=>false
    )));
  }

  public static function getStatuses()
  {
     return array(
         '' => '',
         'one'=>'Один',
         'two'=>'Два',
         'three'=>'Три'
     );
  }
//...

Оказалось, что хоть выпадающий список появляется, фильтрация не происходит.
Немного покопавшись, нашел такое решение: надо для нашего поля status, указать тип «ForeignKey».
Делаем это перекрываем родительский метод «getFields()».


// SomeModelFormFilter.class.php
// ...
  public function getFields()
  {
    $fields = parent::getFields();
    $fields['status']='ForeignKey';

    return $fields;
  }
// ...

Все, теперь работает.