public function set_site_defaults()
 {
     $stackconfig = stack_utils::get_config();
     // Display option does not match up to $stackconfig->mathsdisplay).
     $this->set_option('multiplicationsign', $stackconfig->multiplicationsign);
     $this->set_option('complexno', $stackconfig->complexno);
     $this->set_option('inversetrig', $stackconfig->inversetrig);
     $this->set_option('matrixparens', $stackconfig->matrixparens);
     $this->set_option('floats', (bool) $stackconfig->inputforbidfloat);
     $this->set_option('sqrtsign', (bool) $stackconfig->sqrtsign);
     $this->set_option('simplify', (bool) $stackconfig->questionsimplify);
     $this->set_option('assumepos', (bool) $stackconfig->assumepositive);
     return true;
 }
 public function formulation_and_controls(question_attempt $qa, question_display_options $options)
 {
     $question = $qa->get_question();
     $response = $qa->get_last_qt_data();
     $questiontext = $question->questiontextinstantiated;
     // Replace inputs.
     $inputstovaldiate = array();
     $qaid = null;
     foreach ($question->inputs as $name => $input) {
         $fieldname = $qa->get_qt_field_name($name);
         $state = $question->get_input_state($name, $response);
         $questiontext = str_replace("[[input:{$name}]]", $input->render($state, $fieldname, $options->readonly), $questiontext);
         $feedback = $this->input_validation($fieldname . '_val', $input->render_validation($state, $fieldname));
         $questiontext = str_replace("[[validation:{$name}]]", $feedback, $questiontext);
         $qaid = $qa->get_database_id();
         if ($input->requires_validation()) {
             $inputstovaldiate[] = $name;
         }
     }
     // Replace PRTs.
     foreach ($question->prts as $index => $prt) {
         $feedback = '';
         if ($options->feedback) {
             $feedback = $this->prt_feedback($index, $response, $qa, $options, true);
         } else {
             if (in_array($qa->get_behaviour_name(), array('interactivecountback', 'adaptivemulipart'))) {
                 // The behaviour name test here is a hack. The trouble is that interactive
                 // behaviour or adaptivemulipart does not show feedback if the input
                 // is invalid, but we want to show the CAS errors from the PRT.
                 $result = $question->get_prt_result($index, $response, $qa->get_state()->is_finished());
                 $feedback = html_writer::nonempty_tag('div', $result->errors, array('class' => 'stackprtfeedback stackprtfeedback-' . $name));
             }
         }
         $questiontext = str_replace("[[feedback:{$index}]]", $feedback, $questiontext);
     }
     // Now format the questiontext.  This should be done after the subsitutions of inputs and PRTs.
     $questiontext = $question->format_text(stack_maths::process_display_castext($questiontext, $this), $question->questiontextformat, $qa, 'question', 'questiontext', $question->id);
     // Initialise automatic validation, if enabled.
     if ($qaid && stack_utils::get_config()->ajaxvalidation) {
         $this->page->requires->yui_module('moodle-qtype_stack-input', 'M.qtype_stack.init_inputs', array($inputstovaldiate, $qaid, $qa->get_field_prefix()));
     }
     $result = '';
     $result .= $this->question_tests_link($question, $options) . $questiontext;
     if ($qa->get_state() == question_state::$invalid) {
         $result .= html_writer::nonempty_tag('div', $question->get_validation_error($response), array('class' => 'validationerror'));
     }
     return $result;
 }
// Check permissions.
require_login();
$context = context_system::instance();
require_capability('moodle/site:config', $context);
// Set up page.
$PAGE->set_context($context);
$PAGE->set_url('/question/type/stack/healthcheck.php');
$title = stack_string('healthcheck');
$PAGE->set_title($title);
// Clear the cache if requested.
if (data_submitted() && optional_param('clearcache', false, PARAM_BOOL)) {
    require_sesskey();
    stack_cas_connection_db_cache::clear_cache($DB);
    redirect($PAGE->url);
}
$config = stack_utils::get_config();
// Start output.
echo $OUTPUT->header();
echo $OUTPUT->heading($title);
// Summary
// This array holds summary info, for a table at the end of the pager.
$summary = array();
// LaTeX.
echo $OUTPUT->heading(stack_string('healthchecklatex'), 3);
echo html_writer::tag('p', stack_string('healthcheckmathsdisplaymethod', stack_maths::configured_output_name()));
echo html_writer::tag('p', stack_string('healthchecklatexintro'));
echo html_writer::tag('dt', stack_string('texdisplaystyle'));
echo html_writer::tag('dd', format_text(stack_string('healthchecksampledisplaytex')));
echo html_writer::tag('dt', stack_string('texinlinestyle'));
echo html_writer::tag('dd', format_text(stack_string('healthchecksampleinlinetex')));
if ($config->mathsdisplay === 'mathjax') {
 protected function definition_inner($mform)
 {
     // Load the configuration.
     $this->stackconfig = stack_utils::get_config();
     // Prepare input types.
     $this->typechoices = stack_input_factory::get_available_type_choices();
     // Prepare answer test types.
     $answertests = stack_ans_test_controller::get_available_ans_tests();
     // Algebraic Equivalence should be the default test, and first on the list.
     // This does not come first in the alphabet of all languages.
     $default = 'AlgEquiv';
     $defaultstr = stack_string($answertests[$default]);
     unset($answertests[$default]);
     $this->answertestchoices = array();
     foreach ($answertests as $test => $string) {
         $this->answertestchoices[$test] = stack_string($string);
     }
     stack_utils::sort_array($this->answertestchoices);
     $this->answertestchoices = array_merge(array($default => $defaultstr), $this->answertestchoices);
     // Prepare score mode choices.
     $this->scoremodechoices = array('=' => '=', '+' => '+', '-' => '-');
     $inputnames = $this->get_input_names_from_question_text();
     $prtnames = $this->get_prt_names_from_question();
     // Note that for the editor elements, we are using
     // $mform->getElement('prtincorrect')->setValue(...);
     // instead of setDefault, because setDefault does not work for editors.
     $mform->addHelpButton('questiontext', 'questiontext', 'qtype_stack');
     $mform->addRule('questiontext', stack_string('questiontextnonempty'), 'required', '', 'client');
     $qvars = $mform->createElement('textarea', 'questionvariables', stack_string('questionvariables'), array('rows' => 5, 'cols' => 80));
     $mform->insertElementBefore($qvars, 'questiontext');
     $mform->addHelpButton('questionvariables', 'questionvariables', 'qtype_stack');
     $seed = $mform->createElement('text', 'variantsselectionseed', stack_string('variantsselectionseed'), array('size' => 50));
     $mform->insertElementBefore($seed, 'questiontext');
     $mform->setType('variantsselectionseed', PARAM_RAW);
     $mform->addHelpButton('variantsselectionseed', 'variantsselectionseed', 'qtype_stack');
     $sf = $mform->createElement('editor', 'specificfeedback', get_string('specificfeedback', 'question'), array('rows' => 10), $this->editoroptions);
     $mform->insertElementBefore($sf, 'generalfeedback');
     $mform->getElement('specificfeedback')->setValue(array('text' => self::DEFAULT_SPECIFIC_FEEDBACK));
     $mform->addHelpButton('specificfeedback', 'specificfeedback', 'qtype_stack');
     $mform->addHelpButton('generalfeedback', 'generalfeedback', 'qtype_stack');
     $mform->addElement('textarea', 'questionnote', stack_string('questionnote'), array('rows' => 2, 'cols' => 80));
     $mform->addHelpButton('questionnote', 'questionnote', 'qtype_stack');
     $mform->addElement('submit', 'verify', stack_string('verifyquestionandupdate'));
     $mform->registerNoSubmitButton('verify');
     // Inputs.
     foreach ($inputnames as $inputname => $counts) {
         $this->definition_input($inputname, $mform, $counts);
     }
     // PRTs.
     foreach ($prtnames as $prtname => $count) {
         $this->definition_prt($prtname, $mform, $count);
     }
     // Options.
     $mform->addElement('header', 'optionsheader', stack_string('options'));
     $mform->addElement('selectyesno', 'questionsimplify', stack_string('questionsimplify'));
     $mform->setDefault('questionsimplify', $this->stackconfig->questionsimplify);
     $mform->addHelpButton('questionsimplify', 'autosimplify', 'qtype_stack');
     $mform->addElement('selectyesno', 'assumepositive', stack_string('assumepositive'));
     $mform->setDefault('assumepositive', $this->stackconfig->assumepositive);
     $mform->addHelpButton('assumepositive', 'assumepositive', 'qtype_stack');
     $mform->addElement('editor', 'prtcorrect', stack_string('prtcorrectfeedback'), array('rows' => 1), $this->editoroptions);
     $mform->getElement('prtcorrect')->setValue(array('text' => $this->stackconfig->prtcorrect));
     $mform->addElement('editor', 'prtpartiallycorrect', stack_string('prtpartiallycorrectfeedback'), array('rows' => 1), $this->editoroptions);
     $mform->getElement('prtpartiallycorrect')->setValue(array('text' => $this->stackconfig->prtpartiallycorrect));
     $mform->addElement('editor', 'prtincorrect', stack_string('prtincorrectfeedback'), array('rows' => 1), $this->editoroptions);
     $mform->getElement('prtincorrect')->setValue(array('text' => $this->stackconfig->prtincorrect));
     $mform->addElement('select', 'multiplicationsign', stack_string('multiplicationsign'), stack_options::get_multiplication_sign_options());
     $mform->setDefault('multiplicationsign', $this->stackconfig->multiplicationsign);
     $mform->addHelpButton('multiplicationsign', 'multiplicationsign', 'qtype_stack');
     $mform->addElement('selectyesno', 'sqrtsign', stack_string('sqrtsign'));
     $mform->setDefault('sqrtsign', $this->stackconfig->sqrtsign);
     $mform->addHelpButton('sqrtsign', 'sqrtsign', 'qtype_stack');
     $mform->addElement('select', 'complexno', stack_string('complexno'), stack_options::get_complex_no_options());
     $mform->setDefault('complexno', $this->stackconfig->complexno);
     $mform->addHelpButton('complexno', 'complexno', 'qtype_stack');
     $mform->addElement('select', 'inversetrig', stack_string('inversetrig'), stack_options::get_inverse_trig_options());
     $mform->setDefault('inversetrig', $this->stackconfig->inversetrig);
     $mform->addHelpButton('inversetrig', 'inversetrig', 'qtype_stack');
     $mform->addElement('select', 'matrixparens', stack_string('matrixparens'), stack_options::get_matrix_parens_options());
     $mform->setDefault('matrixparens', $this->stackconfig->matrixparens);
     $mform->addHelpButton('matrixparens', 'matrixparens', 'qtype_stack');
     // Hints.
     $this->add_interactive_settings();
     // Replace standard penalty input at the bottom with the one we want.
     $mform->removeElement('multitriesheader');
     $mform->removeElement('penalty');
     $pen = $mform->createElement('text', 'penalty', stack_string('penalty'), array('size' => 5));
     $mform->insertElementBefore($pen, 'generalfeedback');
     $mform->setType('penalty', PARAM_FLOAT);
     $mform->addHelpButton('penalty', 'penalty', 'qtype_stack');
     $mform->setDefault('penalty', 0.1);
     $mform->addRule('penalty', null, 'required', null, 'client');
 }
 /**
  * Ensure that self::$config is set.
  */
 protected static function ensure_config_loaded()
 {
     if (is_null(self::$config)) {
         self::$config = stack_utils::get_config();
     }
 }
 /**
  * @return stack_maths_output the output method that has been set in the
  *      configuration options.
  */
 protected static function get_output()
 {
     if ('' == trim(stack_utils::get_config()->mathsdisplay)) {
         return self::get_output_instance('mathjax');
     }
     return self::get_output_instance(stack_utils::get_config()->mathsdisplay);
 }