Synfony 2.8 одно из двух полей должно быть заполнено - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть эта форма, и я хочу проверить, заполнено ли одно из двух полей (numberPlate или expirationDate).

Это мое buildForm:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('type', ChoiceType::class, array(
            'choices_as_values' => true,
            'required' => true,
            'label' => 'Tipo Veicolo',
            'empty_data' => '',
            'empty_value' => '',
            'attr' => array('class'=> 'form-control select2'),
            'choices' => array('Auto' => 'Auto', 'Moto' => 'Moto', 'Camper' => 'Camper' ,'Barca' => 'Barca')
        ))
         ->add('numberPlate', TextType::class, array(
                'label' => 'Targa',
                'required' => false,
                'attr' => array(
                    'class'=> 'form-control',
                    'minlength' => 5,
                    'maxlength' => 7
                    )
            ))
         ->add('expirationDate', DateTimeType::class, array(
             'label' => 'Scadenza',
             'widget' => 'single_text',
             'input'  => 'datetime',
             'format' => 'dd/MM/yyyy',
             'attr' => array('class'=> 'form-control')
         ))
    ;
}

1 Ответ

0 голосов
/ 11 декабря 2018

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

namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

class YourModel
{
   /**
     * @Assert\Callback
     */
    public function validate(ExecutionContextInterface $context)
    {
        if (!$this->numberPlate && !$this->expirationDate) {
            $context->buildViolation('Targa or Scadenza is required')
              //optionally display the error at the numberPlate field, omit to display at the top of the form errors
              ->atPath('numberPlate')
              ->addViolation()
              ;
        }
    }
}

Затем обновите свое поле Scadenza как необязательное.

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        //...
         ->add('expirationDate', DateTimeType::class, array(
             'label' => 'Scadenza',
             'required' => false,
             'widget' => 'single_text',
             'input'  => 'datetime',
             'format' => 'dd/MM/yyyy',
             'attr' => array('class'=> 'form-control')
         ))
    ;
}

Когда форма будет отправлена, она выполнит метод YourModel::validate, а если numberPlate и expirationDate are empty, произойдет сбой $form->isValid().

Обязательно очистите кэш после внесения изменений, чтобы обновить аннотации.

ПРИМЕЧАНИЕ: Это будет применяться ко всем / всем формам, в которых используется эта модель сущности, чтобы отделить валидацию, необходимую для реализации групп валидации

...