フォームとして、各フィールドはFORM
デフォルトで送信時のスコープの一部です。このスコープは単純な構造体 (すなわちFORM = {question_id: value, response_id: value}
) であり、そこから各項目を簡単に参照できます: (出力用) <cfoutput>#FORM.question_id#</cfoutput>
。
10 個の質問があり、常に答えがあるとします。まず、質問ごとに非表示のフォーム フィールドを作成します。
<input type="hidden" name="questionId_01" value="01" />
<input type="hidden" name="questionId_02" value="02" />
各フィールドには異なる名前が付いていることに注意してください。これは、各フィールドへの一意の参照を取得するために必要です。次に、質問ごとに対応する入力フィールドを作成します。多肢選択式の質問で、ラジオ ボタンを使用していたとします。同じ名前でフィールドを作成しますが、選択肢の値は次のとおりです。
<input type="radio" name="responseId_01" value="a" />
<input type="radio" name="responseId_01" value="b" />
<input type="radio" name="responseId_01" value="c" />
<input type="radio" name="responseId_02" value="a" />
<input type="radio" name="responseId_02" value="b" />
<input type="radio" name="responseId_02" value="c" />
フォームを送信すると、これらが単純な名前と値のペアとしてサーバーに渡されます。あなたの質問に jQuery タグが添付されているのがわかります (あなたはそれについて言及していませんが)。ほとんどの人は$.serializeArray()
、フォーム データを ajax データの形式で配置するために使用します。それはそれを処理する簡単な方法です。
$('myForm').submit(function(e){
e.preventDefault();
$.ajax({
url: 'myProcessor.cfc?method=processForm&returnformat=JSON',
data: $(this).serializeArray(),
success: callbackFunctionName
});
});
次のパラメーターを投稿します。
questionId_01 01
questionId_02 02
responseId_01 b
responseId_02 a
method processForm
returnformat JSON
したがって、サーバー側で探している構造の配列はまだありません。ARGUMENTS
スコープをループすることで、サーバー側の処理を実行して配列を作成できます。
<cfscript>
LOCAL.processArr = ArrayNew(1);
for (LOCAL.i in ARGUMENTS){
if (FindNoCase('questionId',LOCAL.i)){
LOCAL.tmpArr = ListToArray(LOCAL.i,'_'); // get the Id to find response entity
LOCAL.tmpStr = {questionId = ARGUMENTS[LOCAL.i], responseId = ARGUMENTS['responseId_' & LOCAL.tmpArr[2]]}; // CF arrays start at 1
ArrayAppend(LOCAL.processArr, Duplicate(LOCAL.tmpStr));
}
}
</cfscript>
これで、探していた構造体の配列ができました。その後、配列をループして挿入を実行できます。