diff --git a/calendar/classes/type_base.php b/calendar/classes/type_base.php index b470ffcc4ab..73671197c8e 100644 --- a/calendar/classes/type_base.php +++ b/calendar/classes/type_base.php @@ -59,19 +59,40 @@ abstract class type_base { public abstract function get_months(); /** - * Returns the minimum year of the calendar. + * Returns the minimum year for the calendar. * - * @return int the minumum year + * @return int The minimum year */ public abstract function get_min_year(); /** - * Returns the maximum year of the calendar. + * Returns the maximum year for the calendar * - * @return int the max year + * @return int The maximum year */ public abstract function get_max_year(); + /** + * Returns an array of years. + * + * @param int $minyear + * @param int $maxyear + * @return array the years + */ + public abstract function get_years($minyear = null, $maxyear = null); + + /** + * Returns a multidimensional array with information for day, month, year + * and the order they are displayed when selecting a date. + * The order in the array will be the order displayed when selecting a date. + * Override this function to change the date selector order. + * + * @param int $minyear The year to start with + * @param int $maxyear The year to finish with + * @return array Full date information + */ + public abstract function get_date_order($minyear = null, $maxyear = null); + /** * Returns the number of days in a week. * diff --git a/calendar/tests/calendartype_test_example.php b/calendar/tests/calendartype_test_example.php index 862cdc7b549..e596edf717e 100644 --- a/calendar/tests/calendartype_test_example.php +++ b/calendar/tests/calendartype_test_example.php @@ -76,23 +76,66 @@ class structure extends type_base { } /** - * Returns the minimum year of the calendar. + * Returns the minimum year for the calendar. * - * @return int the minumum year + * @return int The minimum year */ public function get_min_year() { - return 1970; + return 1900; } /** - * Returns the maximum year of the calendar. + * Returns the maximum year for the calendar * - * @return int the max year + * @return int The maximum year */ public function get_max_year() { return 2050; } + /** + * Returns an array of years. + * + * @param int $minyear + * @param int $maxyear + * @return array the years. + */ + public function get_years($minyear = null, $maxyear = null) { + if (is_null($minyear)) { + $minyear = $this->get_min_year(); + } + + if (is_null($maxyear)) { + $maxyear = $this->get_max_year(); + } + + $years = array(); + for ($i = $minyear; $i <= $maxyear; $i++) { + $years[$i] = $i; + } + + return $years; + } + + /** + * Returns a multidimensional array with information for day, month, year + * and the order they are displayed when selecting a date. + * The order in the array will be the order displayed when selecting a date. + * Override this function to change the date selector order. + * + * @param int $minyear The year to start with. + * @param int $maxyear The year to finish with. + * @return array Full date information. + */ + public function get_date_order($minyear = null, $maxyear = null) { + $dateinfo = array(); + $dateinfo['day'] = $this->get_days(); + $dateinfo['month'] = $this->get_months(); + $dateinfo['year'] = $this->get_years($minyear, $maxyear); + + return $dateinfo; + } + /** * Returns the number of days in a week. * diff --git a/calendar/type/gregorian/classes/structure.php b/calendar/type/gregorian/classes/structure.php index cf50cfca7c7..0c9ee7d4bde 100644 --- a/calendar/type/gregorian/classes/structure.php +++ b/calendar/type/gregorian/classes/structure.php @@ -76,23 +76,66 @@ class structure extends type_base { } /** - * Returns the minimum year of the calendar. + * Returns the minimum year for the calendar. * - * @return int the minumum year + * @return int The minimum year */ public function get_min_year() { return 1900; } /** - * Returns the maximum year of the calendar. + * Returns the maximum year for the calendar * - * @return int the max year + * @return int The maximum year */ public function get_max_year() { return 2050; } + /** + * Returns an array of years. + * + * @param int $minyear + * @param int $maxyear + * @return array the years + */ + public function get_years($minyear = null, $maxyear = null) { + if (is_null($minyear)) { + $minyear = $this->get_min_year(); + } + + if (is_null($maxyear)) { + $maxyear = $this->get_max_year(); + } + + $years = array(); + for ($i = $minyear; $i <= $maxyear; $i++) { + $years[$i] = $i; + } + + return $years; + } + + /** + * Returns a multidimensional array with information for day, month, year + * and the order they are displayed when selecting a date. + * The order in the array will be the order displayed when selecting a date. + * Override this function to change the date selector order. + * + * @param int $minyear The year to start with + * @param int $maxyear The year to finish with + * @return array Full date information + */ + public function get_date_order($minyear = null, $maxyear = null) { + $dateinfo = array(); + $dateinfo['day'] = $this->get_days(); + $dateinfo['month'] = $this->get_months(); + $dateinfo['year'] = $this->get_years($minyear, $maxyear); + + return $dateinfo; + } + /** * Returns the number of days in a week. * diff --git a/lib/form/dateselector.php b/lib/form/dateselector.php index 7676edbccdd..9094d026057 100644 --- a/lib/form/dateselector.php +++ b/lib/form/dateselector.php @@ -53,8 +53,7 @@ class MoodleQuickForm_date_selector extends MoodleQuickForm_group { * optional => if true, show a checkbox beside the date to turn it on (or off) * @var array */ - protected $_options = array('startyear' => null, 'stopyear' => null, - 'timezone' => null, 'optional' => null); + protected $_options = array(); /** * @var array These complement separators, they are appended to the resultant HTML. @@ -81,7 +80,6 @@ class MoodleQuickForm_date_selector extends MoodleQuickForm_group { $calendartype = \core_calendar\type_factory::get_calendar_instance(); $this->_options = array('startyear' => $calendartype->get_min_year(), 'stopyear' => $calendartype->get_max_year(), 'defaulttime' => 0, 'timezone' => 99, 'step' => 5, 'optional' => false); - $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; $this->_appendName = true; @@ -98,6 +96,7 @@ class MoodleQuickForm_date_selector extends MoodleQuickForm_group { } } } + // The YUI2 calendar only supports the gregorian calendar type. if ($calendartype->get_name() === 'gregorian') { form_init_date_js(); @@ -114,17 +113,14 @@ class MoodleQuickForm_date_selector extends MoodleQuickForm_group { // Get the calendar type used - see MDL-18375. $calendartype = \core_calendar\type_factory::get_calendar_instance(); - $days = $calendartype->get_days(); - $months = $calendartype->get_months(); - for ($i = $this->_options['startyear']; $i <= $this->_options['stopyear']; $i++) { - $years[$i] = $i; - } $this->_elements = array(); - // E_STRICT creating elements without forms is nasty because it internally uses $this - $this->_elements[] = @MoodleQuickForm::createElement('select', 'day', get_string('day', 'form'), $days, $this->getAttributes(), true); - $this->_elements[] = @MoodleQuickForm::createElement('select', 'month', get_string('month', 'form'), $months, $this->getAttributes(), true); - $this->_elements[] = @MoodleQuickForm::createElement('select', 'year', get_string('year', 'form'), $years, $this->getAttributes(), true); + + $dateformat = $calendartype->get_date_order($this->_options['startyear'], $this->_options['stopyear']); + foreach ($dateformat as $key => $value) { + // E_STRICT creating elements without forms is nasty because it internally uses $this + $this->_elements[] = @MoodleQuickForm::createElement('select', $key, get_string($key, 'form'), $value, $this->getAttributes(), true); + } // The YUI2 calendar only supports the gregorian calendar type so only display the calendar image if this is being used. if ($calendartype->get_name() === 'gregorian') { $this->_elements[] = @MoodleQuickForm::createElement('image', 'calendar', $OUTPUT->pix_url('i/calendar', 'moodle'), diff --git a/lib/form/datetimeselector.php b/lib/form/datetimeselector.php index f80f3566050..ff2fa993856 100644 --- a/lib/form/datetimeselector.php +++ b/lib/form/datetimeselector.php @@ -55,8 +55,7 @@ class MoodleQuickForm_date_time_selector extends MoodleQuickForm_group { * optional => if true, show a checkbox beside the date to turn it on (or off) * @var array */ - var $_options = array('startyear' => null, 'stopyear' => null, 'defaulttime' => null, - 'timezone' => null, 'step' => null, 'optional' => null); + protected $_options = array(); /** * @var array These complement separators, they are appended to the resultant HTML. @@ -82,7 +81,7 @@ class MoodleQuickForm_date_time_selector extends MoodleQuickForm_group { // Get the calendar type used - see MDL-18375. $calendartype = \core_calendar\type_factory::get_calendar_instance(); $this->_options = array('startyear' => $calendartype->get_min_year(), 'stopyear' => $calendartype->get_max_year(), - 'defaulttime' => 0, 'timezone' => 99, 'step' => 5, 'optional' => false); + 'defaulttime' => 0, 'timezone' => 99, 'step' => 5, 'optional' => false); $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; @@ -100,6 +99,7 @@ class MoodleQuickForm_date_time_selector extends MoodleQuickForm_group { } } } + // The YUI2 calendar only supports the gregorian calendar type. if ($calendartype->get_name() === 'gregorian') { form_init_date_js(); @@ -116,23 +116,20 @@ class MoodleQuickForm_date_time_selector extends MoodleQuickForm_group { // Get the calendar type used - see MDL-18375. $calendartype = \core_calendar\type_factory::get_calendar_instance(); - $days = $calendartype->get_days(); - $months = $calendartype->get_months(); - for ($i = $this->_options['startyear']; $i <= $this->_options['stopyear']; $i++) { - $years[$i] = $i; + + for ($i = 0; $i <= 23; $i++) { + $hours[$i] = sprintf("%02d", $i); } - for ($i=0; $i<=23; $i++) { - $hours[$i] = sprintf("%02d",$i); - } - for ($i=0; $i<60; $i+=$this->_options['step']) { - $minutes[$i] = sprintf("%02d",$i); + for ($i = 0; $i < 60; $i += $this->_options['step']) { + $minutes[$i] = sprintf("%02d", $i); } $this->_elements = array(); - // E_STRICT creating elements without forms is nasty because it internally uses $this - $this->_elements[] = @MoodleQuickForm::createElement('select', 'day', get_string('day', 'form'), $days, $this->getAttributes(), true); - $this->_elements[] = @MoodleQuickForm::createElement('select', 'month', get_string('month', 'form'), $months, $this->getAttributes(), true); - $this->_elements[] = @MoodleQuickForm::createElement('select', 'year', get_string('year', 'form'), $years, $this->getAttributes(), true); + $dateformat = $calendartype->get_date_order($this->_options['startyear'], $this->_options['stopyear']); + foreach ($dateformat as $key => $date) { + // E_STRICT creating elements without forms is nasty because it internally uses $this + $this->_elements[] = @MoodleQuickForm::createElement('select', $key, get_string($key, 'form'), $date, $this->getAttributes(), true); + } if (right_to_left()) { // Switch order of elements for Right-to-Left $this->_elements[] = @MoodleQuickForm::createElement('select', 'minute', get_string('minute', 'form'), $minutes, $this->getAttributes(), true); $this->_elements[] = @MoodleQuickForm::createElement('select', 'hour', get_string('hour', 'form'), $hours, $this->getAttributes(), true); diff --git a/user/profile/field/datetime/define.class.php b/user/profile/field/datetime/define.class.php index dfeb3e1d089..bc4f9d2bae6 100644 --- a/user/profile/field/datetime/define.class.php +++ b/user/profile/field/datetime/define.class.php @@ -36,14 +36,8 @@ class profile_define_datetime extends profile_define_base { list($year, $month, $day) = explode('_', date('Y_m_d')); $currentdate = $calendartype->convert_from_gregorian($year, $month, $day); $currentyear = $currentdate['year']; - $startyear = $calendartype->get_min_year(); - $endyear = $calendartype->get_max_year(); - // Create array for the years. - $arryears = array(); - for ($i = $startyear; $i <= $endyear; $i++) { - $arryears[$i] = $i; - } + $arryears = $calendartype->get_years(); // Add elements. $form->addElement('select', 'param1', get_string('startyear', 'profilefield_datetime'), $arryears);