You are here

protected static function DateBase::datetimeRangeYears in Webform 6.x

Same name and namespace in other branches
  1. 8.5 src/Plugin/WebformElement/DateBase.php \Drupal\webform\Plugin\WebformElement\DateBase::datetimeRangeYears()

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

Copied from: DateElementBase::datetimeRangeYears.

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.

See also

\Drupal\Core\Datetime\Element\DateElementBase::datetimeRangeYears

1 call to DateBase::datetimeRangeYears()
DateBase::getTestValues in src/Plugin/WebformElement/DateBase.php
Get test values for an element.

File

src/Plugin/WebformElement/DateBase.php, line 647

Class

DateBase
Provides a base 'date' class.

Namespace

Drupal\webform\Plugin\WebformElement

Code

protected static function datetimeRangeYears($string, $date = NULL) {
  $datetime = new DrupalDateTime();
  $this_year = $datetime
    ->format('Y');
  list($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,
  ];
}