我创建了一个自定义表单字段下拉列表,用于按年过滤。我想要做的一件事是允许用户按年份过滤,这是默认选项。我将其添加为empty_value
。但是,当我渲染表单时,它默认在第一个不是空值的项目上。空值就在那里,就在列表的正上方。如何在页面初始加载的情况下将页面默认设置为“全部”?代码如下。
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class YearType extends AbstractType
{
private $yearChoices;
public function __construct()
{
$thisYear = date('Y');
$startYear = '2012';
$this->yearChoices = range($thisYear, $startYear);
}
public function getDefaultOptions(array $options)
{
return array(
'empty_value' => 'All',
'choices' => $this->yearChoices,
);
}
public function getParent(array $options)
{
return 'choice';
}
public function getName()
{
return 'year';
}
}
我正在使用简单的{{ form_widget(filter_form) }}
答案 0 :(得分:21)
尝试向empty_data
添加null
选项,因此它首先出现。我有很多这种类型的字段,它正在工作,例如:
class GenderType extends \Symfony\Component\Form\AbstractType
{
public function getDefaultOptions(array $options)
{
return array(
'empty_data' => null,
'empty_value' => "Non specificato",
'choices' => array('m' => 'Uomo', 'f' => 'Donna'),
'required' => false,
);
}
public function getParent(array $options) { return 'choice'; }
public function getName() { return 'gender'; }
}
编辑:另一种可能性(我想)是设置preferred_choices
。这样你就可以获得顶部的“全部”选项。但我不知道它是否适用于null
empty_data
,但您可以将empty_data
更改为您想要的任何内容:
public function getDefaultOptions(array $options)
{
return array(
'empty_value' => 'All',
'empty_data' => null,
'choices' => $this->yearChoices,
'preferred_choices' => array(null) // Match empty_data
);
}
答案 1 :(得分:0)
当我需要不使用关系就从数据库中提取一个简单的城市下拉菜单时,我最终将这个配置用于城市字段(将null添加为选择数组的第一个元素),因为empty_data
参数没有为我工作:
$builder->add('city',
ChoiceType::class,
[
'label' => 'ui.city',
'choices' => array_merge([null], $this->cityRepository->findAll()),
'choice_label' => static function (?City $city) {
return null === $city ? '' : $city->getName();
},
'choice_value' => static function(?City $city) {
return null === $city ? null : $city->getId();
},
]);