2015-02-23 95 views
1

我想通過AJAX(AngularJS)發送一個Symfony表單。爲什麼Symfony表單在通過AJAX正確發送數據後「未提交」?

然而,即使數據被清楚地發送,表格由Symfony的說是「未提交」(實際上是沒有錯誤的,但一些調試表明isSubmitted回報false

這裏是FOSUserBundle測試登記表

編輯:雖然圖片看起來很小,但它們已被充分解析,因此如果在其全尺寸下顯示它們是完全可讀的。

這裏是日誌當我使用標準提交從HTTP形式

Symfony logs - HTTP form submission

這裏是日誌時我使用AJAX提交

Symfony logs - AJAX submission

  • 我已禁用CSRF令牌
  • 我從AJAX中使用的方法是「post」,因此它應該沒問題,因爲它是Symfony預期的默認值(並且FOSUserBundle不會覆蓋默認的AFAIK)。
  • 其他形式(FOSUserBundle範圍之外)被正確使用AJAX

發送你對此事的任何想法?任何指針?或者我可以檢查的其他日誌?

編輯:

我用的是default FOSUserBundle registration controller

我差不多使用default FOSUserBundle registration form,但我添加了一個(當前)空的子表單,以便在開發中進一步使用它。

namespace NONG\SecurityBundle\Form; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class UserRegistrationType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) {} 

    public function getParent() { 
     return 'fos_user_registration'; 
    } 

    public function getName() { 
     return 'nong_user_registration'; 
    } 
} 

頁眉和與HTML形式發送數據(注:加了點星之前在接受使着色保持正確的):

POST /server/web/testfosuser/register/ HTTP/1.1 
Host: mywebsite.com 
Connection: keep-alive 
Content-Length: 229 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/.*;q=0.8 
Origin: http://mywebsite.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36   (KHTML, like Gecko) Chrome/40.0.2214.111    Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Referer: http://mywebsite.com/server/web/testfosuser/register/ 
Accept-Encoding: gzip, deflate 
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxx 


fos_user_registration_form%5Bemail%5D=bidon%40bidon.com& 
fos_user_registration_form%5Busername%5D=bidon& 
fos_user_registration_form%5BplainPassword%5D%5Bfirst%5D=bidon& 
fos_user_registration_form%5BplainPassword%5D%5Bsecond%5D=bidon 

頁眉與AJAX請求發送:(NB。加入星前點在接受使着色保持正確的):

POST /server/web/testfosuser/register HTTP/1.1 
Host: mywebsite.com 
Connection: keep-alive 
Content-Length: 229 
Accept: application/json, text/plain, */.* 
Origin: http://mywebsite.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36 
Content-Type: application/json;charset=UTF-8 application/x-www-form-urlencoded; charset=UTF-8 
Referer: http://mywebsite.com/client/ 
Accept-Encoding: gzip, deflate 
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxx 

fos_user_registration_form%5Bemail%5D=bidonqdsfqsdf%40qsdf& 
fos_user_registration_form%5Busername%5D=charles222& 
fos_user_registration_form%5BplainPassword%5D%5Bfirst%5D=bidon& 
fos_user_registration_form%5BplainPassword%5D%5Bsecond%5D=bidon 
+0

您是否可以顯示您的表單代碼,控制器代碼以及由chrome網絡標籤捕獲的兩種情況下的請求標題和正文? – Flip 2015-02-23 22:33:59

+0

我編輯了這個問題。 – Silverspur 2015-02-24 13:36:10

回答

1

我終於設法找到了修正:

正確的URL是...../register/與最終/當我做了AJAX請求,我忘了。

但是,我不確定這裏涉及到哪些機制。我可以去調試的最深處(使用錯誤的URL時)是HttpFoundationRequestHandler,其中$request->getMethod()調用返回GET(而不是POST),因此不提交表單。

+0

從快速的樣子我相信是防止觸發「提交機制」,當你正在處理或只是在同一頁面顯示錶單。 – EnchanterIO 2016-09-26 10:31:45

1

我有類似的問題,我改變了控制器內的以下內容:

$user = new User(); 
$form = $this->createForm(
    new UserRegistrationType(), 
    $user, 
    array(
     'attr' => array('novalidate' => 'novalidate'), 
     'action' => $this->generateUrl('user_registration') 
    ) 
); 

解決html5錯誤冒泡並設置動作URL直接爲我工作。如果這不起作用,請顯示您的JS代碼。

+0

謝謝。可以肯定的是,我必須用你的代碼替換當前的$ form = $ formFactory-> createForm();'你能解釋一下爲什麼這個工作原理(還沒有經過測試)? – Silverspur 2015-02-24 13:38:11

+0

我不知道你是否可以做到這一點,我不知道你的控制器是怎麼樣的。但是,如果你想使用你的代碼,只需設置行動路徑。默認情況下,它只是'action =「」',在我的情況下,這是通過ajax提交的問題。 – ahinze 2015-02-25 11:40:59