From 2eeb76f845c23bdb5359623445a8062c7888b7cd Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Tue, 18 Jan 2011 17:35:03 +0000 Subject: [PATCH] MDL-20636 Finish conversion of the Opaque qtype/behaviour. --- question/behaviour/opaque/behaviour.php | 12 +++--- question/behaviour/opaque/renderer.php | 28 ++++++------- question/todo/diffstat.txt | 16 ++++---- question/type/opaque/edit_opaque_form.php | 4 +- question/type/opaque/file.php | 33 ++++++++++++---- question/type/opaque/lang/en/qtype_opaque.php | 7 +++- question/type/opaque/locallib.php | 39 +++++++++---------- question/type/opaque/questiontype.php | 4 +- 8 files changed, 84 insertions(+), 59 deletions(-) diff --git a/question/behaviour/opaque/behaviour.php b/question/behaviour/opaque/behaviour.php index c43f68ba0ee..64dcaa4fb7d 100644 --- a/question/behaviour/opaque/behaviour.php +++ b/question/behaviour/opaque/behaviour.php @@ -69,12 +69,12 @@ class qbehaviour_opaque extends question_behaviour { } // Set up the random seed to be the current time in milliseconds. - list($micros, $sec) = explode(" ", microtime()); + list($micros, $sec) = explode(' ', microtime()); $step->set_behaviour_var('_randomseed', $sec . floor($micros * 1000)); $step->set_behaviour_var('_userid', $USER->id); $step->set_behaviour_var('_language', current_language()); $step->set_behaviour_var('_preferredbehaviour', $this->preferredbehaviour); - $opaquestate = update_opaque_state($this->qa, $step); + $opaquestate = qtype_opaque_update_state($this->qa, $step); $step->set_behaviour_var('_statestring', $opaquestate->progressinfo); // Remember the question summary. @@ -147,10 +147,10 @@ class qbehaviour_opaque extends question_behaviour { } public function process_remote_action(question_attempt_pending_step $pendingstep) { - $opaquestate = update_opaque_state($this->qa, $pendingstep); - - if (is_string($opaquestate)) { - notify($opaquestate); + try { + $opaquestate = qtype_opaque_update_state($this->qa, $pendingstep); + } catch (SoapFault $sf) { + print_object($sf); return question_attempt::DISCARD; // TODO } diff --git a/question/behaviour/opaque/renderer.php b/question/behaviour/opaque/renderer.php index d3247c9839e..afa2b753f50 100644 --- a/question/behaviour/opaque/renderer.php +++ b/question/behaviour/opaque/renderer.php @@ -33,31 +33,33 @@ class qbehaviour_opaque_renderer extends qbehaviour_renderer { array('class' => 'question_aborted')); } - $opaquestate =& update_opaque_state($qa); - if (is_string($opaquestate)) { - return notify($opaquestate, '', '', true); - // TODO + try { + $opaquestate = qtype_opaque_update_state($qa); + } catch (SoapFault $sf) { + return html_writer::tag('div', get_string('errorconnecting', 'qtype_opaque') . + html_writer::tag('pre', get_string('soapfault', 'qtype_opaque', $sf), array('class' => 'notifytiny')), + array('class' => 'opaqueerror')); } return html_writer::tag('div', $opaquestate->xhtml, - array('class' => opaque_browser_type())); + array('class' => qtype_opaque_browser_type())); } public function head_code(question_attempt $qa) { $output = ''; - $opaquestate =& update_opaque_state($qa); + try { + $opaquestate = qtype_opaque_update_state($qa); + } catch (SoapFault $sf) { + // Errors are reported properly elsewhere. + return ''; + } $question = $qa->get_question(); - $resourcecache = new opaque_resource_cache($question->engineid, + $resourcecache = new qtype_opaque_resource_cache($question->engineid, $question->remoteid, $question->remoteversion); if (!empty($opaquestate->cssfilename) && $resourcecache->file_in_cache($opaquestate->cssfilename)) { - $output .= ''; - } - - if(!empty($opaquestate->headXHTML)) { - $output .= $opaquestate->headXHTML; + $this->page->requires->css($resourcecache->file_url($opaquestate->cssfilename)); } return $output; diff --git a/question/todo/diffstat.txt b/question/todo/diffstat.txt index c517a44c318..0df82cf58cb 100644 --- a/question/todo/diffstat.txt +++ b/question/todo/diffstat.txt @@ -250,10 +250,10 @@ DONE question/behaviour/informationitem/lang/en_utf8/qbehaviour_informationitem. DONE question/behaviour/informationitem/renderer.php | 42 + DONE question/behaviour/informationitem/simpletest/testwalkthrough.php | 78 + - question/behaviour/interactive/behaviour.php | 232 ++ +DONE question/behaviour/interactive/behaviour.php | 232 ++ DONE question/behaviour/interactive/lang/en_utf8/qbehaviour_interactive.php | 6 + DONE question/behaviour/interactive/renderer.php | 62 + - question/behaviour/interactive/interactive/simpletest/testwalkthrough.php | 470 ++++ +DONE question/behaviour/interactive/interactive/simpletest/testwalkthrough.php | 470 ++++ DONE question/behaviour/interactivecountback/behaviour.php | 91 + DONE question/behaviour/interactivecountback/en_utf8/qbehaviour_interactivecountback.php | 3 + @@ -270,10 +270,10 @@ DONE question/behaviour/missing/lang/en_utf8/qbehaviour_missing.php | 3 + DONE question/behaviour/missing/renderer.php | 35 + DONE question/behaviour/missing/simpletest/testmissingbehaviour.php | 96 + - question/behaviour/opaque/behaviour.php | 197 ++ +DONE question/behaviour/opaque/behaviour.php | 197 ++ DONE question/behaviour/opaque/lang/en_utf8/qbehaviour_opaque.php | 4 + - question/behaviour/opaque/renderer.php | 65 + - question/behaviour/opaque/simpletest/testopaquebehaviour.php | 227 ++ +DONE question/behaviour/opaque/renderer.php | 65 + +DONE question/behaviour/opaque/simpletest/testopaquebehaviour.php | 227 ++ DONE question/format.php | 15 +- DONE question/format/blackboard/format.php | 2 +- @@ -381,7 +381,7 @@ DONE question/type/opaque/db/upgrade.php | 69 + DONE question/type/opaque/edit_opaque_form.php | 114 + DONE question/type/opaque/editengine.php | 152 + DONE question/type/opaque/engines.php | 78 + - question/type/opaque/file.php | 31 + +DONE question/type/opaque/file.php | 31 + DONE question/type/opaque/icon.gif | Bin 0 -> 97 bytes DONE question/type/opaque/lang/en_utf8/help/opaque/configuredengines.html | 6 + DONE question/type/opaque/lang/en_utf8/help/opaque/editengine.html | 16 + @@ -394,8 +394,8 @@ DONE question/type/opaque/locallib.php | 826 ++++++ DONE question/type/opaque/question.php | 55 + DONE question/type/opaque/questiontype.php | 220 ++ DONE question/type/opaque/renderer.php | 37 + - question/type/opaque/simpletest/testlocallib.php | 60 + - question/type/opaque/simpletest/testquestiontype.php | 303 ++ +DONE question/type/opaque/simpletest/testlocallib.php | 60 + +DONE question/type/opaque/simpletest/testquestiontype.php | 303 ++ DONE question/type/opaque/styles.css | 14 + DONE question/type/opaque/testengine.php | 70 + DONE question/type/opaque/version.php | 5 + diff --git a/question/type/opaque/edit_opaque_form.php b/question/type/opaque/edit_opaque_form.php index 1668d207624..069260923a1 100644 --- a/question/type/opaque/edit_opaque_form.php +++ b/question/type/opaque/edit_opaque_form.php @@ -71,7 +71,7 @@ class question_edit_opaque_form extends question_edit_form { $errors = parent::validation($data, $files); // Check we can connect to this questoin engine. - $engine = load_engine_def($data['engineid']); + $engine = qtype_opaque_load_engine_def($data['engineid']); if (is_string($engine)) { $errors['engineid'] = $engine; } @@ -90,7 +90,7 @@ class question_edit_opaque_form extends question_edit_form { // Try connecting to the remote question engine both as extra validation of the id, and // also to get the default grade. if ($remoteidok) { - $metadata = get_question_metadata($engine, $data['remoteid'], $data['remoteversion']); + $metadata = qtype_opaque_get_question_metadata($engine, $data['remoteid'], $data['remoteversion']); if (is_string($metadata)) { $errors['remoteid'] = $metadata; } else if (!isset($metadata['questionmetadata']['#']['scoring'][0]['#']['marks'][0]['#'])) { diff --git a/question/type/opaque/file.php b/question/type/opaque/file.php index f183041e6ba..e5b3e0e7eb6 100644 --- a/question/type/opaque/file.php +++ b/question/type/opaque/file.php @@ -1,15 +1,35 @@ . + + /** * Serves files from the Opaque resource cache. * - * @copyright © 2007 The Open University - * @author T.J.Hunt@open.ac.uk - * @license http://www.gnu.org/copyleft/gpl.html GNU Public License - * @package package_name - *//** */ + * @package qtype + * @subpackage opaque + * @copyright 2007 The Open University + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + + require_once(dirname(__FILE__) . '/../../../config.php'); require_once(dirname(__FILE__) . '/locallib.php'); + $engineid = required_param('engineid', PARAM_INT); $remoteid = required_param('remoteid', PARAM_PATH); $remoteversion = required_param('remoteversion', PARAM_PATH); @@ -26,6 +46,5 @@ if ($SESSION->cached_opaque_state->engineid != $engineid || print_error('cannotaccessfile'); } -$resourcecache = new opaque_resource_cache($engineid, $remoteid, $remoteversion); +$resourcecache = new qtype_opaque_resource_cache($engineid, $remoteid, $remoteversion); $resourcecache->serve_file($filename); -?> diff --git a/question/type/opaque/lang/en/qtype_opaque.php b/question/type/opaque/lang/en/qtype_opaque.php index 71ff2bb627e..e450115a6d8 100644 --- a/question/type/opaque/lang/en/qtype_opaque.php +++ b/question/type/opaque/lang/en/qtype_opaque.php @@ -20,6 +20,7 @@ $string['editquestionengine_help'] = 'Each remote system you configure must have $string['editquestionengineshort'] = 'Editing engine'; $string['enginedeleted'] = 'Engine configuration deleted.'; $string['enginename'] = 'Engine name'; +$string['errorconnecting'] = 'Error connecting to the remote question engine.'; $string['getmetadatacallfailed'] = 'Failed to retrieve the metadata for this question. Are you sure the remote id and version are correct?'; $string['invalidquestionidsyntax'] = 'This does not match the syntax for a question id'; $string['invalidquestionversionsyntax'] = 'The question version should be of the form major.minor, where major and minor are integers.'; @@ -53,7 +54,11 @@ $string['questionengine_help'] = 'Select the remote question engine that hosts t $string['questionid'] = 'Question id'; $string['questionid_help'] = 'Opaque questions are identified by both a question id and a question version number. The person who created the question you are trying to refer to will be able to tell you these.'; $string['questionversion'] = 'Question version'; -$string['soapfault'] = 'Soap fault: Fault code: {$a->faultcode}. Fault actor: {$a->faultactor}. Fault string: {$a->faultstring}. Fault detail: {$a->faultdetail}.'; +$string['soapfault'] = 'Technical details: +Fault code: {$a->faultcode}. +Fault actor: {$a->faultactor}. +Fault string: {$a->faultstring}. +Fault detail: {$a->faultdetail}.'; $string['startcallfailed'] = 'Failed to start a question session. {$a}'; $string['stopcallfailed'] = 'Failed to close question session. {$a}'; $string['testconnection'] = 'Test connection'; diff --git a/question/type/opaque/locallib.php b/question/type/opaque/locallib.php index ab3b6b6ca16..16b71c60f3c 100644 --- a/question/type/opaque/locallib.php +++ b/question/type/opaque/locallib.php @@ -174,7 +174,7 @@ class qtype_opaque_engine_manager { $conditions[] = 'qb.url = :qburl'; $params['qburl'] = $qburl; } - return get_records_sql_menu(' + return $DB->get_records_sql_menu(' SELECT e.id,1 ' . implode(' ', $tables) . ' WHERE ' . implode(' AND ', $conditions), $params); } @@ -335,7 +335,7 @@ function qtype_opaque_start_question_session($engine, $remoteid, $remoteversion, 'randomseed' => $data['-_randomseed'], 'userid' => $data['-_userid'], 'language' => $data['-_language'], - 'passKey' => generate_passkey($engine->passkey, $data['-_userid']), + 'passKey' => qtype_opaque_generate_passkey($engine->passkey, $data['-_userid']), 'preferredbehaviour' => $data['-_preferredbehaviour'], ); @@ -400,7 +400,7 @@ function qtype_opaque_update_state(question_attempt $qa, question_attempt_step $ } else if ($SESSION->cached_opaque_state->qaid != $qa->get_database_id() || $SESSION->cached_opaque_state->sequencenumber > $targetseq) { if (!empty($SESSION->cached_opaque_state->questionsessionid)) { - $error = stop_question_session($SESSION->cached_opaque_state->engine, + $error = qtype_opaque_stop_question_session($SESSION->cached_opaque_state->engine, $SESSION->cached_opaque_state->questionsessionid); if (is_string($error)) { unset($SESSION->cached_opaque_state); @@ -415,7 +415,7 @@ function qtype_opaque_update_state(question_attempt $qa, question_attempt_step $ $cachestatus = 'good'; } - $resourcecache = new opaque_resource_cache($question->engineid, + $resourcecache = new qtype_opaque_resource_cache($question->engineid, $question->remoteid, $question->remoteversion); if ($cachestatus == 'empty') { @@ -430,22 +430,22 @@ function qtype_opaque_update_state(question_attempt $qa, question_attempt_step $ $opaquestate->sequencenumber = -1; $opaquestate->resultssequencenumber = -1; - $engine = load_engine_def($question->engineid); + $engine = qtype_opaque_load_engine_def($question->engineid); if (is_string($engine)) { unset($SESSION->cached_opaque_state); return $engine; } $opaquestate->engine = $engine; - $step = opaque_get_step(0, $qa, $pendingstep); - $startreturn = start_question_session($engine, $question->remoteid, + $step = qtype_opaque_get_step(0, $qa, $pendingstep); + $startreturn = qtype_opaque_start_question_session($engine, $question->remoteid, $question->remoteversion, $step->get_all_data(), $resourcecache->list_cached_resources()); if (is_string($startreturn)) { unset($SESSION->cached_opaque_state); return $startreturn; } - extract_stuff_from_response($opaquestate, $startreturn, $resourcecache); + qtype_opaque_extract_stuff_from_response($opaquestate, $startreturn, $resourcecache); $opaquestate->sequencenumber++; $cachestatus = 'catchup'; } else { @@ -454,13 +454,13 @@ function qtype_opaque_update_state(question_attempt $qa, question_attempt_step $ if ($cachestatus == 'catchup') { if ($opaquestate->sequencenumber >= $targetseq) { - $error = stop_question_session($opaquestate->engine, + $error = qtype_opaque_stop_question_session($opaquestate->engine, $opaquestate->questionsessionid); } while ($opaquestate->sequencenumber < $targetseq) { - $step = opaque_get_step($opaquestate->sequencenumber + 1, $qa, $pendingstep); + $step = qtype_opaque_get_step($opaquestate->sequencenumber + 1, $qa, $pendingstep); - $processreturn = opaque_process($opaquestate->engine, $opaquestate->questionsessionid, $step->get_submitted_data()); + $processreturn = qtype_opaque_process($opaquestate->engine, $opaquestate->questionsessionid, $step->get_submitted_data()); if (is_string($processreturn)) { unset($SESSION->cached_opaque_state); return $processreturn; @@ -473,11 +473,11 @@ function qtype_opaque_update_state(question_attempt $qa, question_attempt_step $ if ($processreturn->questionEnd) { $opaquestate->questionended = true; $opaquestate->sequencenumber = $targetseq; - $opaquestate->xhtml = strip_omact_buttons($opaquestate->xhtml); + $opaquestate->xhtml = qtype_opaque_strip_omact_buttons($opaquestate->xhtml); unset($opaquestate->questionsessionid); break; } - extract_stuff_from_response($opaquestate, $processreturn, $resourcecache); + qtype_opaque_extract_stuff_from_response($opaquestate, $processreturn, $resourcecache); $opaquestate->sequencenumber++; } @@ -538,14 +538,14 @@ function qtype_opaque_extract_stuff_from_response($opaquestate, $response, $reso // Actually, we remove any non-disabled buttons, and the following script tag. // TODO think of a better way to do this. if ($opaquestate->resultssequencenumber >= 0) { - $xhtml = strip_omact_buttons($xhtml); + $xhtml = qtype_opaque_strip_omact_buttons($xhtml); } $opaquestate->xhtml = $xhtml; // Process the CSS (only when we have a StartResponse). if (!empty($response->CSS)) { - $opaquestate->cssfilename = opaque_stylesheet_filename($response->questionSession); + $opaquestate->cssfilename = qtype_opaque_stylesheet_filename($response->questionSession); $resourcecache->cache_file($opaquestate->cssfilename, 'text/css;charset=UTF-8', $response->CSS); } @@ -623,7 +623,7 @@ class qtype_opaque_resource_cache { protected $baseurl; // initial part of the URL to link to a file in the cache. /** - * Create a new opaque_resource_cache for a particular remote question. + * Create a new qtype_opaque_resource_cache for a particular remote question. * @param integer $engineid the id of the question engine. * @param string $remoteid remote question id, as per Opaque spec. * @param string $remoteversion remote question version, as per Opaque spec. @@ -639,9 +639,8 @@ class qtype_opaque_resource_cache { if (!is_dir($this->metadatafolder)) { $this->mkdir_recursive($this->metadatafolder); } - $this->baseurl = $CFG->wwwroot . '/question/type/opaque/file.php?engineid=' . - $engineid . '&remoteid=' . $remoteid . - '&remoteversion=' . $remoteversion . '&filename='; + $this->baseurl = new moodle_url('/question/type/opaque/file.php', array( + 'engineid' => $engineid, 'remoteid' => $remoteid, 'remoteversion' => $remoteversion)); } /** @@ -665,7 +664,7 @@ class qtype_opaque_resource_cache { * @return the URL to access this file. */ public function file_url($filename) { - return $this->baseurl . $filename; + return new moodle_url($this->baseurl, array('filename' => $filename)); } /** diff --git a/question/type/opaque/questiontype.php b/question/type/opaque/questiontype.php index 4836bb73d14..702911ad1ce 100644 --- a/question/type/opaque/questiontype.php +++ b/question/type/opaque/questiontype.php @@ -59,12 +59,12 @@ class qtype_opaque extends question_type { return array('question_opaque', 'engineid', 'remoteid', 'remoteversion'); } - function save_question($question, $form, $course) { + function save_question($question, $form) { $form->questiontext = ''; $form->questiontextformat = FORMAT_MOODLE; $form->unlimited = 0; $form->penalty = 0; - return parent::save_question($question, $form, $course); + return parent::save_question($question, $form); } protected function initialise_question_instance(question_definition $question, $questiondata) {