更改symfony2表单字段但保持关系

时间:2015-02-25 17:19:27

标签: forms symfony doctrine-orm

所以我有一个基于包含一对多关系的实体的表单。

问题是该字段呈现为选择(或选择)。我真的不想加载所有可能的ID(有很多)但只想加载实体中设置的那个(这是在选择中出现的id)。

有没有办法做到这一点,仍然保持关系?如果我真的需要更改字段,我如何在表单类中访问给予实体的选定实体,以便我可以检索id?

更新

为了使这更清楚,我的表格代码是:

$this->createFormBuilder()
    ->add('items', 'collection', array(
        'type' => new \MyBundle\Form\ItemsType(),
        'allow_add' => true,
        'data' => $itemsEntities
            )
    )
    ->add('submit', 'submit')

在$ itemsEntities中,我有5个实体,所有实体都生成带有id的加载的选择。 Hakins的回答会起作用我认为如果这只是一个领域,但因为有很多我真的不知道如何处理这个问题。

我试图在\ MyBundle \ Form \ ItemsType上放置一个eventListner,但我永远无法访问任何数据。

2 个答案:

答案 0 :(得分:3)

也许你可以使用该字段的'query_builder'选项(参见:http://symfony.com/doc/current/reference/forms/types/entity.html)并创建一个查询,根据它的id获取你想要的唯一结果。如有必要,您可以将id传递给表单的构造函数。

答案 1 :(得分:1)

您可以将相关实体的ID传递给表单构建器参数,并将字段类型更改为hidden而不是choice(或entity):

在您的控制器中:

$id = $entity->getRelatedEntity()->getId();
$options['id'] = $id;
$form = $this->createForm(new EntityType($options), $entity);

在您的EntityType中:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $options = $this->options;
    $builder
            ->add('relatedEntity', 'hidden', array(
                'data' => $options['id'],
                'required' => TRUE
            ));

更新

为避免在不更改关系的情况下呈现集合,您可以通过将所选项目ID(s)呈现为隐藏字段来仅更改您的Twig表单,然后设置{{ 1}} form.items。 (如果您未设置rendered,则它们将显示在rendered

使用现有的formBuilder代码,更改您的树枝:

form_rest(form)