6

I'm trying to modify the default admin of the User entity.
Just need to remove certain fields from the form actually.

I imagine this doc will be usefull for me when it'll be available.
For now I have created this admin and tried to override the default User one.

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]

But I'm getting

Cannot import resource "/var/www/Symfony/app/config/." from "/var/www/Symfony/app/config/routing.yml".
...
ErrorException: Catchable Fatal Error: Argument 1 passed to Sonata\AdminBundle\Admin\Admin::addExtension() must be an instance of Sonata\AdminBundle\Admin\AdminExtensionInterface, instance of Application\Sonata\UserBundle\Admin\Model\UserAdmin given, called in /var/www/Symfony/app/cache/dev/appDevDebugProjectContainer.php on line 3139 and defined in /var/www/Symfony/vendor/bundles/Sonata/AdminBundle/Admin/Admin.php line 2359

What am I doing wrong ?

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 セットアップ中に作成された User エンティティーの FQCN に設定します。

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

ここで、デフォルトの UserAdmin クラスを拡張するクラスを作成し、configureShowFields、configureFormFields、configureDatagridFilters、および configureListFields メソッドをオーバーライドして、必要なユーザー管理フィールドを追加します。以下は、FOSUserBundle ドキュメントで作成された必要最小限のユーザー エンティティに基づく拡張 UserAdmin クラスのサンプルです。

<?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 に答える