У мене була така ж проблема останнім часом, і я вийшов з цим плагіном .toJSON jQuery, який перетворює форму в об'єкт JSON з тією ж структурою. Це також корисно для динамічно генерованих форм, де ви хочете дозволити вашому користувачу додавати більше полів у певних місцях.
Справа в тому, що ви, можливо, хочете створити форму так, щоб вона сама мала структуру, тому скажімо, ви хочете створити форму, куди користувач вставляє свої улюблені місця у місті: ви можете уявити, що ця форма представляє <places>...</places>
XML-елемент, що містить список місць, яким користувач подобається, таким чином, перелік <place>...</place>
елементів, кожен з яких містить, наприклад, <name>...</name>
елемент, <type>...</type>
елемент, а потім список<activity>...</activity>
елементів, які представляють дії, які ви можете виконувати в такому місці. Отже, ваша XML структура буде такою:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
Як здорово було б мати об'єкт JSON з цього, який би представляв цю точну структуру, тож ви зможете:
- Зберігайте цей об’єкт таким, який він є у будь-якій базі даних CouchDB
- Прочитайте його зі свого сервера $ _POST [] та відновіть правильно вкладений масив, який ви зможете семантично маніпулювати.
- Використовуйте якийсь сценарій на стороні сервера, щоб перетворити його у добре сформований XML-файл (навіть якщо ви не знаєте його точної структури a-priori)
- Просто якимось чином використовуйте його таким, яким він є у будь-якому сценарії сервера, подібного до Node.js
Гаразд, тепер нам потрібно подумати, як форма може представляти XML-файл.
Звичайно, <form>
тег - це root
, але тоді ми маємо це<place>
елемент, який є контейнером, а не самим елементом даних, тому ми не можемо використовувати для нього тег введення.
Ось де <fieldset>
тег стане у нагоді! Ми будемо використовувати <fieldset>
теги для представлення всіх елементів контейнера в нашій формі / представлення XML і таким чином, щоб отримати такий результат:
<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>
Як ви бачите в цій формі, ми порушуємо правило унікальних імен, але це нормально, оскільки вони будуть перетворені в масив елемента, таким чином вони будуть посилатися лише на їх індекс всередині масиву.
У цей момент ви бачите, як name="array[]"
всередині форми немає подібного імені, і все досить, просто і семантично.
Тепер ми хочемо, щоб ця форма була перетворена в об'єкт JSON, який буде виглядати приблизно так:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Для цього я розробив цей плагін jQuery тут, який хтось допоміг оптимізувати у цій темі перегляду коду і виглядає так:
$.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;
};
Я також зробив це одне повідомлення в блозі, щоб пояснити це більше.
Це перетворює все у формі в JSON (навіть радіо та прапорці), і вам залишиться лише зателефонувати
$.post('script.php',('form').toJSO(), ...);
Я знаю , що є багато способів перетворення форм в об'єктах JSON і впевнений , .serialize()
і .serializeArray()
роботу найбільшого в більшості випадків і в основному призначені для використання, але я думаю , що вся цю ідею написання форми як структури XML з осмисленими іменами і перетвореннями його в добре сформований об’єкт JSON варто спробувати, також те, що ви можете додавати одноіменні вхідні теги, не хвилюючись, дуже корисно, якщо вам потрібно відновити дані, що динамічно створюються форми.
Я сподіваюся, що це комусь допоможе!