Редактировать данные пользователя Sonata

Я пытаюсь переопределить класс администратора пользователя Sonata в своем пакете. На данный момент я просто переопределяю метод configureListFields: приложение\админ пространства имен;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;

use Sonata\UserBundle\Admin\Model\UserAdmin as BaseUserAdmin;

class UserAdmin extends BaseUserAdmin
{

    /**
     * @param ListMapper $listMapper
     */
    protected function configureListFields(ListMapper $listMapper):void
    {
        $listMapper
            ->addIdentifier('username')
            ->add('email')
            ->add('groups')
            ->add('enabled', null, ['editable' => true])
            ->add('accountType')
            ->add('createdAt')
        ;

        if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH')) {
            $listMapper
                ->add('impersonating', 'string', ['template' => '@SonataUser/Admin/Field/impersonating.html.twig'])
            ;
        }
    }
}

Я обновляю свою страницу и без проблем получаю список пользователей. Но когда я нажимаю на пользователя, чтобы отредактировать его, у меня появляется эта ошибка: Вызов функции-члена getClass() при нулевом значении в этих строках:

$now = new \DateTime();

        $genderOptions = [
            'choices' => \call_user_func([$this->getUserManager()->getClass(), 'getGenderList']),
            'required' => true,
            'translation_domain' => $this->getTranslationDomain(),
        ];

        // NEXT_MAJOR: Remove this when dropping support for SF 2.8
        if (method_exists(FormTypeInterface::class, 'setDefaultOptions')) {
            $genderOptions['choices_as_values'] = true;
        }

Файл Sonata_admin.yaml:

sonata_admin:
    title: 'Staff Admin Panel'
    templates:
        dashboard: '@SonataAdmin/Core/dashboard.html.twig'
    security:
        handler: sonata.admin.security.handler.role
        role_admin: ROLE_ADMIN
        role_super_admin: ROLE_SUPER_ADMIN
        # information:
        #     GUEST: [VIEW, LIST]
        #     STAFF: [EDIT, LIST, CREATE]
        #     EDITOR: [OPERATOR, EXPORT]
        #     ADMIN: [MASTER]

        # admin_permissions: [CREATE, LIST, DELETE, UNDELETE, EXPORT, OPERATOR, MASTER]
        # object_permissions: [VIEW, EDIT, DELETE, UNDELETE, OPERATOR, MASTER, OWNER]

    dashboard:
        blocks:
            - { type: sonata.admin.block.admin_list, position: left }
        groups:
            content:
                label: Contenu
                icon: '<i class = "fa fa-file-text-o"></i>'
                items:
                    - app.admin.specialty
                    - app.admin.cities
                    - app.admin.colleges
                    - app.admin.building

            sonata.admin.group.media:
                label: Médiathèque
                icon: '<i class = "fa fa-camera-retro"></i>'
                items:
                    - sonata.media.admin.media

            settings:
                label: Paramètres
                icon: '<i class = "fa fa-cog"></i>'
                items:
                    - sonata.classification.admin.category
                    - sonata.classification.admin.context
                    - sonata.classification.admin.tag
                    - sonata.classification.admin.collection
                    - app.admin.icon

            sonata.admin.group.administration:
                label: Utilisateur et Groupes
                label_catalogue: SonataAdminBundle
                icon: '<i class = "fa fa-users"></i>'
                items:
                    - app.admin.user
                    - sonata.user.admin.group

sonata_block:
    blocks:
        sonata.admin.block.admin_list:
            contexts: [admin]

sonata_user:
    security_acl: true
    manager_type: orm
    class:
        user: App\Application\Sonata\UserBundle\Entity\User
        group: App\Application\Sonata\UserBundle\Entity\Group

файл fos_user.yaml:

fos_user:
    db_driver: orm # valid values are 'orm', 'mongodb' and 'couchdb'
    user_class: App\Entity\User #App\Application\Sonata\UserBundle\Entity\User
    firewall_name: main

    registration:
        form:
            type: App\Application\Sonata\UserBundle\Form\RegistrationType

    group:
        group_class: App\Application\Sonata\UserBundle\Entity\Group
        group_manager: sonata.user.orm.group_manager

    service:
        user_manager: sonata.user.orm.user_manager
        mailer: fos_user.mailer.noop

    from_email:
        address: "%env(MAILER_SENDER_ADDRESS)%"
        sender_name: "%env(MAILER_SENDER_NAME)%"

Можно, пожалуйста, контекст второго фрагмента? Это код в configureFormFields()?

Ugo T. 27.05.2019 17:55

Да — это код в ConfigureFormFields().

M'hamed Lalami 27.05.2019 18:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
2
450
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите получить доступ к своему методу getGenderList() из configureFormFields(), вы можете сделать это:

protected function configureFormFields(FormMapper $formMapper)
{
        $now = new \DateTime();
        $genderOptions = [
            'choices' => $this->getSubject()->getGenderList(), // here
            'required' => true,
            'translation_domain' => $this->getTranslationDomain(),
        ];

        // NEXT_MAJOR: Remove this when dropping support for SF 2.8
        if (method_exists(FormTypeInterface::class, 'setDefaultOptions')) {
            $genderOptions['choices_as_values'] = true;
        }
}

См. Документы Symfony об этом.

Теперь я отредактировал метод configureFormFields(). Он работает нормально, но когда я вношу изменения в свои поля и пытаюсь сохранить изменения, у меня возникает эта ошибка: Вызов функции-члена updateCanonicalFields() при нулевом значении

M'hamed Lalami 27.05.2019 18:53

Мы можем найти его у родителя: public function preUpdate($user): void { $this->getUserManager()->updateCanonicalFields($user); $this->getUserManager()->updatePassword($user); }

M'hamed Lalami 27.05.2019 18:54

Хорошо, не могли бы вы показать нам файл конфигурации вашей сонаты?

Ugo T. 27.05.2019 19:59

Я отредактировал свой первый пост и добавил содержимое файла конфигурации сонаты.

M'hamed Lalami 27.05.2019 20:20

Хорошо, спасибо. Кажется, вам нужны дополнительные шаги по настройке, чтобы все работало правильно, посмотрите на этот сообщение. Я надеюсь, что это поможет вам.

Ugo T. 27.05.2019 20:35

Спасибо @Ugo T. за помощь. Пост очень помогает, и ваш ответ правильный.

M'hamed Lalami 28.05.2019 20:10

Другие вопросы по теме