如何在嵌套管理员中执行内联编辑?

2022-08-30 14:40:22

我的问题是以下几点。我正在使用Sonata Admin和Symfony。在“管理”部分中,当我尝试创建实体时,单击添加按钮(拼写为“Ajouter”)时,不会显示任何内容:

enter image description here

我收到以下错误:在 chrome 控制台中Call to a member function getName() on a non-object

以下是我的实体层次结构,我有三个对象,它们通过以下方式链接在一起:

Video ---OneToOne--> String ---OneToMany--> LocalizedString

简单地说,我有一个视频将有一个标题,这个标题将被翻译。以下是我的实体:

本地化字符串

OSC\UtilsBundle\Entity\LocalizedString:
    type: entity
    table: null
    repositoryClass: OSC\UtilsBundle\Entity\LocalizedStringRepository
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    fields:
        locale:
            type: string
            length: '20'
        content:
            type: string
            length: 255

    manyToOne:
        parent:
            targetEntity: String
            mappedBy: localizedObjects


    lifecycleCallbacks: {  }

字符串

OSC\UtilsBundle\Entity\String:
    type: entity
    table: null
    repositoryClass: OSC\UtilsBundle\Entity\StringRepository
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO

    oneToMany:
        localizedObjects:
            targetEntity: LocalizedString
            mappedBy: parent
            cascade: ["persist", "remove"]

    lifecycleCallbacks: {  }

视频

OSC\MySportBundle\Entity\Video:
    type: entity
    table: null
    repositoryClass: OSC\MySportBundle\Entity\VideoRepository
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO

    oneToOne:
        title:
            targetEntity: OSC\UtilsBundle\Entity\String
            cascade: ["persist", "remove"]

    lifecycleCallbacks: {  }

所以,我做了这个结构,以方便在SonataAdmin中进行编辑。如果通过管理仪表板,我想编辑字符串,我可以轻松编辑字符串并将其翻译成多种语言(这已经有效)。

但是,当我尝试在视频管理员中执行此操作时,似乎我无法对String对象进行内联编辑(单击添加按钮不起作用)。

以下是视频管理员课程中的相关代码:

$formMapper
        ->add('title', 'sonata_type_admin', array('delete' => false, 'btn_add' =>false), array(
            'edit' => 'inline',
            'inline' => 'table',
        ));

从我的发现来看,似乎两种浸渍形式是不可能的?有没有办法规避这种限制?或者也许是我的设计不太好?

编辑1:看起来github上有一个补丁:https://github.com/sonata-project/SonataAdminBundle/pull/1971#issuecomment-58023124

如果有人知道我如何使用它,我将不胜感激。


答案 1

在你正在使用的代码中,这不是一个有效的选项。也许您可以尝试在此处查看所有有效选项的文档。delete'btn_delete' => false

如果这不起作用,也许就是您问题的解决方案。确保您的关系以正确的方式使用该选项。sonata_type_collectionby_reference


答案 2

在表单映射器中尝试此操作:

  $formMapper 
         ->add('title', 'sonata_type_model_list', array(
                    'class' => 'YourBundle:String',
                    'required' => false,
                    'delete' => false, 
                    'btn_add' =>true,
                ), array(
                    'edit' => 'inline',
                    'inline' => 'table',
                ))
            ;

如果错误仍然存在,请尝试查看 Doctrine2 文档:Doctrine2 一对一关联映射,然后生成实体


推荐