SonataUser - Расширение администратора

Я пытаюсь изменить администратора по умолчанию для объекта User.
Просто нужно удалить определенные поля из формы.

Думаю, этот документ будет полезен для меня, когда он будет доступен.
На данный момент я создал этого администратора и попытался переопределить User по умолчанию.

app/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php

namespace Application\Sonata\UserBundle\Admin\Model;

use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\UserBundle\Admin\Model\UserAdmin as BaseType;

class UserAdmin extends BaseType
{
    /**
     * {@inheritdoc}
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('username')
            ->add('groups')
            ->add('enabled')
        ;
    }

    /**
     * {@inheritdoc}
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('General')
                ->add('username')
                ->add('email')
                ->add('plainPassword', 'text', array('required' => false))
            ->end()
            ->with('Groups')
                ->add('groups', 'sonata_type_model', array('required' => false))
            ->end()
            ->with('Profile')
                ->add('firstname', null, array('required' => false))
                ->add('lastname', null, array('required' => false))
            ->end()
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function preUpdate($user)
    {
        $this->getUserManager()->updateCanonicalFields($user);
        $this->getUserManager()->updatePassword($user);
    }

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

}

приложение/config/config.yml

services:
    sonata.admin.extension:
        class: Application\Sonata\UserBundle\Admin\Model\UserAdmin
        tags:
            - { name: sonata.admin.extension, target: sonata.user.admin.user }
        arguments: [null, Sonata\UserBundle\Entity\User, SonataUserBundle:UserAdmin]

Но я получаю

Невозможно импортировать ресурс «/var/www/Symfony/app/config/». из "/var/www/Symfony/app/config/routing.yml".
...
ErrorException: Catchable Fatal Error: Аргумент 1, переданный в Sonata\AdminBundle\Admin\Admin::addExtension(), должен быть экземпляром Sonata\AdminBundle\Admin\AdminExtensionInterface, экземпляром Application\Sonata\UserBundle\Admin\Model\UserAdmin, заданным, вызванным в /var/www/Symfony/app/cache/dev/appDevDebugProjectContainer.php в строке 3139 и определенным в /var/www/Symfony/vendor/bundles/Sonata/AdminBundle/Admin/Admin.php строка 2359

Что я делаю неправильно ?


person Pierre de LESPINAY    schedule 11.07.2012    source источник


Ответы (5)


На случай, если кто-то когда-нибудь посмотрит это, я получил это, переопределив UserAdmin.php

добавьте следующую строку в метод registerBundle app/AppKernel.php

// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        // other bundle declarations
        new Sonata\UserBundle\SonataUserBundle(),
    );
} 

Теперь установите значение параметра sonata.user.admin.user.class в FQCN сущности пользователя, которая была создана во время установки FOSUserBundle.

//app/config/config.yml
parameters:
    #....
    sonata.user.admin.user.entity: YourVendor\YourBundle\Entity\User

Теперь создайте класс, расширяющий класс UserAdmin по умолчанию, и переопределите методы configureShowFields, configureFormFields, configureDatagridFilters и configureListFields, чтобы добавить необходимые поля администрирования пользователя. Ниже приведен пример расширенного класса UserAdmin, который основан на базовой сущности пользователя, созданной в документации FOSUserBundle.

<?php
//src/YourVendor/YourBundle/Admin/UserAdmin.php

namespace YourVendor\YourBundle\Admin;

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

use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Show\ShowMapper;

use FOS\UserBundle\Model\UserManagerInterface;
use Sonata\AdminBundle\Route\RouteCollection;


class UserAdmin extends BaseUserAdmin
{
    /**
     * {@inheritdoc}
     */
    protected function configureShowFields(ShowMapper $showMapper)
    {
        $showMapper
            ->with('General')
                ->add('username')
                ->add('email')
            ->end()
            // .. more info
        ;
    }

    /**
     * {@inheritdoc}
     */
    protected function configureFormFields(FormMapper $formMapper)
    {

        $formMapper
            ->with('General')
                ->add('username')
                ->add('email')
                ->add('plainPassword', 'text', array('required' => false))
            ->end()
            // .. more info
            ;

        if (!$this->getSubject()->hasRole('ROLE_SUPER_ADMIN')) {
            $formMapper
                ->with('Management')
                    ->add('roles', 'sonata_security_roles', array(
                        'expanded' => true,
                        'multiple' => true,
                        'required' => false
                    ))
                    ->add('locked', null, array('required' => false))
                    ->add('expired', null, array('required' => false))
                    ->add('enabled', null, array('required' => false))
                    ->add('credentialsExpired', null, array('required' => false))
                ->end()
            ;
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function configureDatagridFilters(DatagridMapper $filterMapper)
    {
        $filterMapper
            ->add('id')
            ->add('username')
            ->add('locked')
            ->add('email')
        ;
    }
    /**
     * {@inheritdoc}
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('username')
            ->add('email')
            ->add('enabled', null, array('editable' => true))
            ->add('locked', null, array('editable' => true))
            ->add('createdAt')
        ;

        if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH')) {
            $listMapper
                ->add('impersonating', 'string', array('template' => 'SonataUserBundle:Admin:Field/impersonating.html.twig'))
            ;
        }
    }
}

Теперь установите значение sonata.user.admin.user.class в FQCN созданного класса UserAdmin в app/config/config.yml, например

parameters:
    sonata.user.admin.user.class: YourVendor\YourBundle\Admin\UserAdmin

Если все настроено правильно, вы увидите новую строку пользователей на странице администратора/панели инструментов. Все пользовательские операции должны работать должным образом.

person Matheno    schedule 06.01.2015

В свой config.yml добавьте следующее:

parameters:
    sonata.user.admin.user.class: Application\Sonata\UserBundle\Admin\Model\UserAdmin
person Pierre    schedule 31.10.2012

Измените тег в определении службы

tags:
    - { name: sonata.admin, manager_type: orm, group: some.menu, label: User }
person AdrienBrault    schedule 11.07.2012
comment
Это устраняет ошибку, но дает новый блок на панели инструментов с именем default с сущностью с именем -. И Add/List ссылки из Users и - ведут на стандартную User админку - person Pierre de LESPINAY; 11.07.2012
comment
Я обновил свой ответ, чтобы показать, как установить ярлык и как поместить этого администратора в группу. - person AdrienBrault; 11.07.2012
comment
На самом деле я хотел бы заменить текущего администратора пользователя, а не добавлять нового. - person Pierre de LESPINAY; 11.07.2012
comment
вы нашли решение для этого? - person worenga; 05.10.2012

То же исправление для Symfony 2.1, вам нужно указать собственный класс UserAdmin для пакета Sonata, как это

sonata_user:
    admin:                  # Admin Classes
        user:
            class:          Application\Sonata\UserBundle\Admin\Entity\UserAdmin
            controller:     SonataAdminBundle:CRUD
            translation:    SonataUserBundle

Также ознакомьтесь с документацией Sonata UserBundle, чтобы узнать о дополнительных параметрах.

person sumkincpp    schedule 14.02.2013

Вы получаете эту ошибку, потому что пытаетесь создать расширение администратора, а ваш класс не реализует AdminExtensionInterface. Вы также можете расширить абстрактный класс AdminExtension, реализующий интерфейс.

Это четко определено в документации Sonata Admin Bundle — Extensions: http://sonata-project.org/bundles/admin/master/doc/reference/extensions.html

person eroteev    schedule 02.01.2015