diff --git a/calendar/classes/external/calendar_event_exporter.php b/calendar/classes/external/calendar_event_exporter.php index f20c7f7199007..c27e3647a1a08 100644 --- a/calendar/classes/external/calendar_event_exporter.php +++ b/calendar/classes/external/calendar_event_exporter.php @@ -126,6 +126,17 @@ protected function get_other_values(renderer_base $output) { } } + // Include category name into the event name, if applicable. + $proxy = $this->event->get_category(); + if ($proxy && $proxy->get('id')) { + $category = $proxy->get_proxied_instance(); + $eventnameparams = (object) [ + 'name' => $values['popupname'], + 'category' => $category->get_formatted_name(), + ]; + $values['popupname'] = get_string('eventnameandcategory', 'calendar', $eventnameparams); + } + // Include course's shortname into the event name, if applicable. $course = $this->event->get_course(); if ($course && $course->get('id') && $course->get('id') !== SITEID) { diff --git a/calendar/classes/external/day_exporter.php b/calendar/classes/external/day_exporter.php index 2965451c0860f..ebe8d8686c8b9 100644 --- a/calendar/classes/external/day_exporter.php +++ b/calendar/classes/external/day_exporter.php @@ -59,11 +59,20 @@ class day_exporter extends exporter { */ public function __construct(\calendar_information $calendar, $data, $related) { $this->calendar = $calendar; - $this->url = new moodle_url('/calendar/view.php', [ - 'view' => 'day', - 'time' => $calendar->time, - 'course' => $this->calendar->course->id, - ]); + + $url = new moodle_url('/calendar/view.php', [ + 'view' => 'day', + 'time' => $calendar->time, + ]); + + if ($this->calendar->course && SITEID !== $this->calendar->course->id) { + $url->param('course', $this->calendar->course->id); + } else if ($this->calendar->categoryid) { + $url->param('category', $this->calendar->categoryid); + } + + $this->url = $url; + parent::__construct($data, $related); } @@ -179,9 +188,9 @@ protected function get_other_values(renderer_base $output) { 'navigation' => $this->get_navigation(), 'filter_selector' => $this->get_course_filter_selector($output), 'new_event_button' => $this->get_new_event_button(), + 'viewdaylink' => $this->url->out(false), ]; - $return['viewdaylink'] = $this->url->out(false); $cache = $this->related['cache']; $eventexporters = array_map(function($event) use ($cache, $output) { diff --git a/calendar/classes/external/event_exporter_base.php b/calendar/classes/external/event_exporter_base.php index cb3ba804f8996..9af9ce2139b16 100644 --- a/calendar/classes/external/event_exporter_base.php +++ b/calendar/classes/external/event_exporter_base.php @@ -34,6 +34,7 @@ use \core_calendar\local\event\entities\event_interface; use \core_calendar\local\event\entities\action_event_interface; use \core_course\external\course_summary_exporter; +use \core\external\coursecat_summary_exporter; use \renderer_base; use moodle_url; @@ -64,6 +65,7 @@ public function __construct(event_interface $event, $related = []) { $endtimestamp = $event->get_times()->get_end_time()->getTimestamp(); $groupid = $event->get_group() ? $event->get_group()->get('id') : null; $userid = $event->get_user() ? $event->get_user()->get('id') : null; + $categoryid = $event->get_category() ? $event->get_category()->get('id') : null; $data = new \stdClass(); $data->id = $event->get_id(); @@ -79,6 +81,7 @@ public function __construct(event_interface $event, $related = []) { $data->descriptionformat = $event->get_description()->get_format(); $data->groupid = $groupid; $data->userid = $userid; + $data->categoryid = $categoryid; $data->eventtype = $event->get_type(); $data->timestart = $starttimestamp; $data->timeduration = $endtimestamp - $starttimestamp; @@ -120,6 +123,12 @@ protected static function define_properties() { 'default' => null, 'null' => NULL_ALLOWED ], + 'categoryid' => [ + 'type' => PARAM_INT, + 'optional' => true, + 'default' => null, + 'null' => NULL_ALLOWED + ], 'groupid' => [ 'type' => PARAM_INT, 'optional' => true, @@ -175,6 +184,10 @@ protected static function define_other_properties() { 'icon' => [ 'type' => event_icon_exporter::read_properties_definition(), ], + 'category' => [ + 'type' => coursecat_summary_exporter::read_properties_definition(), + 'optional' => true, + ], 'course' => [ 'type' => course_summary_exporter::read_properties_definition(), 'optional' => true, @@ -239,6 +252,13 @@ protected function get_other_values(renderer_base $output) { $subscriptionexporter = new event_subscription_exporter($event); $values['subscription'] = $subscriptionexporter->export($output); + $proxy = $this->event->get_category(); + if ($proxy && $proxy->get('id')) { + $category = $proxy->get_proxied_instance(); + $categorysummaryexporter = new coursecat_summary_exporter($category, ['context' => $context]); + $values['category'] = $categorysummaryexporter->export($output); + } + if ($course = $this->related['course']) { $coursesummaryexporter = new course_summary_exporter($course, ['context' => $context]); $values['course'] = $coursesummaryexporter->export($output); diff --git a/calendar/classes/external/month_exporter.php b/calendar/classes/external/month_exporter.php index b71ccc85a3a93..3fff7fe22b7f6 100644 --- a/calendar/classes/external/month_exporter.php +++ b/calendar/classes/external/month_exporter.php @@ -75,8 +75,10 @@ public function __construct(\calendar_information $calendar, \core_calendar\type 'time' => $calendar->time, ]); - if ($this->calendar->courseid) { - $this->url->param('course', $this->calendar->courseid); + if ($this->calendar->course && SITEID !== $this->calendar->course->id) { + $this->url->param('course', $this->calendar->course->id); + } else if ($this->calendar->categoryid) { + $this->url->param('category', $this->calendar->categoryid); } $related['type'] = $type; diff --git a/calendar/classes/external/week_day_exporter.php b/calendar/classes/external/week_day_exporter.php index e974154a51803..5d87d1870eceb 100644 --- a/calendar/classes/external/week_day_exporter.php +++ b/calendar/classes/external/week_day_exporter.php @@ -118,10 +118,16 @@ protected function get_other_values(renderer_base $output) { $url = new moodle_url('/calendar/view.php', [ 'view' => 'day', 'time' => $timestamp, - 'course' => $this->calendar->course->id, - ]); + ]); + + if ($this->calendar->course && SITEID !== $this->calendar->course->id) { + $url->param('course', $this->calendar->course->id); + } else if ($this->calendar->categoryid) { + $url->param('category', $this->calendar->categoryid); + } $return['viewdaylink'] = $url->out(false); + if ($popovertitle = $this->get_popover_title()) { $return['popovertitle'] = $popovertitle; } diff --git a/lang/en/calendar.php b/lang/en/calendar.php index 28280d02cf52d..7401c9d85306d 100644 --- a/lang/en/calendar.php +++ b/lang/en/calendar.php @@ -98,6 +98,7 @@ $string['eventinstanttime'] = 'Time'; $string['eventkind'] = 'Type of event'; $string['eventname'] = 'Event title'; +$string['eventnameandcategory'] = '{$a->category}: {$a->name}'; $string['eventnameandcourse'] = '{$a->course}: {$a->name}'; $string['eventnone'] = 'No events'; $string['eventrepeat'] = 'Repeats'; diff --git a/lib/classes/external/coursecat_summary_exporter.php b/lib/classes/external/coursecat_summary_exporter.php new file mode 100644 index 0000000000000..de3428eeadffc --- /dev/null +++ b/lib/classes/external/coursecat_summary_exporter.php @@ -0,0 +1,133 @@ +. + +/** + * Class for exporting summary information for a course category. + * + * @package core + * @copyright 2017 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace core\external; +defined('MOODLE_INTERNAL') || die(); + +use renderer_base; +use moodle_url; + +/** + * Class for exporting a course summary from an stdClass. + * + * @copyright 2017 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class coursecat_summary_exporter extends \core\external\exporter { + + /** + * @var \coursecat $category + */ + protected $category; + + public function __construct(\coursecat $category, $related) { + $this->category = $category; + + $data = []; + // Specify some defaults. + foreach ($category as $key => $value) { + $data[$key] = $value; + } + + return parent::__construct($data, $related); + } + + protected static function define_related() { + return [ + 'context' => 'context', + ]; + } + + public static function define_other_properties() { + return [ + 'nestedname' => [ + 'type' => PARAM_RAW, + ], + 'url' => [ + 'type' => PARAM_URL, + ], + ]; + } + + protected function get_other_values(renderer_base $output) { + $return = [ + 'nestedname' => $this->category->get_nested_name(), + 'url' => (new moodle_url('/course/index.php', [ + 'categoryid' => $this->category->id, + ]))->out(false), + ]; + + return $return; + } + + public static function define_properties() { + return [ + 'id' => [ + 'type' => PARAM_INT, + ], + 'name' => [ + 'type' => PARAM_TEXT, + 'default' => '', + ], + 'idnumber' => [ + 'type' => PARAM_RAW, + 'null' => NULL_ALLOWED, + ], + 'description' => [ + 'type' => PARAM_RAW, + 'optional' => true, + ], + 'parent' => [ + 'type' => PARAM_INT, + ], + 'coursecount' => [ + 'type' => PARAM_INT, + 'default' => 0, + ], + 'visible' => [ + 'type' => PARAM_INT, + 'default' => 1, + ], + 'timemodified' => [ + 'type' => PARAM_INT, + 'default' => 0, + ], + 'depth' => [ + 'type' => PARAM_INT, + 'default' => 0, + ], + ]; + } + + /** + * Get the formatting parameters for the summary. + * + * @return array + */ + protected function get_format_parameters_for_description() { + return [ + 'component' => 'coursecat', + 'filearea' => 'description', + ]; + } +}