Форма Symfony2 всегда пуста после отправки

Привет @ все им новые с Symfony2 (2.4.4).

Я хочу создать HTML-макет, который всегда показывает форму сверху (панель поиска). Я отправляю форму через сообщение и хотел бы перенаправить на другой контроллер, который должен передать пользователю ввод genarate. Я создал новую функцию:

public function searchFormAction(Request $request) { //$defaultData = array('sstring' => 'Suche'); $form = $this->createFormBuilder() ->add('fnr', 'hidden') ->add('sstring', 'search', array('label' => false)) ->add('submit', 'submit', array('label' => 'suchen')) ->getForm(); $form->handleRequest($request); if($request->isMethod('POST')) { return $this->redirect('SchmanEmployeeBundle:Employee:search', array( 'sstring' => $form->get('sstring')->getData(); )); } return $this->render('SchmanEmployeeBundle:Employee:searchForm.html.twig', array( 'form' => $form->createView() )); } 

Я расширил базовый макет (base.html.twig) и включил форму с функцией рендеринга

 {% render(controller('SchmanEmployeeBundle:Employee:searchForm')) %} 

Это прекрасно работает, и форма всегда присутствует в моем макете. Данный HTML выглядит так:

 <form name="form" method="post" action="/app_dev.php/"> <div><input type="search" id="form_sstring" name="form[sstring]" required="required"></div> <div><button type="submit" id="form_submit" name="form[submit]">suchen</button></div> 

Теперь у меня есть 3 вопроса. 🙂

  1. Если я отправлю форму, я не буду перенаправлен на контроллер SearchAction. Это связано с тем, что $ request-> isMethod – это всегда GET. Зачем? Действия формы – это сообщение?

  2. В Symfony Webtool раздел формы также пуст. Я вижу все поля формы (sstring), и данные всегда ноль. Где пользователь вводит данные?

Помогите мне помочь Спасибо

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

 $defaultData = array(); // No need for a class object, array is enough $form = $this->createFormBuilder($defaultData) ->add('fnr', 'hidden') ->add('sstring', 'search', array('label' => false)) ->add('submit', 'submit', array('label' => 'suchen')) ->getForm(); $form->handleRequest($request); if($form->isValid()) { // Happens if the form is submitted return $this->redirect('SchmanEmployeeBundle:Employee:search', array( 'sstring' => $form->get('sstring')->getData(); // TODO: This will probably produce an error, fix it )); } return $this->render('SchmanEmployeeBundle:Employee:searchForm.html.twig', array( 'form' => $form->createView() )); 

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

  1. Я думаю, это потому, что вы не указали в своей конфигурации маршрутизации, что метод этой функции – POST.
  2. Поскольку форма никогда не передавалась вашей функции (ваша функция хочет GET, но отправлять POST)
  3. Где последний вопрос?

Существует отличный код для выполнения вашей функции поиска, он должен работать (извините, если вы не используете аннотацию). Один хороший момент, теперь вы можете использовать свой тип поиска везде в своем проекте, вы должны сделать свою форму такой, а не formbuilder, в свой контроллер. Легче читать и использовать.

контроллер:

 /** * To search something * * @Route("/search", name="search") * @Template() */ public function searchAction() { $form = $this->createForm(new searchType()); $request = $this->get('request'); if ($request->getMethod() == 'POST') { $form->bind($request); if ($form->isValid()) { $informations = $form->get('search')->getData(); //make things here } } } 

И вот класс searchType:

 class searchType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('fnr', 'hidden') ->add('sstring', 'search', array('label' => false)) ->add('submit', 'submit', array('label' => 'suchen')); } /** * @return string */ public function getName() { return 'yournamespace_searchType'; } }