symfony2表单呈现自定义

时间:2014-05-27 07:38:51

标签: symfony doctrine-orm symfony-forms

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

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

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

我尝试在树枝模板中添加{attr:{'name':'sprint_label'}},但显然它被忽略了(我想象的保留字)。我看过Data Transformers,但在我看来,实体属性名称与生成的表单字段名称紧密耦合。

我考虑过编写一个表单实体包装器来重新映射名称,但是我不明白在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.
    }
}

2 个答案:

答案 0 :(得分:1)

您可以半手动执行read more

,而不是渲染整个form

示例:

您的代码可能如下:

{{ 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>

答案 1 :(得分:1)

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

这样的东西
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');
}

正如您已经发现的那样,在getName()中返回一个空字符串会从字段名称中删除表单的名称。但似乎这不是正确的解决方案。查看https://stackoverflow.com/a/19379696/733368

相反,您应该使用表单工厂并创建命名表单。像

这样的东西
$form = $this->container->get("form.factory")->createNamed(null, new YourFormType(), $entity);

应该有用。

有关表单类型的更多详细信息,请查看Symfony Form Types Reference