Переопределение имен полей в PHP из функции JavaScript - PullRequest
0 голосов
/ 27 марта 2012

Задав вопрос о настройке динамических полей (см. Функция 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_') и их конкретное число, чтобы я мог выполнить запрос базы данных для вставки данных. Создать массив из поля ввода? Что-то еще?

1 Ответ

1 голос
/ 27 марта 2012

Вы можете добавить [] к имени входного элемента (не ID), который PHP преобразует в аккуратный массив независимо от того, сколько у вас входных элементов.

Но есть проблема с этим подходом.Вы должны следить за тем, какое имя ингредиента соответствует каким ингредиенту и количеству ингредиентов.Сброс всего в массиве может привести к тому, что вы смешаете название одного ингредиента с количеством другого ингредиента.Это не хорошо, не так ли?

Таким образом, ваша лучшая ставка будет выглядеть примерно так:

$ingredients = array();  // Initialize array
foreach ($_POST as $key => $value) {
    if (!strncmp($key, 'ingredient_name_', 16)) {  // If field name begins with "ingredient_name_"
        $ingredients[] = array(
            'name' => $_POST[$key],
            'quantity' => $_POST[('ingredient_quantity_'.substr($key, 16))],
            'measure' => $_POST[('ingredient_measure_'.substr($key, 16))],
        );
    }
}

Короче говоря, ответ состоит в том, чтобы построить свой собственный массив $ingredients, циклически перебираяпредставленные данные.Любые другие поля с фиксированными именами могут обрабатываться как обычно.Если вы хотите узнать, сколько там ингредиентов, просто наберите count($ingredients).Это будет работать, даже если есть сотни компонентов, в отличие от вашего текущего кода, который имеет искусственный предел 25.

Это решение предполагает, что всякий раз, когда у вас есть поле с именем ингридиентом_имя_ (число), у вас также будут поляименованные ингридиенты_количество_ (одинаковые номера) и ингредиенты_измерения_ (одинаковые номера), где хранятся соответствующие данные.Если это не так (например, если некоторые поля являются необязательными), просто выберите обязательное поле, найдите его в массиве $_POST и добавьте некоторые условия, относящиеся к пропущенным полям.

...