Моя проблема заключается в следующем. Я использую Sonata Admin с Symfony. В разделе «Администратор», когда я пытаюсь создать объект, при нажатии кнопки «Добавить» (пишется «Ajouter») ничего не появляется:
Я получаю следующую ошибку: 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: localizedObjectslifecycleCallbacks: { }
строка
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
Если кто-нибудь знает, как я могу его использовать, буду признателен.
В вашем коде вы используете delete
что не является допустимым вариантом. Может быть, вы можете попробовать 'btn_delete' => false
Проверьте документацию для всех действительных вариантов Вот.
Если это не работает, возможно sonata_type_collection
это решение вашей проблемы. Убедитесь, что вы используете by_reference
вариант правильный путь в зависимости от ваших отношений.
Попробуйте это в форме сопоставления:
$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 Одно-Одно сопоставление ассоциаций а затем генерировать ваши сущности
Вы сказали, что консоль 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);
и вы видите, что это.