// authors can see assessments of their work at the end of workshop only print_error('nopermissions', 'error', $workshop->view_url(), 'view assessment of own work before workshop is closed'); } // only the reviewer is allowed to modify the assessment if ($isreviewer and $workshop->assessing_allowed($USER->id)) { $assessmenteditable = true; } else { $assessmenteditable = false; } // check that all required examples have been assessed by the user if ($assessmenteditable and $workshop->useexamples and $workshop->examplesmode == workshop::EXAMPLES_BEFORE_ASSESSMENT and !has_capability('mod/workshop:manageexamples', $workshop->context)) { // the reviewer must have submitted their own submission $reviewersubmission = $workshop->get_submission_by_author($assessment->reviewerid); if (!$reviewersubmission) { // no money, no love $assessmenteditable = false; echo $output->header(); echo $output->heading(get_string('exampleneedsubmission', 'workshop'), 2); echo $output->footer(); exit; } else { $examples = $workshop->get_examples_for_reviewer($assessment->reviewerid); foreach ($examples as $exampleid => $example) { if (is_null($example->grade)) { $assessmenteditable = false; echo $output->header(); echo $output->heading(get_string('exampleneedassessed', 'workshop'), 2); echo $output->footer();
} $workshoprecord = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST); $workshop = new workshop($workshoprecord, $cm, $course); $PAGE->set_url($workshop->submission_url(), array('cmid' => $cmid, 'id' => $id)); if ($edit) { $PAGE->url->param('edit', $edit); } if ($id) { // submission is specified $submission = $workshop->get_submission_by_id($id); $params = array('objectid' => $submission->id, 'context' => $workshop->context, 'courseid' => $workshop->course->id, 'relateduserid' => $submission->authorid, 'other' => array('workshopid' => $workshop->id)); $event = \mod_workshop\event\submission_viewed::create($params); $event->trigger(); } else { // no submission specified if (!($submission = $workshop->get_submission_by_author($USER->id))) { $submission = new stdclass(); $submission->id = null; $submission->authorid = $USER->id; $submission->example = 0; $submission->grade = null; $submission->gradeover = null; $submission->published = null; $submission->feedbackauthor = null; $submission->feedbackauthorformat = editors_get_preferred_format(); } } $ownsubmission = $submission->authorid == $USER->id; $canviewall = has_capability('mod/workshop:viewallsubmissions', $workshop->context); $cansubmit = has_capability('mod/workshop:submit', $workshop->context); $canallocate = has_capability('mod/workshop:allocate', $workshop->context);
/** * Print a detailed representation of what a user has done with * a given particular instance of this module, for user activity reports. * * @return string HTML */ function workshop_user_complete($course, $user, $mod, $workshop) { global $CFG, $DB, $OUTPUT; require_once(dirname(__FILE__).'/locallib.php'); require_once($CFG->libdir.'/gradelib.php'); $workshop = new workshop($workshop, $mod, $course); $grades = grade_get_grades($course->id, 'mod', 'workshop', $workshop->id, $user->id); if (!empty($grades->items[0]->grades)) { $submissiongrade = reset($grades->items[0]->grades); $info = get_string('submissiongrade', 'workshop') . ': ' . $submissiongrade->str_long_grade; echo html_writer::tag('li', $info, array('class'=>'submissiongrade')); } if (!empty($grades->items[1]->grades)) { $assessmentgrade = reset($grades->items[1]->grades); $info = get_string('gradinggrade', 'workshop') . ': ' . $assessmentgrade->str_long_grade; echo html_writer::tag('li', $info, array('class'=>'gradinggrade')); } if (has_capability('mod/workshop:viewallsubmissions', $workshop->context)) { $canviewsubmission = true; if (groups_get_activity_groupmode($workshop->cm) == SEPARATEGROUPS) { // user must have accessallgroups or share at least one group with the submission author if (!has_capability('moodle/site:accessallgroups', $workshop->context)) { $usersgroups = groups_get_activity_allowed_groups($workshop->cm); $authorsgroups = groups_get_all_groups($workshop->course->id, $user->id, $workshop->cm->groupingid, 'g.id'); $sharedgroups = array_intersect_key($usersgroups, $authorsgroups); if (empty($sharedgroups)) { $canviewsubmission = false; } } } if ($canviewsubmission and $submission = $workshop->get_submission_by_author($user->id)) { $title = format_string($submission->title); $url = $workshop->submission_url($submission->id); $link = html_writer::link($url, $title); $info = get_string('submission', 'workshop').': '.$link; echo html_writer::tag('li', $info, array('class'=>'submission')); } } if (has_capability('mod/workshop:viewallassessments', $workshop->context)) { if ($assessments = $workshop->get_assessments_by_reviewer($user->id)) { foreach ($assessments as $assessment) { $a = new stdclass(); $a->submissionurl = $workshop->submission_url($assessment->submissionid)->out(); $a->assessmenturl = $workshop->assess_url($assessment->id)->out(); $a->submissiontitle = s($assessment->submissiontitle); echo html_writer::tag('li', get_string('assessmentofsubmission', 'workshop', $a)); } } } }
/** * Print a detailed representation of what a user has done with * a given particular instance of this module, for user activity reports. * * @return string HTML */ function workshop_user_complete($course, $user, $mod, $workshop) { global $CFG, $DB, $OUTPUT; require_once dirname(__FILE__) . '/locallib.php'; require_once $CFG->libdir . '/gradelib.php'; $workshop = new workshop($workshop, $mod, $course); $grades = grade_get_grades($course->id, 'mod', 'workshop', $workshop->id, $user->id); if (!empty($grades->items[0]->grades)) { $submissiongrade = reset($grades->items[0]->grades); $info = get_string('submissiongrade', 'workshop') . ': ' . $submissiongrade->str_long_grade; echo html_writer::tag('li', $info, array('class' => 'submissiongrade')); } if (!empty($grades->items[1]->grades)) { $assessmentgrade = reset($grades->items[1]->grades); $info = get_string('gradinggrade', 'workshop') . ': ' . $assessmentgrade->str_long_grade; echo html_writer::tag('li', $info, array('class' => 'gradinggrade')); } if (has_capability('mod/workshop:viewallsubmissions', $workshop->context)) { if ($submission = $workshop->get_submission_by_author($user->id)) { $title = format_string($submission->title); $url = $workshop->submission_url($submission->id); $link = html_writer::link($url, $title); $info = get_string('submission', 'workshop') . ': ' . $link; echo html_writer::tag('li', $info, array('class' => 'submission')); } } if (has_capability('mod/workshop:viewallassessments', $workshop->context)) { if ($assessments = $workshop->get_assessments_by_reviewer($user->id)) { foreach ($assessments as $assessment) { $a = new stdclass(); $a->submissionurl = $workshop->submission_url($assessment->submissionid)->out(); $a->assessmenturl = $workshop->assess_url($assessment->id)->out(); $a->submissiontitle = s($assessment->submissiontitle); echo html_writer::tag('li', get_string('assessmentofsubmission', 'workshop', $a)); } } } }
$usernames = array_merge($usernames,$a); } $users = $DB->get_records_list('user','username',$usernames,'','username,id,firstname,lastname'); $failures = array(); // username => reason foreach($csv as $a) { if(!empty($a)) { $reviewee = trim($a[0]); $reviewers = array_slice($a,1); if (empty($reviewee)) continue; if (empty($reviewers)) continue; $submission = $workshop->get_submission_by_author($users[$reviewee]->id); if (empty($users[$reviewee])) { $failures[$reviewee] = "error::No user for username $reviewee"; continue; } if ($submission === false) { $failures[$reviewee] = "error::No submission for {$users[$reviewee]->firstname} {$users[$reviewee]->lastname} ($reviewee)"; continue; } foreach($reviewers as $i) { if (empty($i)) continue; if (!empty($users[$i])) { $res = $workshop->add_allocation($submission, $users[$i]->id);
$output .= '<a href="' . $path . '" >' . $OUTPUT->pix_icon(file_file_icon($file), get_mimetype_description($file), 'moodle', array('class' => 'icon')) . s($filename) . '</a><br>'; } echo $output; } } $type = $assignment->assignment->assignmenttype; if ($type == 'online') { require_once "{$CFG->dirroot}/mod/assignment/type/online/assignment.class.php"; $assignment_online = new assignment_online($modid); echo $assignment_online->get_submission($userid)->data1; } } elseif ($mod->modname == 'workshop') { $context = context_module::instance($mod->id); require_once $CFG->dirroot . '/mod/workshop/locallib.php'; $workshop = new workshop($instance, $mod, $course); $submission = $workshop->get_submission_by_author($user->id); if (is_object($submission)) { $content = format_text($submission->content, $submission->contentformat, array('overflowdiv' => true)); $content = file_rewrite_pluginfile_urls($content, 'pluginfile.php', $context->id, 'mod_workshop', 'submission_content', $submission->id); print_r($content); $fs = get_file_storage(); $ctx = $context; $files = $fs->get_area_files($ctx->id, 'mod_workshop', 'submission_attachment', $submission->id); echo '<ul>'; foreach ($files as $file) { if ($file->is_directory()) { continue; } $filepath = $file->get_filepath(); $filename = $file->get_filename(); $fileurl = file_encode_url($CFG->wwwroot . '/blocks/evalcomix/assessment/pluginfile.php', '/' . $ctx->id . '/mod_workshop/submission_attachment/' . $submission->id . $filepath . $filename, false);
/** * Prepare an individual workshop plan for the given user. * * @param workshop $workshop instance * @param int $userid whom the plan is prepared for */ public function __construct(workshop $workshop, $userid) { global $DB; $this->workshop = $workshop; $this->userid = $userid; //get all the groups in this module. better than doing it repeatedly, just store it in memory. if ($workshop->cm->groupingid) { $groups = groups_get_all_groups($workshop->course->id,0,$worksop->cm->groupingid); } else { $groups = groups_get_all_groups($workshop->course->id); } list($sql, $params) = $DB->get_in_or_equal(array_keys($groups)); $groupmembers = $DB->get_records_select('groups_members','groupid '.$sql,$params,'','userid,groupid'); list($sql, $params) = $DB->get_in_or_equal(array_keys($groupmembers)); //all students $studentdata = $DB->get_records_select('user','id '.$sql,$params,'',user_picture::fields()); foreach($groupmembers as $k => $v) { $gid = $v->groupid; $groups[$gid]->members[$k] = $studentdata[$k]; } //--------------------------------------------------------- // * SETUP | submission | assessment | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phasesetup', 'workshop'); $phase->tasks = array(); if (has_capability('moodle/course:manageactivities', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskintro', 'workshop'); $task->link = $workshop->updatemod_url(); $task->completed = !(trim($workshop->intro) == ''); $phase->tasks['intro'] = $task; } if (has_capability('moodle/course:manageactivities', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskinstructauthors', 'workshop'); $task->link = $workshop->updatemod_url(); $task->completed = !(trim($workshop->instructauthors) == ''); $phase->tasks['instructauthors'] = $task; } if (has_capability('mod/workshop:editdimensions', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('editassessmentform', 'workshop'); $task->link = $workshop->editform_url(); if ($workshop->grading_strategy_instance()->form_ready()) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_SETUP) { $task->completed = false; } $phase->tasks['editform'] = $task; } if ($workshop->useexamples and has_capability('mod/workshop:manageexamples', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('prepareexamples', 'workshop'); if ($DB->count_records('workshop_submissions', array('example' => 1, 'workshopid' => $workshop->id)) > 0) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_SETUP) { $task->completed = false; } $phase->tasks['prepareexamples'] = $task; } if (empty($phase->tasks) and $workshop->phase == workshop::PHASE_SETUP) { // if we are in the setup phase and there is no task (typical for students), let us // display some explanation what is going on $task = new stdclass(); $task->title = get_string('undersetup', 'workshop'); $task->completed = 'info'; $phase->tasks['setupinfo'] = $task; } $this->phases[workshop::PHASE_SETUP] = $phase; //--------------------------------------------------------- // setup | * SUBMISSION | assessment | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phasesubmission', 'workshop'); $phase->tasks = array(); if (($workshop->usepeerassessment or $workshop->useselfassessment) and has_capability('moodle/course:manageactivities', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskinstructreviewers', 'workshop'); $task->link = $workshop->updatemod_url(); if (trim($workshop->instructreviewers)) { $task->completed = true; } elseif ($workshop->phase >= workshop::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['instructreviewers'] = $task; } if ($workshop->useexamples and $workshop->examplesmode == workshop::EXAMPLES_BEFORE_SUBMISSION and has_capability('mod/workshop:submit', $workshop->context, $userid, false) and !has_capability('mod/workshop:manageexamples', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('exampleassesstask', 'workshop'); $examples = $this->get_examples(); $a = new stdclass(); $a->expected = count($examples); $a->assessed = 0; foreach ($examples as $exampleid => $example) { if (!is_null($example->grade)) { $a->assessed++; } } $task->details = get_string('exampleassesstaskdetails', 'workshop', $a); if ($a->assessed == $a->expected) { $task->completed = true; } elseif ($workshop->phase >= workshop::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['examples'] = $task; } if (has_capability('mod/workshop:submit', $workshop->context, $userid, false)) { $task = new stdclass(); $task->title = get_string('tasksubmit', 'workshop'); $task->link = $workshop->submission_url(); if ($DB->record_exists('workshop_submissions', array('workshopid'=>$workshop->id, 'example'=>0, 'authorid'=>$userid))) { $task->completed = true; } elseif ($workshop->teammode && $workshop->get_submission_by_author($userid,'s.id') !== false) { $task->completed = true; } elseif ($workshop->phase >= workshop::PHASE_ASSESSMENT) { $task->completed = false; } else { $task->completed = null; // still has a chance to submit } $phase->tasks['submit'] = $task; } if (has_capability('mod/workshop:allocate', $workshop->context, $userid)) { if ($workshop->phaseswitchassessment) { $task = new stdClass(); $allocator = $DB->get_record('workshopallocation_scheduled', array('workshopid' => $workshop->id)); if (empty($allocator)) { $task->completed = false; } else if ($allocator->enabled and is_null($allocator->resultstatus)) { $task->completed = true; } else if ($workshop->submissionend > time()) { $task->completed = null; } else { $task->completed = false; } $task->title = get_string('setup', 'workshopallocation_scheduled'); $task->link = $workshop->allocation_url('scheduled'); $phase->tasks['allocatescheduled'] = $task; } $task = new stdclass(); $task->title = get_string('allocate', 'workshop'); $task->link = $workshop->allocation_url(); $numofauthors = $workshop->count_potential_authors(false); //these two counting methods need different code for teammode and normal mode if ($workshop->teammode) { $submissions_grouped = $workshop->get_submissions_grouped(); $numofsubmissions = count($submissions_grouped); } else { $numofsubmissions = $DB->count_records('workshop_submissions', array('workshopid'=>$workshop->id, 'example'=>0)); } //common sql to teammode and non-teammode count if ($workshop->teammode) { if (count($submissions_grouped)) { list($inorequal, $params) = $DB->get_in_or_equal(array_keys($submissions_grouped)); $sql = "SELECT COUNT(DISTINCT submissionid) FROM {workshop_assessments} WHERE submissionid $inorequal"; $numnonallocated = $numofsubmissions - $DB->count_records_sql($sql,$params); } else { $numnonallocated = 0; } } else { $sql = 'SELECT COUNT(s.id) FROM {workshop_submissions} s LEFT JOIN {workshop_assessments} a ON (a.submissionid=s.id) WHERE s.workshopid = :workshopid AND s.example=0 AND a.submissionid IS NULL'; $params['workshopid'] = $workshop->id; $numnonallocated = $DB->count_records_sql($sql, $params); } if ($numofsubmissions == 0) { $task->completed = null; } elseif ($numnonallocated == 0) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_SUBMISSION) { $task->completed = false; } else { $task->completed = null; // still has a chance to allocate } $a = new stdclass(); $a->expected = $numofauthors; $a->submitted = $numofsubmissions; $a->allocate = $numnonallocated; $task->details = get_string('allocatedetails', 'workshop', $a); unset($a); $phase->tasks['allocate'] = $task; if ($numofsubmissions < $numofauthors and $workshop->phase >= workshop::PHASE_SUBMISSION) { $task = new stdclass(); $task->title = get_string('someuserswosubmission', 'workshop'); $task->completed = 'info'; $phase->tasks['allocateinfo'] = $task; } } if ($workshop->submissionstart) { $task = new stdclass(); $task->title = get_string('submissionstartdatetime', 'workshop', workshop::timestamp_formats($workshop->submissionstart)); $task->completed = 'info'; $phase->tasks['submissionstartdatetime'] = $task; } if ($workshop->submissionend) { $task = new stdclass(); $task->title = get_string('submissionenddatetime', 'workshop', workshop::timestamp_formats($workshop->submissionend)); $task->completed = 'info'; $phase->tasks['submissionenddatetime'] = $task; } if (($workshop->submissionstart < time()) and $workshop->latesubmissions) { $task = new stdclass(); $task->title = get_string('latesubmissionsallowed', 'workshop'); $task->completed = 'info'; $phase->tasks['latesubmissionsallowed'] = $task; } if (isset($phase->tasks['submissionstartdatetime']) or isset($phase->tasks['submissionenddatetime'])) { if (has_capability('mod/workshop:ignoredeadlines', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('deadlinesignored', 'workshop'); $task->completed = 'info'; $phase->tasks['deadlinesignored'] = $task; } } $this->phases[workshop::PHASE_SUBMISSION] = $phase; //--------------------------------------------------------- // setup | submission | * ASSESSMENT | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseassessment', 'workshop'); $phase->tasks = array(); $phase->isreviewer = has_capability('mod/workshop:peerassess', $workshop->context, $userid); if ($workshop->phase == workshop::PHASE_SUBMISSION and $workshop->phaseswitchassessment and has_capability('mod/workshop:switchphase', $workshop->context, $userid)) { $task = new stdClass(); $task->title = get_string('switchphase30auto', 'mod_workshop', workshop::timestamp_formats($workshop->submissionend)); $task->completed = 'info'; $phase->tasks['autoswitchinfo'] = $task; } if ($workshop->useexamples and $workshop->examplesmode == workshop::EXAMPLES_BEFORE_ASSESSMENT and $phase->isreviewer and !has_capability('mod/workshop:manageexamples', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('exampleassesstask', 'workshop'); $examples = $workshop->get_examples_for_reviewer($userid); $a = new stdclass(); $a->expected = count($examples); $a->assessed = 0; foreach ($examples as $exampleid => $example) { if (!is_null($example->grade)) { $a->assessed++; } } $task->details = get_string('exampleassesstaskdetails', 'workshop', $a); if ($a->assessed == $a->expected) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['examples'] = $task; } if (empty($phase->tasks['examples']) or !empty($phase->tasks['examples']->completed)) { $phase->assessments = $workshop->get_assessments_by_reviewer($userid); $numofpeers = 0; // number of allocated peer-assessments $numofpeerstodo = 0; // number of peer-assessments to do $numofself = 0; // number of allocated self-assessments - should be 0 or 1 $numofselftodo = 0; // number of self-assessments to do - should be 0 or 1 foreach ($phase->assessments as $a) { if ($a->authorid == $userid) { $numofself++; if (is_null($a->grade)) { $numofselftodo++; } } else { $numofpeers++; if (is_null($a->grade)) { $numofpeerstodo++; } } } unset($a); if ($workshop->usepeerassessment and $numofpeers) { $task = new stdclass(); if ($numofpeerstodo == 0) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_ASSESSMENT) { $task->completed = false; } $a = new stdclass(); $a->total = $numofpeers; $a->todo = $numofpeerstodo; $task->title = get_string('taskassesspeers', 'workshop'); $task->details = get_string('taskassesspeersdetails', 'workshop', $a); unset($a); $phase->tasks['assesspeers'] = $task; } if ($workshop->useselfassessment and $numofself) { $task = new stdclass(); if ($numofselftodo == 0) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_ASSESSMENT) { $task->completed = false; } $task->title = get_string('taskassessself', 'workshop'); $phase->tasks['assessself'] = $task; } } if ($workshop->assessmentstart) { $task = new stdclass(); $task->title = get_string('assessmentstartdatetime', 'workshop', workshop::timestamp_formats($workshop->assessmentstart)); $task->completed = 'info'; $phase->tasks['assessmentstartdatetime'] = $task; } if ($workshop->assessmentend) { $task = new stdclass(); $task->title = get_string('assessmentenddatetime', 'workshop', workshop::timestamp_formats($workshop->assessmentend)); $task->completed = 'info'; $phase->tasks['assessmentenddatetime'] = $task; } if (isset($phase->tasks['assessmentstartdatetime']) or isset($phase->tasks['assessmentenddatetime'])) { if (has_capability('mod/workshop:ignoredeadlines', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('deadlinesignored', 'workshop'); $task->completed = 'info'; $phase->tasks['deadlinesignored'] = $task; } } $this->phases[workshop::PHASE_ASSESSMENT] = $phase; //--------------------------------------------------------- // setup | submission | assessment | * EVALUATION | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseevaluation', 'workshop'); $phase->tasks = array(); if (has_capability('mod/workshop:overridegrades', $workshop->context)) { $expected = $workshop->count_potential_authors(false); $calculated = $DB->count_records_select('workshop_submissions', 'workshopid = ? AND (grade IS NOT NULL OR gradeover IS NOT NULL)', array($workshop->id)); $task = new stdclass(); $task->title = get_string('calculatesubmissiongrades', 'workshop'); $a = new stdclass(); $a->expected = $expected; $a->calculated = $calculated; $task->details = get_string('calculatesubmissiongradesdetails', 'workshop', $a); if ($calculated >= $expected) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_EVALUATION) { $task->completed = false; } $phase->tasks['calculatesubmissiongrade'] = $task; $expected = $workshop->count_potential_reviewers(false); $calculated = $DB->count_records_select('workshop_aggregations', 'workshopid = ? AND gradinggrade IS NOT NULL', array($workshop->id)); $task = new stdclass(); $task->title = get_string('calculategradinggrades', 'workshop'); $a = new stdclass(); $a->expected = $expected; $a->calculated = $calculated; $task->details = get_string('calculategradinggradesdetails', 'workshop', $a); if ($calculated >= $expected) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_EVALUATION) { $task->completed = false; } $phase->tasks['calculategradinggrade'] = $task; } elseif ($workshop->phase == workshop::PHASE_EVALUATION) { $task = new stdclass(); $task->title = get_string('evaluategradeswait', 'workshop'); $task->completed = 'info'; $phase->tasks['evaluateinfo'] = $task; } $this->phases[workshop::PHASE_EVALUATION] = $phase; //--------------------------------------------------------- // setup | submission | assessment | evaluation | * CLOSED //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseclosed', 'workshop'); $phase->tasks = array(); $this->phases[workshop::PHASE_CLOSED] = $phase; // Polish data, set default values if not done explicitly foreach ($this->phases as $phasecode => $phase) { $phase->title = isset($phase->title) ? $phase->title : ''; $phase->tasks = isset($phase->tasks) ? $phase->tasks : array(); if ($phasecode == $workshop->phase) { $phase->active = true; } else { $phase->active = false; } if (!isset($phase->actions)) { $phase->actions = array(); } foreach ($phase->tasks as $taskcode => $task) { $task->title = isset($task->title) ? $task->title : ''; $task->link = isset($task->link) ? $task->link : null; $task->details = isset($task->details) ? $task->details : ''; $task->completed = isset($task->completed) ? $task->completed : null; } } // Add phase switching actions if (has_capability('mod/workshop:switchphase', $workshop->context, $userid)) { foreach ($this->phases as $phasecode => $phase) { if (! $phase->active) { $action = new stdclass(); $action->type = 'switchphase'; $action->url = $workshop->switchphase_url($phasecode); $phase->actions[] = $action; } } } }