我无法弄清楚如何循环遍历questionTypes并获取所选的questionType值。基于所选择的问题类型,我必须为多选项问题添加答案,例如在选择正确答案时,我们提供四种选择,我们必须选择哪一种作为正确答案。
我尝试使用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>
我在单页中有两种形式。在第一种形式中,我选择了questionType。根据选定的questionType,我必须显示一个添加问题表单。
答案 0 :(得分:1)
为了确保我正在阅读此代码应该如何工作:
这是一个创建问题的表单,而不是回答它。
2. rc是一个以您的基本问题定义为关键字的结构,并且您有其他现有代码可确保此页面上存在rc结构。
(而不是isDefined(“rc.questionType”)我会使用structKeyExists(rc,“questionType”),但这是一个完全不同的讨论。
3.当您更改问题类型的值时,该字段将被提交回来,其他代码会创建并填充rc struct的questionType键。所以isDefined('rc.questionType')现在应该为TRUE(将你带到cfelse块)。
4.现在您带回一个字段的相同页面输入问题,是否需要,并且您正在寻找基于questionType的答案输入框。
如果所有这些假设都是正确的,那么您需要循环选择答案。 cfswitch / cfcase是正确的,但是这些多选项中的一些将需要稍微不同地处理。具有“其他”选项的选项在此端和答案跟踪端需要稍微多一些处理。您必须为选中的答案添加一个文本框。
因此,您需要对rc结构中的问题进行更多定义。您需要跟踪哪一个是正确的答案(一个简单的复选框)。如果您想允许动态数量的多项选择答案,则需要跟踪您需要的答案数量。如果您跟踪答案是否为“其他”,您甚至可以将这些多项选择答案选项保持在一起。这还允许您在多选项中选择多个“其他”类型。当然,这会减少您选择是否只是一个多选题,只需“多选”。让答案确定它是单选还是“其他”选择。如果您想使用单选按钮而不是单个选项的复选框,您只需要计算问题的答案。然后你可以单独担心每个基本的问题类型。
更好地跟踪答案的代码(正确和“其他”选项)也需要撤回,可能是在getQuestionService()函数中,我假设你正在提取你的问题定义和填充rc结构。
您是否计划将此表格用作UPSERT,或者这只是一个INSERT,您会在其他地方更新/编辑问题吗?
无论如何,回到原来的问题。我建议的第一件事就是在页面顶部cfdump rc结构。查看您最初使用的数据。
在需要添加答案的地方,cfswitch是正确的方法。您可能无法在此处匹配任何案例。在此处输出rc.questionTypeID以查看您的值。我会使用问题类型的整数ID而不是问题类型的名称。它将提供更快,更精确的处理。当你得到正确的案例时,你需要在这里讨论你的答案。
要选择哪一个是正确的,只需在cfif中添加selected =“selected”或checked =“checked”(取决于输入类型),检查当前答案是否是正确答案。
答案 1 :(得分:0)
由于switch表达式设置为rc.questiontypeid
,因此案例值应该是可能的rc.questiontypeid
,而不是问题类型名称。