diff --git a/element/daterange/classes/element.php b/element/daterange/classes/element.php index cdd49fc..830e161 100644 --- a/element/daterange/classes/element.php +++ b/element/daterange/classes/element.php @@ -43,6 +43,16 @@ class element extends \mod_customcert\element { */ const CURRENT_YEAR_PLACEHOLDER = '{{current_year}}'; + /** + * First year in a date range placeholder string. + */ + const FIRST_YEAR_PLACEHOLDER = '{{first_year}}'; + + /** + * Last year in a date range placeholder string. + */ + const LAST_YEAR_PLACEHOLDER = '{{last_year}}'; + /** * Default max number of dateranges per element. */ @@ -406,6 +416,7 @@ class element extends \mod_customcert\element { * @return string */ protected function get_daterange_string($date) { + $rangematched = null; $outputstring = ''; foreach ($this->get_decoded_data()->dateranges as $key => $range) { @@ -415,6 +426,7 @@ class element extends \mod_customcert\element { } if ($date >= $range->startdate && $date <= $range->enddate) { + $rangematched = $range; $outputstring = $range->datestring; break; } @@ -424,7 +436,7 @@ class element extends \mod_customcert\element { $outputstring = $this->get_decoded_data()->fallbackstring; } - return $this->format_date_string($outputstring); + return $this->format_date_string($outputstring, $rangematched); } /** @@ -441,15 +453,22 @@ class element extends \mod_customcert\element { /** * Format date string. * - * @param string $datestring + * @param string $datestring Date string to format. + * @param \stdClass $range Optional range element element to process range related placeholders. * * @return string */ - protected function format_date_string($datestring) { + protected function format_date_string($datestring, $range = null) { foreach ($this->get_placeholders() as $search => $replace) { $datestring = str_replace($search, $replace, $datestring); } + if ($range) { + foreach ($this->get_range_placeholders($range) as $search => $replace) { + $datestring = str_replace($search, $replace, $datestring); + } + } + return $datestring; } @@ -464,6 +483,20 @@ class element extends \mod_customcert\element { ]; } + /** + * Return a list of range related placeholders to replace in date string as search => $replace pairs. + * + * @param \stdClass $range + * + * @return array + */ + protected function get_range_placeholders(\stdClass $range) { + return [ + self::FIRST_YEAR_PLACEHOLDER => date('Y', $range->startdate), + self::LAST_YEAR_PLACEHOLDER => date('Y', $range->enddate), + ]; + } + /** * Render the element in html. * diff --git a/element/daterange/lang/en/customcertelement_daterange.php b/element/daterange/lang/en/customcertelement_daterange.php index e84b76c..adf3d52 100644 --- a/element/daterange/lang/en/customcertelement_daterange.php +++ b/element/daterange/lang/en/customcertelement_daterange.php @@ -33,7 +33,7 @@ $string['dateitem_help'] = 'This will be the date that is printed on the certifi $string['dateranges'] = 'Dateranges'; $string['fallbackstring'] = 'Fallback string'; $string['fallbackstring_help'] = 'This string will be displayed if no daterange applied to a date. If Fallback string is not set, then there will be no output at all.'; -$string['help'] = 'Configure a string representation for each daterange. Set start and end dates as well as a string you would like to transform each range to. Make sure your ranges do not overlap, otherwise the first detected daterange will be applied. If no daterange applied to a date, then Fallback string will be displayed. If Fallback string is not set, then there will be no output at all. If you mark a date range as Recurring, then the configured year will not be considerred and the current year will be used. Also there is {{current_year}} placeholder that could be used in the string representation. The placeholder will be replaced by the current year value in the certificate.'; +$string['help'] = 'Configure a string representation for each daterange. Set start and end dates as well as a string you would like to transform each range to. Make sure your ranges do not overlap, otherwise the first detected daterange will be applied. If no daterange applied to a date, then Fallback string will be displayed. If Fallback string is not set, then there will be no output at all. If you mark a date range as Recurring, then the configured year will not be considerred and the current year will be used. Also there are {{first_year}} and {{last_year}} and {{current_year}} placeholders that could be used in the string representation. The placeholders will be replaced by first year or last year in the matched range or the current year.'; $string['issueddate'] = 'Issued date'; $string['maxranges'] = 'Maximum number ranges'; $string['maxranges_desc'] = 'Set a maximum number of date ranges per each element';