提交后,Symfony2表单始终为空

时间:2014-05-19 08:34:42

标签: php html forms symfony

Hi @ all im new with Symfony2(2.4.4)。

我想创建一个HTML布局,它总是在顶部显示一个表单(搜索栏)。我通过post发送表单,并希望重定向到另一个控制器,该控制器应该通过用户输入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-&gt; isMethod总是GET。为什么?表单操作是post?

  2. 在Symfony Webtool中,表单部分也是空的。我看到所有表单字段(sstring),数据总是为null。用户输入的位置在哪里?

  3. 请帮助我 感谢

2 个答案:

答案 0 :(得分:1)

  1. 我猜是因为你没有在你的路由配置中指明这个函数的方法是POST。
  2. 因为表单从未提交给您的函数(您的函数需要GET,但是发送POST)
  3. 最后一个问题在哪里?
  4. 有一个很棒的代码可以使你的搜索功能,它应该工作(抱歉,如果你不使用注释)。 一个好的观点,你现在可以在项目的任何地方使用你的searchType,你应该将你的表单改为你的控制器而不是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';
        }
    }
    

答案 1 :(得分:0)

首先,您的表单默认设置为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中处理表单的常用方法。在继续之前,您应该详细阅读forms,这篇文章内容丰富。