2014-03-18 129 views
1

找到解決方案:我沒有在表單的構建器中指定方法。添加setMethod(「POST」)修復了我的問題。Symfony2表單不會提交。表單名稱不在請求中

我最近開始使用Symfony2(並學習TDD,猜猜我不喜歡它很容易),並且從今天早上開始一直在使用我的表單。它曾經工作,但現在我似乎無法得到一個工作的迴應。

我設法找出了一點錯誤。 Symfony的獲取對HttpFoundationRequestHandler類的一個點,它檢查是否應處理請求或沒有(在第56行開始)和第59行是它打破

} elseif ($request->request->has($name) || $request->files->has($name)) { 

所以,如果我得到這個權利,因爲它無法在請求中找到表單的名稱,它簡單地忽略它,認爲該表單從未提交過。我沒有得到的是如何可能,因爲唯一可以導致頁面更改/刷新的是用戶按下表格的「提交」按鈕...

如果您有任何人有建議或簡單指出我的問題可能是什麼我會非常感謝!

因爲我對此感覺很瞎,所以我會在我的TrinomeClientVideoUploadForm類和我的Controller內顯示並處理表單請求的函數下面發佈。

這這裏,如果課堂上,我用它來構建形式:

<?php 
namespace Trinome\WebVideoViewBundle\Model\Forms; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class TrinomeClientVideoUploadForm extends AbstractType 
{ 
    private $name; 

    public function __construct($name = "trinome_client_video_upload") 
    { 
     $this->name = $name; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add("client", "text") 
       ->add("video", "file") 
       ->add("upload", "submit"); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 
} 

這是處理網頁在我的(唯一的)控制器的功能:

/** 
* @Route("/") 
* @Template() 
*/ 
public function indexAction(Request $request) 
{ 
    $uploadVideoForm = new UploadVideoFormDataSet(); 
    $form = $this->createForm(new TrinomeClientVideoUploadForm(), $uploadVideoForm); 

    $form->handleRequest($request); 

    if ($form->isValid()) 
    { 
     // It never gets here anyways, so I removed it for this post. 
    } 

    return array(
     "form" => $form->createView(), 
    ); 
} 

嫩枝文件,其中我呈現形式:

{% extends "@BaseViews/base.html.twig" %} 

{% block title %}Outil d'upload vidéo Trinome{% endblock %} 
{% block stylesheets %} 
    {% stylesheets '@TrinomeWebVideoViewBundle/Resources/public/css/*' filter='cssrewrite' %} 
     <link rel="stylesheet" href="{{ asset_url }}" /> 
    {% endstylesheets %} 
{% endblock %} 

{% block body %} 
    <div id="wrapper"> 
     <header> 
      {% block header %} 
       {% image '@logo_trinome' %} 
        <img src="{{ asset_url }}" alt="Logo Trinome" /> 
       {% endimage %} 
      {% endblock %} 
     </header> 
     <div id="content"> 
      {% block content %} 
       <h1>Connection</h1> 
       {{ form(form) }} 
      {% endblock %} 
     </div> 
    </div> 
{% endblock %} 
+0

顯示呈現表格的小枝 –

+0

用小枝文件編輯我的文章。 – gCardinal

回答

0

您不應該需要使用構造,特別是因爲您沒有將控制器中的$name變量作爲參數傳遞。然後您可以刪除私有財產。我不認爲這是你的問題,而只是沒有必要。

在您的控制器中,當您調用createForm方法時,您沒有爲窗體傳遞動作或方法。我猜你的樹枝正在呈現一個沒有動作屬性的窗體標籤。

關於你的表單類型,假設你正試圖將對象(或實體)UploadVideoFormDataSet領帶到您的表單,表單類型應該看起來更像是這樣的:

 
class TrinomeClientVideoUploadForm extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add("client", "text") 
      ->add("video", "file") 
      ->add("upload", "submit") 
     ; 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Namespace\YourBundle\Entity\UploadVideoFormDataSet' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'namespace_yourbundle_uploadvideoformdataset'; 
    } 
} 

希望這有助於你。

+0

它沒有,原來沒有setMethod()使它無法正常工作。一旦我添加它,我的表單就開始工作。謝謝! – gCardinal

0

試圖改變這一功能

public function getName() 
{ 
    return "oww_yiss_it_works"; 
} 

這是胡亂猜測(我相信,你期望它的工作構造不工作),我不是用symfony好,儘量回到你改變什麼,你會得到問題是

+0

我早些時候嘗試過,它不起作用,再加上我不喜歡用這種方式硬編碼。什麼工作(看來)是將setMethod()添加到我的$構建器。 雖然感謝您的幫助:) – gCardinal