【问题标题】:Symfony3 Render multiple time same formSymfony3 多次渲染相同的表单
【发布时间】:2016-03-29 13:38:09
【问题描述】:

我想多次呈现同一个表单来处理两个不同选项卡的相同操作。 问题是当我尝试时,只显示第一个选项卡的表单,如果我更改表单的 idname . 我发现这是 symfony 的预期行为,但我仍然需要它来工作。

我发现它可能适用于集合,但不知道它是如何工作的。

树枝:

{{ form(contactForm, {'attr': {'id': 'contactFormId' ~ Client.Id}, 'name': "contactFormName" ~ Client.Id})}}

表格:

$this->contactForm = $this->createFormBuilder($contact, array('allow_extra_fields' =>true))
->add('Nom',        TextType::class, array('mapped'=>false))
->add('Prenom',     TextType::class, array('mapped'=>false))
->add('Telephone',  TextType::class, array(
    'label' => 'Téléphone'))
->add('Email',      TextType::class)
->add('Ajouter',    SubmitType::class)
->getForm();

【问题讨论】:

    标签: forms twig symfony


    【解决方案1】:

    这是一个较老的问题,但我只是遇到了类似的情况。我想在列表视图中有一个表单对象的多个版本。对我来说,解决方案是将表单对象上的createView() 调用移动到视图,而不是在控制器中调用它。这是一种关于关注点分离的肮脏解决方案,但我想发布它,以便无论如何它可能对其他人有所帮助。

    我的控制器动作如下所示:

    /**
     * @Route("", name="cart_show")
     * @Method("GET")
     */
    public function showAction(Request $request)
    {
    
        /** @var CartInterface $cart */
        $cart = $this->get('rodacker.cart');
    
        $deleteForm = $this->createDeleteForm();
    
        return $this->render(
            'AppBundle:Cart:show.html.twig',
            ['cart' => $cart, 'deleteForm' => $deleteForm]
        );
    
        // ...
        private function createDeleteForm()
        {
            return $this->createForm(
                OrderItemDeleteType::class,
                null,
                [
                    'action' => $this->generateUrl('cart_remove_item'),
                    'method' => 'DELETE',
                ]
            );
        }
    }
    

    在视图中,我通过在控制器传递的表单变量 (deleteForm) 上调用 createView 函数来设置 form 变量:

    {% for item in items %}
        {% set form =  deleteForm.createView %}
        {{ form_start(form) }}
        {{ form_widget(form.item, {'value': item.image.filename}) }}
        <button type="submit" class="btn btn-xs btn-danger" title="Artikel entfernen">
            <i class="fa fa-trash-o"></i> entfernen
        </button>
        {{ form_end(form) }}
    {% endfor %}
    

    【讨论】:

    • 其实我真的很喜欢这个主意。作为一个对象,能够对它进行 CRUD 是合乎逻辑的,那么为什么不使用接口呢?他们可能在某些特殊情况下不起作用,但我有一天会尝试一下。
    • 一般来说这是可行的,但我面临的问题是 id 被多次使用。这会导致某些字段类型出现问题。
    【解决方案2】:

    一旦你渲染了一个 Symfony 表单,同一个表单将不会再次渲染。

    我建议创建一个表单类并多次调用 Controller::createForm() 以创建所需数量的 Form 实例;您可以在所有表​​单上独立调用 isSubmitted 等。 http://symfony.com/doc/current/book/forms.html#creating-form-classes

    【讨论】:

    • 问题是我会创建一个不固定数量的表格,而且可能很多。因此我无法创建那么多表格;这会大大降低页面速度。
    • 如果您需要可变数量的“表单”,听起来 CollectionType 字段正是您正在寻找的。您可以通过提供自己的 AbstractType 类来添加整个表单字段集合,并动态添加和删除此类条目。 symfony.com/doc/current/reference/forms/types/collection.html
    • 我看过你的想法,问题是集合允许在同一个地方获取多个表单。我需要在不同的地方渲染表单,每次都有一个很小的差异,但很重要。因此,我认为我不能为您提供 CollectionType::class ...
    • 你说的JS能做到是什么意思?你的意思是修改表格?如果是,我同意,但问题不在于表单中的值,而在于渲染的数量和位置。否则你能解释一下吗?
    • 冒犯已完成。总的来说,我对 JS 或 Symfony 没有任何困难,我要求的是 Symfony 解决方案,如果存在的话,而不是 JS 修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多