Каков правильный подход к одновременной проверке нескольких флажков в Symfony2 (требуется один)?

Допустим, у нас есть форма Symfony2, содержащая 3 флажка (A, B, C), и мы хотим, чтобы пользователь отметил хотя бы один флажок, чтобы проверить форму, поэтому любая комбинация ([A], [B], [C] , [A,B], [A,C], [B,C], [A,B,C]) вернет true, а никакое выделение [] не вернет false.

Каков правильный подход для достижения этого с помощью валидаторов Symfony для объектов Doctrine?

Изменить:
Каждый флажок сопоставляется с собственным столбцом в базе данных с помощью Doctrine @ORM\Column(type="boolean").


person VMC    schedule 22.10.2012    source источник


Ответы (3)


Если вы правильно используете тип поля выбора для списка параметров, вы можете использовать ChoiceValidator:

@Assert\Choice(min=1, minMessage = "You must choose at least one option.")

Из документов:

Если множественная опция истинна, то вы можете использовать минимальную опцию, чтобы принудительно выбрать как минимум XX значений. Например, если min равно 3, но входной массив содержит только 2 допустимых элемента, проверка завершится ошибкой.

person noetix    schedule 22.10.2012
comment
Извините, что не указал: каждый флажок сопоставлен с собственным полем в базе данных (только что обновил вопрос). Кроме того, я думаю, что нашел решение, опубликую его в ближайшее время. - person VMC; 23.10.2012

Проблема решена.

На основе класса Symfony2 Документация Constraint Validator и Добавлена ​​информация об изменениях в настройке подпути проверки к UPGRADE-2.1 .md

В свой класс объектов я добавил:

class Message
{

  // ...

  // check if user selected at least one network to publish the message
  public function isNetworkSelected(ExecutionContext $context)
  {
    if (!$this->network_twitter && !$this->network_facebook && !$this->network_googleplus)
    {
      $context->addViolationAtSubPath('network_facebook', 'Please select at least one network', array(), null);
    }
  }

  // ...

}

In validation.yml:

MY\MessageBundle\Entity\Message
    constraints:
        - Callback:
            methods:   [isNetworkSelected]
person VMC    schedule 22.10.2012

У вас есть кнопочное управление? Если это так, в событии щелчка проверьте, сделан ли выбор, если да, верните true, иначе верните false.

person sjramsay    schedule 22.10.2012
comment
О, извините, может быть, мой вопрос был недостаточно ясен (я отредактировал). Я имел в виду проверку с использованием фреймворка Symfony2, а не Javascript. - person VMC; 23.10.2012