diff --git a/calendar/export.php b/calendar/export.php index 7de7d5cab4ae5..979c89272b92a 100644 --- a/calendar/export.php +++ b/calendar/export.php @@ -114,7 +114,6 @@ $PAGE->set_title($course->shortname.': '.get_string('calendar', 'calendar').': '.$pagetitle); $PAGE->set_heading($course->fullname); $PAGE->set_pagelayout('standard'); -$PAGE->set_button(calendar_preferences_button($course)); $renderer = $PAGE->get_renderer('core_calendar'); $calendar->add_sidecalendar_blocks($renderer); diff --git a/calendar/lib.php b/calendar/lib.php index c675c658617f8..3c2aa92cac5e4 100644 --- a/calendar/lib.php +++ b/calendar/lib.php @@ -1658,6 +1658,8 @@ function calendar_get_default_courses() { * Display calendar preference button * * @param stdClass $course course object + * @deprecated since Moodle 3.2 + * @todo MDL-55875 This will be deleted in Moodle 3.6. * @return string return preference button in html */ function calendar_preferences_button(stdClass $course) { @@ -1667,8 +1669,9 @@ function calendar_preferences_button(stdClass $course) { if (!isloggedin() || isguestuser()) { return ''; } + debugging('This should no longer be used, the calendar preferences are now linked to the user preferences page'); - return $OUTPUT->single_button(new moodle_url('/calendar/preferences.php', array('course' => $course->id)), get_string("preferences", "calendar")); + return $OUTPUT->single_button(new moodle_url('/user/calendar.php'), get_string("preferences", "calendar")); } /** diff --git a/calendar/managesubscriptions.php b/calendar/managesubscriptions.php index a83b90f630c6d..3e4e0e98f693c 100644 --- a/calendar/managesubscriptions.php +++ b/calendar/managesubscriptions.php @@ -110,7 +110,6 @@ // Print title and header. $PAGE->set_title("$course->shortname: ".get_string('calendar', 'calendar').": ".get_string('subscriptions', 'calendar')); $PAGE->set_heading($course->fullname); -$PAGE->set_button(calendar_preferences_button($course)); $renderer = $PAGE->get_renderer('core_calendar'); diff --git a/calendar/preferences.php b/calendar/preferences.php deleted file mode 100644 index aeb502dadd97f..0000000000000 --- a/calendar/preferences.php +++ /dev/null @@ -1,84 +0,0 @@ -dirroot.'/calendar/lib.php'); -require_once($CFG->dirroot.'/calendar/preferences_form.php'); - -$courseid = required_param('course', PARAM_INT); -$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST); - -$PAGE->set_url(new moodle_url('/calendar/preferences.php', array('course' => $courseid))); -$PAGE->set_pagelayout('standard'); - -require_login($course); - -if ($courseid == SITEID) { - $viewurl = new moodle_url('/calendar/view.php', array('view' => 'month')); -} else { - $viewurl = new moodle_url('/calendar/view.php', array('view' => 'month', 'course' => $courseid)); -} -navigation_node::override_active_url($viewurl); - -$defaultlookahead = CALENDAR_DEFAULT_UPCOMING_LOOKAHEAD; -if (isset($CFG->calendar_lookahead)) { - $defaultlookahead = intval($CFG->calendar_lookahead); -} -$defaultmaxevents = CALENDAR_DEFAULT_UPCOMING_MAXEVENTS; -if (isset($CFG->calendar_maxevents)) { - $defaultmaxevents = intval($CFG->calendar_maxevents); -} - -$prefs = new stdClass; -$prefs->timeformat = get_user_preferences('calendar_timeformat', ''); -$prefs->startwday = calendar_get_starting_weekday(); -$prefs->maxevents = get_user_preferences('calendar_maxevents', $defaultmaxevents); -$prefs->lookahead = get_user_preferences('calendar_lookahead', $defaultlookahead); -$prefs->persistflt = get_user_preferences('calendar_persistflt', 0); - -$form = new calendar_preferences_form($PAGE->url); -$form->set_data($prefs); - -if ($form->is_cancelled()) { - redirect($viewurl); -} else if ($form->is_submitted() && $form->is_validated() && confirm_sesskey()) { - $data = $form->get_data(); - if ($data->timeformat != CALENDAR_TF_12 && $data->timeformat != CALENDAR_TF_24) { - $data->timeformat = ''; - } - set_user_preference('calendar_timeformat', $data->timeformat); - - $data->startwday = intval($data->startwday); - if ($data->startwday < 0 || $data->startwday > 6) { - $data->startwday = abs($data->startwday % 7); - } - set_user_preference('calendar_startwday', $data->startwday); - - if (intval($data->maxevents) >= 1) { - set_user_preference('calendar_maxevents', $data->maxevents); - } - - if (intval($data->lookahead) >= 1) { - set_user_preference('calendar_lookahead', $data->lookahead); - } - - set_user_preference('calendar_persistflt', intval($data->persistflt)); - redirect($viewurl, get_string('changessaved'), 1); - exit; -} - -$strcalendar = get_string('calendar', 'calendar'); -$strpreferences = get_string('calendarpreferences', 'calendar'); - -$PAGE->navbar->add($strpreferences); -$PAGE->set_pagelayout('admin'); -$PAGE->set_title("$course->shortname: $strcalendar: $strpreferences"); -$PAGE->set_heading($course->fullname); - -echo $OUTPUT->header(); -echo $OUTPUT->heading($strpreferences); -echo $OUTPUT->box_start('generalbox boxaligncenter'); -$form->display(); -echo $OUTPUT->box_end(); -echo $OUTPUT->footer(); \ No newline at end of file diff --git a/calendar/tests/behat/calendar_lookahead.feature b/calendar/tests/behat/calendar_lookahead.feature index e95c018496de9..449574ff8c8b2 100644 --- a/calendar/tests/behat/calendar_lookahead.feature +++ b/calendar/tests/behat/calendar_lookahead.feature @@ -28,11 +28,13 @@ Feature: Limit displayed upcoming events | Event title | Two months away event | When I follow "C1" Then I should not see "Two months away event" - And I follow "Go to calendar" - And I click on "Preferences" "button" + And I am on site homepage + And I follow "Preferences" in the user menu + And I follow "Calendar preferences" And I set the following fields to these values: | Upcoming events look-ahead | 3 months | And I press "Save changes" And I wait to be redirected - And I follow "C1" + And I am on site homepage + And I follow "Course 1" And I should see "Two months away event" diff --git a/calendar/upgrade.txt b/calendar/upgrade.txt index 55d272ab010f2..4a37e2c205bfd 100644 --- a/calendar/upgrade.txt +++ b/calendar/upgrade.txt @@ -1,6 +1,9 @@ This files describes API changes in /calendar/* , information provided here is intended especially for developers. +=== 3.2 === +* calendar_preferences_button() is now depreciated. Calendar preferences have been moved to the user preferences page. + === 2.9 === default values changes in code: * core_calendar_external::get_calendar_events_parameters() 'timeend' default option changed; now, by default, diff --git a/calendar/view.php b/calendar/view.php index e37e3ac237d5d..fe8c3e93d3d54 100644 --- a/calendar/view.php +++ b/calendar/view.php @@ -38,7 +38,12 @@ // // ///////////////////////////////////////////////////////////////////////////// -// Display the calendar page. +/** + * Display the calendar page. + * @copyright 2003 Jon Papaioannou + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @package core_calendar + */ require_once('../config.php'); require_once($CFG->dirroot.'/course/lib.php'); @@ -117,7 +122,6 @@ $PAGE->set_pagelayout('standard'); $PAGE->set_title("$course->shortname: $strcalendar: $pagetitle"); $PAGE->set_heading($COURSE->fullname); -$PAGE->set_button(calendar_preferences_button($course)); $renderer = $PAGE->get_renderer('core_calendar'); $calendar->add_sidecalendar_blocks($renderer, true, $view); diff --git a/lib/navigationlib.php b/lib/navigationlib.php index ec308c6bf87d0..ddc3752cc17a5 100644 --- a/lib/navigationlib.php +++ b/lib/navigationlib.php @@ -4461,6 +4461,15 @@ protected function generate_user_settings($courseid, $userid, $gstitle='usercurr } } + // Add "Calendar preferences" link. + if (isloggedin() && !isguestuser($user)) { + if ($currentuser && has_capability('moodle/user:editownprofile', $systemcontext) || + has_capability('moodle/user:editprofile', $usercontext)) { + $url = new moodle_url('/user/calendar.php', array('id' => $user->id)); + $useraccount->add(get_string('calendarpreferences', 'calendar'), $url, self::TYPE_SETTING, null, 'preferredcalendar'); + } + } + // View the roles settings. if (has_any_capability(array('moodle/role:assign', 'moodle/role:safeoverride', 'moodle/role:override', 'moodle/role:manage'), $usercontext)) { diff --git a/user/calendar.php b/user/calendar.php new file mode 100644 index 0000000000000..486d5d63c28ca --- /dev/null +++ b/user/calendar.php @@ -0,0 +1,123 @@ +. + +/** + * Allows you to edit a users profile + * + * @copyright 2015 Shamim Rezaie http://foodle.org + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @package core_user + */ + +require_once('../config.php'); +require_once($CFG->dirroot.'/calendar/lib.php'); +require_once($CFG->dirroot.'/user/editlib.php'); +require_once($CFG->dirroot.'/user/lib.php'); + +$userid = optional_param('id', $USER->id, PARAM_INT); // User id. + +$PAGE->set_url('/user/calendar.php', array('id' => $userid)); + +list($user, $course) = useredit_setup_preference_page($userid, SITEID); + +$defaultlookahead = CALENDAR_DEFAULT_UPCOMING_LOOKAHEAD; +if (isset($CFG->calendar_lookahead)) { + $defaultlookahead = intval($CFG->calendar_lookahead); +} +$defaultmaxevents = CALENDAR_DEFAULT_UPCOMING_MAXEVENTS; +if (isset($CFG->calendar_maxevents)) { + $defaultmaxevents = intval($CFG->calendar_maxevents); +} + +// Create form. +$calendarform = new core_user\form\calendar_form(null, array('userid' => $user->id)); + +$user->timeformat = get_user_preferences('calendar_timeformat', ''); +$user->startwday = calendar_get_starting_weekday(); +$user->maxevents = get_user_preferences('calendar_maxevents', $defaultmaxevents); +$user->lookahead = get_user_preferences('calendar_lookahead', $defaultlookahead); +$user->persistflt = get_user_preferences('calendar_persistflt', 0); +$calendarform->set_data($user); + +$redirect = new moodle_url("/user/preferences.php", array('userid' => $user->id)); +if ($calendarform->is_cancelled()) { + redirect($redirect); +} else if ($calendarform->is_submitted() && $calendarform->is_validated() && confirm_sesskey()) { + $data = $calendarform->get_data(); + + // Time format. + if ($data->timeformat != CALENDAR_TF_12 && $data->timeformat != CALENDAR_TF_24) { + $data->timeformat = ''; + } + set_user_preference('calendar_timeformat', $data->timeformat); + + // Start weekday. + $data->startwday = intval($data->startwday); + if ($data->startwday < 0 || $data->startwday > 6) { + $data->startwday = abs($data->startwday % 7); + } + set_user_preference('calendar_startwday', $data->startwday); + + // Calendar events. + if (intval($data->maxevents) >= 1) { + set_user_preference('calendar_maxevents', $data->maxevents); + } + + // Calendar lookahead. + if (intval($data->lookahead) >= 1) { + set_user_preference('calendar_lookahead', $data->lookahead); + } + + set_user_preference('calendar_persistflt', intval($data->persistflt)); + + // Calendar type. + $calendartype = $data->calendartype; + // If the specified calendar type does not exist, use the site default. + if (!array_key_exists($calendartype, \core_calendar\type_factory::get_list_of_calendar_types())) { + $calendartype = $CFG->calendartype; + } + + $user->calendartype = $calendartype; + // Update user with new calendar type. + user_update_user($user, false, false); + + // Trigger event. + \core\event\user_updated::create_from_userid($user->id)->trigger(); + + if ($USER->id == $user->id) { + $USER->calendartype = $calendartype; + } + + redirect($redirect); +} + +// Display page header. +$streditmycalendar = get_string('calendarpreferences', 'calendar'); +$userfullname = fullname($user, true); + +$PAGE->navbar->includesettingsbase = true; + +$PAGE->set_title("$course->shortname: $streditmycalendar"); +$PAGE->set_heading($userfullname); + +echo $OUTPUT->header(); +echo $OUTPUT->heading($streditmycalendar); + +// Finally display THE form. +$calendarform->display(); + +// And proper footer. +echo $OUTPUT->footer(); diff --git a/calendar/preferences_form.php b/user/classes/form/calendar_form.php similarity index 52% rename from calendar/preferences_form.php rename to user/classes/form/calendar_form.php index ff3a9e931b71e..16364501de77d 100644 --- a/calendar/preferences_form.php +++ b/user/classes/form/calendar_form.php @@ -1,5 +1,4 @@ . /** - * The mform for settings user preferences + * Form to edit a users preferred language * - * @copyright 2010 Sam Hemelryk + * @copyright 2015 Shamim Rezaie http://foodle.org * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - * @package calendar + * @package core_user */ - /** - * Always include formslib - */ +namespace core_user\form; + if (!defined('MOODLE_INTERNAL')) { - die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page + die('Direct access to this script is forbidden.'); // It must be included from a Moodle page. } require_once($CFG->dirroot.'/lib/formslib.php'); /** - * The mform class for setting user preferences + * Class user_edit_calendar_form. * - * @copyright 2010 Sam Hemelryk + * @copyright 2015 Shamim Rezaie http://foodle.org * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class calendar_preferences_form extends moodleform { +class calendar_form extends \moodleform { + + /** + * Define the form. + */ + public function definition () { + global $CFG, $USER; - function definition() { $mform = $this->_form; + $userid = $USER->id; + + if (is_array($this->_customdata)) { + if (array_key_exists('userid', $this->_customdata)) { + $userid = $this->_customdata['userid']; + } + } + + // Add some extra hidden fields. + $mform->addElement('hidden', 'id'); + $mform->setType('id', PARAM_INT); + + // We do not want to show this option unless there is more than one calendar type to display. + if (count(\core_calendar\type_factory::get_list_of_calendar_types()) > 1) { + $calendartypes = \core_calendar\type_factory::get_list_of_calendar_types(); + $mform->addElement('select', 'calendartype', get_string('preferredcalendar', 'calendar'), $calendartypes); + $mform->setType('calendartype', PARAM_ALPHANUM); + $mform->setDefault('calendartype', $CFG->calendartype); + } else { + $mform->addElement('hidden', 'calendartype', $CFG->calendartype); + $mform->setType('calendartype', PARAM_ALPHANUM); + + } + // Date / Time settings. $options = array( - '0' => get_string('default', 'calendar'), - CALENDAR_TF_12 => get_string('timeformat_12', 'calendar'), - CALENDAR_TF_24 => get_string('timeformat_24', 'calendar') + '0' => get_string('default', 'calendar'), + CALENDAR_TF_12 => get_string('timeformat_12', 'calendar'), + CALENDAR_TF_24 => get_string('timeformat_24', 'calendar') ); $mform->addElement('select', 'timeformat', get_string('pref_timeformat', 'calendar'), $options); $mform->addHelpButton('timeformat', 'pref_timeformat', 'calendar'); + // First day of week. $options = array( 0 => get_string('sunday', 'calendar'), 1 => get_string('monday', 'calendar'), @@ -63,14 +91,16 @@ function definition() { $mform->addElement('select', 'startwday', get_string('pref_startwday', 'calendar'), $options); $mform->addHelpButton('startwday', 'pref_startwday', 'calendar'); + // Maximum events to display. $options = array(); - for ($i=1; $i<=20; $i++) { + for ($i = 1; $i <= 20; $i++) { $options[$i] = $i; } $mform->addElement('select', 'maxevents', get_string('pref_maxevents', 'calendar'), $options); $mform->addHelpButton('maxevents', 'pref_maxevents', 'calendar'); - $options = array(365 => new lang_string('numyear', '', 1), + // Calendar lookahead. + $options = array(365 => new \lang_string('numyear', '', 1), 270 => get_string('nummonths', '', 9), 180 => get_string('nummonths', '', 6), 150 => get_string('nummonths', '', 5), @@ -90,14 +120,38 @@ function definition() { $mform->addElement('select', 'lookahead', get_string('pref_lookahead', 'calendar'), $options); $mform->addHelpButton('lookahead', 'pref_lookahead', 'calendar'); + // Remember event filtering. $options = array( 0 => get_string('no'), 1 => get_string('yes') ); $mform->addElement('select', 'persistflt', get_string('pref_persistflt', 'calendar'), $options); $mform->addHelpButton('persistflt', 'pref_persistflt', 'calendar'); - - $this->add_action_buttons(false, get_string('savechanges')); + $this->add_action_buttons(true, get_string('savechanges')); } -} \ No newline at end of file + /** + * Extend the form definition after the data has been parsed. + */ + public function definition_after_data() { + global $CFG; + + $mform = $this->_form; + + // If calendar type does not exist, use site default calendar type. + if ($calendarselected = $mform->getElementValue('calendartype')) { + if (is_array($calendarselected)) { + // There are multiple calendar types available. + $calendar = reset($calendarselected); + } else { + // There is only one calendar type available. + $calendar = $calendarselected; + } + // Check calendar type exists. + if (!array_key_exists($calendar, \core_calendar\type_factory::get_list_of_calendar_types())) { + $calendartypeel = $mform->getElement('calendartype'); + $calendartypeel->setValue($CFG->calendartype); + } + } + } +} diff --git a/user/editlib.php b/user/editlib.php index 0017d7704d08d..67f2f4a38740b 100644 --- a/user/editlib.php +++ b/user/editlib.php @@ -304,14 +304,6 @@ function useredit_shared_definition(&$mform, $editoroptions, $filemanageroptions $mform->addElement('select', 'timezone', get_string('timezone'), $choices); } - // Multi-Calendar Support - see MDL-18375. - $calendartypes = \core_calendar\type_factory::get_list_of_calendar_types(); - // We do not want to show this option unless there is more than one calendar type to display. - if (count($calendartypes) > 1) { - $mform->addElement('select', 'calendartype', get_string('preferredcalendar', 'calendar'), $calendartypes); - $mform->setDefault('calendartype', $CFG->calendartype); - } - if (!empty($CFG->allowuserthemes)) { $choices = array(); $choices[''] = get_string('default');