我正在使用SonataAdminBundle,并且在表单中我想要显示一些映射信息。我的主对象Skin被映射到CmsElemnt中,其中的内容被保存。我需要在表单中访问它以便能够更新它。
我有这样的映射信息:
Skin.php
/**
* @ORMOneToMany(targetEntity="CmsElement", mappedBy="content")
*/
private $navbar;
CmsElement.php
/**
* @ORMManyToOne(targetEntity="Skin", inversedBy="navbar")
* @ORMJoinColumn(name="page_id", referencedColumnName="id")
*/
private $content;
我尝试使用symfony文档在这里:
http://symfony.com/doc/current/book/forms.html embedding-a-single-object
所以我创建了一个服务来加载cmelement信息: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' => 'MpShopBundleEntityCmsElement',
));
}
public function getName()
{
return 'skin_element_type_cms';
}
}
注册:skin_element_type_cms:
class: MpShopBundleFormTypeSkinElementType
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 `MpShopBundleAdminSkinAdmin`
您不必创建自定义表单来管理关系。您可以使用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