AJAX Symfony Form + встроенная форма = ошибка не возвращена в правильной форме - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть форма symfony 4.2 через AJAX со встроенной подформой, которая используется в качестве пользовательской группы.

Проблема в том, что мой imgLinks, который является частьювстроенная форма group_pictures не возвращает свою ошибку как часть group_picture bu как одиночную ошибку без какой-либо группы.

Поле проверяется, и ошибка возвращается, как и ожидалось, ИСКЛЮЧЕНИЕ не назначено дляправильная группа.

В профилировщике Symfony Form tab я вижу ошибку, связанную с полем, но она не отображается как часть группы, как показано на скриншоте ниже

enter image description here

no error added

Это очень странное поведение, поскольку все остальные мои поля возвращают ошибки в соответствующих группах.

В профилировщике post parameter мы видим, что оно отправлено с правильной группой:

enter image description here

Итак, вот поле сущности:

 /**
 * @var string|null
 *
 * @ORM\Column(name="img_links", type="simple_array")
 *
 * @AcmeAssert\ImageLinks
 */
private $imgLinks;

Изменение моего пользовательского Assert для другого в комплекте с Symfony приводит кТакое же поведение, поэтому мое пользовательское ограничение не является причиной

Тип формы

$builder->add(
     $builder->create('group_pictures', FormType::class, array('inherit_data' => true))
       ->add('imgLinks', CollectionType::class, array(
            'label' => false,
            'entry_type' => TextType::class,
            'allow_add' => true,
            'allow_delete' => true,
       ))
 );

Функция моего контроллера для сбора ошибок и их возврата в мой AJAX

    private function getErrorMessages($form)
{
    $errors = array();

    foreach ($form->getErrors() as $key => $error) {
        $errors[] = $error->getMessage();
    }

    foreach ($form->all() as $child) {
        if (!$child->isValid()) {
            $errors[$child->getName()] = $this->getErrorMessages($child);
        }
    }
    return $errors;
}

в приведенном выше сборщике ошибок, если я вставлю код для выгрузки дочернего элемента group picture следующим образом:

if( $child->getName() == 'group_pictures'){
     dump($child);
 }

Я вижу, что ему не присвоено никакой ошибки -errors: []

Тогда ошибкивозвращается в браузер (скриншот консоли), так как вы видите, что ошибка назначается клавише 0 вместо group_picture

browser error

1 Ответ

0 голосов
/ 24 декабря 2018
getErrorMessages

Метод сначала назначает ошибку как упорядоченную / index => value /, а затем для каждой дочерней формы ошибка присваивается как неупорядоченная / key => value /

Эта часть для меня немногоodd

это то, что я использую

публичная функция

function getErrors(FormInterface $form)
        {
            $this->childErrors($form);

            foreach ($form->all() as $key => $child) {
                if ($child instanceof FormInterface) {
                    $this->childErrors($child, true);
                }
            }

            return $this->errors;
    }

И это метод childErrors

private function childErrors(FormInterface $form, $recursive = false)
{
    foreach ($form->getErrors() as $error) {
        $message = $this->translator->trans($error->getMessage(), [], 'validators');
        $this->errors[] = $message;
    }

    if ($form->count() && $recursive) {
        foreach ($form->all() as $child) {
            $this->childErrors($child, $recursive);
        }
    }
}

UPDATE: да,это параметры error_bubbling.

Должны быть установлены записи типа коллекции error_bubbling true / по умолчанию false иСам тип коллекции имеет значение true, поэтому его необходимо будет отключить, иначе ошибка будет отображаться в основной форме.

...