首页 文章

SonataUser - 扩展管理员

提问于
浏览
6

我正在尝试修改 User 实体的默认管理员 .
只需要从表单中删除某些字段 .

我想this doc对我来说将是有用的 .
现在我已创建此管理员并尝试覆盖默认的 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;
    }

}

app/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致命错误:传递给Sonata \ AdminBundle \ Admin \ Admin :: addExtension()的参数1必须是Sonata \ AdminBundle \ Admin \ AdminExtensionInterface的实例,Application \ Sonata \ UserBundle \ Admin \ Model \的实例UserAdmin给出,在3139行的/var/www/Symfony/app/cache/dev/appDevDebugProjectContainer.php中调用,并在/var/www/Symfony/vendor/bundles/Sonata/AdminBundle/Admin/Admin.php第2359行中定义

我究竟做错了什么 ?

5 回答

  • 0

    在config.yml中,添加以下内容:

    parameters:
        sonata.user.admin.user.class: Application\Sonata\UserBundle\Admin\Model\UserAdmin
    
  • 3

    万一有人会在某一天看到这个,我通过覆盖UserAdmin.php来实现这一点

    将以下行添加到app / AppKernel.php的registerBundle方法中

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

    现在将sonata.user.admin.user.class参数的值设置为在FOSUserBundle设置期间创建的User实体的FQCN .

    //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的值设置为app / config / config.yml中创建的UserAdmin类的FQCN,例如

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

    如果一切设置正确,您将在管理员/仪表板页面中看到新用户行 . 所有用户操作都应按预期工作 .

  • 3

    更改服务定义中的标记

    tags:
        - { name: sonata.admin, manager_type: orm, group: some.menu, label: User }
    
  • 1

    对于Symfony 2.1的相同修复,您需要像这样为Sonata bundle指定自定义UserAdmin类

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

    另请查看Sonata UserBundle documentation以获取更多选项

  • 1

    您收到此错误,因为您正在尝试创建管理扩展,并且您的类未实现AdminExtensionInterface . 您还可以扩展实现接口的抽象AdminExtension类 .

    这在Sonata Admin Bundle的文档中有明确定义 - 扩展:http://sonata-project.org/bundles/admin/master/doc/reference/extensions.html

相关问题