You are here

public static function CalendarHelper::month in Calendar 8.2

Returns an array for month.

Parameters

ViewExecutable $view: The view.

Return value

array Empty array for month.

Throws

\Exception

File

src/CalendarHelper.php, line 110

Class

CalendarHelper
Class CalendarHelper.

Namespace

Drupal\calendar

Code

public static function month(ViewExecutable $view) {
  $week_header = self::buildWeekHeader($view->styleInfo
    ->getDayNameSize());
  $calendar_arguments = self::getCalendarArguments($view);
  foreach ($calendar_arguments as $date_argument) {

    // Get first and last day from month in argument.
    $start_date = new DrupalDateTime($date_argument['argument'] . '01');
    $first_week_info = self::weekInfo($start_date
      ->format('Y') . $start_date
      ->format('W'));
    $end_date = clone $start_date;
    $end_date
      ->modify("last day of this month");
    $year = $end_date
      ->format('Y');
    if ($end_date
      ->format('W') < $start_date
      ->format('W')) {
      $year++;
    }
    $last_week_info = self::weekInfo($year . $end_date
      ->format('W'));

    // Build array with days per week with prefixes and suffixes.
    $caldays = [];
    $week_counter = $first_week_info['weekno'];
    $week_counter_max = $last_week_info['weekno'];

    // Correct for new year by calculating number of weeks in diff.
    if ($end_date
      ->format('W') < $start_date
      ->format('W')) {
      $week_counter_max = $week_counter + (int) floor($first_week_info['startweekdate']
        ->diff($last_week_info['startweekdate'])->days / 7);
    }
    do {
      $week_date = $first_week_info['startweekdate'];
      $week_end_date = clone $week_date;
      $week_end_date
        ->add(new DateInterval('P6D'));
      $calweek = [];

      // $week_header is already ordered so use first key.
      foreach ($week_header as $key => $value) {
        $week_header_day = $key;
        break;
      }

      // Inner loop to construct days for each week, some of which may be prefix or suffix.
      do {
        $calweek[$week_date
          ->format('Ymd')] = [
          'header' => $week_header[$week_header_day],
          'date' => $first_week_info['startweekdate']
            ->format('d'),
          'multiday' => [],
          'allday' => [],
          'other' => [],
        ];
        if ($week_date < $start_date) {
          $calweek[$week_date
            ->format('Ymd')]['class'] = 'prefix';
        }
        elseif ($week_date > $end_date) {
          $calweek[$week_date
            ->format('Ymd')]['class'] = 'suffix';
        }
        $week_date
          ->add(new DateInterval('P1D'));
        if ($week_header_day < 6) {
          $week_header_day++;
        }
        else {
          $week_header_day = 0;
        }
      } while ($week_date <= $week_end_date);

      // Add start- and enddate since we need this for offset calculations.
      $calweek_keys = array_keys($calweek);
      $startweekdate = new DateTime(array_shift($calweek_keys));
      $endweekdate = new DateTime(array_pop($calweek_keys));
      $caldays[$week_counter] = [
        'startweekdate' => $startweekdate,
        'endweekdate' => $endweekdate,
        'weekdays' => $calweek,
      ];
      $week_counter++;
    } while ($week_counter <= $week_counter_max);
  }
  return $caldays;
}