Создавать радиогруппы динамически оракула APEX - PullRequest
1 голос
/ 19 января 2012

В настоящее время я использую oracle APEX 4.1, и у меня возникла проблема с динамическим созданием радиогрупп.

У меня есть простое требование (!) Для отображения списка вопросов из таблицы и отображения кнопки радиогруппы да / нетрядом с каждым вопросом.Список вопросов может различаться, поэтому он не является статичным.

Для этого я решил создать анонимный блок plsql, и пример кода приведен ниже:

For c1 IN (select * from question)
LOOP
v_row:=v_row+1;
v_rowName:='F'||v_row;
v_radioYes:='<input type="radio" name='||v_rowName||'  value="yes" />Yes';
v_radioNo:='<input type="radio" name='||v_rowName||'  value="no" />No';
v_radio:=v_radioYes||' '||v_radioNo;
htp.p('<tr><td>'||v_row||'. '||c1.Question_text||'</td><td>'||v_type||'</tr>');
END LOOP;

Итак,вопросы отображаются, а радиогруппы также отображаются рядом с каждым вопросом.

Моя проблема заключается в том, что при отправке мне нужно выяснить, какие параметры пользователь выбрал для каждого вопроса, и сохранить их в базе данных.Легко, но я не могу ссылаться на радиокнопки для каждого вопроса, чтобы узнать, что проверил пользователь.В идеале, эти переключатели должны были быть созданы с использованием инструмента APEX, но я не мог заставить это делать в цикле динамически.Есть ли способ ссылки на эти радиогруппы, которые были созданы динамически?Я выбрал неправильный подход?

Ответы [ 2 ]

2 голосов
/ 24 июля 2012

Я недавно столкнулся с почти такой же проблемой. Мое решение найти выбранную опцию состояло в том, чтобы добавить параметр p_onchange к вызову функции APEX_ITEM.RADIOGROUP (см. Apex 4.1 API Reference). Вы можете разместить любой код JavaScript там. Я написал простую функцию для назначения выбранного значения скрытому полю ввода.

Вот функция js:

function put_selected_value(sel_value) { 
  $x('P66_SELECTED_VALUE').value=sel_value;
}

и RADIOGROUP

apex_item.RADIOGROUP(10, wrk_id, null, null, null, null, 
                     'javascript:put_selected_value(this.value);')
0 голосов
/ 20 января 2012

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 . Это сохранит выбранное значение в скрытом элементе, который будет опубликован при отправке.

Извините за длинную почту, я не думал, что это будет так сложно. Надеюсь, кто-нибудь придет и покажет нам легкий путь:)

...