Подтвердить что ты не робот

Как выполнить встроенное редактирование внутри вложенного администратора?

Моя проблема в следующем. Я использую 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

Если кто-то знает, как я могу его использовать, я был бы признателен.

4b9b3361

Ответ 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);, и вы увидите, что это такое.