MDL-63809 question: handling bad questions in question_has_capability_on
This commit is contained in:
+27
-10
@@ -921,8 +921,6 @@ function question_load_questions($questionids, $extrafields = '', $join = '') {
|
||||
* @param stdClass[]|null $filtercourses The courses to filter the course tags by.
|
||||
*/
|
||||
function _tidy_question($question, $category, array $tagobjects = null, array $filtercourses = null) {
|
||||
global $CFG;
|
||||
|
||||
// Load question-type specific fields.
|
||||
if (!question_bank::is_qtype_installed($question->qtype)) {
|
||||
$question->questiontext = html_writer::tag('p', get_string('warningmissingtype',
|
||||
@@ -1651,25 +1649,44 @@ class context_to_string_translator{
|
||||
/**
|
||||
* Check capability on category
|
||||
*
|
||||
* @param mixed $questionorid object or id. If an object is passed, it should include ->contextid and ->createdby.
|
||||
* @param int|stdClass $questionorid object or id. If an object is passed, it should include ->contextid and ->createdby.
|
||||
* @param string $cap 'add', 'edit', 'view', 'use', 'move' or 'tag'.
|
||||
* @param integer $notused no longer used.
|
||||
* @return boolean this user has the capability $cap for this question $question?
|
||||
* @param int $notused no longer used.
|
||||
* @return bool this user has the capability $cap for this question $question?
|
||||
* @throws coding_exception
|
||||
*/
|
||||
function question_has_capability_on($questionorid, $cap, $notused = -1) {
|
||||
global $USER;
|
||||
global $USER, $DB;
|
||||
|
||||
if (is_numeric($questionorid)) {
|
||||
$question = question_bank::load_question_data((int)$questionorid);
|
||||
$questionid = (int)$questionorid;
|
||||
} else if (is_object($questionorid)) {
|
||||
// All we really need in this function is the contextid and author of the question.
|
||||
// We won't bother fetching other details of the question if these 2 fields are provided.
|
||||
if (isset($questionorid->contextid) && isset($questionorid->createdby)) {
|
||||
$question = $questionorid;
|
||||
} else if (!empty($questionorid->id)) {
|
||||
$questionid = $questionorid->id;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($question) && isset($questionorid->id) && $questionorid->id != 0) {
|
||||
$question = question_bank::load_question_data($questionorid->id);
|
||||
// At this point, either $question or $questionid is expected to be set.
|
||||
if (isset($questionid)) {
|
||||
try {
|
||||
$question = question_bank::load_question_data($questionid);
|
||||
} catch (Exception $e) {
|
||||
// Let's log the exception for future debugging.
|
||||
debugging($e->getMessage(), DEBUG_NORMAL, $e->getTrace());
|
||||
|
||||
// Well, at least we tried. Seems that we really have to read from DB.
|
||||
$question = $DB->get_record_sql('SELECT q.id, q.createdby, qc.contextid
|
||||
FROM {question} q
|
||||
JOIN {question_categories} qc ON q.category = qc.id
|
||||
WHERE q.id = :id', ['id' => $questionid]);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
|
||||
if (!isset($question)) {
|
||||
throw new coding_exception('$questionorid parameter needs to be an integer or an object.');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user