2013-03-20 121 views
1

我有一個相當複雜的形式與Symfony2生成和呈現Twig,JQuery。該表單用於修改電子商務訂單,因此沒有最終提交的概念。當通過Ajax提交表單時,將舊錶單與新表單同步的下一步是什麼?我想過使用它返回整個表單,以完全覆蓋舊的表單或返回JSON數據,然後可以用它來檢測和更新更改。更新阿賈克斯提交表格

我的直覺是說,返回JSON數據來檢測和更新新的變化是最好的方式..但是,一個很大的形式,有很多事情要檢查。標籤,錯誤,幫助,值。從本質上講,我可以看到form update logic變得越來越大,並且非常快地創建維護問題。

我希望瞭解通過AJAX更新大型表單的最佳做法是什麼。也許我錯過了一種標準化的技術。

回答

1

要更新大型表單,我會返回一個非常特定的JSON對象,該對象允許您執行for-each循環來自動執行檢查。我會在下面舉一個例子。

data: 
    firstField: 
     name: "name" 
     error: "none" 
     help: "This is a help string" 
     value: "$49.99" 
     quantity: "2" 
     subForm1: 
      value1: "something" 
      value2: "somethingElse" 
    //etc... 

返回這個對象後,您可以像下面的僞代碼確實

for field in data 
    find element with name field.name 
     if element.error is not field.error, element.error = field.error 
     if element.quantity is not field.quantity, element.quantity = field.quantity 
     //ifs for each intended field of the form 
     element.find newElement with name subform1 
      if newElement.value1 is not field.subform1.value1 update it 
     //etc... 

這將允許您創建一個相當簡單的方法來檢測的變化形式,並且只更新領域做一些事情需要更新。

+0

我喜歡你的建議。你認爲這對於多層子表單/集合類型是可行的嗎?因爲在那個時候,數組的JSON數據會非常抽象。 – JustinP 2013-03-20 17:52:25

+0

我已經更新了我的答案,希望它對您有用。如果您計劃使用子表單,則需要更多地聲明JSON對象結構,因爲您需要知道何時輸入另一個for循環,除非您使用jQuery類型檢查來查看對象是字符串還是實際對象...如果你想要更多的細節,我可以稍後添加一些。 – TJC 2013-03-20 18:01:48

0

不知道這是否是最好的方法,但對於像我這樣的新手來說,使用Spring MVC,我基本上只是返回一個「視圖」,它具有保存AJAX提交後的HTML內容。

我沒有代碼方便顯示,但從概念上看,這是它的樣子。我猜JSON會是一個較小的有效載荷回到瀏覽器,但是發回HTML對於像我這樣的假人來說更容易。

<form action="/form/save" method="post"> 
    First name: <input type="text" name="firstname"><br> 
    Last name: <input type="text" name="lastname"> 
</form> 

<form action="/form/save" method="post"> 
<!-- Start: This is the HTML that the "view" returns after the form is submitted via AJAX --> 
    First name: <input type="text" name="firstname" value="Mark"><br> 
    Last name: <input type="text" name="lastname" value="McGuire"> 
<!-- End: --> 
</form> 
0

如果我理解正確的,在沒有最終的概念「的新形式同步舊錶」提交基本控制器持續。我對每個返回的json塊都有一個控制器操作,但是我使用了最終提交的概念。但是,您可以通過將持續呼叫放入這些控制器來使用此技術。

喜歡的東西 JS:使用

$('#field').on(function(){ 
      $.ajax({ 
       url: // url to your controller 
        // captures relevant information via 
        // javascript and passes it via querystring 
        // or possibly post 
       ,dataType: 'jsonp' 
       ,success: function(entities, status, ob) { 
        // javascript response 
        // for display purposes 
       }}); 
}); 

標準symfony的控制器,並處理請求字符串或交參數來更新數據庫。

+0

我認爲我看到的問題是Symfony控制器返回'$ form-> createView()'並且Twig呈現它有用。那麼,如何從' - > createView()'的某個版本返回到更新的表單顯示? – JustinP 2013-03-20 18:01:06

+0

我通常從我的控制器返回樹枝的渲染,其中form-> createView作爲變量傳遞;如果你有一個不同的schtick,那麼我不確定我的方法會起作用。不過,我偶爾會使用一個救援函數,它返回$ this-> redirect($ this-> generateUrl,array(/ * parameters * /));這是帶參數的重定向,我將用它來更新表單。 – Lighthart 2013-03-20 18:15:12