Symfony2 在表单本身中创建新的实体元素

Posted

技术标签:

【中文标题】Symfony2 在表单本身中创建新的实体元素【英文标题】:Symfony2 create new entity element in the form itself 【发布时间】:2015-10-13 11:11:34 【问题描述】:

我正在使用 SonataAdminBundle,我想在表单中显示一些映射信息。我的主要对象皮肤用 CmsElemnt 映射,在女巫中保存了内容。我需要在表单中访问它才能更新它。

我有这个映射信息:

皮肤.php

/**
 * @ORM\OneToMany(targetEntity="CmsElement", mappedBy="content")
 */
private $navbar;

CmsElement.php

/**
 * @ORM\ManyToOne(targetEntity="Skin", inversedBy="navbar")
 * @ORM\JoinColumn(name="page_id", referencedColumnName="id")
 */
private $content;

我尝试在这里使用 symfony 文档:

http://symfony.com/doc/current/book/forms.html#embedding-a-single-object

所以我创建了一个服务来加载 CmsElement 信息:

class SkinElementType extends AbstractType

    public function buildForm(FormBuilderInterface $builder, array $options) 

        $builder
            ->add('content', 'textarea'); 
    

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    
        $resolver->setDefaults(array(
            'data_class' => 'Mp\ShopBundle\Entity\CmsElement',
        ));
    

    public function getName()
    
        return 'skin_element_type_cms';
    

已注册:

skin_element_type_cms:
    class: Mp\ShopBundle\Form\Type\SkinElementType
    tags:
        -   name: form.type 

现在我在皮肤管理中这样做:

    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper)
    
        $formMapper
//            ->add('id', 'hidden')
              ->add('name')
            ->add('status', null, array('required' => false))
        ->add('skin_element_type_cms', new CmsElement(), array(
            'required' => false,
            'attr' => array('cols' => '8', 'rows' => '8')))

我收到此错误:

Please define a type for field `skin_element_type_cms` in `Mp\ShopBundle\Admin\SkinAdmin`

【问题讨论】:

在控制器中使用 $this->createFormBuilder() 来创建表单并处理它们 我正在使用 SonataAdminBundle 【参考方案1】:

您不必创建自定义表单来管理您的关系。您可以使用 sonata_type_collection 来管理 oneToMany 关系。

SkinAdmin.php

protected function configureFormFields(FormMapper $formMapper)

    $formMapper
        ->add('name')
        ->add('status', null, array('required' => false))
        ->add('navbar', 'sonata_type_collection', array(), array(
            'edit' => 'inline',
            'inline' => 'table'
        ))
   ;

查看官方文档了解更多详情:https://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/form_field_definition.html#advanced-usage-one-to-many

【讨论】:

以上是关于Symfony2 在表单本身中创建新的实体元素的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 将自定义字段添加到表单构建器

在数据存储中创建新实体时“争用过多”

获取 SQL 在实体框架中创建新表

Core Data 自动迁移不会在我的新模型中创建新实体

Symfony2 表单和 <input> 模式属性

在 symfony2 中创建表