Форма Symfony2 сделать одно поле обязательным для заполнения между 2 полями

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

В общем, моя проблема заключается в следующем: я хочу проверить, чтобы пользователь выбрал хотя бы одно из двух обязательных полей (maleSeat и femaleSeat)

 ->add('maxSeats', 'integer', array(
'label' => ucwords('max Seats'),
'required' => true, // Choose if it's required or not
'constraints' => $constraints['maxSeats'],
'invalid_message' => 'You entered an invalid value, it should include %num%',
'sonata_help' => 'Here some help text!!!',
'attr' => array(
'class' => 'form-control',
'help' => 'My Help Message',
),
'label_attr' => array(
'class' => 'control-label'
)
))
->add('maleSeats', 'integer', array(
'label' => ucwords('male Seats'),
'required' => true, // Choose if it's required or not
'constraints' => $constraints['maleSeats'],
'invalid_message' => 'You entered an invalid value, it should include %num%',
'attr' => array(
'class' => 'form-control'
),
'label_attr' => array(
'class' => 'control-label'
)
))
->add('femaleSeats', 'integer', array(
'label' => ucwords('female Seats'),
'required' => true, // Choose if it's required or not
'constraints' => $constraints['femaleSeats'],
'invalid_message' => 'You entered an invalid value, it should include %num%',
'attr' => array(
'class' => 'form-control'
),
'label_attr' => array(
'class' => 'control-label'
)
))

$constraints = array(
'maxSeats' => array(
new Assert\NotBlank(),
new Assert\Range(array(
'min'        => 1,
'minMessage' => 'Min Seats is 1'
)),
new Assert\Regex(array(
'pattern' => '/[0-9]/',
'message' => 'Total Seats Should Only be a Positive Number',
)),
),
'maleSeats' => array(
new Assert\NotBlank(),
new Assert\Range(array(
'min'        => 1,
'minMessage' => 'Min Seats is 1'
)),
new Assert\Length(array(
'min' => 1,
'max' => 30,
'minMessage' => 'The min Seats must be more than 6 and less than 1 characters long',
'maxMessage' => 'The min Seats must be more than 6 and less than 30 characters long',
)),
new Assert\Regex(array(
'pattern' => '/[0-9]/',
'message' => 'Total Seats Should Only be a Positive Number',
)),
),
'femaleSeats' => array(
new Assert\NotBlank(),
new Assert\Range(array(
'min'        => 1,
'minMessage' => 'Min Seats is 1'
)),
new Assert\Length(array(
'min' => 1,
'max' => 30,
'minMessage' => 'The min Seats must be more than 6 and less than 1 characters long',
'maxMessage' => 'The min Seats must be more than 6 and less than 30 characters long',
)),
new Assert\Regex(array(
'pattern' => '/[0-9]/',
'message' => 'Total Seats Should Only be a Positive Number',
)),
),

);

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

0

Решение

Вы можете сделать это с помощью обратного вызова в вашем Seat юридическое лицо :

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
// if you're using the older 2.4 validation API, you'll need this instead
// use Symfony\Component\Validator\ExecutionContextInterface;

class Seat
{
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context)
{
if ($this->getFemaleSeats() == 0 && $this->getMaleSeats == 0) {
// If you're using the new 2.5 validation API (you probably are!)
$context->buildViolation('Female and male seat could not be empty at the same time')
->atPath('maleSeats')
->addViolation();
// If you're using the old 2.4 validation API
/*
$context->addViolationAt(
'maleSeats',
'Female and male seat could not be empty at the same time'
);
*/
}

}

Если вы хотите получить больше информации о конфигурации, я предлагаю вам ссылку Symfony Callback Doc

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]