2012-01-19 4 views
1

현재 oracle APEX 4.1을 사용 중이며 radiogroup을 동적으로 생성하는 데 문제가 있습니다.라디오 그룹을 동적으로 생성하십시오. 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

만료. 처음에는 this'd 조금 더 쉬울 거라고 생각했지만 잠시 후에 나는 radiogroups 꽤 toothgrinder 것으로 나타났습니다. (정점 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> 

좋아! apex_application.g_F01 배열을 사용하여 액세스 할 수있는 5 개의 필드가 생성됩니다. 여기서 필드 1은 apex_application.g_f01(1)입니다.

그러나 방사성 그룹은 차별적 반응을 보입니다. APEX_ITEM.RADIOGROUP은 실제로 방사선 그룹을 만들지 않고 라디오 버튼을 만듭니다. 그룹은 f01 배열이됩니다. 와아! 나는 그것을 좋아하지 않는다! F ## 배열은 1부터 50까지만 시작하므로 몇 가지 항목을 생성하면 이상적이지 않습니다. 또한 논리가 엉망이됩니다. 갑자기 배열을 반복하지 않아도됩니다. 이 항목으로 구성된을 radioGroup을 만들어 : 당신은 그것은 종류의 당신이 무엇을 요구했다 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를 교체하려는 경우

예를 들어, 출력은 다음과 같이 될 것이다. 질문 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> 

숨겨진 항목을 볼 수 있습니까? 나는 정점이 그 숨겨진 아이템에 선택된 값을 넣는다 고 가정하므로, 당신은 방사선 그룹의 선택된 값을 쉽게 참조 할 수 있습니다.

아마도이 문제를 해결하는 가장 좋은 방법 일 수 있습니다. radiogroups 및 단추를 생성하고 javascript를 사용하여 숨겨진 항목에 선택한 값을 넣으십시오. apex_item.hidden을 사용하여 숨겨진 항목을 만들 수 있습니다. 감사하게도 나중에 배열에서 쉽게 참조 할 수 있습니다. p_idx => 1을 사용하면 모든 숨겨진 항목이 배열 g_f01에 저장됩니다.

radiogroup 컨테이너에서 숨겨진 항목을 피기 백해야합니다. 그런 다음 라디오 버튼에 onchange 이벤트를 바인딩하십시오. 예를 들어이 jsfiddle을보세요. 이렇게하면 숨겨진 항목에 선택된 값이 유지되며 제출시 게시됩니다.

길이가 긴 게시물에 대해 유감스럽게 생각합니다. 너무 복잡 할 것이라고 생각하지 않았습니다. 누군가가 따라 와서 쉬운 방법을 보여줍니다. :)

+0

많은 감사 : 여기

은 JS 함수이다. 나는 숨겨진 접근법을 더 일찍 고려 했으므로 이것이 유일한 방법이라고 생각한다. 진행 상황에 대해 계속 알려줄 것입니다. – Dandy

1

나는 거의 같은 문제를 최근에 겪었습니다. 선택된 솔루션을 찾기위한 나의 해결책은 APEX_ITEM.RADIOGROUP 함수 호출에 p_onchange 매개 변수를 추가하는 것이 었습니다 (Apex 4.1 API 참조를 참조하십시오). 거기에 자바 스크립트 코드를 둘 수 있습니다. 나는 숨겨진 입력 필드에 선택된 값을 할당하는 간단한 함수를 작성했다. 응답에 대한

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);')