Php Symfony 2:如何编辑嵌入表单中的持久化对象

Php Symfony 2:如何编辑嵌入表单中的持久化对象,php,forms,symfony,Php,Forms,Symfony,我拥有以下实体: //实体 class propertiesGeneral{ /** * @var abc\NikBundle\Entity\propertiesFinancial $finances * @ORM\OneToOne(targetEntity="propertiesFinancial", mappedBy="property", cascade= {"persist", "remove", "merge"})) */ protect

我拥有以下实体:

//实体

class propertiesGeneral{

    /**
     * @var abc\NikBundle\Entity\propertiesFinancial $finances
     * @ORM\OneToOne(targetEntity="propertiesFinancial", mappedBy="property", cascade= {"persist", "remove", "merge"}))
     */
    protected $finances;

   /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;

    protected $generalfield1;

    protected $generalfield2;
}

class propertiesFinancial{

    /**
     * @ORM\OneToOne(targetEntity="propertiesGeneral", inversedBy="finances")
     * @ORM\JoinColumn(name="property_id", referencedColumnName="id")
     * @ORM\Id
     */
     protected $property;

     protected $financialfield1;

     protected $financialfield2;
}
因此,我使用以下形式来保存新的Properties General和Properties Financial对象:

$builder = $this->createFormBuilder();
$form = $builder
            ->add('general',new GeneralType, array(
                  'label' => false
            ))
            ->add('finances',new FinancesType,array(
                  'label' => false
            ))
            ->add('price_rent','text',array(
                  'mapped' => false,
            ))
            ->add('price_buy','text',array(
                  'mapped' => false,
            ))
            ->getForm();
而GeneralType表单为:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('generalfield1',null)
    ->add('generalfield2',null)
}
而财务形式是:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('financialfield1',null)
    ->add('financialfield2',null)
}
这段代码可以很好地在数据库中持久化propertiesGeneral和propertiesFinancial对象。但我的问题是如何编辑现有记录。因此,我希望使用相同的表单,字段的默认值是从数据库检索到的对象的相应值。是否有可能使用相同的形式

在表单类(类型)中,您可以定义
setDefaultOptions
方法:

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'FQCN of your entity like Acme/Entity/propertiesGeneral',
    ));
}
工作原理:

    $form = $this->createForm(new GeneralType(), new propertiesGeneral());

另外,请阅读:和以了解更多信息。

在表单类(类型)中,您可以定义
setDefaultOptions
方法:

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'FQCN of your entity like Acme/Entity/propertiesGeneral',
    ));
}
工作原理:

    $form = $this->createForm(new GeneralType(), new propertiesGeneral());


另外,请阅读:和以了解更多信息。

“$this->createForm(new FinancialType(),new Properties Financial());”对于创建简单表单很有用,但不适用于嵌入式表单…@IIIRX为实体中的类型定义相同的层次结构。我们正在使用带有数据类的表单,这比您的表单更难:)我在GeneralType中移动了“->add('Financials',new FinancesType,array('label'=>false)),但表单在显示时仍然为空。我想知道嵌入表单的唯一解决方案是手动加载默认值还是使用EventListener。
->add('Financials',collection',array('type'=>new FinancesType())
试试这个。“$this->createForm(new FinancialType(),new Properties Financial());”用于创建简单表单,但不适用于嵌入表单…@IIIRX为类型定义与实体中相同的层次结构。我们正在使用带有数据类的表单,这比您的表单更难:)我在GeneralType中移动了“->add('Financials',new FinancesType,array('label'=>false)),但表单在显示时仍然为空。我想知道嵌入表单的唯一解决方案是手动加载默认值还是使用EventListener。
->add('Financials',collection',array('type'=>new FinancesType())
试试这个。