Доступ к полю формы от подписчика (события формы) в Symfony2 - PullRequest
2 голосов
/ 12 марта 2012

Я следую учебному пособию Как динамически генерировать формы с помощью событий формы .Я застрял на создании AddNameFieldSubscriber:

$subscriber = new AddNameFieldSubscriber($builder->getFormFactory());

Мой вопрос прост: как FormFactory может получить доступ и изменить поле произвольной формы, ранее созданное $builder?И почему мы передаем FormFactory вместо самого $builder?

Предполагая, что у нас есть только два поля ("имя" и "цена") в построителе :

class ProductType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $subscriber = new AddProductTypeSubscriber($builder->getFormFactory());
        $builder->addEventSubscriber($subscriber);

        $builder->add('name');
        $builder->add('price');
    }

    public function getName() { return 'product'; }
}

Я бы хотел установить required = false (просто пример) в подписчике :

class ProductTypeSubscriber implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_SET_DATA => 'preSetData');
    }

    public function preSetData(DataEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) return;

        // Access "name" field and set require = false
    }
}

1 Ответ

1 голос
/ 12 марта 2012

Я могу ошибаться по этому поводу, но я не верю, что вы можете изменить атрибуты формы после ее создания.Однако вы можете добавить к форме.

Вместо добавления поля 'name' в ProductType::buildForm, вы можете отложить это для подписчика:

if (!$data->getId()) {
    $form->add($this->factory->createNamed('text', 'name', null, array('required' => false)));
} else {
    $form->add($this->factory->createNamed('text', 'name'));
}
...