(Типы форм Symfony 4) Как сделать всю подчиненную форму обязательной / не обязательной, основываясь на значении <select>в форме? - PullRequest
0 голосов
/ 07 февраля 2019

Вот мой класс типа формы.Таким образом, поле < select>, о котором я говорю, является 'numSubscriptionTiers':

class UserProfileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('numSubscriptionTiers', ChoiceType::class, [
                'choices' => [
                    '1' => 1,
                    '2' => 2,
                    '3' => 3
                ]
            ])
            ->add('subscriptionTier1', UserSubscriptionTierType::class, [
                'required' => false,
                'entry_type' => UserSubscriptionTierType::class
            ])
            ->add('subscriptionTier2', UserSubscriptionTierType::class, [
                'required' => false,
                'entry_type' => UserSubscriptionTierType::class
            ])
            ->add('subscriptionTier3', UserSubscriptionTierType::class, [
                'required' => false,
                'entry_type' => UserSubscriptionTierType::class
            ])

Если пользователь выбирает 1, тогда требуется только выполнить подчиненную форму subscriptionTier1, если пользователь выбирает 2, то только сделать subscriptionTier1и требуются подчиненные формы subscriptionTier2 и т. д. ...

Я знаю, что существуют события формы, такие как PRE_SET_DATA, POST_SUBMIT и т. д. ... но можете ли вы добавить что-то похожее на событие JavaScript из класса типа формы?Как какое-то событие onChange для выбора numSubscriptionTiers и установки обязательного атрибута соответствующих подчиненных форм на true / false?

Я уже пошел сюда: https://symfony.com/doc/current/form/dynamic_form_modification.html#how-to-dynamically-generate-forms-based-on-user-data, и он только дает пример того, как динамически заполнять список выбора, а не добавлять событие изменения после того, как его параметры указаны.

1 Ответ

0 голосов
/ 07 февраля 2019

Используйте событие PRE_SUBMIT для динамического изменения формы , чтобы установить проверку бэкэнда для элементов формы.

Например, если отправленное значение numSubscriptionTiers равно 2, затем удалите потомков subscriptionTier1 и subscriptionTier2 и добавьте их снова, но на этот раз с дополнительным ограничением NotBlank:

// add imports

public function buildForm(FormBuilderInterface $builder, array $options)
{
    // skipped for brevity
    $builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'conditional']);
}

public function conditional(FormEvent $event)
{
    $form = $event->getForm();
    $data = $event->getData();

    // make sure tierCount is between 1-3
    $tierCount = min(3, max(1, (int) $data['numSubscriptionTiers'] ?? 0));

    for ($i = 1; $i <= $tierCount; $i++) {
        $childName = sprintf('subscriptionTier%d', $i);

        $form
            ->remove($childName)
            ->add($childName, UserSubscriptionTierType::class, [
                'required' => false,
                'entry_type' => UserSubscriptionTierType::class,
                'constraints' => new NotBlank(),
            ]);
    }
}

Боюсь, атрибут HTML5 required должен быть добавлен динамическииспользуя JavaScript, потому что PHP не будет обрабатывать это на стороне клиента.Ну, вы можете изменить свойство required динамически читаемого поля subscriptionTier1, но подумайте, что произойдет, если пользователь изменит numSubscriptionTiers на 2.Невозможно отправить форму из-за свойства required элемента subscriptionTier1.Таким образом, только JavaScript является решением этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...