Основная форма проверки


Вопрос + Желаемому Результату

Приведенный ниже код работает в настоящее время, однако я не уверен, что использование массива для перебора многочисленных несуществующих полей формы будет достаточно эффективным, на мой вкус. Этот процесс можно улучшить, чтобы эффективно ликвидировать первые шаг в предлагаемое решение?

Ожидаемый результат: если ответ представляется на FormB, проверить сведения о форма для обеспечения операции были по крайней мере некоторые материалы на каждое поле.

Фон

Мы с помощью поддержки системы продажи билетов в нашей организации, которая до сих пор достаточно хорошо работает. Однако одна незначительная придирка в том, что посмотреть билет' страница отделяет "важные переменные билет" (назначен специалист, категорию билета и т. д.) - с "обратный билет" форма. Две формы, одна страница. Проверка для обеих форм происходит после отправки на следующей странице, опять-таки, каждый отдельно от других.

В теории, этот метод имеет смысл. Однако, поскольку речь идет о двух отдельных форм, что это часто означает, что люди способны критического обойти данные из "важных переменных билет", и просто добавить ответ. Здесь элемент человека-обучение существует, но, как всегда, программного изменения удовлетворит потребность в согласованности.

Сохранить для рерайта весь процесс, чтобы решить эту проблему, я посмотрел на то, чтобы положить в достаточно простом АО "наложения" на странице просмотр билет, так что, когда они представляют "обратный билет" - он делает быструю проверку, чтобы убедиться, что все важные авиабилет переменных есть некоторая форма входа. Это быстро исправить, но поставляется с некоторыми (для меня) интересные задачи.

Языки

Основное приложение написано на PHP, с использованием MySQL, дополняются с jQuery версии v1.3.2.

Постоянная

"Важно авиабилет переменных" всегда есть имя= из ticket_fields[customXX], где XX-это в основном идентификатор в базе данных, которая в настоящее время означает, что мы на верхнем пределе около 60 на данный момент, очевидно, это может увеличить в время как более ticket_fields создаются!

Не все ticket_fields используются на каждый билет, билеты использовать 5-10 полей, другие нет.

Пример данных форма (форматирование исключается)

<input type="radio" name="ticket_fields[custom5][selection]" id="custom50" value="3"  />&nbsp;<label for="custom50">No</label>&nbsp;
<input type="radio" name="ticket_fields[custom5][selection]" id="custom51" value="4"  />&nbsp;<label for="custom51">Yes</label>&nbsp;

<input type="checkbox" name="ticket_fields[custom6][selections][]" id="custom60" value="1"  />&nbsp;<label for="custom60">A</label>
<input type="checkbox" name="ticket_fields[custom6][selections][]" id="custom64" value="5"  />&nbsp;<label for="custom64">B</label>&nbsp;

<select name="ticket_fields[custom27][parent]" id="ticket_fields_custom27_parent"  >
<option value="0">Please Select</option>
<option value="129562786078">Sample Option - Add new option, then delete this</option>
<option value="129562792948">Top level</option>
</select>

Предлагаемое Решение

Это JS выполняет onSubmit в FormB:

  // ####################################################################
  // The following bits validate the 'Additional Ticket Fields' on submit
  // ####################################################################
    // Need an array of numbers for some horrible hacking. Used to iterate through the dynamically generated "ticket_fields" 100 should be safe, famous last words.
    var numArray = new Array();
    var b;
    for (b = 0; b < 100; b++) { numArray[b] = b; }

    // Text boxes

    // Radio Buttons
    // iterates through existing ticket_fields and finds existing radio buttons, then validates on that radio button
    $.each(numArray, function(i, v) {
        var radbut = $('input:radio[name^="ticket_fields[custom' + v + ']"]');
        // If found a checkbox, validate it
        if (radbut.length > 0) {
            var radbut2 = $('input:radio[name^="ticket_fields[custom' + v + ']"]:checked');
            console.log(radbut2.length);
            if (radbut2.length > 0) {  } else { validationFail = true; }
        } else {
        // do nowt
        }
    });

    // Check boxes
    // iterates through existing ticket_fields and finds existing checkboxes, then validates on that checkbox
    $.each(numArray, function(i, v) {
        var chkbox = $('input:checkbox[name^="ticket_fields[custom' + v + ']"]');
        // If found a checkbox, validate it
        if (chkbox.length > 0) {
            var chkbox2 = $('input:checkbox[name^="ticket_fields[custom' + v + ']"]:checked');
            if (chkbox2.length > 0) {  } else { validationFail = true; }
        } else {
        // do nowt
        }
    });

    // Select boxes ... includes multi-levels
    // Checks each select box in turn, fails if value set to 0. Does nothing if no selectors exist.
    $('select[name^="ticket_fields"] option:selected').each(function(){
        if (this.length) {
        } else { 
            if(this.value == 0) {
                validationFail = true;
            }
        }
    });

if (validationFail) {
    alert('Please ensure all Additional Ticket Fields are completed. \n REMEMBER: Click Update when done.');
    return false;
}


636
6
задан 7 февраля 2011 в 11:02 Источник Поделиться
Комментарии
2 ответа

Мне удалось обойти общий массив путем вытаскивания номера из имени атрибута на каждом поле формы со следующим:

// Pulls numbers from submitted "ticket_fields" which are stored in the name= attribute.
// Used to iterate through the dynamically generated "ticket_fields"
var numArray = new Array();
$(':input[name^="ticket_fields"]').each(function(){
fieldId = $(this).attr('name').replace(/\D/g, "");
if ($.inArray(fieldId,numArray) > -1) { } else { numArray.push(fieldId); }
});

Это делает его гораздо удобнее, так что вместо того, numArray, имея дурацкую уровне чисел для перебора, он получает именно правильные значения из формы самих полей каждый раз. Также позволяет бесконечно масштабировать.

4
ответ дан 8 февраля 2011 в 05:02 Источник Поделиться

Вы могли бы сделать простую карту, вместо кода у вас там в ответ:

var numArray = $(':input[name^="ticket_fields"]').map(function(){
fieldId = this.name.replace(/\D/g, "");
if ($.inArray(fieldId,numArray) === -1) return fieldId;
}).get();

Также используя этот.имя вместо $(этот).буква attr('имя'), который массово неэффективно.

0
ответ дан 11 февраля 2011 в 09:02 Источник Поделиться