Задав вопрос о настройке динамических полей (см. Функция Javascript для добавления / удаления полей ), я пришел к выводу, что я считаю хорошим решением в JavaScript иметь форму, которая позволит пользователям добавить и удалить группу полей. Вот функция JavaScript:
var fieldcount = 2;
var count = 2;
window.createinput = function (field1, field2, field3, area, limit) {
if (count > limit) return;
field_area = document.getElementById(area);
var qty = document.createTextNode("Quantity");
var msr = document.createTextNode(" Measure");
var ing = document.createTextNode(" Ingredient Name");
var li = document.createElement("li");
var input = document.createElement("input");
input.id = field1 + fieldcount;
input.name = field1 + fieldcount;
input.size = "10";
input.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc.
li.appendChild(qty);
li.appendChild(input);
var input2 = document.createElement("input");
input2.id = field2 + fieldcount;
input2.name = field2 + fieldcount;
input2.size = "20";
input2.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc.
li.appendChild(msr);
li.appendChild(input2);
var input3 = document.createElement("input");
input3.id = field3 + fieldcount;
input3.name = field3 + fieldcount;
input3.size = "30";
input3.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc.
li.appendChild(ing);
li.appendChild(input3);
field_area.appendChild(li);
//create the removal link
var removalLink = document.createElement('a');
removalLink.className = "remove";
removalLink.onclick = function () {
this.parentNode.parentNode.removeChild(this.parentNode);
count = count - 1;
}
var removalText = document.createTextNode('Remove Field Group');
removalLink.appendChild(removalText);
li.appendChild(removalLink);
fieldcount++ //loop in php to handle renaming variables for database entry based on total number of field groups
count++
}
Код HTML, который ссылается на эту функцию, будет следующим:
<ul id="ingredients">
<li>Quantity<input type="text" name="ingredient_quantity_1" id="ingredient_quantity_1" size="10" /> Measure<input type="text" name="ingredient_measure_1" id="ingredient_measure_1" size="20" /> Ingredient Name<input type="text" name="ingredient_name_1" id="ingredient_name_1" size="30" /></li>
</ul>
<input type="button" value="Add Ingredient" onclick="createinput('ingredient_quantity_','ingredient_measure_','ingredient_name_','ingredients', 5)" />
Вы также можете просмотреть на http://jsfiddle.net/wtX7Y/82/
Проблема в том, что когда я хочу получить эти значения формы в PHP, имена полей могут достигать только предела, определенного в вызове функции, но значения могут иметь пробелы в последовательности (например, имя_ ингредиента_1, имя_ ингредиента_3, имя_ ингредиента_4) из-за возможности удалять поля в форме с помощью функции RemovalLink.onclick.
Мне либо нужно написать какой-то механизм в PHP, который может извлекать / переопределять эти значения имен полей в некотором типе последовательности для отправки в базу данных, либо переписать функцию JavaScript, чтобы полностью устранить эту потребность, и POST - обычная последовательность для обработки PHP с простым итеративным циклом для извлечения значений. Я нигде не сталкивался с этим конкретным вопросом при поиске, но я видел, что люди предлагают массивы для обработки именования переменных переменных, и мне интересно, является ли это правильным подходом.
С моим существующим кодом - я пытался решить мою проблему с помощью цикла for PHP следующим образом, но я не могу понять, как сделать два отдельных подсчета внутри цикла (один для определения новой переменной) name и один для получения значения имени поля, которое необходимо переопределить):
$field_count = 1;
for($i = 1; $i <= 25; $i++)
{
if(isset($_REQUEST['ingredient_quantity_' . $field_count]))
{
${'ingredient_quantity_' . $i} = $_REQUEST['ingredient_quantity_' . $field_count];
${'ingredient_measure_' . $i} = $_REQUEST['ingredient_measure_' . $field_count];
${'ingredient_name_' . $i} = $_REQUEST['ingredient_name_' . $field_count];
echo $i . ". Field Count:" . $field_count . " - " . ${'ingredient_quantity_' . $i} . " " . ${'ingredient_measure_' . $i} . " " . ${'ingredient_name_' . $i} . "<br />";
}
$field_count++;
}
Суть в том, что мне просто нужен способ подсчитать количество полей набора с определенным префиксом имени поля (например, 'component_quantity_') и их конкретное число, чтобы я мог выполнить запрос базы данных для вставки данных. Создать массив из поля ввода? Что-то еще?