2015-05-13 3 views
7

Итак, вот сценарий: у меня есть группа переключателей. Исходя из их значения, я должен или не должен проверять другие три поля (они пустые, содержат номера и т. Д.).Условная проверка полей на основе другого значения поля в Symfony2

Могу ли я передать все эти значения в какое-то ограничение и сравнить их там?

Или обратный вызов непосредственно в контроллере - лучший способ решить эту проблему?

Как правило, что является лучшей практикой в ​​этом случае?

ответ

2

Предлагаю вам использовать callback validator.

Например, в классе сущностей:

<?php 

use Symfony\Component\Validator\Constraints as Assert; 

/** 
* @Assert\Callback(methods={"myValidation"}) 
*/ 
class Setting { 
    public function myValidation(ExecutionContextInterface $context) 
    { 
     if (
       $this->getRadioSelection() == '1' // RADIO SELECT EXAMPLE 
       && 
       (// CHECK OTHER PARAMS 
       $this->getFiled1() == null 
       ) 
      ) 
     { 
      $context->addViolation('mandatory params'); 
     } 
     // put some other validation rule here 
    } 
} 

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

Сообщите мне, что вам нужно больше информации.

Надеюсь, это поможет.

+0

Не _exactly_ что я но это привело меня к правильному решению. Спасибо!! – spiridon

+3

Привет @spiridon, не могли бы вы подробно рассказать о том, как добиться правильного решения на основе этого подхода? спасибо – Ninj

2

Вам необходимо использовать группы проверки. Это позволяет проверять объект только на некоторые ограничения для этого класса. Более подробную информацию можно найти в документации по Symfony2 http://symfony.com/doc/current/book/validation.html#validation-groups, а также http://symfony.com/doc/current/book/forms.html#validation-groups

В форме можно определить метод, называемый setDefaultOptions, который должен выглядеть примерно так:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    // some other code here ... 
    $builder->add('SOME_FIELD', 'password', array(
     'constraints' => array(
      new NotBlank(array(
       'message' => 'Password is required', 
       'groups' => array('SOME_OTHER_VALIDATION_GROUP'), 
      )), 
     ) 
    )) 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'validation_groups' => function (FormInterface $form) { 
      $groups = array('Default'); 
      $data = $form->getData(); 

      if ($data['SOME_OTHER_FIELD']) { // then we want password to be required 
       $groups[] = 'SOME_OTHER_VALIDATION_GROUP'; 
      } 

      return $groups; 
     } 
    )); 
} 

Следующая ссылка предоставляет подробный пример как вы можете их использовать http://web.archive.org/web/20161119202935/http://marcjuch.li:80/blog/2013/04/21/how-to-use-validation-groups-in-symfony/.

Надеюсь, это поможет!

+0

Я делаю это в под форме и $ form-> getData() возвращает пустой массив. У моей формы есть поля, и она работает без изменений. – Ninj

+0

EDIT: Хорошо, используя '$ form-> getData()' была моя ошибка, мне пришлось искать правильное поле: '$ form-> get ('aField') -> getData()' – Ninj

Смежные вопросы