使用sona_type_immutable_array中的对象(特别是像sona_ttype_immutaable_ar



问题描述

我需要在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,
                    )
                )
            )
        )
    );

问题目标

  1. 找出我需要做些什么才能让生活融入这个想法
  2. 获取有关如何将与对象相关的字段类型包括在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()
                )
            )
        )
    ));
}

同样,这是一个粗略的轮廓,所以根据您的需要进行调整。

相关内容

  • 没有找到相关文章

最新更新