Symfony 在sonata_type_immutable_数组中使用对象(特别是像sonata_type_immutable_数组) 问题描述
我需要在sonata\u type\u immutable\u数组中定义对象相关字段(如sonata\u type\u model\u list),表单类型定义:Symfony 在sonata_type_immutable_数组中使用对象(特别是像sonata_type_immutable_数组) 问题描述,symfony,doctrine-orm,sonata-admin,symfony-2.5,Symfony,Doctrine Orm,Sonata Admin,Symfony 2.5,我需要在sonata\u type\u immutable\u数组中定义对象相关字段(如sonata\u type\u model\u list),表单类型定义: $formMapper->add('options', 'sonata_type_immutable_array', array( 'keys' => array( array('linkName', 'text', array()), array('linkPath', 'sona
$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
关于这个问题我发现了什么
我试图在sonata_type_immutable_array中找到有关使用sonata_type_model_list的任何信息,但信息很少。
这个()主题对我有点帮助,但以同样的方式进行操作时,我又遇到了另一个错误:
Impossible to invoke a method ("id") on a NULL variable ("") in SonataDoctrineORMAdminBundle:Form:form_admin_fields.html.twig at line 60
所以我完全无法理解我该做什么
我的背景
--我有一个名为CmsLink的映射类,它定义了“linkPath”字段所关联的对象
--我有CmsLink类的admin类,它有非常基本的配置:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('technicalAlias')
->add('url')
;
}
--我有一个名为CmsMenuItem的Doctrine ORM映射类,它定义了对象和“选项”字段,该字段保存由sonata_type_immutable_数组管理的数据表单类型,字段类型为json_数组:
--最后是CmsMenuItem类的admin类,下面是关键代码:
$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,
)
)
)
)
);
问题目标
我刚刚遇到这个问题,并用自定义类型和数据转换器解决了它 这是一个大致的轮廓,不过你需要根据你的问题进行调整 自定义类型
同样,这是一个粗略的轮廓,所以根据您的需要调整它。您解决过这个问题吗?我也有同样的想法,我放弃了这个问题,因为答案来得太晚了,我用了另一种方式(不记得具体是什么),但很快我会做一些类似的工作,所以我会再次调查这个问题。你试过用亚当的答案吗?
$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,
)
)
)
)
);
class YourImmutableArrayType extends ImmutableArrayType
{
/**
* @var YourSettingsObjectTransformer
*/
private $transformer;
public function __construct(YourSettingsObjectTransformer $transformer)
{
$this->transformer = $transformer;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->addModelTransformer($this->transformer);
}
public function getName()
{
return 'your_type_name';
}
public function getParent()
{
return 'sonata_type_immutable_array';
}
}
class NewsListingSettingsTransformer implements DataTransformerInterface
{
public function __construct(ObjectManager $manager)
{
// You'll need the $manager to lookup your objects later
}
public function reverseTransform($value)
{
if (is_null($value)) {
return $value;
}
// Here convert your objects in array to IDs
return $value;
}
public function transform($value)
{
if (is_null($value)) {
return $value;
}
// Here convert ids embedded in your array to objects,
// or ArrayCollection containing objects
return $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()
)
)
)
));
}