Symfony OneToOne关系呈现独特的形式

问题描述 投票:1回答:1

我有一个实体,有太多的字段和数据要由MySQL处理。

所以我创建了另一个实体来存储内容并将其链接到具有OneToOne关系的父实体。

这是我的父实体HomeContent的摘录

// ...
class HomeContent
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="locale", type="string", length=6)
 */
private $locale;

/**
 * @var string
 *
 * @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
 */
private $healthIntro;

/**
 * @var string
 *
 * @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
 */
private $desktopIntro;

/**
 * @var string
 *
 * @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
 */
private $techIntro;

// ...

public function __construct()
{
    $this->healthIntro = new ContentBlock();
    $this->desktopIntro = new ContentBlock();
    $this->techIntro = new ContentBlock();
// ...

我的ContentBlockentity有一个文本字段content与setter和getter。

现在我想简单地用每个字段的textarea渲染我的表单,最好的方法是什么?

现在,它们被渲染为select元素,我用内容字段定义了一个ContentBlockType

// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('content', 'textarea');
}
// ...

当然还有HomeContentType

// ...
 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title', 'text')
        ->add('metadescription', 'text')
        ->add('healthIntro', 'entity', array(
            'class' => 'NavaillesMainBundle:ContentBlock'
        ))
// ...
symfony doctrine symfony-forms
1个回答
1
投票

首先,我建议遵守使用JoinColumn()annotation的规则。例:

/**
 * @var string
 *
 * @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
 * @ORM\JoinColumn(name="desktop_intro_id", referencedColumnName="id")
 */
private $desktopIntro;

回答:

我不知道我的方式是否最好,但我建议您创建ContentBlockFormType并将其嵌入到您的表单中。所以HomeContent实体的形式如下:

    // ...

    public function buildForm(FormBuilderInterface $builder, array $options) 
    {
        $builder
            ->add('title', 'text')
            ->add('metadescription', 'text')
            ->add('desktopIntro', ContentBlockFormType::class, [
                 'label'                 => 'Desktop intro',
                 'required'              => false,
            ])
            ->add('healthIntro', ContentBlockFormType::class, [
                 'label'                 => 'Health intro',
                 'required'              => false,
            ])
            ->add('techIntro', ContentBlockFormType::class, [
                 'label'                 => 'Tech intro',
                 'required'              => false,
            ])
    }

    // ... 
© www.soinside.com 2019 - 2024. All rights reserved.