0

questionTypes をループして選択した questionType 値を取得する方法がわかりません。選択した questionType に基づいて、複数選択肢の質問の回答を追加する必要があります。たとえば、正しい回答を選択する場合は、4 つの選択肢を提供し、そのうちの 1 つを正解として選択する必要があります。

使用しようとしましcfswitchたが、うまくいかないようです:

<html>
  <head> <script src="http://code.jquery.com/jquery-latest.js"></script></head>
<body>
<cfoutput>


    <cfif not IsDefined('rc.questionType')>
        <form class="form form-horizontal" action="#buildUrl('question.new')#" method="post">
            <input type="hidden" name="surveyId" value="#rc.surveyId#">
                <fieldset>

                <div class="control-group">
                <label class="control-label" for="questiontype">Question type</label>
                    <div class="controls">
                    <select name="questionType" onchange="this.form.submit()">
                        <option value="0" >Select question type</option>
                    <cfloop query="rc.types">
                        <option value="#id#">#name#</option>
                    </cfloop> 
                    </select>
                    </div>
                </div> 
                </fieldset>
        </form> 

    <!--- if question type is defined, display question form --->
    <cfelse>
        <form class="form form-horizontal" action="#buildUrl('question.save')#" method="post">
            <input type="hidden" name="id" value="0">
            <input type="hidden" name="surveyId" value="#rc.data.fksurveyId#">
            <input type="hidden" name="questionTypeId" value="#rc.data.fkquestionTypeId#">
            <input type="hidden" name="rank" value="#rc.data.rank#">



            <fieldset>

            <div class="control-group">
            <label class="control-label" for="question">Question</label>
                <div class="controls">
                    <input class="input-xxlarge" type="text" name="question" id="question" required="true" placeholder="write your question">
                </div>
            </div>

            <div class="control-group">
            <label class="control-label" for="Required">Required</label>
                <div class="controls">
                <select name="Required">
                    <option value="1" selected>Yes</option>
                    <option value="0">No</option>
                </select>
                </div>
            </div>                 



            <!--- question arguments for selected type, this will be for multioption questions --->

           <!--- <cfif rc.questiontype is "multiple choice (single selection),Multiple Choice (Multi Selection) with Other,Multiple Choice (Single Selection) with Other,Multiple Choice (Multi Selection)"> --->
           <cfswitch expression="#rc.questiontypeid#">
                <cfcase value="multiple choice (single selection),Multiple Choice (Multi Selection) with Other,Multiple Choice (Single Selection) with Other,Multiple Choice (Multi Selection)">
                 <div class="control-group">
                    <label class="control-label" for="answer">Answer</label>
                      <div class="controls">
                         <input class="input-xxlarge" type="text" name="new_answer" id="new_answer">
                      </div>
                </div>

               <div class="control-group">
                   <label class="control-label" for="rank">rank</label>
                      <div class="controls">
                         <input class="input-mini" type="text" name="rank" id="rank">
                     </div>
               </div>


                <div class="control-group">
                    <label class="control-label" for="answer">Answer</label>
                      <div class="controls">
                         <input class="input-xxlarge" type="text" name="new_answer" id="new_answer">
                      </div>
                </div>

               <div class="control-group">
                   <label class="control-label" for="rank">rank</label>
                      <div class="controls">
                         <input class="input-mini" type="text" name="rank" id="rank">
                     </div>
               </div>
          </cfcase>
        </cfswitch>




            <!---  --->
            <div class="form-actions">
                <button type="submit" class="btn btn-primary">Save</button>
                <a href="#buildUrl(action='admin:question.list', querystring='surveyid=#rc.surveyId#')#" class="btn">Cancel</a>
            </div>
            </fieldset>
        </form> 
    </cfif>
<cfdump var="#rc#">

</cfoutput>
</body>
</html>

これは、新しい質問を追加するための私のコントローラー メソッドです。

<cffunction name="new" returntype="void" access="public">
        <cfargument name="rc" type="struct" required="true">
        <!---call service to get the textfields, checkboxes etc,. based on questiontype selection --->
        <!--- call service to get question types for select box --->
        <cfset rc.types = getQuestionService().types()> 
        <cfset rc.action = 'New Question'>
        <!--- if user select question type --->
        <cfif isdefined('arguments.rc.questionType')>
            <cfset rc.data = getQuestionService().new(arguments.rc.surveyId, arguments.rc.questionType)>
        </cfif> 
    </cffunction>

1 ページに 2 つのフォームがあります。最初のフォームでは、questionType を選択しています。選択した questionType に基づいて、質問の追加フォームを表示する必要があります。

4

2 に答える 2

1

このコードがどのように機能するかを確認するには:

1. これは質問を作成するためのフォームであり、回答するためのものではありません。
2. rc は、基本的な質問定義をキーとする構造体であり、rc 構造体がこのページに存在することを保証する他の既存のコードがあります。
(isDefined("rc.questionType") ではなく、structKeyExists(rc, "questionType") を使用しますが、それはまったく別の議論です。
3. 質問タイプの値を変更すると、そのフィールドが送信され、他のコードは rc 構造体の questionType キーを作成して入力するので、 isDefined('rc.questionType') は TRUE になるはずです (cfelse ブロックに移動します)。
4. 質問を入力するフィールド (必須かどうか) がある同じページに戻ります。質問の種類に基づいて回答入力ボックスを探しています。

これらの仮定がすべて正しい場合、これが、回答のオプションをループする必要があるポイントです。cfswitch/cfcase は正しいですが、これらの複数選択オプションの一部は、少し異なる方法で処理する必要があります。「その他」のオプションがあるものは、この目的と回答追跡の目的でもう少し多くの処理が必要になります。そのチェックされた回答のテキスト ボックスを追加する必要があります。

そのため、rc 構造体の質問に対してもう少し定義が必要になります。どちらが正解かを追跡する必要があります (単純なチェックボックス)。動的な数の多肢選択式の回答を許可する場合は、必要な回答の数を追跡する必要があります。また、回答が「その他」であるかどうかを追跡すれば、これらの多肢選択式の回答オプションをまとめておくこともできます。これにより、複数選択オプションで複数の「その他」タイプを選択することもできます。確かに、これが多肢選択式の質問であるかどうかの選択肢を、単に「複数選択」の 1 つに減らすことになります。回答によって、単一選択か「その他」選択かを決定します。また、単一選択にチェック ボックスの代わりにラジオ ボタンを使用する場合は、しなければならないのは、質問の答えを数えることです。次に、基本的な質問の種類ごとに個別に心配することができます。

回答 (正解と「その他」のオプション) をより適切に追跡するためのコードも、おそらく getQuestionService() 関数でプルアップする必要があります。構造体。

このフォームを UPSERT として使用する予定ですか、それとも単に INSERT であり、別の場所で質問を更新/編集する予定ですか?

とにかく、元の質問に戻ります。最初にお勧めするのは、ページの上部にある rc 構造体も cfdump することです。最初に作業しているデータを確認します。

アンサーを追加する必要がある場所では、cfswitch が正しい方法です。ここでは、どのケースにも一致しない可能性があります。ここに rc.questionTypeID を出力して、値を確認します。また、質問の種類の名前ではなく、質問の種類に整数の ID を使用します。より高速で正確な処理が可能になります。正しいケースを取得したら、ここで回答を cfloop する必要があります。

どちらが正しいかを選択するには、現在の回答が正しい回答であるかどうかを確認する cfif 内に selected="selected" または checked="checked" (入力タイプに応じて) を追加するだけです。

于 2013-02-26T21:07:07.590 に答える
0

switch 式が に設定されているためrc.questiontypeid、case 値はrc.questiontypeid問題タイプ名ではなく、 possible である必要があります。

于 2013-02-26T19:50:39.340 に答える