问题描述
我需要在sonata_type_immutable_array表单类型定义中定义与对象相关的字段(如sonata_type_model_list):
$formMapper->add('options', 'sonata_type_immutable_array', array(
'keys' => array(
array('linkName', 'text', array()),
array('linkPath', 'sonata_type_model_list',
array(
'model_manager' => $linkAdmin->getModelManager(),
'class' => $linkAdmin->getClass(),
)
)
)
)
这不起作用,这是错误消息:
Impossible to access an attribute ("associationadmin") on a NULL variable ("") in SonataDoctrineORMAdminBundle:Form:form_admin_fields.html.twig at line 60
我对这个问题的发现
我试图在sona_type_immutable_array中查找有关使用Sona_type_model_list的任何信息,但信息很少。这个(https://github.com/a2lix/TranslationFormBundle/issues/155)这个话题帮了我一点忙,但以同样的方式做所有事情,我又犯了一个错误:
Impossible to invoke a method ("id") on a NULL variable ("") in SonataDoctrineORMAdminBundle:Form:form_admin_fields.html.twig at line 60
所以我完全没能决定我该做什么
我的上下文
--我有一个名为CmsLink的Doctrine ORM映射类,它定义了与"linkPath"字段相关的对象。
--我有CmsLink类的管理类,它有非常基本的配置:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('technicalAlias')
->add('url')
;
}
--我有一个名为CmsMenuItem的Doctrine ORM映射类,它定义了对象和"选项"字段,这些字段持久化了由sona_type_immutable_array表单类型管理的数据,字段类型为json_array:
/**
* @var string
*
* @ORMColumn(name="options", type="json_array", nullable=true)
*/
private $options;
--最后,我有了CmsMenuItem类的管理类,这里是关键代码:
$linkAdmin = $this->configurationPool->getAdminByClass("Argon\CMSBundle\Entity\CmsLink");
$formMapper
->add('options', 'sonata_type_immutable_array',
array(
'keys' => array(
array('linkName', 'text', array()),
array('linkPath', 'sonata_type_model_list',
array(
'model_manager' => $linkAdmin->getModelManager(),
'class' => $linkAdmin->getClass(),
)
),
array('description', 'textarea', array()),
array('image', 'sonata_media_type',
array(
'provider' => 'sonata.media.provider.image',
'context' => 'pages_static',
'required'=>false,
)
)
)
)
);
问题目标
- 找出我需要做些什么才能让生活融入这个想法
- 获取有关如何将与对象相关的字段类型包括在sonata_type_immutable_array中的一般信息和理解
我刚刚遇到这个问题,并用自定义类型和数据转换器解决了它。
这是大致的大纲,不过你需要根据自己的问题进行调整。
自定义类型
类YourImmutableArrayType扩展了ImmutableArray类型{/***@var YourSettings ObjectTransformer*/私人$transformer;公共函数__construct(YourSettingsObjectTransformer$transformer){$this->transformer=$transformer;}公共函数buildForm(FormBuilderInterface$builder,array$options){parent::buildForm($builder,$options);$builder->addModelTransformer($this->transformer);}公共函数getName(){return'your_type_name';}公共函数getParent(){return"sonata_type_immutable_array";}}
自定义型号变压器
类NewsListingSettingsTransformer实现DataTransformerInterface{公共函数__construct(ObjectManager$manager){//您稍后需要$manager来查找您的对象}公共函数reverseTransform($value){if(is_null($value)){返回$value;}//在这里将数组中的对象转换为ID返回$value;}公共函数转换($value){if(is_null($value)){返回$value;}//在这里,将嵌入数组中的id转换为对象,//或包含对象的ArrayCollection返回$value;}}
在管理类中构建表单
$formMapper->add('settings', 'your_type_name', array(
'keys' => array(
array(
'collectionOfObjects',
'sonata_type_model',
array(
'class' => YourObject::class,
'multiple' => true,
'model_manager' => $this->yourObjectAdmin->getModelManager()
)
)
)
));
}
同样,这是一个粗略的轮廓,所以根据您的需要进行调整。