Pfew. Сначала я подумал, что это будет немного легче, но после того, как я немного осмотрелся, я обнаружил, что радиогруппы - это вполне зуборез. (это на вершине 4,1 кстати)
Обычно я отвечаю, что использование 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.
Ого! Мне это не нравится! Массивы 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
Он сделал то, что вы просили: он создал радиогруппу, состоящую из предметов. Если вы нажмете кнопку на вопросе 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>
Видите скрытый предмет? Я предполагаю, что apex помещает выбранное значение в этот скрытый элемент, чтобы вы могли легко ссылаться на выбранное значение радиогруппы.
Это, наверное, лучший способ решить эту проблему. Создайте свои радиогруппы и кнопки и поместите выбранное значение в скрытый элемент, используя JavaScript. Вы можете создать скрытый элемент, используя apex_item.hidden
, который вы, к счастью, можете впоследствии легко найти в массиве. Если вы используете p_idx => 1
, все скрытые элементы будут сохранены в массиве g_f01
.
Вам просто нужно добавить этот скрытый предмет в контейнер радиогруппы. Затем свяжите событие onchange с вашими радиокнопками.
Пример, посмотрите на это jsfiddle . Это сохранит выбранное значение в скрытом элементе, который будет опубликован при отправке.
Извините за длинную почту, я не думал, что это будет так сложно. Надеюсь, кто-нибудь придет и покажет нам легкий путь:)