You are here

protected static function DateElementBase::datetimeRangeYears in Drupal 10

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Datetime/Element/DateElementBase.php \Drupal\Core\Datetime\Element\DateElementBase::datetimeRangeYears()
  2. 9 core/lib/Drupal/Core/Datetime/Element/DateElementBase.php \Drupal\Core\Datetime\Element\DateElementBase::datetimeRangeYears()

Specifies the start and end year to use as a date range.

Handles a string like -3:+3 or 2001:2010 to describe a dynamic range of minimum and maximum years to use in a date selector.

Centers the range around the current year, if any, but expands it far enough so it will pick up the year value in the field in case the value in the field is outside the initial range.

Parameters

string $string: A min and max year string like '-3:+1' or '2000:2010' or '2000:+3'.

object $date: (optional) A date object to test as a default value. Defaults to NULL.

Return value

array A numerically indexed array, containing the minimum and maximum year described by this pattern.

2 calls to DateElementBase::datetimeRangeYears()
Datelist::processDatelist in core/lib/Drupal/Core/Datetime/Element/Datelist.php
Expands a date element into an array of individual elements.
Datetime::processDatetime in core/lib/Drupal/Core/Datetime/Element/Datetime.php
Expands a datetime element type into date and/or time elements.

File

core/lib/Drupal/Core/Datetime/Element/DateElementBase.php, line 33

Class

DateElementBase
Provides a base class for date elements.

Namespace

Drupal\Core\Datetime\Element

Code

protected static function datetimeRangeYears($string, $date = NULL) {
  $datetime = new DrupalDateTime();
  $this_year = $datetime
    ->format('Y');
  [
    $min_year,
    $max_year,
  ] = explode(':', $string);

  // Valid patterns would be -5:+5, 0:+1, 2008:2010.
  $plus_pattern = '@[\\+|\\-][0-9]{1,4}@';
  $year_pattern = '@^[0-9]{4}@';
  if (!preg_match($year_pattern, $min_year, $matches)) {
    if (preg_match($plus_pattern, $min_year, $matches)) {
      $min_year = $this_year + $matches[0];
    }
    else {
      $min_year = $this_year;
    }
  }
  if (!preg_match($year_pattern, $max_year, $matches)) {
    if (preg_match($plus_pattern, $max_year, $matches)) {
      $max_year = $this_year + $matches[0];
    }
    else {
      $max_year = $this_year;
    }
  }

  // We expect the $min year to be less than the $max year. Some custom values
  // for -99:+99 might not obey that.
  if ($min_year > $max_year) {
    $temp = $max_year;
    $max_year = $min_year;
    $min_year = $temp;
  }

  // If there is a current value, stretch the range to include it.
  $value_year = $date instanceof DrupalDateTime ? $date
    ->format('Y') : '';
  if (!empty($value_year)) {
    $min_year = min($value_year, $min_year);
    $max_year = max($value_year, $max_year);
  }
  return [
    $min_year,
    $max_year,
  ];
}