如何在自定义symfony表单字段类型中默认为empty_value选项?

时间:2012-08-06 19:07:45

标签: symfony

我创建了一个自定义表单字段下拉列表,用于按年过滤。我想要做的一件事是允许用户按年份过滤,这是默认选项。我将其添加为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) }}

在树枝上渲染我的表单

2 个答案:

答案 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();
        },
    ]);