【PHP講座】カレンダーを作成する No.2

カレンダーを作成する

PHP でカレンダーを作成します。

前回の続きです。

【PHP講座】カレンダーを作成する No.1

2019.10.22

今回は、翌月部分と前月部分をつくっていきたいと思います。



カレンダーを作成する

それでは、カレンダーを作成していきます。

今回の記事のポイントは以下の通りです。

  • 翌月カレンダーの作成
  • 前月カレンダーの作成

前回のコードを修正しながら、進めていきます。

翌月カレンダーの作成

翌月カレンダーを作成していきます。

前回の記事で当月分の表示をしているので、その後ろに追加で表示させる準備をします。

$head = '';
$nextMonthDay = new DateTime('first day of next month');
while ($nextMonthDay->format('w') > 0) {
  $head .= sprintf('<td class="except">%d</td>', $nextMonthDay->format('d'));
  $nextMonthDay->add(new DateInterval('P1D'));
}

変数 nextMonthDay に翌月の 1日のデータを持った DateTimeクラスのインスタンスを代入。

あとは、日曜日であれば、表示させず、そうでなければ、日曜日になるまで 1日ごとに td要素を変数 head に保管していく仕組みが while文のところです。

そして、前回表示させていた部分に追加で head を表示させます(詳しくは後で紹介するソースをご確認ください)。

前月カレンダーの作成

続いて、前月カレンダーを作成していきます。

こちらも前回の記事のコードに追加して、表示させる準備をしていきます。

$tail = '';
$PreMonthDay = new DateTime('last day of previous month');
while ($PreMonthDay->format('w') < 6) {
  $tail = sprintf('<td class="except">%d</td>', $PreMonthDay->format('d')) . $tail;
  $PreMonthDay->sub(new DateInterval('P1D'));
}

基本的に翌月カレンダーの作成と考え方は同じです。

ただ、前に文字列を連結していくところと 1日引いていくところ(While文)に注意が必要です。

今回の記事のサンプルコード

今回の記事のサンプルコードです(PHP)。

スタイルシートに関しては前回の内容と同じなので、確認したい方は前回の記事をご確認ください。

<?php

$tail = '';
$PreMonthDay = new DateTime('last day of previous month');
while ($PreMonthDay->format('w') < 6) {
  $tail = sprintf('<td class="except">%d</td>', $PreMonthDay->format('d')) . $tail;
  $PreMonthDay->sub(new DateInterval('P1D'));
}

$content = '';
$daterange = new DatePeriod(
  new DateTime('first day of this month'),
  new DateInterval('P1D'),
  new DateTime('first day of next month')
);

foreach ($daterange as $day) {
  if ($day->format('w') % 7 === 0) {
    $content .= '</tr><tr>';
  }
  $content .= sprintf('<td class="week_%d">%d</td>', $day->format('w'), $day->format('d'));
}

$head = '';
$nextMonthDay = new DateTime('first day of next month');
while ($nextMonthDay->format('w') > 0) {
  $head .= sprintf('<td class="except">%d</td>', $nextMonthDay->format('d'));
  $nextMonthDay->add(new DateInterval('P1D'));
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>My Calendar</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <table>
    <thead>
      <tr>
        <th><a href="">«</a></th>
        <th colspan="5">October 2019</th>
        <th><a href="">»</a></th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>Sun</td>
        <td>Mon</td>
        <td>Tue</td>
        <td>Wed</td>
        <td>Thu</td>
        <td>Fri</td>
        <td>Sat</td>
      </tr>
      <tr>
      <?php echo $tail . $content . $head; ?>
      </tr>
    </tbody>
    <tfoot>
      <tr>
        <th colspan="7"><a href="">Today</a></th>
      </tr>
    </tfoot>
  </table>
</body>

結果は以下の通りです。

カレンダー

最後に

いかがでしょうか。

次回は指定した月のカレンダーを表示できるようにしていきたいと思います。

コツコツやっていきます。