表单使用来自各种实体的混合字段,并在Symfony2中使用Twig进行格式转换


Forms using mixed fields from various entities and rending with Twig in Symfony2

问题

我有一个Symfony2.3项目,它由许多实体(模型)组成。这些模型包括地址、人员、应用程序和其他类型。我需要一个表格来表示在线应用程序中的不同步骤。应用程序步骤都包含来自不同实体的许多字段。

一开始是这样;我创建了匹配的FormTypes和Twig模板来匹配。一切都很好,直到我需要把表格弄混。

例如,对于一个表单,我需要:

  • 名字
  • 姓氏
  • 多臂
  • 邮编(来自地址实体)
  • 应用程序开始日期(来自应用程序实体)

正如您所看到的,表单由来自不同表单的2个额外元素组成。因此,我遇到了使用学说将三个层面结合在一起的问题;实体,来自类型和分支模板。(http://symfony.com/doc/current/book/forms.html#handling-表单提交)

当前解决方案

到目前为止,我的模型已经设置好了。所以地址详细信息在地址实体中,个人详细信息存储在个人实体中。

然后,我创建了我希望它们如何输出到屏幕上的所有FormTypes,其中包含混合字段。因此,我有一个Step-1 FormType,它有:

  • 名字
  • 第二个名字
  • 多臂
  • 地址房屋编号
  • 地址邮政编码

然后在Twig中简单地输出字段。然后,我将添加自定义验证和自定义方法,以将数据保存到数据库和各种表中。我得出的结论是,我必须这样做,因为没有一个表单可以映射到一个实体。

我需要什么

如果有人能阐明这一点,并为我提供一些例子,我将不胜感激!

正如您在下面看到的,我有一些字段是硬编码的,它们表示与其他实体和FormType不同的属性。

  • 我需要一种方法使所有这些实体都处于正常形式
  • 具有各种FormType步骤,这些步骤具有来自这些不同实体的混合属性
  • 一些FormTypes会嵌入其他FormTypes,例如地址,因为用户可以添加3
  • 拥有Twig tempalte,它将简单地渲染每个单独的小部件
  • 加载表单、检查表单是否有效并将值保存到自己的表中的控制器

可能是,我必须创建一个完全自定义的方法来单独保存值,但我希望有一种"Symfony方式"来实现这一点。

示例代码

假设所有的getter和setter都是用条令创建的。假设所有条令映射都添加了与链接表的一对一关系。

个人实体:

private $id
private $first_name
private $last_name
private $dob

地址实体

private $address_number
private $address_postcode
private $address_lived_years
private $address_lived_months

应用程序实体

private $id
private $plan

AddresType

$builder->add('address_number', 'text')
        ->add('address_postcode', 'text')

混合形式示例:Step1Type

$builder->add('first_name', 'text')
        ->add('last_name', text')
        ->add('dob', 'date')
        ->add('address_1', 'collection', array('type' => new AddressType()));
        ->add('address_lived_years', 'text')
        ->add('address_lived_months', 'text')
        ->add('plan', 'text')

Twig

{{ form_start(step_1_form) }}
    {{ form_label(step_1_form.first_name, 'First Name') }}
    {{ form_errors(step_1_form.first_name) }}
    {{ form_widget(step_1_form.first_name) }}
    ... etc
{{ form_end(step_1_form) }}

控制器将其整合在一起

$step_1_form = $this->createForm(new StepOneType())->createView();
return $this->render('MyBundle:Application:apply_step_1.html.twig', array(
                    'step_1_form' => $step_1_form));
// Code needed to load form getForm() and handleRequest()

我没有看到在那里定义任何条令关联映射。由于您要求用户输入person实体中的一些数据和address实体中的某些数据,我认为您需要保存它们并将它们标记为相关的(如中所示,保存在person表中的行应该以某种方式链接到保存在address表中的行将)。对于你的情况,我认为OneToOne应该是这样(一个人链接到一个地址…反之亦然)。然而,在现实生活中,情况并非如此。

然后,您应该定义特定的*Type类(例如PersonAddresType),以容纳该特定情况下的ONLY所需字段,并在那里使用条令关系和嵌入形式。请参阅S2站点上的文档。对于您的情况,我认为嵌入单个对象是正确的开始。

如果你需要更多的细节(或者一些例子)。。。让我知道。如果需要的话,我会试着写几行代码。

相关文章: