我的问题如下。我正在使用Symfony的Sonata Admin。在Admin部分,当我尝试创建一个实体时,当我点击添加按钮(拼写为" Ajouter")时,没有任何内容出现:
我收到以下错误:Chrome控制台中的Call to a member function getName() on a non-object
这是我的实体层次结构的方式,我有三个以下列方式链接在一起的对象:
Video ---OneToOne--> String ---OneToMany--> LocalizedString
简单地说,我有一个视频将有一个标题,这个标题将被翻译。这是我的实体:
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',
));
从我发现的情况来看,看起来两种不可能的形式是不可能的?有没有办法规避这种限制?或者也许我的设计不太好?
Edit1:看起来github上有一个补丁:https://github.com/sonata-project/SonataAdminBundle/pull/1971#issuecomment-58023124
如果有人知道如何使用它,我将不胜感激。
答案 0 :(得分:1)
在您的代码中,您使用的delete
不是有效选项。也许你可以试试'btn_delete' => false
查看文档以获取所有有效选项here。
如果这不起作用,也许sonata_type_collection
可以解决您的问题。确保以正确的方式使用by_reference
选项,具体取决于您的关系。
答案 1 :(得分:0)
在表格映射器中尝试:
$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然后生成您的实体
答案 2 :(得分:-3)
你说Chrome控制台会给你错误:
Call to a member function getName() on a non-object
所以这个错误不是来自javascript?
如果来自PHP的错误意味着当你尝试$ object-> getName()时(它必须在OSC \ UtilsBundle \ Controller中使用Ctr + f" getName()"在文件编辑器中找到那条线)$ object不是一个对象,因为你可能得到了obeject数组,而不是单个对象。尝试添加var_dump($object);
,您就会看到它是什么。