Как переопределить свойства и формы сущностей SonataUser?

Я создаю новый проект, используя Symfony 2.7.x и Sonata Admin 2.3.x плюс пользователь Sonata. По умолчанию Sonata добавляет кучу бесполезных полей, и я хочу, чтобы моя сущность была как можно более чистой. Итак, мой первый вопрос:

  • Можно ли переопределить сущности пользователя Sonata, чтобы избавиться от некоторых бесполезных свойств? Как?

Теперь, как вторая часть вопроса, связанная с тем же, я хочу создать или использовать свою собственную форму для добавления новых пользователей и/или групп, потому что по умолчанию я не могу добавлять роли. Посмотрите на изображение ниже, чтобы понять, о чем я говорю:

Добавить группу Sonata

Я должен иметь возможность добавлять оттуда новые динамические роли, но не могу.

  • Это возможно? Как? Любое обходное решение?

Я просмотрел Github здесь и документы здесь, но не нашел ничего полезного. Любые советы?


person ReynierPM    schedule 28.02.2016    source источник
comment
Не используйте SonataUserBundle, вместо этого используйте только FOSUserBundle.   -  person 1ed    schedule 28.02.2016
comment


Ответы (2)


Вы можете избавиться от свойств Sonata, расширив сущность FOSUserBundle напрямую, а не модель пользователя SonataUser.

измените сущность, которую ваш пользователь расширяет на самом деле:

use Sonata\UserBundle\Model\User as BaseUser;

к следующему:

use FOS\UserBundle\Entity\User as BaseUser;

Затем, чтобы удалить бесполезные свойства из форм и, возможно, добавить новые, переопределите класс UserAdmin сонаты по умолчанию:

1- Создайте класс администратора с именем UserAdmin в своем собственном пакете.

2- Откройте файл vendor/sonata-project/user-bundle/Admin/Model/UserAdmin.php и возьмите из него configureFormFields. Вставьте его в свой собственный класс администратора и оставьте только нужные поля, удалив ненужные поля из построителя базовой формы.

Класс может выглядеть так:

use FOS\UserBundle\Model\UserManagerInterface;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;

class UserAdmin extends Admin // You can extends directly from SonataUserAdmin if it's easier for you
{
    protected $userManager;

    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
           ... The fields you keep ...
    }

    /**
     * @param UserManagerInterface $userManager
     */
    public function setUserManager(UserManagerInterface $userManager)
    {
        $this->userManager = $userManager;
    }

    /**
     * @return UserManagerInterface
     */
    public function getUserManager()
    {
        return $this->userManager;
    }
}

3- Определите новый класс UserAdmin как службу

services:
    sonata.user.admin.user:
        class: YourOwnAdminBundle\Admin\UserAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: %sonata.user.admin.groupname%, label: "User", label_catalogue: %sonata.user.admin.label_catalogue%", icon: "%sonata.user.admin.groupicon%"}
        arguments:
            - ~
            - %sonata.user.admin.user.entity%
            - %sonata.user.admin.user.controller%
        calls:
            - [setUserManager, ["@fos_user.user_manager"]]
            - [setTranslationDomain, ["%sonata.user.admin.user.translation_domain%"]]

Затем адаптируйте конфигурацию пользователя sonata в config.yml:

sonata_user: 
    ...
    admin:
        user:
            class:          YourOwnAdminBundle\Admin\UserAdmin
            controller:     SonataAdminBundle:CRUD
            translation:    SonataUserBundle

И это должно быть хорошо.

Посмотрите на этот похожий вопрос на случай, если я что-то забыл или вам нужно больше.

person Tjaari76    schedule 28.02.2016

Насколько я знаю, вам не нужно ничего делать со свойствами объекта SonataUserBundle, но вы можете отредактировать Model\User.php SonataUserBundle, если вы действительно хотите удалить некоторые свойства, которые вам не понадобятся; Вы должны быть осторожны, потому что удаляемые свойства могут повлиять на некоторые формы или функции, связанные с этими свойствами.

person Adrian Legaspi    schedule 28.02.2016
comment
Я не должен, но я хочу, потому что администратору не нужно иметь Facebook или Twitter или другие свойства, потому что я хочу удалить их, поскольку они совершенно бесполезны. С другой стороны, вам не следует редактировать Model\User.php, так как он является частью пакета, и в следующий раз, когда вы запустите composer update, у вас могут возникнуть проблемы. - person ReynierPM; 28.02.2016
comment
Вы можете просто использовать FOSUserBundle и расширить его, чтобы создать свой собственный UserBundle, на мой взгляд, это намного проще, но вам все равно придется создавать некоторые функции из Sonata. Кроме того, почему отрицательный голос? - person Adrian Legaspi; 28.02.2016
comment
Потому что ваш ответ совершенно неверен, и я не понимаю ваш пост. Прочитайте документы пакета, и вы поймете, почему отрицательный голос - person ReynierPM; 28.02.2016
comment
На вопрос, касающийся определенного пакета, не следует отвечать удалением пакета или установкой другого пакета. Это, безусловно, причина того, что за вас проголосовали. Имейте это в виду для следующего :) - person chalasr; 28.02.2016