2017-11-13 17 views
1

私はクライアント用のカスタムページビルダーを持っています。ドラッグアンドドロップバックエンドを使用して独自のWebフォームを構築できます。現時点でダイナミックフォームからネストされたJSONを作成

、私は次のようなJSON形式で出力したデータを取得することができます。

{ 
    "email":"[email protected]", 
    "geoip_country":"XXYY", 
    "geoip_state":"XXYY", 
    "geoip_city":"XXYY", 
} 

をしかし、私は私が別のしたい、次の形式で出力を変更する必要がありますフォームからの電子メールのフィールドから、とdynamic_attributesセクション内にネストされた他のすべてのデータをドロップし、次のように:

{ 
    "email":"[email protected]", 
    "dynamic_attributes":{ 
     "geoip_country":"XXYY", 
     "geoip_state":"XXYY", 
     "geoip_city":"XXYY", 
     // all other form fields here. 

    }, 
} 

誰もが正しい方向に私を指すもらえますか?私は非常JSONを出力して経験していないよ - 私はまた、JSONには、次のjQueryの関数から作成されていることを追加する必要があります:

(function ($) { 
    $.fn.serializeFormJSON = function() { 

     var o = {}; 
     var a = this.serializeArray(); 
     $.each(a, function() { 
      if (o[this.name]) { 
       if (!o[this.name].push) { 
        o[this.name] = [o[this.name]]; 
       } 
       o[this.name].push(this.value || ''); 
      } else { 
       o[this.name] = this.value || ''; 
      } 
     }); 
     return o; 
    }; 
})(jQuery); 

参照フィドル:https://jsfiddle.net/fish_r/m46zLdo9/3/

感謝を!

+0

は、一定のプロパティ名をdynamic_attributes' 'ですか?そのプロパティ名はどこから来たのでしょうか?プライマリまたは子供としてフィールドをどのように区切っていますか?いくつかのサンプルHTMLを表示 – charlietfl

+0

動的属性と電子メールの両方が定数プロパティ名であり、動的属性内にネストされたデータは動的に生成されるものです。フィドルリンクを追加するように編集しました –

+0

シンプルなフォームで、常に1つのプライマリフィールドが 'email'であり、他のすべてがネストされていますか?私はそれよりも複雑なレベルが高いと思う? – charlietfl

答えて

1

はこれを試してみてください:

$('#myform').submit(function(e) { 
 
    e.preventDefault(); 
 
    var data = $(this).serializeFormJSON(); 
 
    console.log(data); 
 
}); 
 

 
(function ($) { 
 
    $.fn.serializeFormJSON = function() { 
 
\t \t 
 
     var o = {}; 
 
     var dynamic_attributes = {}; 
 
     var a = this.serializeArray(); 
 
     $.each(a, function() { 
 
      if (this.name =='email') { 
 
       if (o[this.name]) { 
 
        if (!o[this.name].push) { 
 
         o[this.name] = [o[this.name]]; 
 
        } 
 
        o[this.name].push(this.value || ''); 
 
       } else { 
 
        o[this.name] = this.value || ''; 
 
       } 
 
      } else { 
 
       if (dynamic_attributes[this.name]) { 
 
        if (!dynamic_attributes[this.name].push) { 
 
         dynamic_attributes[this.name] = [dynamic_attributes[this.name]]; 
 
        } 
 
        dynamic_attributes[this.name].push(this.value || ''); 
 
       } else { 
 
        dynamic_attributes[this.name] = this.value || ''; 
 
       } 
 
      } 
 
     }); 
 
     o['dynamic_attributes'] = dynamic_attributes; 
 
     
 
     return o; 
 
    }; 
 
})(jQuery);
.hidden {opacity:.3}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form action="" method="POST" id="myform"> 
 
    <input type="text" name="name" placeholder="name"><br/> 
 
    <input type="email" name="email" placeholder="Enter your email"><br/> 
 
    <input type="text" name="address1" placeholder="Enter the first line of your address"><br/> 
 
    <input type="submit"> 
 
</form> 
 
<div id="output"></div>

+0

すばらしい、ありがとう、私は私たちが前進し、extra_parametersという名前の別のプロパティを作成しました。 - もう一つの質問ですが、名前/クラスまたはIDによる特定の入力を除外することができる方法を知っていますか? –

+0

これを無視して、jqueryでフォームをクローニングし、隠された入力を削除してからserializeFormJSON()関数を実行することで、この問題を解決しました。 Sunwooにもう一度感謝します。 –

+0

コメントを後で確認することをお詫び申し上げます。それを聞いてうれしい。 – sunwoo

関連する問題