Интернет разработки: PHP, Symfony, C#, ASP.NET, Linux, Windows. При поддержке компании HotSupport.Ru
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;
}
// ...
Все, теперь работает.

а чего не тип поля enum использовал?
Post:
post_type: { type: enum, values: [/text], notnull: true, default: text }
странно обрезало строку..
values: [ text, photo, video, audio ], notnull: true, default: text }
если будет лишний комент – удали плыз
Так сложилось, так как заранее неизвестно какие значения в этом поле будут.
, но тут я оставил заметку как быстро решить небольшую задачку, иногда думаю такое всеже будет встречаться.
Да я понимаю как нужно с этим поступать
> $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%»);
}
…