No one answered my question on dynamic java select boxes so I spent a while messing around with custom questions until I got it working. Figured I'd share my findings in case anyone else has a similar issue.
This is probably not the best way to go about doing this but I had little choice so bare with me.
My problem, I needed select boxes that would change depending on their parent select box. IE Dynamic java select boxes.
I used Mirko Elviro's Multiple Dynamic Combo Boxes code available
here.
I put the javascript in the
form_view template, so yes it's added in every form regardless of whether or not those questions are used on that form. I couldn't find a way around it.
Code:
<script language="JavaScript" type="text/javascript">
<!--
/*
*** Multiple dynamic combo boxes
*** by Mirko Elviro, 9 Mar 2005
*** Script featured and available on JavaScript Kit (http://www.javascriptkit.com)
***
***Please do not remove this comment
*/
// This script supports an unlimited number of linked combo boxed
// Their id must be "combo_0", "combo_1", "combo_2" etc.
// Here you have to put the data that will fill the combo boxes
// ie. data_2_1 will be the first option in the second combo box
// when the first combo box has the second option selected
// first combo box
data_1 = new Option("1", "$");
data_2 = new Option("2", "$$");
// second combo box
data_1_1 = new Option("11", "-");
data_1_2 = new Option("12", "-");
data_2_1 = new Option("21", "--");
data_2_2 = new Option("22", "--");
data_2_3 = new Option("23", "--");
data_2_4 = new Option("24", "--");
data_2_5 = new Option("25", "--");
// third combo box
data_1_1_1 = new Option("111", "*");
data_1_1_2 = new Option("112", "*");
data_1_1_3 = new Option("113", "*");
data_1_2_1 = new Option("121", "*");
data_1_2_2 = new Option("122", "*");
data_1_2_3 = new Option("123", "*");
data_1_2_4 = new Option("124", "*");
data_2_1_1 = new Option("211", "**");
data_2_1_2 = new Option("212", "**");
data_2_2_1 = new Option("221", "**");
data_2_2_2 = new Option("222", "**");
data_2_3_1 = new Option("231", "***");
data_2_3_2 = new Option("232", "***");
// fourth combo box
data_2_2_1_1 = new Option("2211","%")
data_2_2_1_2 = new Option("2212","%%")
// other parameters
displaywhenempty=""
valuewhenempty=-1
displaywhennotempty="-select-"
valuewhennotempty=0
function change(currentbox) {
numb = currentbox.id.split("_");
currentbox = numb[1];
i=parseInt(currentbox)+1
// I empty all combo boxes following the current one
while ((eval("typeof(document.getElementById(\"combo_"+i+"\"))!='undefined'")) &&
(document.getElementById("combo_"+i)!=null)) {
son = document.getElementById("combo_"+i);
// I empty all options except the first one (it isn't allowed)
for (m=son.options.length-1;m>0;m--) son.options[m]=null;
// I reset the first option
son.options[0]=new Option(displaywhenempty,valuewhenempty)
i=i+1
}
// now I create the string with the "base" name ("stringa"), ie. "data_1_0"
// to which I'll add _0,_1,_2,_3 etc to obtain the name of the combo box to fill
stringa='data'
i=0
while ((eval("typeof(document.getElementById(\"combo_"+i+"\"))!='undefined'")) &&
(document.getElementById("combo_"+i)!=null)) {
eval("stringa=stringa+'_'+document.getElementById(\"combo_"+i+"\").selectedIndex")
if (i==currentbox) break;
i=i+1
}
// filling the "son" combo (if exists)
following=parseInt(currentbox)+1
if ((eval("typeof(document.getElementById(\"combo_"+following+"\"))!='undefined'")) &&
(document.getElementById("combo_"+following)!=null)) {
son = document.getElementById("combo_"+following);
stringa=stringa+"_"
i=0
while ((eval("typeof("+stringa+i+")!='undefined'")) || (i==0)) {
// if there are no options, I empty the first option of the "son" combo
// otherwise I put "-select-" in it
if ((i==0) && eval("typeof("+stringa+"0)=='undefined'"))
if (eval("typeof("+stringa+"1)=='undefined'"))
eval("son.options[0]=new Option(displaywhenempty,valuewhenempty)")
else
eval("son.options[0]=new Option(displaywhennotempty,valuewhennotempty)")
else
eval("son.options["+i+"]=new Option("+stringa+i+".text,"+stringa+i+".value)")
i=i+1
}
//son.focus()
i=1
combostatus=''
cstatus=stringa.split("_")
while (cstatus[i]!=null) {
combostatus=combostatus+cstatus[i]
i=i+1
}
return combostatus;
}
}
//-->
</script>
And for each seperate custom question I did the following.
PHP Code:
//Question 1
$thisanswer = $q_{$formbit[id]};
$answer ="<select name=\"".$formbit[id]."\" id=\"combo_0\" onChange=\"change(this);\" style=\"width:200px;\">
<option value=\"value1\">-select-</option>
<option value=\"value2\">1</option>
<option value=\"value3\">2</option>
</select>";
PHP Code:
//Question 2
$thisanswer = $q_{$formbit[id]};
$answer ="<select name=\"".$formbit[id]."\" id=\"combo_1\" onChange=\"change(this)\" style=\"width:200px;\">
<option value=\"value1\"> </option>
</select>";
PHP Code:
//Question 3
$thisanswer = $q_{$formbit[id]};
$answer ="<select name=\"".$formbit[id]."\" id=\"combo_2\" onChange=\"change(this);\" style=\"width:200px;\">
<option value=\"value1\"> </option>
</select>";
PHP Code:
//Question 4
$thisanswer = $q_{$formbit[id]};
$answer ="<select name=\"".$formbit[id]."\" id=\"combo_3\" onChange=\"change(this);\" style=\"width:200px;\">
<option value=\"value1\"> </option>
</select>";
Example
The questions work wonderfully and the values are submitted properly. Hope this is helpful to someone.