0

出于某种原因,我需要分离一些数据,现在我有三个实体:

  • 命令
  • 订货公司
  • 最终用户

现在 Order 有一些基本数据,如 deliveryPlace 等......并且与 OrderingCompany 和 FinalUser 是一对一的关系。

现在以一种形式,我想让用户指定一些订单数据以及有关订购公司和最终用户的所有信息。我如何将 OrderingCompany 和 FinalUser 嵌入许多字段,因为据我所知,实体类型只允许选择一个字段。

我正在考虑手动处理表单,但处理 handleRequest 将是一个彻头彻尾的地狱。

那么我该怎么做呢?

4

1 回答 1

3

您应该使用两个(复合)字段构造 Order 表单:OrderingCompany 和 FinalUser。这两个字段都可以用它们自己的类型表示(但这不是强制性的)。

在下面的示例中,我将快速而肮脏,我将手动构建表格。没有什么禁止你将字段的构造提取到单独的类型。

<?php

class Order extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('orderdata') // orderdata should exist on order entity
            ->add('finalUser', new FinalUserType)
            // same with OrderingCompany
        ;
    }

    public function getName()
    {
        return 'order';
    }
}

   

class FinalUserType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array('data_class' => 'FinalUser'));
    }
}

选项 2

还有另一种可能性:使用属性路径将表单字段直接映射到实体图的基础对象(假设您的图具有正确的实例):

<?php

class Order extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('orderdata') // orderdata should exist on order entity
            ->add('finalUserName', 'text', array(
                'property_path' => 'finalUser.name' // $order->getFinalUser()->(get|set)Name() will be called
            ))
        ;
    }
}
于 2013-07-03T11:11:10.643 回答