Skip to content

Customize admin

Edit this page

Extension

Admin extensions allow you to add or change features of one or more Admin instances. To create an extension your class must implement the interface SonataAdminBundleAdminAdminExtensionInterface and be registered as a service. The interface defines a number of functions which you can use to customize the edit form, list view, form validation, alter newly created objects and other admin features.

Hint

As most of the classes from sonata are final, "Extension" is an easy way to customize admins created in sonata's code.

As an example, let's assume that we want to customize PageAdmin, adding position field into the admin page, and this admin is declared as sonata.page.admin.page

1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace App\Admin\Extension;

use Sonata\AdminBundle\Admin\AbstractAdminExtension;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag;

#[AutoconfigureTag(name: 'sonata.admin.extension', attributes: ['target' => 'sonata.page.admin.page'])]
final class PositionAdminExtension extends AbstractAdminExtension
{
    public function configureFormFields(FormMapper $form): void
    {
        $form->add('position');
    }
}

As you can see the position field was added into the admin page!

Tip

If you want to add the field into the existing group you can check out The Form View

Tip

If you want to reorder the fields check out Reorder fields

Note

To know more information about how to configure service tags using yaml, xml or php file check out Symfony Tags docs

Attributes supported by sonata.admin.extension tag

Attribute name Description
target Admins service's name that you want to customize, If you use the global attribute as true, you don't need to pass it.
global adds the extension to all admins.
excludes specify one or more admin service ids to which the Extension should not be added (this will prevent it matching any of the other settings).
extends specify one or more classes. If the managed class of an admin extends one of the specified classes the extension will be added to that admin.
implements specify one or more interfaces. If the managed class of an admin implements one of the specified interfaces the extension will be added to that admin.
instanceof specify one or more classes. If the managed class of an admin extends one of the specified classes or is an instance of that class the extension will be added to that admin.
uses Specify one or more traits. If the managed class of an admin uses one of the specified traits the extension will be added to that admin.
admin_extends specify one or more classes. If the class of an admin extends one of the specified classes the extension will be added to that admin.
admin_implements specify one or more interfaces. If the class of an admin implements one of the specified interfaces the extension will be added to that admin.
admin_instanceof specify one or more classes. If the class of an admin extends one of the specified classes or is an instance of that class the extension will be added to that admin.
admin_uses Specify one or more traits. If the class of an admin uses one of the specified traits the extension will be added to that admin.
priority Can be a positive or negative integer. The higher the priority, the earlier it was executed.

Configuration extension in sonata config

It's a another way to configure Admin extension in case you don't want to use services tags, it's defined in your sonata_admin configs

1
2
3
4
5
6
7
# config/packages/sonata_admin.yaml

sonata_admin:
    extensions:
        app.publish.extension:
            admins:
                - App\Admin\Extension\PositionAdminExtension
Attribute name Description
global adds the extension to all admins.
admins specify one or more admin service ids to which the Extension should be added.
excludes specify one or more admin service ids to which the Extension should not be added (this will prevent it matching any of the other settings).
extends specify one or more classes. If the managed class of an admin extends one of the specified classes the extension will be added to that admin.
implements specify one or more interfaces. If the managed class of an admin implements one of the specified interfaces the extension will be added to that admin.
instanceof specify one or more classes. If the managed class of an admin extends one of the specified classes or is an instance of that class the extension will be added to that admin.
uses Specify one or more traits. If the managed class of an admin uses one of the specified traits the extension will be added to that admin.
admin_extends specify one or more classes. If the class of an admin extends one of the specified classes the extension will be added to that admin.
admin_implements specify one or more interfaces. If the class of an admin implements one of the specified interfaces the extension will be added to that admin.
admin_instanceof specify one or more classes. If the class of an admin extends one of the specified classes or is an instance of that class the extension will be added to that admin.
admin_uses Specify one or more traits. If the class of an admin uses one of the specified traits the extension will be added to that admin.
priority Can be a positive or negative integer. The higher the priority, the earlier it was executed.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# config/packages/sonata_admin.yaml

sonata_admin:
    extensions:
        app.publish.extension:
            global: true
            admins:
                - app.admin.article
            implements:
                - App\Publish\PublishStatusInterface
            excludes:
                - app.admin.blog
                - app.admin.news
            extends:
                - App\Document\Blog
            instanceof:
                - App\Document\Page
            uses:
                - App\Trait\Timestampable
            admin_implements:
                - App\Admin\PublishableAdminInterface
            admin_extends:
                - App\Admin\AbstractAdmin
            admin_instanceof:
                - App\Admin\MediaAdmin
            admin_uses:
                - App\Trait\Loggable

If those options doesn't fill your need, you can still dynamically add/remove an extensions in the `AdminInterface::configure()` method of your admin with the methods `addExtension` and `removeExtension`:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use App\AdminExtension\PublishStatusAdminExtension;
use Sonata\AdminBundle\Admin\AbstractAdmin;

final class PublishStatusAdmin extends AbstractAdmin
{
    protected function configure(): void
    {
        // ...

        if ($someCondition) {
            $this->addExtension(new PublishStatusAdminExtension());
        }
    }
}

Reorder fields

Sometime you want to reorder the fields added from Extension. Methods that pass SonataAdminBundleAdminAdminInterfaceMapperInterface or SonataBlockBundleFormMapperFormMapper as parameter you can use reorder method

In case you want to reorder the fields The Form View, you can do like this:

1
2
3
4
5
6
7
8
9
10
11
12
public function configureFormFields(FormMapper $form): void
{
    $form
        ->with('main')
            ->reorder([
                'url',
                'position'
            ])
            ->add('position')
        ->end()
    ;
}

In this case the position field will be into the main group, after url field

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.
TOC
    Version