Роли администратора Symfony Sonata во встроенных объектах onetomany

У меня есть Symfony 2.3 + Sonata Admin + Sonata User Bundle.

Я создал объект Student и еще один объект Contact. Student имеет отношения "один ко многим" с Contact. Я добавил Contact к Student с sonata_type_collection в моем классе StudentAdmin. Я также создал группу пользователей Operator и назначил все разрешения Student, но только list и view пользователю Contact.

Моя проблема в том, что любой пользователь Operator не может добавлять или удалять Contact (со страницы редактирования учащегося), но может редактировать (и значения сохраняются).

Любые предложения или примеры?

Некоторый код:

Назначенные роли:

ROLE_SONATA_ADMIN_STUDENT_EDIT
ROLE_SONATA_ADMIN_STUDENT_LIST
ROLE_SONATA_ADMIN_STUDENT_CREATE
ROLE_SONATA_ADMIN_STUDENT_VIEW
ROLE_SONATA_ADMIN_STUDENT_DELETE 

ROLE_SONATA_ADMIN_CONTACT_LIST
ROLE_SONATA_ADMIN_CONTACT_VIEW 

ROLE_ADMIN: ROLE_USER, ROLE_SONATA_ADMIN 


     /**
     * @ORM\OneToMany(targetEntity="MyBundle\Entity\Contact",
                      mappedBy="student",
                      cascade={"persist", "remove"})
     **/
    private $contact;


->add('contact', 'sonata_type_collection',
                    array(
                            'label' => 'Contact',
                            'by_reference' => false,
                    ),
                    array(
                            'edit' => 'inline',
                            'inline' => 'table',
                    ))

Спасибо!


person Sergio Ordóñez    schedule 01.12.2015    source источник
comment
Чего вы пытаетесь достичь? Вы хотите, чтобы Пользователь с ролью Оператор добавлял/удалял контакты? вам нужно добавить роли ROLE_SONATA_ADMIN_CONTACT_CREATE, ROLE_SONATA_ADMIN_CONTACT_DELETE   -  person HypeR    schedule 01.12.2015
comment
Английский не мой язык, может быть, я что-то неправильно написал. С ролями, которые я назначаю, когда я нахожусь на странице редактирования ученика, пользователь Оператор не может добавлять или удалять контакт (во встроенной форме), это нормально, потому что кнопки добавления/удаления исчезают, но он может редактировать/изменять значения (добавленные ранее пользователями с доступом), потому что входы включены, и когда я сохраняю Student, значения сохраняются для контакта. Я не хочу этого. У меня есть другая группа пользователей для этого. Я думаю, что проблема в том, чтобы знать, как роли работают со связанными/встроенными сущностями.   -  person Sergio Ordóñez    schedule 02.12.2015


Ответы (1)


Я понял вашу проблему, и я не думаю, что Sonata справляется с этим по умолчанию.

Вы должны проверить текущие роли пользователей и либо удалить поля контактов, либо добавить атрибут «только для чтения» или «отключен» в полях контактов.

Удалить поля контактов

protected function configureFormFields(FormMapper $formMapper)
{
    // check if current user has role contact edition
    $hasContactRole = $this->getConfigurationPool()->getContainer()->get('security.context')->isGranted('ROLE_SONATA_ADMIN_CONTACT_EDIT'));
    if ($hasContactRole) {
        $formMapper->add('contact', 'sonata_type_collection',
            array(
                'label' => 'Contact',
                'by_reference' => false,
            ),
            array(
                'edit' => 'inline',
                'inline' => 'table',
            )
        );
    }
}
person HypeR    schedule 02.12.2015
comment
Большой! Спасибо за ваше время. Это элегантное решение, и оно открыло мне глаза на то, как охватить области, не охватываемые Symfony/Sonata. - person Sergio Ordóñez; 03.12.2015
comment
Вы должны принять мой ответ, если он решил вашу проблему, поэтому он вознаграждает мою работу и помогает людям с похожими проблемами, вот как работает StackOverflow;) meta.stackexchange.com/questions/23138/ - person HypeR; 03.12.2015