簡體   English   中英

Symfony2 表單提交后始終為空

[英]Symfony2 Form is always empty after submitting

我是 Symfony2 (2.4.4) 的新手。

我想創建一個 HTML 布局,它總是在頂部(搜索欄)顯示一個表單。 我通過 post 發送表單並希望重定向到另一個控制器,該控制器應該傳遞用戶輸入並生成輸出。 我創建了一個這樣的新函數:

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)並且數據始終為空。 用戶輸入在哪里?

  1. 我猜是因為你沒有在路由配置中指定這個函數的方法是 POST。
  2. 因為表單從未提交給您的函數(您的函數想要 GET,但發送 POST)
  3. 最后一個問題在哪里?

有一個很棒的代碼可以讓你的搜索功能,它應該可以工作(對不起,如果你不使用注釋)。 一個好處,您現在可以在項目中的任何地方使用您的 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';
    }
}

首先,您的表單默認設置為 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()
));

另外,我認為您不應該擔心 form 方法,因為您沒有其他方法的不同實現。 這是在 Symfony 中處理表單的常用方式。 在繼續之前,您應該詳細閱讀表格,這篇文章內容豐富。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM