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

时间:2015-07-23 08:47:08

标签: php forms symfony sonata-admin sonata

我正在使用SonataAdminBundle,并且在表单中我想显示一些映射信息。我的主要对象Skin使用CmsElemnt进行映射,因为内容已保存。我需要在表单中访问它才能更新它。

我有这个映射信息:

Skin.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 dcumentation Here:

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`

1 个答案:

答案 0 :(得分:0)

您无需创建自定义表单来管理您的关系。您可以使用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