Symfony 2 Эта форма не должна содержать лишних полей

Я создал форму, используя formBuilder в Symfony. Я добавляю базовый стиль во входные данные формы, используя внешнюю таблицу стилей и ссылаясь на идентификатор тега. Форма правильно отображается и правильно обрабатывает информацию.

Однако он выводит нежелательный неупорядоченный список с элементом списка, содержащим следующий текст: This form should not contain extra fields.

Мне очень трудно избавиться от этого уведомления. Мне было интересно, может ли кто-нибудь помочь мне понять, почему он отображается с моей формой и как его удалить?

Спасибо заранее!

Контроллер

$form = $this->createFormBuilder($search)
        ->add('searchinput', 'text', array('label'=>false, 'required' =>false))
        ->add('search', 'submit')
        ->getForm();

$form->handleRequest($request);

Вывод Twig (форма выводится и обрабатывается правильно

This form should not contain extra fields.

Визуализированный HTML

<form method="post" action="">
    <div id="form">
       <ul>
           <li>This form should not contain extra fields.</li>
       </ul>
       <div>
          <input type="text" id="form_searchinput" name="form[searchinput]" />
       </div>
       <div>
          <button type="submit" id="form_search" name="form[search]">Search</button>
       </div>
       <input type="hidden" id="form__token" name="form[_token]" value="bb342d7ef928e984713d8cf3eda9a63440f973f2" />
    </div>
 </form>

person AnchovyLegend    schedule 06.10.2013    source источник
comment
возможный дубликат Symfony2: избавьтесь от этой формы не должно содержать лишних полей   -  person falinsky    schedule 06.10.2013


Ответы (5)


Мне кажется, что у вас проблема из-за поля токена. Если это так, попробуйте добавить параметры в createFormBuilder ():

$this->createFormBuilder($search, array(
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
    ))
    ->add('searchinput', 'text', array('label'=>false, 'required' =>false))
    ->add('search', 'submit')
    ->getForm();

Чтобы узнать дополнительное поле, используйте этот код в контроллере, где вы получите запрос:

$data = $request->request->all();

print("REQUEST DATA<br/>");
foreach ($data as $k => $d) {
    print("$k: <pre>"); print_r($d); print("</pre>");
}

$children = $form->all();

print("<br/>FORM CHILDREN<br/>");
foreach ($children as $ch) {
    print($ch->getName() . "<br/>");
}

$data = array_diff_key($data, $children);
//$data contains now extra fields

print("<br/>DIFF DATA<br/>");
foreach ($data as $k => $d) {
    print("$k: <pre>"); print_r($d); print("</pre>");
}

$form->bind($data);
person nni6    schedule 06.10.2013
comment
Спасибо за ответ, попробую. Почему в первую очередь создается поле токена и почему это проблема? - person AnchovyLegend; 06.10.2013
comment
Не знаю, какое поле в вашем случае лишнее, это очень просто выяснить. Дополнительные поля означают, что в запросе есть некоторые поля, которых нет в конструкторе форм. Таким образом, привязка формы вызывает эту ошибку. Возможно, по умолчанию поле токена не добавлено в конструкторе форм, поэтому вы можете указать это явно, добавив параметры в конструктор форм, как я написал вам в ответе. - person nni6; 07.10.2013
comment
Поле токена создается для защиты CSRF (см. symfony.com/doc/ current / book / forms.html # csrf-protection) Это встроено в Sf2 и почти наверняка не является причиной ошибки. Скорее всего, вы жестко запрограммировали какое-то скрытое поле в шаблоне формы, и это поле не является частью объекта, к которому вы привязываетесь. - person Acyra; 22.01.2014
comment
В Symfony FormInterface есть метод под названием getExtraData(), который может помочь. - person ziiweb; 30.05.2016

Это сообщение также возможно, если вы добавили / изменили поля в createFormBuilder () и нажали обновить в браузере ...

В этом случае все нормально после повторной отправки формы ;-)

person PBR    schedule 27.02.2014
comment
Мой случай точно ... После смены построителя я продолжал отправлять AJAX, не обновляя весь экран. Tnx, +1. - person userfuser; 23.07.2014

Я получил то же сообщение при наличии нескольких форм на одной странице. Оказывается, symfony по умолчанию использует имя «форма» для всех из них. Вместо использования createFormBuilder вы можете изменить имя формы, чтобы избежать конфликтов, используя

public FormBuilderInterface createNamedBuilder(string $name, string|FormTypeInterface $type = 'form', mixed $data = null, array $options = array(), FormBuilderInterface $parent = null)

См. Пример https://stackoverflow.com/a/13366086/1025437.

person Mondane    schedule 04.08.2015

Я столкнулся с этой ошибкой при создании многоступенчатой ​​формы.

Когда отправляется форма шага 1, $ request-> request содержит массив acme_mybundle_myform. Это привело к ошибке проверки и остановило правильное заполнение полей назад, вперед и формы. Не говоря уже о том, что эта форма не должна содержать лишних полей.

Я обнаружил это благодаря коду от nni6.

Решение в моем случае было внутри контроллера:

if ($form->isValid())
{
    if($form->has('nextStep') && $form->get('nextStep')->isClicked())
    {
        $session->getFlashBag()->set('notice', 'Next clicked');

        $registerType->incrementStep();

        $request->request->remove('acme_mybundle_myform');

        return $this->forward("AcmeMyBundle:Default:register", array($request));

    }
....
}
person Korutech App Solutions    schedule 16.05.2014

У меня была такая же ошибка.

Это произошло потому, что у меня была форма, которая по ошибке имела имя NULL.

В HTML атрибут name будет выглядеть так:

<form name href="..." action"..."></form>

Так просто.

Может быть, не для всех, но стоит проверить.

person Tortus    schedule 26.08.2014