symfony2表单呈现自定义
在工作中,我们正在测试几种不同的PHP框架。为了对它们进行性能测试,我们在每个模块中实现相同的功能 我们有一个REST规范,它定义了所使用的路由和数据元素。例如,对于路由POST/sprints/create,我需要在POST数据中包含几个字段,如csrf、sprint_标签、sprint_点 我已经创建了一个带有标签和点的实体,以及一个用于创建表单的FormType,但是我找不到任何方法来更改HTML表单中生成的名称属性,该属性最终定义了POST数据名称 我尝试在细枝模板中添加一个{attr:{'name':'sprint_label'}},但显然它被忽略了(我想是保留字)。我看过数据转换器,但在我看来,实体属性名与生成的表单字段名紧密耦合 我曾考虑过编写一个表单实体包装器来重新映射名称,但我不理解在post之后的表单生成和实体管理器持久化之间发生的魔力(调用哪些方法,使用哪些参数) 有人知道如何自定义生成的表单字段名吗 谢谢, 萨姆 表格编号: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
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_标签…)。。。