Saya memiliki masalah yang sama belakangan ini dan keluar dengan plugin .toJSON jQuery ini yang mengubah formulir menjadi objek JSON dengan struktur yang sama. Ini juga berguna secara khusus untuk formulir yang dihasilkan secara dinamis di mana Anda ingin membiarkan pengguna Anda menambahkan lebih banyak bidang di tempat-tempat tertentu.
Intinya adalah Anda mungkin benar-benar ingin membangun formulir sehingga memiliki struktur itu sendiri, jadi katakanlah Anda ingin membuat formulir di mana pengguna memasukkan tempat favoritnya di kota: Anda dapat membayangkan formulir ini untuk mewakili <places>...</places>
elemen XML yang mengandung daftar tempat yang disukai pengguna sehingga daftar <place>...</place>
elemen yang masing-masing berisi misalnya <name>...</name>
elemen, <type>...</type>
elemen dan kemudian daftar <activity>...</activity>
elemen untuk mewakili aktivitas yang dapat Anda lakukan di tempat seperti itu. Jadi struktur XML Anda akan seperti ini:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
Betapa kerennya memiliki objek JSON dari ini yang akan mewakili struktur yang tepat ini sehingga Anda dapat:
- Simpan objek ini seperti di basis data apa pun yang mirip CouchDB
- Baca dari sisi server $ _POST [] Anda dan coba kembali larik bersarang dengan benar yang kemudian dapat Anda manipulasi secara semantik
- Gunakan beberapa skrip sisi server untuk mengonversinya menjadi file XML yang terbentuk dengan baik (bahkan jika Anda tidak tahu struktur persisnya a-priori)
- Hanya entah bagaimana menggunakannya seperti di skrip server Node.js- seperti apa pun
OK, jadi sekarang kita perlu berpikir bagaimana suatu formulir dapat mewakili file XML.
Tentu saja <form>
tag adalah root
, tetapi kemudian kita memiliki <place>
elemen yang merupakan wadah dan bukan elemen data itu sendiri, jadi kita tidak dapat menggunakan tag input untuk itu.
Di sinilah <fieldset>
tag berguna! Kami akan menggunakan <fieldset>
tag untuk mewakili semua elemen wadah dalam formulir / representasi XML kami, sehingga mencapai hasil seperti ini:
<form name="places">
<fieldset name="place">
<input type="text" name="name"/>
<select name="type">
<option value="dwelling">Dwelling</option>
<option value="restoration">Restoration</option>
<option value="sport">Sport</option>
<option value="administrative">Administrative</option>
</select>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
</fieldset>
</form>
Seperti yang Anda lihat dalam formulir ini, kami melanggar aturan nama unik, tetapi ini OK karena mereka akan dikonversi menjadi array elemen sehingga mereka akan dirujuk hanya dengan indeks mereka di dalam array.
Pada titik ini Anda dapat melihat bagaimana tidak ada name="array[]"
nama seperti di dalam formulir dan semuanya cantik, sederhana dan semantik.
Sekarang kami ingin formulir ini dikonversi menjadi objek JSON yang akan terlihat seperti ini:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Untuk melakukan ini, saya telah mengembangkan plugin jQuery ini di sini di mana seseorang membantu mengoptimalkan dalam utas Tinjauan Kode ini dan terlihat seperti ini:
$.fn.toJSO = function () {
var obj = {},
$kids = $(this).children('[name]');
if (!$kids.length) {
return $(this).val();
}
$kids.each(function () {
var $el = $(this),
name = $el.attr('name');
if ($el.siblings("[name=" + name + "]").length) {
if (!/radio|checkbox/i.test($el.attr('type')) || $el.prop('checked')) {
obj[name] = obj[name] || [];
obj[name].push($el.toJSO());
}
} else {
obj[name] = $el.toJSO();
}
});
return obj;
};
Saya juga membuat posting blog yang satu ini untuk menjelaskan hal ini lebih lanjut.
Ini mengonversi semuanya dalam bentuk menjadi JSON (bahkan radio dan kotak centang) dan yang harus Anda lakukan hanyalah menelepon
$.post('script.php',('form').toJSO(), ...);
Saya tahu ada banyak cara untuk mengubah bentuk menjadi objek JSON dan tentu saja .serialize()
dan .serializeArray()
berfungsi dengan baik dalam banyak kasus dan sebagian besar dimaksudkan untuk digunakan, tapi saya pikir seluruh gagasan ini menulis formulir sebagai struktur XML dengan nama yang bermakna dan mengubahnya menjadi objek JSON yang terbentuk dengan baik patut dicoba, juga fakta bahwa Anda dapat menambahkan tag input dengan nama yang sama tanpa khawatir sangat berguna jika Anda perlu retrive data formulir yang dihasilkan secara dinamis.
Saya harap ini membantu seseorang!