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

カレンダーを作成する

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

前回の続きです。

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

2019.10.27

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



カレンダーを作成する

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

今回の記事のポイントです。

  • 指定した月のカレンダーを表示させる

前回のコードを修正していきます。

指定した月のカレンダーを表示させる

それでは、指定した月のカレンダーを表示させていきます。

指定月を格納させる変数を用意して、それに対してインスタンスを生成するという準備を行います。

$t = '2019-11';
$thisMonth = new DateTime($t);
$yearMonth = $thisMonth->format('F Y');

thisMonth は、指定した月のインスタンスを格納するための変数です。

yearMonth は、指定した月の年月を表しています(文字列型)。

実際に echo などで表示させてみると以下のようになるかと思います。

November 2019

あとは、この yearMonth を使って、前回のコードを修正していきます。

例えば、前回だと以下のような表現があったかと思います。

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

this month は、yearMonth に書き換えることができます。

'first day of ' . $yearMonth

next month は、以下のように表現することができます。

$yearMonth . ' +1 month'

そして、prevous month は、以下のように表現できます。

$yearMonth . ' -1 month'

これらを使って、書き換えていき、あとは HTML で表示させているカレンダーのタイトル部分も yearMonth を使うようにします。

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

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

スタイルシートに関しては、今回も変更していないので、第1回目のものをご参照ください。

<?php
$t = '2019-11';
$thisMonth = new DateTime($t);
$yearMonth = $thisMonth->format('F Y');

$tail = '';
$PreMonthDay = new DateTime('last day of ' . $yearMonth . ' -1 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 ' . $yearMonth),
  new DateInterval('P1D'),
  new DateTime('first day of ' . $yearMonth . ' +1 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 ' . $yearMonth . ' +1 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"><?php echo $yearMonth; ?></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>

結果は以下の通りです。

カレンダー

最後に

いかがでしょうか。

次回は、リンクを動作させるための準備をしていく予定です。

今年の風邪は咳が長引くみたいなので、私と同じようなことにならないように皆様ご自愛ください。