|
|
|
|
@ -33,8 +33,6 @@ class FillBlanks extends Question |
|
|
|
|
*/ |
|
|
|
|
public function createAnswersForm($form) |
|
|
|
|
{ |
|
|
|
|
$fillBlanksAllowedSeparator = self::getAllowedSeparator(); |
|
|
|
|
|
|
|
|
|
$defaults = array(); |
|
|
|
|
|
|
|
|
|
if (!empty($this->id)) { |
|
|
|
|
@ -57,10 +55,8 @@ class FillBlanks extends Question |
|
|
|
|
$blanksepartornumber = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$blankSeparatortStart = self::getStartSeparator($blanksepartornumber); |
|
|
|
|
$blankSeparatortEnd = self::getEndSeparator($blanksepartornumber); |
|
|
|
|
$blankSeparatortStartRegexp = self::escapeForRegexp($blankSeparatortStart); |
|
|
|
|
$blankSeparatortEndRegexp = self::escapeForRegexp($blankSeparatortEnd); |
|
|
|
|
$blankSeparatorStart = self::getStartSeparator($blanksepartornumber); |
|
|
|
|
$blankSeparatorEnd = self::getEndSeparator($blanksepartornumber); |
|
|
|
|
|
|
|
|
|
$setValues = null; |
|
|
|
|
|
|
|
|
|
@ -72,8 +68,8 @@ class FillBlanks extends Question |
|
|
|
|
// javascript |
|
|
|
|
echo '<script> |
|
|
|
|
|
|
|
|
|
var blankSeparatortStart = "'.$blankSeparatortStart.'"; |
|
|
|
|
var blankSeparatortEnd = "'.$blankSeparatortEnd.'"; |
|
|
|
|
var blankSeparatortStart = "'.$blankSeparatorStart.'"; |
|
|
|
|
var blankSeparatortEnd = "'.$blankSeparatorEnd.'"; |
|
|
|
|
var blankSeparatortStartRegexp = getBlankSeparatorRegexp(blankSeparatortStart); |
|
|
|
|
var blankSeparatortEndRegexp = getBlankSeparatorRegexp(blankSeparatortEnd); |
|
|
|
|
|
|
|
|
|
@ -287,7 +283,7 @@ class FillBlanks extends Question |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* abstract function which creates the form to create / edit the answers of the question |
|
|
|
|
* Function which creates the form to create/edit the answers of the question |
|
|
|
|
* @param FormValidator $form |
|
|
|
|
*/ |
|
|
|
|
public function processAnswersCreation($form) |
|
|
|
|
@ -295,15 +291,15 @@ class FillBlanks extends Question |
|
|
|
|
global $charset; |
|
|
|
|
|
|
|
|
|
$answer = $form->getSubmitValue('answer'); |
|
|
|
|
//var_dump($answer); |
|
|
|
|
// Due the fckeditor transform the elements to their HTML value |
|
|
|
|
$answer = api_html_entity_decode($answer, ENT_QUOTES, $charset); |
|
|
|
|
// Due the ckeditor transform the elements to their HTML value |
|
|
|
|
|
|
|
|
|
//$answer = api_html_entity_decode($answer, ENT_QUOTES, $charset); |
|
|
|
|
//$answer = htmlentities(api_utf8_encode($answer)); |
|
|
|
|
|
|
|
|
|
// remove the :: eventually written by the user |
|
|
|
|
$answer = str_replace('::', '', $answer); |
|
|
|
|
|
|
|
|
|
// remove starting and ending space and |
|
|
|
|
|
|
|
|
|
$answer = api_preg_replace("/\xc2\xa0/", " ", $answer); |
|
|
|
|
|
|
|
|
|
// start and end separator |
|
|
|
|
@ -420,6 +416,7 @@ class FillBlanks extends Question |
|
|
|
|
<tr> |
|
|
|
|
<th>'.get_lang("Answer").'</th> |
|
|
|
|
</tr>'; |
|
|
|
|
|
|
|
|
|
return $header; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -485,14 +482,16 @@ class FillBlanks extends Question |
|
|
|
|
$result = Display::input('text', "choice[$questionId][]", $correctItem, $attributes); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return an array with the different choices available when the answers between bracket show as a menu |
|
|
|
|
* @param $correctAnswer |
|
|
|
|
* @param $displayForStudent true if we want to shuffle the choices of the menu for students |
|
|
|
|
* Return an array with the different choices available |
|
|
|
|
* when the answers between bracket show as a menu |
|
|
|
|
* @param string $correctAnswer |
|
|
|
|
* @param bool $displayForStudent true if we want to shuffle the choices of the menu for students |
|
|
|
|
* |
|
|
|
|
* @return array |
|
|
|
|
*/ |
|
|
|
|
public static function getFillTheBlankMenuAnswers($correctAnswer, $displayForStudent) |
|
|
|
|
@ -502,15 +501,16 @@ class FillBlanks extends Question |
|
|
|
|
if ($displayForStudent) { |
|
|
|
|
shuffle($listChoises); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $listChoises; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the array index of the student answer |
|
|
|
|
* @param $correctAnswer the menu Choice1|Choice2|Choice3 |
|
|
|
|
* @param $studentAnswer the student answer must be Choice1 or Choice2 or Choice3 |
|
|
|
|
* @return int in the exemple 0 1 or 2 depending of the choice of the student |
|
|
|
|
* @param string $correctAnswer the menu Choice1|Choice2|Choice3 |
|
|
|
|
* @param string $studentAnswer the student answer must be Choice1 or Choice2 or Choice3 |
|
|
|
|
* |
|
|
|
|
* @return int in the example 0 1 or 2 depending of the choice of the student |
|
|
|
|
*/ |
|
|
|
|
public static function getFillTheBlankMenuAnswerNum($correctAnswer, $studentAnswer) |
|
|
|
|
{ |
|
|
|
|
@ -520,19 +520,23 @@ class FillBlanks extends Question |
|
|
|
|
return $num; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return -1; // should not happened, because student choose the answer in a menu of possible answers |
|
|
|
|
|
|
|
|
|
// should not happened, because student choose the answer in a menu of possible answers |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the possible answer if the answer between brackets is a multiple choice menu |
|
|
|
|
* @param $correctAnswer |
|
|
|
|
* @param string $correctAnswer |
|
|
|
|
* |
|
|
|
|
* @return array |
|
|
|
|
*/ |
|
|
|
|
public static function getFillTheBlankSeveralAnswers($correctAnswer) |
|
|
|
|
{ |
|
|
|
|
// is answer||Answer||response||Response , mean answer or Answer ... |
|
|
|
|
$listSeveral = api_preg_split("/\|\|/", $correctAnswer); |
|
|
|
|
|
|
|
|
|
return $listSeveral; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -540,8 +544,9 @@ class FillBlanks extends Question |
|
|
|
|
* Return true if student answer is right according to the correctAnswer |
|
|
|
|
* it is not as simple as equality, because of the type of Fill The Blank question |
|
|
|
|
* eg : studentAnswer = 'Un' and correctAnswer = 'Un||1||un' |
|
|
|
|
* @param $studentAnswer the [studentanswer] of the info array of the answer field |
|
|
|
|
* @param $correctAnswer the [tabwords] of the info array of the answer field |
|
|
|
|
* @param string $studentAnswer [studentanswer] of the info array of the answer field |
|
|
|
|
* @param string $correctAnswer [tabwords] of the info array of the answer field |
|
|
|
|
* |
|
|
|
|
* @return bool |
|
|
|
|
*/ |
|
|
|
|
public static function isGoodStudentAnswer($studentAnswer, $correctAnswer) |
|
|
|
|
@ -549,20 +554,27 @@ class FillBlanks extends Question |
|
|
|
|
switch (self::getFillTheBlankAnswerType($correctAnswer)) { |
|
|
|
|
case self::FILL_THE_BLANK_MENU: |
|
|
|
|
$listMenu = self::getFillTheBlankMenuAnswers($correctAnswer, false); |
|
|
|
|
return ($listMenu[0] == $studentAnswer); |
|
|
|
|
$result = $listMenu[0] == $studentAnswer; |
|
|
|
|
break; |
|
|
|
|
case self::FILL_THE_BLANK_SEVERAL_ANSWER: |
|
|
|
|
// the answer must be one of the choice made |
|
|
|
|
$listSeveral = self::getFillTheBlankSeveralAnswers($correctAnswer); |
|
|
|
|
return (in_array($studentAnswer, $listSeveral)); |
|
|
|
|
$result = in_array($studentAnswer, $listSeveral); |
|
|
|
|
break; |
|
|
|
|
case self::FILL_THE_BLANK_STANDARD: |
|
|
|
|
default: |
|
|
|
|
return ($studentAnswer == $correctAnswer); |
|
|
|
|
$result = $studentAnswer == $correctAnswer; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param string $correctAnswer |
|
|
|
|
* |
|
|
|
|
* @return int |
|
|
|
|
*/ |
|
|
|
|
public static function getFillTheBlankAnswerType($correctAnswer) |
|
|
|
|
{ |
|
|
|
|
if (api_strpos($correctAnswer, "|") && !api_strpos($correctAnswer, "||")) { |
|
|
|
|
@ -576,8 +588,8 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return information about the answer |
|
|
|
|
* @param string $userAnswer : the text of the answer of the question |
|
|
|
|
* @param bool $isStudentAnswer : true if it is a student answer and not the empty question model |
|
|
|
|
* @param string $userAnswer the text of the answer of the question |
|
|
|
|
* @param bool $isStudentAnswer true if it's a student answer false the empty question model |
|
|
|
|
* |
|
|
|
|
* @return array of information about the answer |
|
|
|
|
*/ |
|
|
|
|
@ -608,7 +620,7 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
$listAnswerResults['systemstring'] = $listDoubleColon[1]; |
|
|
|
|
|
|
|
|
|
//make sure we only take the last bit to find special marks |
|
|
|
|
// make sure we only take the last bit to find special marks |
|
|
|
|
$listArobaseSplit = explode('@', $listDoubleColon[1]); |
|
|
|
|
|
|
|
|
|
if (count($listArobaseSplit) < 2) { |
|
|
|
|
@ -676,9 +688,11 @@ class FillBlanks extends Question |
|
|
|
|
$listDoubleColon[0] |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// if student answer, the second [] is the student answer, the third is if student scored or not |
|
|
|
|
// if student answer, the second [] is the student answer, |
|
|
|
|
// the third is if student scored or not |
|
|
|
|
$listBrackets = array(); |
|
|
|
|
$listWords = array(); |
|
|
|
|
|
|
|
|
|
if ($isStudentAnswer) { |
|
|
|
|
for ($i=0; $i < count($listAnswerResults['tabwords']); $i++) { |
|
|
|
|
$listBrackets[] = $listAnswerResults['tabwordsbracket'][$i]; |
|
|
|
|
@ -700,15 +714,16 @@ class FillBlanks extends Question |
|
|
|
|
// if we are in student view, we've got 3 times :::::: for common words |
|
|
|
|
$commonWords = api_preg_replace("/::::::/", "::", $commonWords); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$listAnswerResults['commonwords'] = explode("::", $commonWords); |
|
|
|
|
|
|
|
|
|
return $listAnswerResults; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Replace the occurence of blank word with [correct answer][student answer][answer is correct] |
|
|
|
|
* Replace the occurrence of blank word with [correct answer][student answer][answer is correct] |
|
|
|
|
* @param array $listWithStudentAnswer |
|
|
|
|
* |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
public static function getAnswerInStudentAttempt($listWithStudentAnswer) |
|
|
|
|
@ -733,13 +748,35 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* This function is the same than the js one above getBlankSeparatorRegexp |
|
|
|
|
* @param $inChar |
|
|
|
|
* @param string $inChar |
|
|
|
|
* |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
public static function escapeForRegexp($inChar) |
|
|
|
|
{ |
|
|
|
|
if (in_array($inChar, array(".", "+", "*", "?", "[", "^", "]", "$", "(", ")", "{", "}", "=", "!", ">", "|", ":", "-", ")"))) { |
|
|
|
|
$listChars = [ |
|
|
|
|
".", |
|
|
|
|
"+", |
|
|
|
|
"*", |
|
|
|
|
"?", |
|
|
|
|
"[", |
|
|
|
|
"^", |
|
|
|
|
"]", |
|
|
|
|
"$", |
|
|
|
|
"(", |
|
|
|
|
")", |
|
|
|
|
"{", |
|
|
|
|
"}", |
|
|
|
|
"=", |
|
|
|
|
"!", |
|
|
|
|
">", |
|
|
|
|
"|", |
|
|
|
|
":", |
|
|
|
|
"-", |
|
|
|
|
")", |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
if (in_array($inChar, $listChars)) { |
|
|
|
|
return "\\".$inChar; |
|
|
|
|
} else { |
|
|
|
|
return $inChar; |
|
|
|
|
@ -748,13 +785,34 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* return $text protected for use in regexp |
|
|
|
|
* @param $text |
|
|
|
|
* @param string $text |
|
|
|
|
* |
|
|
|
|
* @return mixed |
|
|
|
|
*/ |
|
|
|
|
public static function getRegexpProtected($text) |
|
|
|
|
{ |
|
|
|
|
$listRegexpCharacters = array("/", ".", "+", "*", "?", "[", "^", "]", "$", "(", ")", "{", "}", "=", "!", ">", "|", ":", "-", ")"); |
|
|
|
|
$listRegexpCharacters = [ |
|
|
|
|
"/", |
|
|
|
|
".", |
|
|
|
|
"+", |
|
|
|
|
"*", |
|
|
|
|
"?", |
|
|
|
|
"[", |
|
|
|
|
"^", |
|
|
|
|
"]", |
|
|
|
|
"$", |
|
|
|
|
"(", |
|
|
|
|
")", |
|
|
|
|
"{", |
|
|
|
|
"}", |
|
|
|
|
"=", |
|
|
|
|
"!", |
|
|
|
|
">", |
|
|
|
|
"|", |
|
|
|
|
":", |
|
|
|
|
"-", |
|
|
|
|
")", |
|
|
|
|
]; |
|
|
|
|
$result = $text; |
|
|
|
|
for ($i=0; $i < count($listRegexpCharacters); $i++) { |
|
|
|
|
$result = str_replace($listRegexpCharacters[$i], "\\".$listRegexpCharacters[$i], $result); |
|
|
|
|
@ -785,7 +843,8 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* return the start separator for answer |
|
|
|
|
* @param $number |
|
|
|
|
* @param string $number |
|
|
|
|
* |
|
|
|
|
* @return mixed |
|
|
|
|
*/ |
|
|
|
|
public static function getStartSeparator($number) |
|
|
|
|
@ -797,7 +856,8 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* return the end separator for answer |
|
|
|
|
* @param $number |
|
|
|
|
* @param string $number |
|
|
|
|
* |
|
|
|
|
* @return mixed |
|
|
|
|
*/ |
|
|
|
|
public static function getEndSeparator($number) |
|
|
|
|
|