@Cels

Как сделать, чтобы symfony форма при получении данных, увидела динамически добавленные поля?

Ситуация следующая:
Выводится обычная форма symfony и при изменении значения какого-либо поля, выполняется ajax запрос, по которому выбираются дополнительные поля к этой форме и передаются обратно в виде массива из html-кода элементов, которые уже выводятся средствами js.
Дополнительные поля я получаю в сервисе: Как последовательно получить поля формы в symfony?

Теперь при получении данных в контроллере:
if ($form->isSubmitted()) {
    $data = $form->getData();
...

получаю только те поля, которые были в форме изначально, а динамических полей нет, хотя в POST запросе они присутствуют.
Как добавить динамические поля к форме, чтоб она их увидела?

P.S. Сейчас, также, после отправки формы, выводится сообщение:
"Эта форма не должна содержать дополнительных полей."

Нашел кусок кода, где Форма проверяет только свои существующие элементы и отсекает все лишнее:
// vendor\symfony\symfony\src\Symfony\Component\Form\Form.php

public function submit($submittedData, $clearMissing = true)
{
    ...
    foreach ($this->children as $name => $child) {
        $isSubmitted = array_key_exists($name, $submittedData);

        if ($isSubmitted || $clearMissing) {
            $child->submit($isSubmitted ? $submittedData[$name] : null, $clearMissing);
            unset($submittedData[$name]);

            if (null !== $this->clickedButton) {
                continue;
            }

            if ($child instanceof ClickableInterface && $child->isClicked()) {
                $this->clickedButton = $child;

                continue;
            }

            if (method_exists($child, 'getClickedButton') && null !== $child->getClickedButton()) {
                $this->clickedButton = $child->getClickedButton();
            }
        }
    }
    ...
}


но легче не стало - чего-то даже в теории не могу понять, как получить или изменить или заменить исходную форму...

В ожидании решения (если оно существует), пока использую:
$data = $request->request->all();
  • Вопрос задан
  • 1375 просмотров
Решения вопроса 1
voronkovich
@voronkovich
Форма не "видит" динамических полей, потому что они в ней не определены :). Динамические поля можно добавлять в зависимости от значений запроса:
// Экземпляр запроса можно передать из контроллера в тип формы
// или построить форму прямо в контроллере (что проще)
if ($request->request->has('form[dynamic_field]')) {
    $builder->add('dynamic_field', TextType::class, []);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы