Переопределение формы администратора пользователя

Я пытаюсь переопределить SonataUser/Admin/Model/UserAdmin configureFormFields(), потому что мне нужно удалить некоторые поля по умолчанию из формы администратора. Поэтому я скопировал файл vendor/bundles/Sonata/UserBundle/Admin/Model/UserAdmin.php в свой пакет app/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php и изменил его. Затем объявил его как сервис:

# app/application/Sonata/UserBundle/Resources/config/services.yml
services:
    application_user.registration.form.type:
        class: Application\Sonata\UserBundle\Admin\Model\UserAdmin
        arguments: [%sonata_user.model.user.class%]
        tags:
            - { name: form.type, alias: application_user_admin }

Теперь вопросы: правильно ли я поступаю? Как я могу сказать администратору сонаты использовать его?


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


Ответы (2)


Класс переопределения должен быть установлен в config.yml:

# app/config/config.yml
sonata_user:
  admin:
    user:
      class:      MyCompany\UserBundle\Admin\Model\UserAdmin

Расширить оригинальный UserAdmin:

namespace MyCompany\UserBundle\Admin\Model;

use Sonata\AdminBundle\Form\FormMapper;

class UserAdmin extends \Sonata\UserBundle\Admin\Model\UserAdmin
{

    protected function configureFormFields(FormMapper $formMapper)
    {
        // new logic
    }

}

Конечно, измените имя класса MyCompany\UserBundle\Admin\Model\UserAdmin, чтобы отразить структуру вашего пакета.

person Aurelijus Rozenas    schedule 31.12.2013

Вместо этого рекомендуется хранить пакеты в каталоге src: (см. раздел Создание пакета ). В этом случае, если вы используете простые расширения, обязательно используйте --dest=src для создания пакета внутри пространства имен приложения в src/.

php app/console sonata:easy-extends:generate SonataUserBundle --dest=src

Создав переопределяющий пакет в src/Application/Sonata/UserBundle и зарегистрировав пакет поставщика в качестве родительского, вам не придется создавать новую службу. Здесь объясняется, как правильно переопределить набор: переопределить набор и сэкономить много времени.

Не забудьте создать файл, который вы хотите переопределить, в том же месте, что и ваш родительский пакет. В вашем случае вам придется скопировать SonataUser/Admin/Model/UserAdmin.php от поставщика в ваш пакет src/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php и изменить его по своему усмотрению. Вот почему переопределение пакетов может быть таким полезным.

person Mick    schedule 10.07.2012
comment
На самом деле я использовал SonataEasyExtends для расширения SonataUser Bundle ( как указано в документах), автоматически создает структуру расширяющегося пакета. Он использует /app/Application по умолчанию, я оставил его, потому что он всегда упоминается в документации SonataUser. - person Pierre de LESPINAY; 10.07.2012
comment
Если вы не укажете никаких параметров, файлы будут созданы в app/Application/Sonata... но вы можете указать путь с --dest=src. Я обновил свой ответ. - person Mick; 10.07.2012
comment
Я видел это (я намеренно оставил его, потому что они все еще используют этот путь в документах. Возможно, я перенесу его позже). Вопрос больше о том, как заставить сонату использовать мой новый класс администратора. - person Pierre de LESPINAY; 10.07.2012
comment
Вы все равно можете переопределить класс вместо создания новой службы. Удачи :-) - person Mick; 10.07.2012
comment
Это то, что я сделал (см. мой вопрос), но этот класс не переопределяется. - person Pierre de LESPINAY; 10.07.2012
comment
Я понимаю. Это удивительно. Просто чтобы подтвердить, правильно ли ваш пакет переопределяет пакет поставщика с помощью функции getParent()? - person Mick; 10.07.2012
comment
Да, EasyExtends делает это автоматически. Сущности и переводы из этой связки уже учтены (расширены). Кажется, есть что-то для объявления в конфигурации - person Pierre de LESPINAY; 10.07.2012