2016-04-18 2 views
1

У меня есть форма, в которой используется пользовательская не отображаемая субформа.Symfony: выборочная проверка подформы

public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->add('subtype', 'my-subtype'); 
    } 
} 

Эта подформация состоит из нескольких полей, и мне нужно выполнить дополнительную проверку обоих из них вместе. Ограничение Callback идеально подходит для работы. Однако я не могу найти способ добавления этого ограничения в подчиненную форму в целом.

До сих пор я пытался установить Callback в setDefaultOptions() или установить его с помощью setAttribute() в buildForm(), но обратный вызов не оценивается.

В настоящее время я просто добавить Обратный к одному из полея:

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder->add('field1', 'text') 
     ->add(
      'field2', 'text', 
      array(
      'constraints' => array(
       new Callback(array(
        'methods' => array(array($this, 'validateMyType')) 
       )) 
     ) 
    )); 
} 

public function validateMyType($data, ExecutionContextInterface $context) { 
    // Validation failed... 
    $context->addViolationAt('subtype', "mySubtypeViolation"); 
    return; 
} 

Это, однако, не позволяет мне добавить нарушения на всем подтипе. Что бы я ни использовал в addViolationAt(), это нарушение всегда добавляется в поле, на котором размещается ограничение обратного вызова.

ответ

0

Во-первых, у меня была опечатка в конфигурации, поэтому метод обратного вызова не запускался. Во-вторых, error-bubbling был автоматически установлен, поэтому ошибка была добавлена ​​ко всей форме. Так что мне нужно было только вручную отключить его.

public function setDefaultOptions(OptionsResolverInterface $resolver) { 
    $resolver->setDefaults([ 
     'error_bubbling' => false, // Automatically set to true for compound forms. 
     'constraints' => 
     array(
      new Callback(array(
       'methods' => array(array($this, 'validateMyType')) 
       )) 
    )]); 
} 

Чем нарушение добавляется как для любой другой функции обратного вызова:

public function validateFacrMembership($data, ExecutionContextInterface $context) { 
    $context->addViolation("invalidValueMessage"); 
} 
1

Я удивлен, что вы не можете добавить обратный вызов в setDefaultOptions(), потому что я просто тестировал это, и это работает. Это определенно, как я сделал бы это сначала.

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'constraints' => new Callback([$this, 'test']) 
    ]); 
} 

public function test($data, ExecutionContextInterface $context) 
{ 
    return; 
} 

И test метод был выполнен (я проверил с помощью отладчика).

+0

Ok. Это мое плохое. У меня было плохое объявление значений по умолчанию («ограничения» **, ** array (... »). Как мне еще нужно выяснить, как добавить нарушение в свои поля и подчинить его в целом. – Wolfer

+0

Вам нужно использовать Путь свойств ваших нарушений. '$ context-> buildViolation (...) -> atPath ('подтип')' должен делать трюк. – Terenoth

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