@symnoob

Symfony — Как изменить форму Бандла?

Всем привет, как можно изменить Форму бандла, а точнее убрать оттуда ненужное текстовое поле?
И Форма при этом рэндэруется в самом бандле.
  • Вопрос задан
  • 103 просмотра
Решения вопроса 2
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Можно использовать Form Type Extension

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;

class BundleFormTypeExtension extends AbstractTypeExtension
{
    public static function getExtendedTypes(): iterable
    {
        return [BundleFormType::class];
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->remove('someField');
    }
}
Ответ написан
Комментировать
@Flying
Если форма реализована в виде сервиса - то всё становится довольно просто. Любой сервис имеет идентификатор и вся работа с сервисом идёт по этому идентификатору.

Таким образом задача сводится к тому чтобы подменить сервис с идентификатором нужной вам формы другим сервисом, выполняющим то что вам нужно.

Простейший вариант: сделать свой класс формы, наследованный от оригинала (который, естественно, в конечном итоге должен реализовывать FormTypeInterface) и переопределить в нём метод buildForm() на что-то вроде:
public function buildForm(FormBuilderInterface $builder, array $options)
{
    parent::buildForm($builder, $options);
    $builder->remove('nameOfTheFieldToRemove');
}

далее, в config/services.yaml вы просто регистрируете свой класс как сервис с идентификатором оригинального сервиса.

Ситуация может оказаться чуть сложнее в случае если оригинальный сервис формы не имеет публичного идентификатора. Маловероятно что такое произойдёт в случае формы, но если вдруг это так - нужно будет смотреть код формирования контейнера в целевом bundle и писать свой compiler pass для внесения нужных вам изменений.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы