更改 symfony2 表单字段但保持关系
Change symfony2 form field but keep relation
所以我有一个基于包含一对多关系的实体的表单。
问题在于此字段呈现为 select(或选项)。我真的不想加载所有可能的 id(有很多)但只想加载在实体中设置的那个(这是 selected 在 select 中出现的 id ).
有什么办法既能做到又能保持关系?如果我真的必须更改字段,我如何以 class 的形式访问提供给实体的 selected 实体,以便我可以检索 ID?
更新
为了更清楚一点,这是我的表单代码:
$this->createFormBuilder()
->add('items', 'collection', array(
'type' => new \MyBundle\Form\ItemsType(),
'allow_add' => true,
'data' => $itemsEntities
)
)
->add('submit', 'submit')
在 $itemsEntities 中,我有 5 个实体,所有实体都生成带有大量 ID 的 select。哈金斯的回答会奏效我认为如果这只是一个领域但因为有很多我真的不知道如何处理这个。
我试图在 \MyBundle\Form\ItemsType 上放置一个 eventListner,但我永远无法访问任何数据。
也许您可以使用该字段的 'query_builder' 选项(参见:http://symfony.com/doc/current/reference/forms/types/entity.html)并创建一个查询,根据它的 ID 获取您想要的唯一结果。如果需要,您可以将 id 传递给 form 的构造函数。
您可以将相关实体的 ID 传递给表单构建器参数,并将您的字段类型更改为 hidden
而不是 choice
(或 entity
):
在你的控制器中:
$id = $entity->getRelatedEntity()->getId();
$options['id'] = $id;
$form = $this->createForm(new EntityType($options), $entity);
在您的实体类型中:
public function buildForm(FormBuilderInterface $builder, array $options) {
$options = $this->options;
$builder
->add('relatedEntity', 'hidden', array(
'data' => $options['id'],
'required' => TRUE
));
更新
为了避免在不改变关系的情况下渲染集合,您可以通过将所选项目的 ID 渲染为隐藏字段来仅更改 Twig 表单, 然后设置 rendered
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 %}
所以我有一个基于包含一对多关系的实体的表单。
问题在于此字段呈现为 select(或选项)。我真的不想加载所有可能的 id(有很多)但只想加载在实体中设置的那个(这是 selected 在 select 中出现的 id ).
有什么办法既能做到又能保持关系?如果我真的必须更改字段,我如何以 class 的形式访问提供给实体的 selected 实体,以便我可以检索 ID?
更新
为了更清楚一点,这是我的表单代码:
$this->createFormBuilder()
->add('items', 'collection', array(
'type' => new \MyBundle\Form\ItemsType(),
'allow_add' => true,
'data' => $itemsEntities
)
)
->add('submit', 'submit')
在 $itemsEntities 中,我有 5 个实体,所有实体都生成带有大量 ID 的 select。哈金斯的回答会奏效我认为如果这只是一个领域但因为有很多我真的不知道如何处理这个。
我试图在 \MyBundle\Form\ItemsType 上放置一个 eventListner,但我永远无法访问任何数据。
也许您可以使用该字段的 'query_builder' 选项(参见:http://symfony.com/doc/current/reference/forms/types/entity.html)并创建一个查询,根据它的 ID 获取您想要的唯一结果。如果需要,您可以将 id 传递给 form 的构造函数。
您可以将相关实体的 ID 传递给表单构建器参数,并将您的字段类型更改为 hidden
而不是 choice
(或 entity
):
在你的控制器中:
$id = $entity->getRelatedEntity()->getId();
$options['id'] = $id;
$form = $this->createForm(new EntityType($options), $entity);
在您的实体类型中:
public function buildForm(FormBuilderInterface $builder, array $options) {
$options = $this->options;
$builder
->add('relatedEntity', 'hidden', array(
'data' => $options['id'],
'required' => TRUE
));
更新
为了避免在不改变关系的情况下渲染集合,您可以通过将所选项目的 ID 渲染为隐藏字段来仅更改 Twig 表单, 然后设置 rendered
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 %}