2012-01-19 2 views
1

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

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

Чтобы сделать это, я решил создать 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; 

Таким образом, вопросы показываются и radiogroups также отображается рядом с каждым вопросом.

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

ответ

0

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.

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

+0

Большое спасибо за ответ. Раньше я считал скрытый подход, поэтому, я думаю, это единственный способ. Будет информировать вас о прогрессе – Dandy

1

В последнее время я столкнулся с почти той же проблемой. Моим решением найти выбранную опцию было добавить параметр p_onchange к вызову функции APEX_ITEM.RADIOGROUP (обратитесь к Apex 4.1 API Refernce). Вы можете разместить там любой код 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);')