29
Мар

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

Posted by Jeka under Программирование

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


// 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;
  }
// ...

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

Reader's Comments

  1. 228vit |

    а чего не тип поля enum использовал?
    Post:
    post_type: { type: enum, values: [/text], notnull: true, default: text }

  2. 228vit |

    странно обрезало строку..

    values: [ text, photo, video, audio ], notnull: true, default: text }

    если будет лишний комент – удали плыз

  3. Jeka |

    Так сложилось, так как заранее неизвестно какие значения в этом поле будут.
    Да я понимаю как нужно с этим поступать :) , но тут я оставил заметку как быстро решить небольшую задачку, иногда думаю такое всеже будет встречаться.

  4. Eugeniy |

    > $fields['status']=’ForeignKey’;
    выглядит как некрасивая затычка :)

    имхо правильнее так -

    public function getFields()
    {
    return array_merge(parent::getFields(), array(
    ’site_url’ => ‘custom’,

    ));
    }

    protected function addSiteUrlColumnQuery($query, $field, $value) {
    $query->andWhere(’s.url like ?’, «%$value%»);
    }

Оставьте комментарий