|
|
|
|
@ -23,22 +23,22 @@ class FillBlanks extends Question |
|
|
|
|
public function __construct() |
|
|
|
|
{ |
|
|
|
|
parent::__construct(); |
|
|
|
|
$this -> type = FILL_IN_BLANKS; |
|
|
|
|
$this -> isContent = $this-> getIsContent(); |
|
|
|
|
$this->type = FILL_IN_BLANKS; |
|
|
|
|
$this->isContent = $this->getIsContent(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* function which redefines Question::createAnswersForm |
|
|
|
|
* @param the formvalidator instance |
|
|
|
|
* @param FormValidator $form |
|
|
|
|
*/ |
|
|
|
|
function createAnswersForm($form) |
|
|
|
|
public function createAnswersForm($form) |
|
|
|
|
{ |
|
|
|
|
$fillBlanksAllowedSeparator = self::getAllowedSeparator(); |
|
|
|
|
|
|
|
|
|
$defaults = array(); |
|
|
|
|
|
|
|
|
|
if (!empty($this->id)) { |
|
|
|
|
$objectAnswer = new answer($this->id); |
|
|
|
|
$objectAnswer = new Answer($this->id); |
|
|
|
|
$answer = $objectAnswer->selectAnswer(1); |
|
|
|
|
$listAnswersInfo = FillBlanks::getAnswerInfo($answer); |
|
|
|
|
|
|
|
|
|
@ -69,7 +69,6 @@ class FillBlanks extends Question |
|
|
|
|
$setValues .= 'document.getElementById("weighting['.$i.']").value = "'.$weighting.'";'; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// javascript |
|
|
|
|
echo '<script> |
|
|
|
|
|
|
|
|
|
@ -78,23 +77,21 @@ class FillBlanks extends Question |
|
|
|
|
var blankSeparatortStartRegexp = getBlankSeparatorRegexp(blankSeparatortStart); |
|
|
|
|
var blankSeparatortEndRegexp = getBlankSeparatorRegexp(blankSeparatortEnd); |
|
|
|
|
|
|
|
|
|
function FCKeditor_OnComplete( editorInstance ) { |
|
|
|
|
if (window.attachEvent) { |
|
|
|
|
editorInstance.EditorDocument.attachEvent("onkeyup", updateBlanks) ; |
|
|
|
|
} else { |
|
|
|
|
editorInstance.EditorDocument.addEventListener("keyup",updateBlanks,true); |
|
|
|
|
CKEDITOR.on("instanceCreated", function(e) { |
|
|
|
|
if (e.editor.name === "answer") { |
|
|
|
|
e.editor.on("change", updateBlanks); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
var firstTime = true; |
|
|
|
|
|
|
|
|
|
function updateBlanks() { |
|
|
|
|
function updateBlanks() |
|
|
|
|
{ |
|
|
|
|
if (firstTime) { |
|
|
|
|
var field = document.getElementById("answer"); |
|
|
|
|
var answer = field.value; |
|
|
|
|
} else { |
|
|
|
|
var oEditor = FCKeditorAPI.GetInstance("answer"); |
|
|
|
|
var answer = oEditor.EditorDocument.body.innerHTML; |
|
|
|
|
var answer = CKEDITOR.instances["answer"].getData(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// disable the save button, if not blanks have been created |
|
|
|
|
@ -104,13 +101,12 @@ class FillBlanks extends Question |
|
|
|
|
var blanksRegexp = "/"+blankSeparatortStartRegexp+"[^"+blankSeparatortStartRegexp+"]*"+blankSeparatortEndRegexp+"/g"; |
|
|
|
|
|
|
|
|
|
var blanks = answer.match(eval(blanksRegexp)); |
|
|
|
|
var fields = "<div class=\"control-group\">"; |
|
|
|
|
fields += "<label class=\"control-label\">'.get_lang('Weighting').'</label>"; |
|
|
|
|
fields += "<div class=\"controls\">"; |
|
|
|
|
var fields = "<div class=\"form-group \">"; |
|
|
|
|
fields += "<label class=\"col-sm-2 control-label\">'.get_lang('Weighting').'</label>"; |
|
|
|
|
fields += "<div class=\"col-sm-8\">"; |
|
|
|
|
fields += "<table>"; |
|
|
|
|
fields += "<tr><th style=\"padding:0 20px\">'.get_lang("WordTofind").'</th><th style=\"padding:0 20px\">'.get_lang("QuestionWeighting").'</th><th style=\"padding:0 20px\">'.get_lang("BlankInputSize").'</th></tr>"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (blanks != null) { |
|
|
|
|
for (var i=0 ; i < blanks.length ; i++){ |
|
|
|
|
// remove forbidden characters that causes bugs |
|
|
|
|
@ -135,7 +131,7 @@ class FillBlanks extends Question |
|
|
|
|
} |
|
|
|
|
fields += "<tr>"; |
|
|
|
|
fields += "<td>"+blanks[i]+"</td>"; |
|
|
|
|
fields += "<td><input style=\"width:20px\" value=\""+value+"\" type=\"text\" id=\"weighting["+i+"]\" name=\"weighting["+i+"]\" /></td>"; |
|
|
|
|
fields += "<td><input style=\"width:35px\" value=\""+value+"\" type=\"text\" id=\"weighting["+i+"]\" name=\"weighting["+i+"]\" /></td>"; |
|
|
|
|
fields += "<td>"; |
|
|
|
|
fields += "<input type=\"button\" value=\"-\" onclick=\"changeInputSize(-1, "+i+")\">"; |
|
|
|
|
fields += "<input type=\"button\" value=\"+\" onclick=\"changeInputSize(1, "+i+")\">"; |
|
|
|
|
@ -151,21 +147,24 @@ class FillBlanks extends Question |
|
|
|
|
document.getElementById("blanks_weighting").innerHTML = fields + "</table></div></div>"; |
|
|
|
|
if (firstTime) { |
|
|
|
|
firstTime = false; |
|
|
|
|
'; |
|
|
|
|
'; |
|
|
|
|
|
|
|
|
|
if (isset($listAnswersInfo) && count($listAnswersInfo["tabweighting"]) > 0) { |
|
|
|
|
|
|
|
|
|
if (count($listAnswersInfo["tabweighting"]) > 0) { |
|
|
|
|
foreach ($listAnswersInfo["tabweighting"] as $i => $weighting) { |
|
|
|
|
echo 'document.getElementById("weighting['.$i.']").value = "'.$weighting.'";'; |
|
|
|
|
if (!empty($i)) { |
|
|
|
|
echo 'document.getElementById("weighting['.$i.']").value = "'.$weighting.'";'; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
foreach ($listAnswersInfo["tabinputsize"] as $i => $sizeOfInput) { |
|
|
|
|
echo 'document.getElementById("sizeofinput['.$i.']").value = "'.$sizeOfInput.'";'; |
|
|
|
|
echo '$("#samplesize\\\['.$i.'\\\]").width('.$sizeOfInput.');'; |
|
|
|
|
if (!empty($i)) { |
|
|
|
|
echo 'document.getElementById("sizeofinput['.$i.']").value = "'.$sizeOfInput.'";'; |
|
|
|
|
echo '$("#samplesize\\\['.$i.'\\\]").width('.$sizeOfInput.');'; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
echo '} |
|
|
|
|
'; |
|
|
|
|
|
|
|
|
|
echo ' |
|
|
|
|
echo '} |
|
|
|
|
} |
|
|
|
|
window.onload = updateBlanks; |
|
|
|
|
|
|
|
|
|
@ -257,26 +256,32 @@ class FillBlanks extends Question |
|
|
|
|
</script>'; |
|
|
|
|
|
|
|
|
|
// answer |
|
|
|
|
$form->addElement ('label', null, '<br /><br />'.get_lang('TypeTextBelow').', '.get_lang('And').' '.get_lang('UseTagForBlank')); |
|
|
|
|
$form->addElement ('html_editor', 'answer', '<img src="../img/fill_field.png">','id="answer" cols="122" rows="6" onkeyup="javascript: updateBlanks(this);"', array('ToolbarSet' => 'TestQuestionDescription', 'Width' => '100%', 'Height' => '350')); |
|
|
|
|
$form -> addRule ('answer',get_lang('GiveText'),'required'); |
|
|
|
|
$form->addElement('label', null, '<br /><br />'.get_lang('TypeTextBelow').', '.get_lang('And').' '.get_lang('UseTagForBlank')); |
|
|
|
|
$form->addElement( |
|
|
|
|
'html_editor', |
|
|
|
|
'answer', |
|
|
|
|
'<img src="../img/fill_field.png">', |
|
|
|
|
['id' => 'answer', 'onkeyup' => "javascript: updateBlanks(this);"], |
|
|
|
|
array('ToolbarSet' => 'TestQuestionDescription') |
|
|
|
|
); |
|
|
|
|
$form->addRule('answer',get_lang('GiveText'),'required'); |
|
|
|
|
|
|
|
|
|
//added multiple answers |
|
|
|
|
$form->addElement ('checkbox','multiple_answer','', get_lang('FillInBlankSwitchable')); |
|
|
|
|
$form->addElement('checkbox','multiple_answer','', get_lang('FillInBlankSwitchable')); |
|
|
|
|
$form->addElement('select', 'select_separator', get_lang("SelectFillTheBlankSeparator"), self::getAllowedSeparatorForSelect(), ' id="select_separator" style="width:150px" onchange="changeBlankSeparator()" '); |
|
|
|
|
$form->addElement ('label', null, '<input type="button" onclick="updateBlanks()" value="'.get_lang('RefreshBlanks').'" class="btn" />'); |
|
|
|
|
$form->addElement('label', null, '<input type="button" onclick="updateBlanks()" value="'.get_lang('RefreshBlanks').'" class="btn" />'); |
|
|
|
|
$form->addElement('html','<div id="blanks_weighting"></div>'); |
|
|
|
|
|
|
|
|
|
global $text, $class; |
|
|
|
|
global $text; |
|
|
|
|
// setting the save button here and not in the question class.php |
|
|
|
|
$form->addElement('html','<div id="defineoneblank" style="color:#D04A66; margin-left:160px">'.get_lang('DefineBlanks').'</div>'); |
|
|
|
|
$form->addElement('style_submit_button','submitQuestion',$text, 'class="'.$class.'"'); |
|
|
|
|
$form->addButtonSave($text, 'submitQuestion'); |
|
|
|
|
|
|
|
|
|
if (!empty($this -> id)) { |
|
|
|
|
$form -> setDefaults($defaults); |
|
|
|
|
if (!empty($this->id)) { |
|
|
|
|
$form->setDefaults($defaults); |
|
|
|
|
} else { |
|
|
|
|
if ($this -> isContent == 1) { |
|
|
|
|
$form -> setDefaults($defaults); |
|
|
|
|
if ($this->isContent == 1) { |
|
|
|
|
$form->setDefaults($defaults); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -318,15 +323,20 @@ class FillBlanks extends Question |
|
|
|
|
// remove forbidden chars |
|
|
|
|
$matchingResult = str_replace("/\\/", "", $matchingResult); |
|
|
|
|
$matchingResult = str_replace('/"/', "", $matchingResult); |
|
|
|
|
|
|
|
|
|
return $blankStartSeparator.$matchingResult.$blankEndSeparator; |
|
|
|
|
}, |
|
|
|
|
$answer |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// get the blanks weightings |
|
|
|
|
$nb = preg_match_all('/'.$blankStartSeparatorRegexp.'[^'.$blankStartSeparatorRegexp.']*'.$blankEndSeparatorRegexp.'/', $answer, $blanks); |
|
|
|
|
$nb = preg_match_all( |
|
|
|
|
'/'.$blankStartSeparatorRegexp.'[^'.$blankStartSeparatorRegexp.']*'.$blankEndSeparatorRegexp.'/', |
|
|
|
|
$answer, |
|
|
|
|
$blanks |
|
|
|
|
); |
|
|
|
|
if (isset($_GET['editQuestion'])) { |
|
|
|
|
$this -> weighting = 0; |
|
|
|
|
$this->weighting = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* if we have some [tobefound] in the text |
|
|
|
|
@ -356,7 +366,7 @@ class FillBlanks extends Question |
|
|
|
|
if ($i != $nb - 1) { |
|
|
|
|
$answer .= ","; |
|
|
|
|
} |
|
|
|
|
// calculate the global weightning for the question |
|
|
|
|
// calculate the global weighting for the question |
|
|
|
|
$this -> weighting += $form->getSubmitValue('weighting['.$i.']'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -387,10 +397,10 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
// Allow answers order switches |
|
|
|
|
$is_multiple = $form -> getSubmitValue('multiple_answer'); |
|
|
|
|
$answer.='@'.$is_multiple; |
|
|
|
|
$answer.= '@'.$is_multiple; |
|
|
|
|
|
|
|
|
|
$this -> save(); |
|
|
|
|
$objAnswer = new answer($this->id); |
|
|
|
|
$this->save(); |
|
|
|
|
$objAnswer = new Answer($this->id); |
|
|
|
|
$objAnswer->createAnswer($answer, 0, '', 0, 1); |
|
|
|
|
$objAnswer->save(); |
|
|
|
|
} |
|
|
|
|
@ -423,8 +433,18 @@ class FillBlanks extends Question |
|
|
|
|
* @param $displayForStudent |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
public static function getFillTheBlankHtml($separatorStartRegexp, $separatorEndRegexp, $correctItemRegexp, $questionId, $correctItem, $attributes, $answer, $listAnswersInfo, $displayForStudent, $inBlankNumber) |
|
|
|
|
{ |
|
|
|
|
public static function getFillTheBlankHtml( |
|
|
|
|
$separatorStartRegexp, |
|
|
|
|
$separatorEndRegexp, |
|
|
|
|
$correctItemRegexp, |
|
|
|
|
$questionId, |
|
|
|
|
$correctItem, |
|
|
|
|
$attributes, |
|
|
|
|
$answer, |
|
|
|
|
$listAnswersInfo, |
|
|
|
|
$displayForStudent, |
|
|
|
|
$inBlankNumber |
|
|
|
|
) { |
|
|
|
|
$result = ""; |
|
|
|
|
$inTabTeacherSolution = $listAnswersInfo['tabwords']; |
|
|
|
|
$inTeacherSolution = $inTabTeacherSolution[$inBlankNumber]; |
|
|
|
|
@ -554,8 +574,9 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return information about the answer |
|
|
|
|
* @param string $answer : the text of the answer of the question |
|
|
|
|
* @param bool $inIsStudentAnswer : 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 is a student answer and not the empty question model |
|
|
|
|
* |
|
|
|
|
* @return array of information about the answer |
|
|
|
|
*/ |
|
|
|
|
public static function getAnswerInfo($userAnswer = "", $isStudentAnswer = false) |
|
|
|
|
@ -571,12 +592,13 @@ class FillBlanks extends Question |
|
|
|
|
$listAnswerResults['studentanswer'] = array(); |
|
|
|
|
$listAnswerResults['studentscore'] = array(); |
|
|
|
|
$listAnswerResults['blankseparatornumber'] = 0; |
|
|
|
|
$listDoubleColon = array(); |
|
|
|
|
|
|
|
|
|
api_preg_match("/(.*)::(.*)$/s", $userAnswer, $listResult); |
|
|
|
|
|
|
|
|
|
if (count($listResult) < 2) { |
|
|
|
|
$listDoubleColon[] = $listResult; |
|
|
|
|
$listDoubleColon[] = ""; |
|
|
|
|
$listDoubleColon[] = ''; |
|
|
|
|
$listDoubleColon[] = ''; |
|
|
|
|
} else { |
|
|
|
|
$listDoubleColon[] = $listResult[1]; |
|
|
|
|
$listDoubleColon[] = $listResult[2]; |
|
|
|
|
@ -586,11 +608,12 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
//make sure we only take the last bit to find special marks |
|
|
|
|
$listArobaseSplit = explode('@', $listDoubleColon[1]); |
|
|
|
|
|
|
|
|
|
if (count($listArobaseSplit) < 2) { |
|
|
|
|
$listArobaseSplit[1] = ""; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//take the complete string except after the last '::' |
|
|
|
|
// take the complete string except after the last '::' |
|
|
|
|
$listDetails = explode(":", $listArobaseSplit[0]); |
|
|
|
|
|
|
|
|
|
// < number of item after the ::[score]:[size]:[separator_id]@ , here there are 3 |
|
|
|
|
@ -621,7 +644,12 @@ class FillBlanks extends Question |
|
|
|
|
$blankCharEndForRegexp = self::escapeForRegexp($blankCharEnd); |
|
|
|
|
|
|
|
|
|
// get all blanks words |
|
|
|
|
$listAnswerResults['wordsCount'] = preg_match_all('/'.$blankCharStartForRegexp.'[^'.$blankCharEndForRegexp.']*'.$blankCharEndForRegexp.'/', $listDoubleColon[0], $listWords); |
|
|
|
|
$listAnswerResults['wordsCount'] = preg_match_all( |
|
|
|
|
'/'.$blankCharStartForRegexp.'[^'.$blankCharEndForRegexp.']*'.$blankCharEndForRegexp.'/', |
|
|
|
|
$listDoubleColon[0], |
|
|
|
|
$listWords |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if ($listAnswerResults['wordsCount'] > 0) { |
|
|
|
|
$listAnswerResults['tabwordsbracket'] = $listWords[0]; |
|
|
|
|
// remove [ and ] in string |
|
|
|
|
@ -640,7 +668,11 @@ class FillBlanks extends Question |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// get all common words |
|
|
|
|
$commonWords = preg_replace('/'.$blankCharStartForRegexp.'[^'.$blankCharEndForRegexp.']*'.$blankCharEndForRegexp.'/', "::", $listDoubleColon[0]); |
|
|
|
|
$commonWords = preg_replace( |
|
|
|
|
'/'.$blankCharStartForRegexp.'[^'.$blankCharEndForRegexp.']*'.$blankCharEndForRegexp.'/', |
|
|
|
|
"::", |
|
|
|
|
$listDoubleColon[0] |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// if student answer, the second [] is the student answer, the third is if student scored or not |
|
|
|
|
$listBrackets = array(); |
|
|
|
|
@ -649,11 +681,13 @@ class FillBlanks extends Question |
|
|
|
|
for ($i=0; $i < count($listAnswerResults['tabwords']); $i++) { |
|
|
|
|
$listBrackets[] = $listAnswerResults['tabwordsbracket'][$i]; |
|
|
|
|
$listWords[] = $listAnswerResults['tabwords'][$i]; |
|
|
|
|
if ($i+1 < count($listAnswerResults['tabwords'])) { // should always be |
|
|
|
|
if ($i+1 < count($listAnswerResults['tabwords'])) { |
|
|
|
|
// should always be |
|
|
|
|
$i++; |
|
|
|
|
} |
|
|
|
|
$listAnswerResults['studentanswer'][] = $listAnswerResults['tabwords'][$i]; |
|
|
|
|
if ($i+1 < count($listAnswerResults['tabwords'])) { // should always be |
|
|
|
|
if ($i+1 < count($listAnswerResults['tabwords'])) { |
|
|
|
|
// should always be |
|
|
|
|
$i++; |
|
|
|
|
} |
|
|
|
|
$listAnswerResults['studentscore'][] = $listAnswerResults['tabwords'][$i]; |
|
|
|
|
@ -820,12 +854,12 @@ class FillBlanks extends Question |
|
|
|
|
|
|
|
|
|
// rebuild the sentence with student answer inserted |
|
|
|
|
for ($i=0; $i < count($listStudentAnswerInfo['commonwords']); $i++) { |
|
|
|
|
$result .= $listStudentAnswerInfo['commonwords'][$i]; |
|
|
|
|
$result .= $listStudentAnswerInfo['studentanswer'][$i]; |
|
|
|
|
$result .= isset($listStudentAnswerInfo['commonwords'][$i]) ? $listStudentAnswerInfo['commonwords'][$i] : ''; |
|
|
|
|
$result .= isset($listStudentAnswerInfo['studentanswer'][$i]) ? $listStudentAnswerInfo['studentanswer'][$i] : ''; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// the last common word (should be </p>) |
|
|
|
|
$result .= $listStudentAnswerInfo['commonwords'][$i]; |
|
|
|
|
$result .= isset($listStudentAnswerInfo['commonwords'][$i]) ? $listStudentAnswerInfo['commonwords'][$i] : ''; |
|
|
|
|
return $result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|