2012-01-19 109 views
1

我目前使用的是oracle APEX 4.1,並且在動態創建radiogroups時遇到了問題。動態創建RadioGroups oracle APEX

我有一個簡單的要求(!)來顯示一個表格中的問題列表,並在每個問題旁邊顯示一個yes/no radiogroup按鈕。問題列表可能會有所不同,所以不是靜態的。

要做到這一點,我決定創建一個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工具創建的,但我無法動態地在循環中執行此操作。有沒有辦法引用這些動態創建的radiogroups?我採取了錯誤的做法嗎?

回答

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所做的實際上並不是創建一個radiogroup,而是創建一個radiobutton。該組將是f01陣列。 哇!我不喜歡那樣! F ##陣列從1開始到50開始,所以如果你生成了一些項目,這並不理想。另外,你的邏輯被搞砸了:突然之間,你不必再遍歷一個數組,而是通過數組。

例如,輸出會是這樣,如果你有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 

它像是做了什麼,你問替換apex_item.text:它創造了由項目的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實際上是如何工作的呢?當查看頁面項目radiogroup的輸出代碼時,這是輸出:

<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將選定的值放入該隱藏項目中,以便您可以輕鬆地引用選定的radiogroup值。

這可能是您解決這個問題的最佳方法。生成您的radiogroups和按鈕,並使用javascript將選定的值放入一個隱藏的項目中。您可以使用apex_item.hidden創建隱藏物品,之後您可以在陣列中輕鬆地引用它。如果您使用p_idx => 1,所有隱藏的項目將被存儲到數組g_f01

你只需要在你的radiogroup容器中搭載這個隱藏的物品。然後將onchange事件綁定到您的單選按鈕。例如,請看jsfiddle。這會將選定的值保留在隱藏項目中,該項目將在提交時發佈。

對不起,我不認爲它會變得如此複雜。希望有人來,並向我們展示一個簡單的方法:)

+0

許多感謝您的答覆。我曾經考慮過隱藏的方法,所以我想這是唯一的方法。將隨時向您通報進展情況 – Dandy

1

我最近遇到了幾乎相同的問題。我找到選擇的選項的解決方案是將p_onchange參數添加到APEX_ITEM.RADIOGROUP函數調用(請參閱Apex 4.1 API參考)。您可以在其中放置任何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);')