function wrsqz_save_question_options($questionType, $dbType, &$question) {

    /*Delete old tables*/
  if (($oldproblem = get_records('question_' . $questionType . 'wiris', 'question', $question->id, 'id ASC')) === false) {
		$oldproblem = array();
	}
	
	foreach ($oldproblem as $op) {
		delete_records('question_' . $questionType . 'wiris', 'id', $op->id);
	}
	
	if(($oldproblem = get_records('question_' . $dbType, 'question', $question->id, 'id ASC')) === false) {
		$oldproblem = array();
	}
	
	foreach ($oldproblem as $op) {
		delete_records('question_' . $dbType, 'id', $op->id);
	}

  /*Store new values*/
	if (wrsqz_wirisQuizzesUsed($question)) {
		//common fields
    $problem->id = $problem->idcache = 0;
		$problem->question = $question->id;
    $program = $question->hiddenCASValue;
		$problem->md5 = md5($program);
    //options field

    //1. General options
    $options = array();
    if(!empty($question->wirisCASForComputations)){
      $options['wirisCASForComputations'] = $question->wirisCASForComputations;
    }
    if(!empty($question->hiddenInitialCASValue)){
      $options['hiddenInitialCASValue'] = stripslashes_safe($question->hiddenInitialCASValue);
    }
		
    //2. Question-type specific options
		if ($questionType == 'shortanswer') {
      $eqoptionArray=array();
      if(!empty($question->wirisEditor))
        $eqoptionArray['editor'] = 'true';
      if(!empty($question->multipleAnswers))
        $eqoptionArray['multipleAnswers'] = 'true';
      /*if(!empty($question->wirisCASForComputations))
        $eqoptionArray['wirisCASForComputations']='true';*/
      if(isset($question->testFunctionName)){
        $eqoptionArray['testFunctionName']=array();
        $eqoptionArray['testFunction'] = array();
        //get an indexed answer id array. this is done because answers are reordered
        //when are saved, skipping blank ones.
        if(isset($question->answers)){
          $answersList = explode(',',$question->answers);
        }else{
          $answersList = explode(',',wrsqz_deprecated_answersList($question));
        }
        $k=0;
        $answersId=array();
        foreach ($question->answer as $key => $dataanswer) {
          if (!(trim($dataanswer) == '' && $question->fraction[$key] == 0 && wrsqz_html_is_blank($question->feedback[$key]))) {
            $answersId[$key]=$answersList[$k];
            $k++;
          }
        }

        foreach($question->testFunctionName as $index => $value){
          if(!empty($value) && trim($value)!=''){
            $eqoptionArray['testFunctionName'][$index] = $value;
            if(isset($answersId[$index])){
              $eqoptionArray['testFunction'][$answersId[$index]]=$index;
            }
          }
        }
      }
      if(function_exists('http_build_query')){
        $problem->eqoption = http_build_query($eqoptionArray,null,'&');
      }else{
        $problem->eqoption = wrsqz_http_build_query($eqoptionArray);
      }
            
      if(!isset($problem->eqoption) || $problem->eqoption == null){
        $problem->eqoption='';
      }
            
		}else if ($questionType == 'truefalse') {
			$wirisAnswer = trim($question->wirisAnswer);
			$problem->override = (!empty($wirisAnswer)) ? $wirisAnswer : '';
		}else if ($questionType == 'multichoice') {
			$problem->override = implode(';', $question->gradeOverride);
		}else if ($questionType == 'multianswer'){
      $problem->eqoption = (empty($question->wirisEditor)) ? '' : 'editor=true&';
    }

    //serialize & save options field
    $problem->options = serialize($options);

		if (insert_record('question_' . $questionType . 'wiris', $problem) !== false) {
			unset($problem);
			
			$problem->id = 0;
			$problem->question = $question->id;
			$problem->program = $question->hiddenCASValue;

			if (insert_record('question_' . $dbType, $problem) !== false) {
				return true;
			}

			$result->error = 'Could not insert quiz WIRIS exercice!'; 
			return $result;
		}

		$result->error = 'Could not insert quiz ' . $questionType . 'wiris options!';
		return $result;
	}
	
	$question->qtype = $questionType;
	return update_record('question', $question);
}
예제 #2
0
function wrsqz_set_data($questionType, $dbType, &$mform, &$question) {
	$default_values = array();
	//common options
  if(isset($question->options->wiris->options)){
    $options = $question->options->wiris->options;
    if(isset($options['wirisCASForComputations'])){
      $default_values['wirisCASForComputations'] = $options['wirisCASForComputations'];
    }
    if(isset($options['hiddenInitialCASValue'])){
      $default_values['hiddenInitialCASValue'] = $options['hiddenInitialCASValue'];
    }
  }

  //question-type specific options
	if ($questionType == 'shortanswer' && isset($question) && isset($question->options) && isset($question->options->wiris) && isset($question->options->wiris->eqoption)) {
		$default_values['wirisEditor'] = '';
		mb_parse_str($question->options->wiris->eqoption, $eqoptionArray);

		if (isset($eqoptionArray['editor']) && $eqoptionArray['editor'] == 'true') {
			$default_values['wirisEditor'] = '1';
		}
		if (isset($eqoptionArray['multipleAnswers']) && $eqoptionArray['multipleAnswers'] == 'true') {
			$default_values['multipleAnswers'] = '1';
		}
		/*if (isset($eqoptionArray['wirisCASForComputations']) && $eqoptionArray['wirisCASForComputations'] == 'true') {
			$default_values['wirisCASForComputations'] = '1';
		}*/

		if (isset($eqoptionArray['testFunction'])){
      //set testFunctionNames where their associated answers are
      $index = 0;
      
      foreach ($question->options->answers as $answer){
        if (isset($eqoptionArray['testFunction'][$answer->id])){
          $testFunctionNameIndex = $eqoptionArray['testFunction'][$answer->id];
          $default_values['testFunctionName['.$index.']'] = $eqoptionArray['testFunctionName'][$testFunctionNameIndex];
          unset($eqoptionArray['testFunctionName'][$testFunctionNameIndex]);
        }
        $index++;
      }
      //set test functions with no associated answer.
      foreach($eqoptionArray['testFunctionName'] as $key => $value){
        $default_values['testFunctionName['.$index.']'] = $value;
        $index++;
      }
    }else if (isset($eqoptionArray['testFunctionName'])){
      //Backwards compatibility for old WIRIS quizzes (didn't have testFunction attribute).
      foreach ($eqoptionArray['testFunctionName'] as $index => $value){
        $default_values['testFunctionName['.$index.']'] = $eqoptionArray['testFunctionName'][$index];
      }
    }

	}else if($questionType == 'multianswer' && isset($question) 
    && isset($question->options) && isset($question->options->wiris)
    && isset($question->options->wiris->eqoption)){

    mb_parse_str($question->options->wiris->eqoption, $eqoptionArray);
    if (isset($eqoptionArray['editor']) && $eqoptionArray['editor'] == 'true') {
			$default_values['wirisEditor'] = '1';
		} else {
      $default_values['wirisEditor'] = '';
    }
  }

	if (isset($question) && isset($question->options) && isset($question->options->wiris) && !empty($question->options->wiris->override)) {
		if ($questionType == 'multichoice') {
			$overrideList = explode(';', $question->options->wiris->override);
			
			foreach ($overrideList as $key => $value) {
				$default_values['gradeOverride[' . $key . ']'] = $value;
			}
		}else if ($questionType == 'truefalse') {
			$overrideList = explode(';', $question->options->wiris->override);
			$default_values['wirisAnswer'] = $overrideList[0];
		}
	}

	global $CFG;
	
	$pos = ($mform->_elementIndex['hiddenCASValue']);
	$value = trim($mform->_elements[$pos]->_attributes['value']);

  $selectedLang = optional_param('WIRISCASLang','',PARAM_ALPHA);
  $availableLangs = wrsqz_getAvailableCASLangs();

	if (!empty($value)) {
		$program = $value;
    $sessionLang = wrsqz_CASLanguageFromSession($program);
    if(in_array($selectedLang, $availableLangs) && $selectedLang != $sessionLang){
      //We have to translate the WIRIS session
      $translation = wrsqz_translateCASSession($program,$selectedLang);
      if($translation !==false){
        $program = $translation[0];
        $CASLang = $selectedLang;
        //Rearrange all form fields with the new named variables (at the end of the function).
      }else{
        //We couldn't translate the program. Do nothing
        $CASLang = $sessionLang;
      }
    }else{
      $CASLang = $sessionLang;
    }
	}else{
        if (isset($question) && isset($question->id)
        && ($program = wrsqz_getProgram($questionType, $question->id)) !== false
        && !empty($program)) {
            $CASLang = wrsqz_CASLanguageFromSession($program);
        }else {
            $CASLang = wrsqz_currentCASLanguage();
            $program = wrsqz_getDefaultCASCode($CASLang);
        }
    }

  $default_values['htmlWirisEditor']  = '<applet  name="WirisCASApplet" code="' . wrsqz_getCASClass($CASLang) . '" codebase="' . $CFG->wiriscascodebase . '" archive="' . wrsqz_getCASArchive($CASLang) . '" height="450" WIDTH="100%">';
	$default_values['htmlWirisEditor'] .= '<param name="version" value="2.0"/>';
	$default_values['htmlWirisEditor'] .= '<param name="command" value="false"/>';
	$default_values['htmlWirisEditor'] .= '<param name="commands" value="false"/>';
	$default_values['htmlWirisEditor'] .= '<param name="interface" value="false"/>';
	$default_values['htmlWirisEditor'] .= '<param name="XMLinitialText" value="' . htmlentities($program, ENT_QUOTES, 'UTF-8') . '"/>';
	$default_values['htmlWirisEditor'] .= '</applet>';
  $default_values['WIRISCASLang'] = $CASLang;
    
	// defined only because we call wrsqz_wirisQuizzesUsed
  $default_values['hiddenCASValue'] = $program;

  $question = (object)(array_merge((array)$question, $default_values));

  if(isset($translation) && ! empty($translation[1])){
        //If WIRIS CAS program had to be translated, there may be references (#a) to
        //old variable names, so replace them.
    wrsqz_replaceVarReferencesInFlatQuestion($questionType, $question, $translation[1]);
    wrsqz_replaceVarReferencesInForm($questionType, $mform, $translation[1]);
  }

  // If uses wiris quizzes, display advanced otherwise the program
  // is lost if the advanced button is never clicked
  if (wrsqz_wirisQuizzesUsed($question)) {
     $mform->setShowAdvanced(1);
  }

}