Множественные значения параметров

Материал из 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 стандартных элементов интерфейса:

Если поле формы 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.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Разработчику
Администратору
Инструменты