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

Posted

技术标签:

【中文标题】如何在嵌套管理员中执行内联编辑?【英文标题】:How can I perform an inline editing inside a nested admin? 【发布时间】:2014-11-30 03:59:20 【问题描述】:

我的问题如下。我正在将 Sonata Admin 与 Symfony 一起使用。在 Admin 部分,当我尝试创建实体时,单击添加按钮(拼写为“Ajouter”)时没有显示任何内容:

我在 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 中进行编辑。如果通过管理仪表板,我想编辑一个字符串,我可以轻松地编辑一个字符串并将其翻译成多种语言(这已经有效)。

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

这是视频管理类中的相关代码:

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

根据我的发现,看起来不可能有两种叠瓦形式?有没有办法绕过这个限制?或者可能是我的设计不太好?

Edit1: github 上好像有补​​丁:https://github.com/sonata-project/SonataAdminBundle/pull/1971#issuecomment-58023124

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

【问题讨论】:

只需使用 'sonata_type_model' 并传递它的相关选项以获得更好的控制 您是否尝试过'inline' => 'standard' 与sonata_type_collection 而不是sonata_type_admin 与'inline'=>'table' 还有你的 StringAdmin 是什么? 【参考方案1】:

你说 chrome 控制台给你错误:

Call to a member function getName() on a non-object

所以这个错误不是来自 javascript

如果 php 出错,这意味着当您尝试 $object->getName() 时(它必须在 OSC\UtilsBundle\Controller 中使用 Ctr+f "getName()" 在文件编辑器中找到该行)$object 是不是一个对象,因为你可能得到对象数组,而不是单个对象。尝试添加var_dump($object);,你会看到它是什么。

【讨论】:

【参考方案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 One to One association mapping 然后生成你的实体

【讨论】:

【参考方案3】:

在您的代码中,您使用的 delete 不是有效选项。也许你可以试试'btn_delete' => false 检查文档以获取所有有效选项 here。

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

【讨论】:

以上是关于如何在嵌套管理员中执行内联编辑?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 管理员中嵌套内联?

如何在管理界面中内联编辑 django 用户配置文件?

如何在 Django 的表单中拥有嵌套的内联表单集?

具有嵌套属性的 Best_In_Place 内联编辑

快速编辑模块在drupal 7.5中不起作用

奏鸣曲管理包中的内联可编辑 OneToOne 关系