Создание элементов формы с возможностью выбора нескольких значений

Задача
Форма должна содержать поле, которое предлагает пользователю ряд вариантов и разрешает выбор нескольких из них.

Решение
Используйте списковый элемент с возможностью выбора нескольких значений, такой как группа флажков (checkbox) или прокручиваемый список (scrolling list).

Обсуждение
Элементы формы с возможностью выбора нескольких значений позволяют выбирать любое количество предложенных вариантов, в том числе ни одного. В нашем примере, посвященном заказу фигурок коров, элемент с возможностью выбора нескольких значений представлен набором доступных аксессуаров. Столбец accessory таблицы cow_order относится к типу SET, поэтому его допустимые значения и значение по умолчанию могут быть получены следующим запросом:

mysql> SHOW COLUMNS FROM cow_order LIKE 'accessories'\G
*************************** 1. row ***************************
Field: accessories
Type: set('cow bell','horns','nose ring','tail ribbon')
Null: YES
Key:Default: cow bell,horns
Extra:

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


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

Флажки. Группа флажков похожа на группу переключателей тем, что она состоит из элементов , имеющих одинаковые атрибуты name. Однако атрибут type содержит checkbox, а не radio, кроме того необходимо пометить как checked все те элементы группы, которые вы хотите видеть выбранными по умолчанию. Если ни один элемент не помечен, ни один не будет изначально выбран. Следующий набор флажков показывает аксессуары для фигурок коров, при этом по умолчанию выбраны два первых элемента:

checked="checked" />cow bell
checked="checked" />horns
nose ring
tail ribbon

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


Отличия состоят в том, что вы включаете атрибут multiple в открывающий тег





В CGI.pm-сценариях на Perl вы можете создавать группы флажков и прокручиваемые списки, вызывая функции checkbox_group() и scrolling_list() соответственно. Эти функции принимают аргументы name, values, labels и default,как и их родственницы с возможностью выбора единственного значения.


Но так как изначально может быть выбрано несколько элементов, CGI.pm разрешает указывать аргумент default в виде скаляра или в виде ссылки на мас сив значений. (Имя аргумента defaults является синонимом default.)

Для получения списка разрешенных значений столбца SET можно сделать то же самое, что для столбцов ENUM в рецепте 18.2 – то есть вызвать функцию, возвращающие метаданные столбца:

my $acc_info = get_enumorset_info ($dbh, "cow_order", "accessories");

Однако значение по умолчанию для столбца SET имеет не совсем тот вид, который подходил бы для генерирования элемента формы. MySQL представляет значения SET по умолчанию в виде списка элементов, разделенных запятыми. Например, значение по умолчанию для столбца accessories – это cowbell,horns. Функции CGI.pm рассчитывают не на такой формат, поэтому необходимо разделить значение по умолчанию по запятым, чтобы получить массив. Следующее выражение показывает, как это сделать с учетом того, что значением по умолчанию может быть undef (NULL):

my @acc_def = (defined ($acc_info->{default})
? split (/,/, $acc_info->{default})
: () );

После разделения значения по умолчанию на части передайте полученный массив по ссылке той функции формирования списка, которую вы планируете использовать:

print checkbox_group (-name => "accessories",
-values => $acc_info->{values},
-default => \@acc_def,
-linebreak => 1); # выводить кнопки вертикально
print scrolling_list (-name => "accessories",
-values => $acc_info->{values},
-default => \@acc_def,
-size => 3, # показывать 3 значения одновременно
-multiple => 1); # создать список с множественным выбором

Если вы так используете значения SET для создания элементов списка, то значения будут отображаться в том порядке, в котором они перечислены в определении столбца. Если этот порядок вас не устраивает, отсортируйте значения соответствующим образом.

Для PHP и Python можно создать функции, формирующие элементы с множественным выбором. Формат их вызова будет таким:

make_checkbox_group (name, values, labels, default, vertical)
make_scrolling_list (name, values, labels, default, size, multiple)

Аргументы name, values и labels этих функций аналогичны аргументам функций PHP и Python для единичного выбора. Функция make_checkbox_group() принимает аргумент vertical, который (если установлен в значение «истина») указывает на необходимость вертикального, а негоризонтального расположения элементов. Функция make_scrolling_list() уже была описана в рецепте 18.2 при формировании списков единичного выбора. Укажите для аргумента multiple значение «истина», чтобы использовать функцию для вывода списка с множественным выбором. Для обеих функций аргумент default может быть массивом значений, если изначально необходимо выбрать несколько элементов.

Функция make_checkbox_group() выглядит так (рассматриваем версию на Python; для PHP все аналогично):

def make_checkbox_group (name, values, labels, default, vertical):
if type (values) not in (types.ListType, types.TupleType):
return ("make_checkbox_group: values argument must be a list")
if type (labels) not in (types.ListType, types.TupleType):
return ("make_checkbox_group: labels argument must be a list")
if len (values) != len (labels):
return ("make_checkbox_group: value and label list size mismatch")
if type (default) not in (types.ListType, types.TupleType):
default = [ default ] # преобразовать скаляр в список
str = ""
for i in range (len (values)):
value = values[i]
label = labels[i]
# проверить, являются ли значение и видимый текст строками
if type (value) is not types.StringType:
value = `value`
if type (label) is not types.StringType:
label = `label`
# выбрать элемент, если он совпадает с одним из значений по умолчанию
checked = ""
for d in default:
if type (d) is not types.StringType:
d = `d`
if value == d:
checked = " checked=\"checked\""
break
if type (name) is not types.StringType:
name = `name`
str = str + \
"%s" \
% (cgi.escape (name, 1),
cgi.escape (value, 1),
checked,
cgi.escape (label, 1))
if vertical:
str = str + "
" # вертикальный вывод элементов
str = str + "\n"
return (str)
Извлекаем информацию об аксессуарах для фигурок коров и представляем
их флажками:import re # требуется re.split()
acc_info = get_enumorset_info (conn, "cow_order", "accessories")
if acc_info["default"] == None:
acc_def = ""
else:
acc_def = re.split (",", acc_info["default"])
print make_checkbox_group ("accessories",
acc_info["values"],
acc_info["values"],
acc_def,
1) # вертикальный вывод элементов
Для формирования не флажков, а прокручиваемого списка, вызываем make_
scrolling_list():
print make_scrolling_list ("accessories",
acc_info["values"],
acc_info["values"],
acc_def,
3, # показать 3 значения одновременно
1) # создать список с множественным выбором
В PHP вы извлекаете информацию об аксессуарах, затем формируете флаж-
ки или прокручиваемый список так:
$acc_info = get_enumorset_info ($conn_id, "cow_order", "accessories");
$acc_def = explode (",", $acc_info["default"]);
print (make_checkbox_group ("accessories[]",
$acc_info["values"],
$acc_info["values"],
$acc_def,
TRUE)); # вертикальный вывод элементов
print (make_scrolling_list ("accessories[]",
$acc_info["values"],
$acc_info["values"],
$acc_def,
3, # показывать 3 значения одновременно
TRUE)); # создать список с множественным выбором

Обратите внимание на то, что в примерах на PHP название поля указывается как accessories[], а не accessories. Если вы хотите разрешить полю иметь несколько значений в PHP, необходимо добавить после его имени []. Если опустить [], то пользователь при заполнении формы сможет отметить несколько вариантов, но PHP вернет в сценарий только один из них.

Что касается страниц JSP, использованная ранее для получения списка значений столбца size (типа ENUM) функция getEnumOrSetValues() может применяться и для столбца accessory (типа SET). Определение столбца и значение по умолчанию содержатся во втором и пятом столбцах запроса SHOW COLUMNS, ко-торый возвращает информацию о столбце accessory. Выполните запрос, преобразуйте определение типа в список значений values и поместите значение по умолчанию в defList:

SHOW COLUMNS FROM cow_order LIKE 'accessories'


<% getEnumOrSetValues (pageContext, "typeDef", "values"); %>


Для столбца типа SET defList может содержать несколько значений, разделенных запятыми. Специальная обработка не требуется, тег JSTL умеет обрабатывать такие строки в цикле, так что значения по умолчанию для флажков можно инициализировать так:

value=""
checked="checked"

/>



Формируем прокручиваемый список с множественным выбором:



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Ведение журнала Apache с помощью MySQL
Выполнение поиска и получение результатов
Журнал доступа к веб-странице
Загрузка в форму записи базы данных
Использование ввода через Web для формирования запросов