Symfony 在sonata_type_immutable_数组中使用对象(特别是像sonata_type_immutable_数组) 问题描述

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

我需要在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', '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,
                    )
                )
            )
        )
    );
问题目标
  • 了解我需要做什么才能让这个想法充满活力
  • 获取有关如何将对象相关字段类型包含到sonata_type_immutable_数组中的一般信息和理解

  • 我刚刚遇到这个问题,并用自定义类型和数据转换器解决了它

    这是一个大致的轮廓,不过你需要根据你的问题进行调整

    自定义类型
    同样,这是一个粗略的轮廓,所以根据您的需要调整它。

    您解决过这个问题吗?我也有同样的想法,我放弃了这个问题,因为答案来得太晚了,我用了另一种方式(不记得具体是什么),但很快我会做一些类似的工作,所以我会再次调查这个问题。你试过用亚当的答案吗?
    $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()
                    )
                )
            )
        ));
    }