Как выполнить встроенное редактирование внутри вложенного администратора?
Моя проблема в следующем. Я использую Sonata Admin с Symfony. В разделе Admin, когда я пытаюсь создать сущность, ничего не появляется, когда я нажимаю кнопку добавления (написано "Ajouter" ):
![enter image description here]()
Я получаю следующую ошибку: Call to a member function getName() on a non-object
в консоли Chrome
Здесь, как моя иерархия сущностей, у меня есть три объекта, которые связаны между собой следующим образом:
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. Если через панель управления admin я хочу отредактировать строку, я могу легко отредактировать строку и перевести ее на многие языки (это уже работает).
Однако, когда я пытаюсь сделать это в видеоадминистраторе, кажется, что я не могу выполнить встроенное редактирование (нажатие кнопки добавления не работает) объекта String.
Здесь соответствующий код в классе видео admin:
$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
Если кто-то знает, как я могу его использовать, я был бы признателен.
Ответы
Ответ 1
В вашем коде вы используете delete
, который не является допустимым. Возможно, вы можете попробовать 'btn_delete' => false
Проверьте документацию на все допустимые параметры здесь.
Если это не работает, возможно, sonata_type_collection
является решением вашей проблемы. Убедитесь, что вы используете опцию by_reference
правильно, в зависимости от вашего отношения.
Ответ 2
Попробуйте это в форме mapper:
$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 сопоставление ассоциаций один на один, а затем сгенерируйте ваши сущности
Ответ 3
Вы сказали, что хром-консоль дает вам ошибку:
Call to a member function getName() on a non-object
Итак, эта ошибка не из javascript?
Если ошибка из PHP означает, что при попытке $object- > getName() в OSC\UtilsBundle\Controller использовать Ctr + f "getName()" в редакторе файлов, чтобы найти эту строку) $object is а не объект, который может быть вызван тем, что вы можете получить массив obeject, а не отдельный объект. Попробуйте добавить var_dump($object);
, и вы увидите, что это такое.