【问题标题】:Change symfony2 form field but keep relation更改 symfony2 表单字段但保持关系
【发布时间】:2015-02-25 17:19:27
【问题描述】:

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

问题是这个字段被呈现为一个选择(或选择)。我真的不想加载所有可能的 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 的选择。哈金斯的回答会起作用,我想如果这只是一个领域,但由于有很多我真的不知道如何处理。

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

【问题讨论】:

    标签: forms symfony doctrine-orm


    【解决方案1】:

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

    【讨论】:

    • 问题是我正在使用一个集合。因此,对于每个集合,我都有不同的 ID。我正在尝试使用事件侦听器,但没有成功
    【解决方案2】:

    您可以将相关实体的 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 表单,然后设置 @987654326 @form.items。 (如果你不设置它们rendered,它们将出现在form_rest(form)

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

    {% block body %}
        ...
        {% for item in form.items %}
              {% if item.vars.data %}
                  <input type="hidden" name="{{ item.vars.full_name}}" id="{{ item.vars.id }}" value="{{ item.vars.value }}"
              {% endif %}
        {% endfor %}
        {% do form.items.setRendered %}
        ...
    {% endblock %}
    

    【讨论】:

    • 感谢您的更新。这似乎是正确的方法,但我只需要打印选定的 id 而不是每个 id 作为输入。我会试试这个(有一些变化),如果成功,我会将这个答案设置为接受的答案。
    • @AntonioCS 你说得对,看看我上次更新只渲染选定的 id (item.vars.data true)
    • 我已将此答案设置为正确答案,因为这引导我找到正确答案。我不需要 for 我只需要创建输入并执行 {{ item.vars.value }} (不是使用项目,而是使用表单项的正确名称),并且将打印正确的值而无需其余部分。谢谢!
    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 2012-07-21
    • 2016-06-23
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多