Symfony: проверка пользовательских подчиненных форм

У меня есть форма ведьма использует пользовательскую не отображенную субформу.

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

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

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

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

В настоящее время я просто добавляю Callback в одно из полей:

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 (), нарушение всегда добавляется в поле, в котором находится ограничение Callback.

1

Решение

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

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

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

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

1

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

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

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");
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector