如何在Symfony2中多次渲染相同的表单?

ct3nt3jp  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(109)

我有一个多车模板。可以有一个变量的车,没有固定的限制。
在每个购物车我想有一个用户可以选择一个国家的形式。如果他提交的形式应建立运费。
现在我正在做以下事情来在twig中实现它:

{% for cart in carts %}
    {# Some template stuff #}
    {{ form_start(form) }}
        <div class="form-input">
        <label for="country" class="middle-color">Country <span class="active-color">*</span></label>
        {{ form_widget(form.country) }}
    {{ form_end(form) }}
{% endfor %}

这是我的表单生成器:

$form = $this->createFormBuilder()
    ->add('country', 'choice', array('choice_list' => $choiceList, 'label' => 'country',
        'attr' => array('class' => "custom-selectbox dark-color light-gradient")))
    ->getForm();

现在的问题是,这个逻辑对于第一个购物车是有效的,但是对于后面的购物车却没有显示表单。我该如何处理这个问题呢?

oogrdqng

oogrdqng1#

我遇到了这个和另一个关于类似问题的问题。你可以在这里找到我的第一个答案。
最后,我没有在控制器中调用表单上的createView()函数,这是在将表单传递给视图时通常会做的,而是在twig视图本身中调用。
例如,在你的控制器动作中,你确实返回了表单对象本身:

return $this->render('AppBundle:Cart:list.html.twig', ['formObject' => $form];

在你看来,你应该在每个循环中设置表单:

{% for cart in carts %}
    {# Some template stuff #}
    {% set form = formObject.createView %}
    {{ form_start(form) }}
        <div class="form-input">
        <label for="country" class="middle-color">Country <span class="active-color">*</span></label>
        {{ form_widget(form.country) }}
    {{ form_end(form) }}
{% endfor %}
jvidinwx

jvidinwx2#

对于Symfony 5和6,您可以

$formBuilder = $this->createFormBuilder()->add('...');

return $this->render('list.html.twig', ['formBuilder' => $formBuilder];

在你的树枝上

{% for cart in carts %}
    {# Some template stuff #}
    {% set form = formBuilder.form.createView %}
    {{ form_start(form) }}
        <div class="form-input">
        <label for="country" class="middle-color">Country <span class="active-color">*</span></label>
        {{ form_widget(form.country) }}
    {{ form_end(form) }}
{% endfor %}
hkmswyz6

hkmswyz63#

您应该使用collection表单类型。这里是一个从How to Embed a Collection of Forms开始的指南
P.S.注意,在呈现表单小部件之后,Form组件将其标记为已呈现,并且不再呈现。

相关问题