6

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

我想这个文档在可用时会对我有用。
现在我已经创建了这个管理员并尝试覆盖默认管理员User

应用程序/应用程序/奏鸣曲/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.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:可捕获的致命错误:传递给 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 中调用,并在第 2359 行的 /var/www/Symfony/vendor/bundles/Sonata/AdminBundle/Admin/Admin.php 中定义

我究竟做错了什么 ?

4

5 回答 5

4

万一有一天有人会查到这个,我通过覆盖 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 设置期间创建的用户实体的 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

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

于 2015-01-06T15:04:31.753 回答
3

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

parameters:
    sonata.user.admin.user.class: Application\Sonata\UserBundle\Admin\Model\UserAdmin
于 2012-10-31T20:00:00.567 回答
1

Symfony 2.1 的相同修复,您需要像这样为 Sonata 捆绑包指定自定义 UserAdmin 类

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

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

于 2013-02-14T14:29:59.543 回答
1

更改服务定义中的标签

tags:
    - { name: sonata.admin, manager_type: orm, group: some.menu, label: User }
于 2012-07-11T13:57:26.837 回答
0

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

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

于 2015-01-02T21:18:12.360 回答