2013-10-06 4 views
7

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

Однако, он выводит ненужную неупорядоченный список с элементом списка, содержащего следующий текст: 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> 
+1

Возможный дубликат [Symfony2: избавиться от "Эта форма не должна содержать дополнительных полей"] (http://stackoverflow.com/questions/8475999/symfony2-get-rid-of-this-form-should-not -contain-extra-fields) – falinsky

ответ

9

Мне кажется, что у вас есть проблема, потому что лексемы Если это так, попробуйте добавить опции для 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); 
+0

Спасибо за ответ, я попробую. Почему поле маркера генерируется в первую очередь и почему это проблема? – AnchovyLegend

+0

Я не знаю, какое поле дополнительно в вашем случае, вы можете найти это очень просто. Дополнительные поля означают, что в запросе есть несколько полей, которые отсутствуют в построителе форм. И поэтому привязка формы делает эту ошибку. Может быть по умолчанию маркерное поле не добавляется в построитель форм, поэтому вы можете указать это явно, добавив опции для формирования построителя, как я написал вам ответ. – nni6

+0

Поле токенов генерируется как защита CSRF (см. Http://symfony.com/doc/current/book/forms.html#csrf-protection). Он встроен в Sf2 и почти наверняка не является причиной ошибки. Скорее всего, вы скопировали какое-то скрытое поле в свой шаблон формы, и это поле не является частью объекта, к которому вы привязываетесь. – Acyra

4

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

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

+1

Мой случай точно. После смены строителя я продолжал подавать AJAX без обновления всего экрана. Tnx, +1. – userfuser

0

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

При отправке формы с шагом 1 запрос $ 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)); 

    } 
.... 
} 
0

Я имел ту же ошибку.

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

В HTML, имя атрибута будет выглядеть следующим образом:

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

Как просто.

Возможно, не все, но стоит проверить.

1

Я получил то же сообщение, имея несколько форм на одной странице. Оказывается, symfony по умолчанию использует имя 'form' для всех из них.Вместо того чтобы использовать 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 для примера.