symfony2表单呈现自定义

symfony2表单呈现自定义,symfony,doctrine-orm,symfony-forms,Symfony,Doctrine Orm,Symfony Forms,在工作中,我们正在测试几种不同的PHP框架。为了对它们进行性能测试,我们在每个模块中实现相同的功能 我们有一个REST规范,它定义了所使用的路由和数据元素。例如,对于路由POST/sprints/create,我需要在POST数据中包含几个字段,如csrf、sprint_标签、sprint_点 我已经创建了一个带有标签和点的实体,以及一个用于创建表单的FormType,但是我找不到任何方法来更改HTML表单中生成的名称属性,该属性最终定义了POST数据名称 我尝试在细枝模板中添加一个{attr:

在工作中,我们正在测试几种不同的PHP框架。为了对它们进行性能测试,我们在每个模块中实现相同的功能

我们有一个REST规范,它定义了所使用的路由和数据元素。例如,对于路由POST/sprints/create,我需要在POST数据中包含几个字段,如csrf、sprint_标签、sprint_点

我已经创建了一个带有标签和点的实体,以及一个用于创建表单的FormType,但是我找不到任何方法来更改HTML表单中生成的名称属性,该属性最终定义了POST数据名称

我尝试在细枝模板中添加一个{attr:{'name':'sprint_label'}},但显然它被忽略了(我想是保留字)。我看过数据转换器,但在我看来,实体属性名与生成的表单字段名紧密耦合

我曾考虑过编写一个表单实体包装器来重新映射名称,但我不理解在post之后的表单生成和实体管理器持久化之间发生的魔力(调用哪些方法,使用哪些参数)

有人知道如何自定义生成的表单字段名吗

谢谢, 萨姆

表格编号:

<?php
namespace Blah\AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class SprintType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', 'text')
            ->add('points', 'integer')
            ->add('Save', 'submit');
    }

    public function getName()
    {
        return ''; // this removes the sprint[title] name, leaving just title.
    }
}

您可以半手动执行,而不是呈现整个
表单

例如:

您的代码可能如下所示:

{{ form(form) }}
我想你在寻找:

{{ form_start(form) }}
   {# ... #}

{{ form_widget(form.label, {'attr': {'class': 'sprint_label_or_something'}}) }}
您还可以使用HTML标记完全手动渲染:

<form action="{{ route('your_route') }}">
    <input name="some_type[label]" />
</form>

我认为您不能直接自定义字段的呈现名称。但是,您可以将所需的名称添加到生成器中。请记住,如果实体没有相应的属性,则必须更正属性路径。试试像这样的东西

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('sprint_label', 'text', array('property_path' => 'title'))
        ->add('sprint_points', 'integer', array('property_path' => 'points'))
        ->add('Save', 'submit');
}
$form = $this->container->get("form.factory")->createNamed(null, new YourFormType(), $entity);
正如您已经发现的,在
getName()
中返回空字符串会从字段名中删除表单名。但这似乎不是正确的解决方案。退房

相反,您应该使用表单工厂并创建一个命名表单。差不多

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('sprint_label', 'text', array('property_path' => 'title'))
        ->add('sprint_points', 'integer', array('property_path' => 'points'))
        ->add('Save', 'submit');
}
$form = $this->container->get("form.factory")->createNamed(null, new YourFormType(), $entity);
应该有用


有关表单类型的更多详细信息,请检查

是否可以提供表单类型的源代码?我已经在使用下面的内容呈现它们,但这并不能满足我的需要。我需要的形式,以呈现不是或工作像一个魅力。注意:您还必须更改模板中的属性值,例如form_行(sprint.title…->form_行(sprint.sprint_标签…)。。。