Symonfy表单类型:将实体字段选择限制为关联值

时间:2015-12-07 12:33:29

标签: forms symfony

我有一个实体SearchFieldTypeManyToManySearchOperator

/**
 * @ORM\ManyToMany(targetEntity="SearchOperator", cascade={"persist", "remove"})
 * @ORM\JoinTable(
 *      joinColumns={@ORM\JoinColumn(name="type_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="operator_id", referencedColumnName="id")}
 *      )
 **/
 private $operators;

在表单类型中,默认设置会显示一个选择控件,其中包含所有现有运算符,而我只想显示该实体的当前可用运算符。这是我的(失败的)尝试,因为我读到我需要创建一个事件监听器(我吗?)才能访问相关的实体:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $formFactory = $builder->getFormFactory();
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formFactory)
    {
        $form = $event->getForm();
        $data = $event->getData();

        if ($data != null)
        {
            $form
                ->add($formFactory->createNamed('name', 'text', array('auto_initialize' => false)))
                ->add($formFactory->createNamed('operators', 'entity', array('class' => 'AppBundle:SearchOperator',
                                                   'multiple' => false,
                                                   'expanded' => false,
                                                   'choices'  => $data->getOperators())))
            ;
        }
      });
}

我收到此错误:

  

仅在根表单上支持自动初始化。您应该在字段“name”上将“auto_initialize”选项设置为false。

我尝试在字段和表单本身(setDefaultOptions)中将此选项设置为false,但没有结果。

我目前的symfony版本是2.7.6

1 个答案:

答案 0 :(得分:0)

"winningPlan" : { "stage" : "PROJECTION", "transformBy" : { "headers.From" : 1, "_id" : 0 }, "inputStage" : { "stage" : "FETCH", "filter" : { "headers.Date" : { "$gt" : ISODate("2001-04-01T05:00:00Z") } }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "headers.From" : 1 }, "indexName" : "headers.From_1", "isMultiKey" : false, "direction" : "forward", "indexBounds" : { "headers.From" : [ "[MinKey, MaxKey]" ] } } } 的{​​{1}}上,您已经映射了多对多的关系。我假设下面的表单是$operators

因为你有一个ManyToMany关系,这意味着你的表单希望在'运算符'的输入中有很多值。但是,您将字段类型设置为' entity'。这些不兼容。如果,正如您所说,您只需要一个下拉列表,那么您可能希望将关系更改为ManyToOne。 (如果您想保留ManyToMany,您必须将表单类型设置为' collection')。

您遇到的其他错误:

  

仅在根表单上支持自动初始化。你应该设置" auto_initialize"字段上的选项为false" name"。

将通过从字段"名称'中删除此选项来解决此问题。据我所知: SearchFieldType

然后,在将关系修复为ManyToOne之后,您可以使用SearchFieldType选项传递一个QueryBuilder实例,其中包含一些查询过滤器(我甚至不理解您要过滤的注释)对于'实体'字段类型(see here)。