Переглянути джерело

Fixed matching exercise with response random

Cristian Fasanando 15 роки тому
батько
коміт
e74e31651b

+ 17 - 0
main/exercice/answer.class.php

@@ -252,6 +252,23 @@ class Answer
 	{
 		return $this->answer[$id];
 	}
+	
+	
+	function selectAnswerByAutoId($auto_id) {
+		
+		$TBL_ANSWER = Database::get_course_table(TABLE_QUIZ_ANSWER);
+		$auto_id = intval($auto_id);
+		$sql="SELECT id, answer FROM $TBL_ANSWER WHERE id_auto='$auto_id'";
+		$rs = Database::query($sql, __FILE__, __LINE__);
+		
+		if (Database::num_rows($rs)>0) {
+			$row = Database::fetch_array($rs);
+			return $row;
+		}
+		return false; 
+
+	}
+	
 	/**
 	 * returns the answer title from an answer's position
 	 *

+ 11 - 29
main/exercice/exercice_submit.php

@@ -576,19 +576,15 @@ if ($formSent) {
 									break;
 									// for matching
 								case MATCHING :
-									if ($answerCorrect) {
-										if ($answerCorrect == $choice[$answerId]) {
-											$questionScore += $answerWeighting;
-											$totalScore += $answerWeighting;
-											$choice[$answerId] = $matching[$choice[$answerId]];
-										}
-										elseif (!$choice[$answerId]) {
-											$choice[$answerId] = '   ';
-										} else {
-											$choice[$answerId] = '<font color="red"><s>' . $matching[$choice[$answerId]] . '</s></font>';
+
+									$numAnswer=$objAnswerTmp->selectAutoId($answerId);
+
+									if ($answerCorrect) {										
+										if ($answerCorrect == $choice[$numAnswer]) {											
+											$questionScore+=$answerWeighting;
+											$totalScore+=$answerWeighting;
 										}
-									} else {
-										$matching[$answerId] = $answer;
+										$matching[$numAnswer] =  $choice[$numAnswer];
 									}
 									break;
 									// for hotspot with no order
@@ -642,25 +638,11 @@ if ($formSent) {
 								}
 							}
 							elseif ($answerType == MATCHING) {
-								$j = sizeof($matching) + 1;
-
-								for ($i = 0; $i < sizeof($choice); $i++, $j++) {
-									$val = $choice[$j];
-									if (preg_match_all('#<font color="red"><s>([0-9a-z ]*)</s></font>#', $val, $arr1)) {
-										$val = $arr1[1][0];
-									}
-									$val = $val;
-									$val = strip_tags($val);
-									$sql = "select position from $table_ans where question_id='" . Database :: escape_string($questionId) . "' and answer='" . Database :: escape_string($val) . "' AND correct=0";
-									$res = Database::query($sql, __FILE__, __LINE__);
-									if (Database :: num_rows($res) > 0) {
-										$answer = Database :: result($res, 0, "position");
-									} else {
-										$answer = '';
-									}
-									exercise_attempt($questionScore, $answer, $quesId, $exeId, $j);
 
+								foreach ($matching as $j => $val) {									
+									exercise_attempt($questionScore, $val, $quesId, $exeId, $j);
 								}
+
 							} elseif ($answerType == FREE_ANSWER) {
 								$answer = $choice;
 								exercise_attempt($questionScore, $answer, $quesId, $exeId, 0);

+ 25 - 11
main/exercice/exercise.lib.php

@@ -110,9 +110,30 @@ function showQuestion($questionId, $onlyAnswers=false, $origin=false,$current_it
 		// only used for the answer type "Matching"
 		if($answerType == MATCHING)
 		{
-			$cpt1='A';
+			$x = 1;
+			$letter = 'A';
 			$cpt2=1;
 			$Select=array();
+			$answer_matching = $cpt1 = array();		
+
+			for($answerId=1;$answerId <= $nbrAnswers;$answerId++) {
+				$answerCorrect = $objAnswerTmp->isCorrect($answerId);
+				$numAnswer = $objAnswerTmp->selectAutoId($answerId);
+				$answer=$objAnswerTmp->selectAnswer($answerId);
+				if(!$answerCorrect) {
+					// options (A, B, C, ...) that will be put into the list-box
+					$cpt1[$x] = $letter;
+					$answer_matching[$x]=$objAnswerTmp->selectAnswerByAutoId($numAnswer);
+					$x++;
+					$letter++;						
+				}
+			}
+			
+			foreach($answer_matching as $value) {				
+				$Select[$value['id']]['Lettre'] =  $cpt1[$value['id']];
+				$Select[$value['id']]['Reponse'] = $value['answer'];
+			}
+					
 		}
 		elseif($answerType == FREE_ANSWER)
 		{
@@ -236,13 +257,8 @@ function showQuestion($questionId, $onlyAnswers=false, $origin=false,$current_it
 
 			// matching // TODO: replace $answerId by $numAnswer
 			else {
-				if(!$answerCorrect) {
-					// options (A, B, C, ...) that will be put into the list-box
-					$Select[$answerId]['Lettre']=$cpt1++;
-					// answers that will be shown at the right side
-					$answer = api_parse_tex($answer);
-					$Select[$answerId]['Reponse']=$answer;
-				} else {
+				
+				if ($answerCorrect) {
 					$s.="
 					<tr>
 					  <td colspan='2'>
@@ -252,7 +268,7 @@ function showQuestion($questionId, $onlyAnswers=false, $origin=false,$current_it
 					$s.='	<span style=\' float:left; width:5%;\'><b>'.$cpt2.'</b>.&nbsp;</span>
 							<span style=\' float:left; width:95%;\'>'.$answer.'</span>';
 							
-					$s.="<td width='20%' valign='top' align='center'>&nbsp;&nbsp;<select name='choice[".$questionId."][".$answerId."]'>
+					$s.="<td width='20%' valign='top' align='center'>&nbsp;&nbsp;<select name='choice[".$questionId."][".$numAnswer."]'>
 							<option value='0'>--</option>";
 
 		            // fills the list-box
@@ -296,8 +312,6 @@ function showQuestion($questionId, $onlyAnswers=false, $origin=false,$current_it
 								</table>
 							  </td>
 							</tr>";
-
-
 							$cpt2++;
 						}	// end while()
 					}  // end if()

+ 11 - 19
main/exercice/exercise_result.php

@@ -798,25 +798,17 @@ foreach ($questionList as $questionId) {
 					break;
 			// for matching TODO: replace $answerId id by $numAnswer
 			case MATCHING :
-					if($answerCorrect)
-					{
-						if($answerCorrect == $choice[$answerId])
-						{
+					if ($answerCorrect) {						
+						if ($answerCorrect == $choice[$numAnswer]) {					
 							$questionScore+=$answerWeighting;
-							$totalScore+=$answerWeighting;
-							$choice[$answerId]=$matching[$choice[$answerId]];
-						}
-						elseif(!$choice[$answerId])
-						{
-							$choice[$answerId]='&nbsp;&nbsp;&nbsp;';
-						}
-						else
-						{
-							$choice[$answerId]='<font color="red"><s>'.$matching[$choice[$answerId]].'</s></font>';
-						}
-					}
-					else
-					{
+							$totalScore+=$answerWeighting;							
+							$choice[$numAnswer]=$matching[$choice[$numAnswer]];
+						} elseif(!$choice[$numAnswer]) {
+							$choice[$numAnswer]='&nbsp;&nbsp;&nbsp;';
+						} else {
+							$choice[$numAnswer]='<font color="red"><s>'.$matching[$choice[$numAnswer]].'</s></font>';
+						}						
+					} else {
 						$matching[$answerId]=$answer;
 					}
 					break;
@@ -917,7 +909,7 @@ foreach ($questionList as $questionId) {
 						echo $answer; ?>
 					</td>
 					<td width="50%">
-						<?php echo $choice[$answerId]; ?> / <font color="green"><b>
+						<?php echo $choice[$numAnswer]; ?> / <font color="green"><b>
 						<?php
 						$matching[$answerCorrect]=api_parse_tex($matching[$answerCorrect]);
 						echo $matching[$answerCorrect]; ?></b></font>

+ 24 - 34
main/exercice/exercise_show.php

@@ -843,16 +843,15 @@ if ($show_results) {
 			$objAnswerTmp=new Answer($questionId);
 			$table_ans = Database :: get_course_table(TABLE_QUIZ_ANSWER);
 			$TBL_TRACK_ATTEMPT= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
-
-			$sql_select_answer = 'SELECT id, answer, correct, position FROM '.$table_ans.' WHERE question_id="'.Database::escape_string($questionId).'" AND correct<>0';
-			$sql_answer = 'SELECT position, answer FROM '.$table_ans.' WHERE question_id="'.Database::escape_string($questionId).'" AND correct=0';
+			$sql_answer = 'SELECT id, answer FROM '.$table_ans.' WHERE question_id="'.Database::escape_string($questionId).'" AND correct=0';
 			$res_answer = Database::query($sql_answer, __FILE__, __LINE__);
 			// getting the real answer
 			$real_list =array();
 			while ($real_answer = Database::fetch_array($res_answer)) {
-				$real_list[$real_answer['position']]= $real_answer['answer'];
+				$real_list[$real_answer['id']]= $real_answer['answer'];
 			}
 
+			$sql_select_answer = 'SELECT id, answer, correct, id_auto FROM '.$table_ans.' WHERE question_id="'.Database::escape_string($questionId).'" AND correct<>0';
 			$res_answers = Database::query($sql_select_answer, __FILE__, __LINE__);
 
 			echo '<table width="100%" height="71" border="0" cellspacing="3" cellpadding="3" >';
@@ -866,46 +865,37 @@ if ($show_results) {
 			$questionScore=0;
 
 			while ($a_answers = Database::fetch_array($res_answers)) {
+				
 				$i_answer_id = $a_answers['id']; //3
 				$s_answer_label = $a_answers['answer'];  // your dady - you mother
 				$i_answer_correct_answer = $a_answers['correct']; //1 - 2
-				$i_answer_position = $a_answers['position']; // 3 - 4
-
-				$sql_user_answer =
-						'SELECT answers.answer
-						FROM '.$TBL_TRACK_ATTEMPT.' as track_e_attempt
-						INNER JOIN '.$table_ans.' as answers
-							ON answers.position = track_e_attempt.answer
-							AND track_e_attempt.question_id=answers.question_id
-						WHERE answers.correct = 0
-						AND track_e_attempt.exe_id = "'.Database::escape_string($id).'"
-						AND track_e_attempt.question_id = "'.Database::escape_string($questionId).'"
-						AND track_e_attempt.position="'.Database::escape_string($i_answer_position).'"';
-
-
-				$res_user_answer = Database::query($sql_user_answer, __FILE__, __LINE__);
+				$i_answer_id_auto = $a_answers['id_auto']; // 3 - 4
+				
+				$sql_user_answer = "SELECT answer 
+									FROM $TBL_TRACK_ATTEMPT 
+									WHERE exe_id = '$id' AND question_id = '$questionId' AND position='$i_answer_id_auto'";
+				$res_user_answer = Database::query($sql_user_answer, __FILE__, __LINE__);					
+				
 				if (Database::num_rows($res_user_answer)>0 ) {
 					$s_user_answer = Database::result($res_user_answer,0,0); //  rich - good looking
 				} else {
-					$s_user_answer = '';
+					$s_user_answer = 0;
 				}
-
-				//$s_correct_answer = $s_answer_label; // your ddady - your mother
-				$s_correct_answer = $real_list[$i_answer_correct_answer];
-
+				
 				$i_answerWeighting=$objAnswerTmp->selectWeighting($i_answer_id);
-
-				//if($s_user_answer == $s_correct_answer) // rich == your ddady?? wrong
-				//echo $s_user_answer.' - '.$real_list[$i_answer_correct_answer];
-
-				if ($s_user_answer == $real_list[$i_answer_correct_answer]) { // rich == your ddady?? wrong
-					$questionScore+=$i_answerWeighting;
-					$totalScore+=$i_answerWeighting;
-				} else {
-					$s_user_answer = '<span style="color: #FF0000; text-decoration: line-through;">'.$s_user_answer.'</span>';
+				
+				$user_answer = '';
+				if (!empty($s_user_answer)) {
+					if ($s_user_answer == $i_answer_correct_answer)	{
+						$questionScore+=$i_answerWeighting;
+						$totalScore+=$i_answerWeighting;
+						$user_answer = '<span>'.$real_list[$i_answer_correct_answer].'</span>';											
+					} else {
+						$user_answer = '<span style="color: #FF0000; text-decoration: line-through;">'.$real_list[$s_user_answer].'</span>';
+					}
 				}
 				echo '<tr>';
-				echo '<td>'.$s_answer_label.'</td><td>'.$s_user_answer.' / <b><span style="color: #008000;">'.$s_correct_answer.'</span></b></td>';
+				echo '<td>'.$s_answer_label.'</td><td>'.$user_answer.' / <b><span style="color: #008000;">'.$real_list[$i_answer_correct_answer].'</span></b></td>';
 				echo '</tr>';
 			}
 			echo '</table>';