Множественные значения параметров
Материал из Eludia.
Вообще говоря, любой параметр в HTTP-запросе может присутствовать произвольное число раз, с разными значениями. Обычно это трактуется как передача множественного значения для отдельного параметра. То есть, например, строка GET-запроса '/?id=1&id=2&id=3' используется для передачи списка (1, 2, 3) в качестве значения параметра q. Различные серверные API предоставляют возможность доступа к векторным значениям в ситуациях типа описанной.
Однако в Eludia.pm дублирование имён параметров в HTTP-запросе не применяется никогда. Вместо этого множественные значения передаются при помощи групп параметров с общим префиксом. Например, вместо вышеприведённой строки запроса используется '/?id_1=1&id_2=1&id_3=1'.
Непосредственно приложением такого рода запросы формируются крайне редко. В подавляющем большинстве случаев множество id передаётся при использовании 3 стандартных элементов интерфейса:
- поля формы типа checkboxes;
- поля формы типа tree;
- клетки таблицы типа checkbox.
Если поле формы c именем $name и набором значений $values имеет один из указанных типов, то для каждого значения из @$values генерируется 1 HTML-элемент типа checkbox с именем "_${name}_$_->{id}". Например, для имени 'id_user' и набора значений [1, 2] будут сгенерированы checkbox'ы c именами '_id_user_1' и '_id_user_2'.
Что касается таблиц, то checkbox, расположенный каждой отдельной клетке считается отдельным полем ввода, и генерировать имя для каждого из них приходится разработчику приложения. Впрочем, это несложно:
{
type => 'checkbox',
name => "_id_user_$i->{id}",
off => ... # условие сокрытия checkbox'а
hidden => ... # условие сокрытия клетки таблицы (обычно вместе со всем столбцом)
},
В обоих описанных случаях в хэше %_REQUEST становятся доступными 2 компоненты:
- $_REQUEST {$name}: ссылка на список выбранных значений (который может быть пустым);
- $_REQUEST {"$name,-1"}: тот же список, дополненный элементом -1 и склееный в строку через разделитель ','. Такое значение всегда пригодно для подстановки в SQL-выражение IN (...).
Продолжая вышеописанный пример, скажем, что при отмеченных checkbox'ах, соответствующих id=1 и id=2, получим $_REQUEST {id_user} = [1, 2] и $_REQUEST {'id_user,-1'} = '1,2,-1'. Таким образом, многозначные параметры (в смысле $_REQUEST) можно использовать несмотря на то, что наименования всех параметров HTTP-запроса различаются.
Всюду выше предполагалось, что передаваемые значения являются целыми числами. Наборы значений для полей форм могут содержать и символы, не являющиеся цифрами. Однако если такие значения передавать через клетки таблиц, механизм не сработает (поскольку имя checkbox'а содержит и имя параметра и значение, которые автоматически не разделяются). В таком (довольно экзотическом) случае придётся вручную перебрать все переданные параметры:
foreach (keys %_REQUEST) {
/^my_prefix_/ or next;
my $value = $';
### обработка $value...
}
На протяжении довольно долгого времени синтетические векторные компоненты %_REQUEST не поддерживались. Вместо них использовалась функция get_ids, либо непосредственная обработка keys %_REQUEST.
