Изменить календарь для отображения нескольких событий в день - PullRequest
0 голосов
/ 02 апреля 2020

со вчерашнего дня я думаю о проблеме, которая у меня есть ...

Я использую этот календарный код для отображения календаря на моем веб-сайте.

Вот код PHP для него: (Я немного изменил его, чтобы представлять цвета и время в календаре)

 // CSS classes
          $css_cal = 'calendar';
          $css_cal_row = 'calendar-row';
          $css_cal_day_head = 'calendar-day-head';
          $css_cal_day = 'calendar-day';
          $css_cal_day_number = 'day-number';
          $css_cal_day_blank = 'calendar-day-np';
          $css_cal_day_event = 'calendar-day-event';
          $css_cal_event = 'calendar-event';

          // Table headings
          $headings = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];

          // Start: draw table
          $calendar =
            "<table cellpadding='0' cellspacing='0' class='{$css_cal}'>" .
            "<tr class='{$css_cal_row}'>" .
            "<td class='{$css_cal_day_head}'>" .
            implode("</td><td class='{$css_cal_day_head}'>", $headings) .
            "</td>" .
            "</tr>";

          // Days and weeks
          $running_day = date('N', mktime(0, 0, 0, $month, 1, $year));
          $days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year));

          // Row for week one
          $calendar .= "<tr class='{$css_cal_row}'>";

          // Print "blank" days until the first of the current week
          for ($x = 1; $x < $running_day; $x++) {
            $calendar .= "<td class='{$css_cal_day_blank}'> </td>";
          }

          // Keep going with days...
          for ($day = 1; $day <= $days_in_month; $day++) {

            // Check if there is an event today
            $cur_date = date('Y-m-d', mktime(0, 0, 0, $month, $day, $year));
            $draw_event = false;
            if (isset($events) && isset($events[$cur_date])) {
              $draw_event = true;
            }

            // Day cell
            $calendar .= $draw_event ?
              "<td class='{$css_cal_day} {$css_cal_day_event}'>" :
              "<td class='{$css_cal_day}'>";

            // Add the day number
            $calendar .= "<div class='{$css_cal_day_number}'>" . $day . "</div>";

            // Insert an event for this day
            if ($draw_event) {
              $calendar .=
                "<div class='{$css_cal_event}'>" .
                "<a href='{$events[$cur_date]['href']}' style='color:".$events[$cur_date]['color'].";'>" .
                $events[$cur_date]['time'].' Uhr: <br/>'.$events[$cur_date]['text'] .
                "</a>" .
                "</div>";
            }

            // Close day cell
            $calendar .= "</td>";

            // New row
            if ($running_day == 7) {
              $calendar .= "</tr>";
              if (($day + 1) <= $days_in_month) {
                $calendar .= "<tr class='{$css_cal_row}'>";
              }
              $running_day = 1;
            }

            // Increment the running day
            else {
              $running_day++;
            }

          } // for $day

          // Finish the rest of the days in the week
          if ($running_day != 1) {
            for ($x = $running_day; $x <= 7; $x++) {
              $calendar .= "<td class='{$css_cal_day_blank}'> </td>";
            }
          }

          // Final row
          $calendar .= "</tr>";

          // End the table
          $calendar .= '</table>';

          // All done, return result
          return $calendar;
        }

Теперь у меня есть два разных типа встреч, которые я получаю от своего дБ, преобразовать в массив и передать его как переменную $events:

$events = array();
            foreach ($partEvents as $event) {
                $events[date('Y-m-d', strtotime($event['eventDate']))] = array(
                    'text' => $event['description'],
                    'href' => '/nsl/editGroupCoaching/'.$event['ID'],
                    'time' => date('H:i', strtotime($event['eventDate'])),
                    'color' => '#edb01a'
                );
            }

            foreach ($appointments as $event) {
                $events[date('Y-m-d', strtotime($event['date']))] = array(
                    'text' => $event['description'],
                    'href' => '#',
                    'time' => date('H:i', strtotime($event['date'])),
                    'color' => '#00898d'
                );
            }

Поэтому я отображаю $partEvents в одном цвете и $appointments в другом цвете. В целом, это работает нормально, и они отображаются со временем перед ними. Однако всякий раз, когда в один день происходит 2 события, он больше не работает, поскольку ключ массива больше не является уникальным (отображается только 1 из 2 событий) ....

Что Я хотел бы иметь в виду, что в один день может быть 1,2,3 или даже 10 событий ...

Я подумал только о том, чтобы просто изменить генерацию массива и добавить H:i:s в ключах массива. однако, тогда больше не отображаются встречи ...

Как мне нужно изменить код из генерации календаря, чтобы иметь возможность добавлять несколько событий в день? Я много пытался поиграться с $runningDay и $cur_date, но, похоже, я не могу заставить его работать ... Должен признать, что я не самый лучший с многомерными массивами, хотя ..

Любая помощь приветствуется:)

1 Ответ

1 голос
/ 02 апреля 2020

Если вы добавите время к основному индексу событий, callendar не сможет напрямую определить, есть ли событие для данного дня. Вы можете добавить вторичный индекс, который будет использоваться после того, как будут найдены события на указанную дату (добавлены две локальные объясняющие переменные $date и $time - изменить их имена в случае конфликта с оставшейся частью кода):

        $events = array();
        foreach ($partEvents as $event) {
            $date = date('Y-m-d', strtotime($event['eventDate']));
            $time = date('H:i', strtotime($event['eventDate']));
            $events[$date][$time] = array(
                'text' => $event['description'],
                'href' => '/nsl/editGroupCoaching/'.$event['ID'],
                'color' => '#edb01a'
            );
        }

        foreach ($appointments as $event) {
            $date = date('Y-m-d', strtotime($event['eventDate']));
            $time = date('H:i', strtotime($event['eventDate']));
            $events[$date][$time] = array(
                'text' => $event['description'],
                'href' => '#',
                'color' => '#00898d'
            );
        }

Теперь вам нужно изменить способ отображения событий (потенциальные проблемы рендеринга оставлены для решения - просто добавьте копии одного события в ячейку таблицы):

        ...
        // Insert an event for this day
        if ($draw_event) {
            ksort($events[$cur_date]);
            foreach ($events[$cur_date] as $time => $event) {
                $calendar .=
                    "<div class='{$css_cal_event}'>" .
                    "<a href='{$event['href']}' style='color:".$event['color'].";'>" .
                    $time.' Uhr: <br/>'.$event['text'] .
                    "</a>" .
                    "</div>";
            }
        }
        ...
...