Pfew. Сначала я подумал, что это будет немного легче, но после того, как я наткнулся на некоторое время, я обнаружил, что радиогруппы являются довольно зубным врачом. (это на вершине 4.1 btw)
Обычно я бы ответил, что использование apex_item будет способом динамического создания элементов. Однако радиогруппы реагируют с завихрением.
Если вы хотите использовать, например:
for r in(select level l, 'question '||level q, 'Y' a
from dual
connect by level < 6)
loop
htp.p('<div>'||r.q);
htp.p(
APEX_ITEM.TEXT(
p_idx => 1,
p_value => r.a,
p_size => 3,
p_maxlength => 1)
);
htp.p('</div>');
end loop;
Выход будет:
<div>question 1
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
<div>question 2
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
<div>question 3
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
<div>question 4
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
<div>question 5
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
Отлично! Создано 5 полей, доступных с помощью массива apex_application.g_F01
, где поле 1 будет apex_application.g_f01(1)
.
Радиогруппы, однако, реагируют друг на друга. То, что делает APEX_ITEM.RADIOGROUP
, на самом деле не создает радиогруппу, а создает радиобуй. Тогда группа будет массивом f01. Woah! Мне это не нравится! Массивы F ## начинаются с 1 до 50, поэтому, если вы создадите несколько элементов, это не идеально. Кроме того, ваша логика ввернута: внезапно вам не нужно больше перебирать массив, а массивы.
Например, результат будет так, если бы вы заменить apex_item.text
с apex_item.radiogroup
<div>question 1
<input type="radio" name="f01" value="Y" />Yes?
</div>
<div>question 2
<input type="radio" name="f01" value="Y" />Yes?
</div>
<div>question 3
<input type="radio" name="f01" value="Y" />Yes?
</div>
<div>question 4
<input type="radio" name="f01" value="Y" />Yes?
</div>
<div>question 5
<input
Это своего рода сделал то, что вы спросили: она создала RadioGroup, состоящий из элементов. Если вы нажмете кнопку на вопрос 4 и вопрос 1 был ранее отмечен, отметка будет удалена из вопроса 1 и будет установлена на 4.
Это работает. При отправке и перебирает массив F01, он будет передавать значение по:
--this after submit process
for i in 1..apex_application.g_f01.count
loop
apex_debug_message.log_message('array F01: item '||i||': '||apex_application.g_f01(i));
end loop;
--results in this debug message:
--array F01: item 1: Y
Итак, каковы ваши варианты тогда? Не используйте это. Это не динамично! Вы не можете перебирать 50 массивов, если вы не пишете 50 циклов над каждым массивом ...
Как работает APEX?При обращении к выходному коду радиоисточника элемента страницы это результат:
<input type="hidden" name="p_arg_names" value="50795996117686343389" />
<fieldset id="P3_RGROUP_PAGE_ITEM" tabindex="-1" class="radio_group">
<input type="radio" id="P3_RGROUP_PAGE_ITEM_0" name="p_t01" value="Yes" checked="checked" />
<label for="P3_RGROUP_PAGE_ITEM_0">Y</label><br />
<input type="radio" id="P3_RGROUP_PAGE_ITEM_1" name="p_t01" value="No" />
<label for="P3_RGROUP_PAGE_ITEM_1">N</label></fieldset>
Просмотреть скрытый объект? Я предполагаю, что вершина помещает выбранное значение в этот скрытый элемент, поэтому вы можете легко ссылаться на выбранное значение радиогруппы.
Возможно, это лучший способ решить эту проблему. Создайте свои радиогруппы и кнопки и поместите выбранное значение в скрытый элемент, используя javascript. Вы можете создать скрытый элемент, используя apex_item.hidden
, который вы можете с благодарностью легко найти в массиве впоследствии. Если вы используете p_idx => 1
, все скрытые элементы будут сохранены в массиве g_f01
.
Вам просто нужно спрятать этот скрытый элемент в контейнере радиогруппы. Затем привяжите событие onchange к вашим радиобарабанам. Пример, посмотрите на это jsfiddle. Это сохранит выбранное значение в скрытом элементе, который будет отправлен в submit.
Извините за длинный пост, я не думал, что это будет так сложно. Надеюсь, кто-то приходит и показывает нам простой способ:
Большое спасибо за ответ. Раньше я считал скрытый подход, поэтому, я думаю, это единственный способ. Будет информировать вас о прогрессе – Dandy