LoginSignup
9
15

More than 5 years have passed since last update.

ホームページで使うカレンダーの作り方(PHPプログラムのベース)

Last updated at Posted at 2018-05-08

Laravelで作りたいシステムがあって、カレンダーが必要だったのでそういうパッケージがないかと探したけどなさ気だったので、カレンダーを表示するルーチンを作りました。phpファイル1つなのでLaravelじゃなくてもCodeigniterでも静的なホームページでも使えます。

動くサンプル
http://www.uneri.tokyo/php/20180508_calendar/

GitHub
https://github.com/uneri/calendar/blob/master/index.php

ポイント
・内閣府ホームページの"国民の祝日について"からデータを取得しています
・デザイナーの方にも使いやすいようにPHPとHTMLをなるべく分離するよう意識しました

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>ホームページで使うカレンダー(祝日つき)(PHPプログラムのベース)</title>
    <meta charset="utf-8">
    <meta name="description" content="ホームページで使うカレンダー(祝日つき)(PHPプログラムのベース)">
    <meta name="author" content="shimamura">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
</head>
<body>
<?php
  //Control 日付作成処理
  // 1ヶ月分の日付を格納
  $days = array();
  // 1年分の日付を格納
  $cals = array();
  //今月の最終日を格納
  $lastday = date('Y-m-t');

  //祝日設定処理
  $conf_horiday = true;
  if ($conf_horiday) {
    $horidays = array();
    $horiname = array();
    // 内閣府ホームページの"国民の祝日について"よりデータを取得する
    $res = file_get_contents('http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu_kyujitsu.csv');
    $res = mb_convert_encoding($res, "UTF-8", "SJIS");
    $pieces = explode("\r\n", $res);
    $dummy = array_shift($pieces);
    $dummy = array_pop($pieces);

    foreach ($pieces as $key => $value) {
      $temp = explode(',', $value);
      $horidays[] = $temp[0];  //日付を設定
      $horiname[] = $temp[1];  //祝日名を設定
    }
  }

  for ($i = 0; $i <= 365; $i++) {
    //日付を1日ずつ増やしていく mktime(hour, minute, second, month, day, year)
    $day = date('Y-m-d', mktime(0, 0, 0, date('m'), date('1') + $i, date('Y')));
    //日付を格納する
    $days[$i]['day'] = $day;
    //祝日を設定する
    if ($conf_horiday) {
      $ind = array_search($day,$horidays);
      if ($ind){
        $days[$i]['hori'] = $horiname[$ind];
      } else {
        $days[$i]['hori'] = '';
      }
    } else {
      $days[$i]['hori'] = '';
    }
    //その他必要な処理をここに追加する
    //$days[$i]['hoge'] = '';

    if ($day == $lastday){
      //月末日の処理
      //次の月末日で更新する
      $target_day = date("Y-m-1", strtotime($lastday));
      $lastday = date("Y-m-t",strtotime($target_day . "+1 month"));
      //月ごとに格納する
      $cals[] = $days;
      $days = array();
    }
  }
?>




  <div class="container">
    <h1>カレンダー(祝日つき)</h1>
<?php
  //View 表示処理
  //$weeklavel = array("日", "月", "火", "水", "木", "金", "土");
  //echo $weeklavel[$ww];
  foreach ($cals as $key => $mm) {
    foreach ($mm as $key => $dd) {
      //月を表示する
      $dayD = new DateTime($dd['day']);
      echo '<h3>'.$dayD->format('Y').'年'.$dayD->format('n').'月</h3>';
      break;
    }
?>
    <div class="table-responsive">
      <!-- table class="table table-bordered" style="table-layout:fixed;" -->
      <table class="table table-bordered">
        <thead>
          <tr>
            <th class="danger"><span class="text-danger"></span></th>
            <th></th>
            <th></th>
            <th></th>
            <th></th>
            <th></th>
            <th class="info"><span class="text-info"></span></th>
          </tr>
        </thead>
        <tbody>
          <tr>
<?php
    $j = 0;
    $first = true;
    foreach ($mm as $key => $dd) {
      $dayD = new DateTime($dd['day']);
      $ww = $dayD->format('w');

      if ($first){
        //月の初めの開始位置を設定する
        for ($j = 0; $j < $ww; $j++) {
          //$jはこの後も使用する
          echo '<td></td>';
        }
        $first = false;
      }
      if ($dd['hori']){
        //祝日
        echo '<td class="danger"><span class="text-danger">'.$dayD->format('j').$dd['hori'].'</span></td>';
      } elseif($j == 0) {
        //日曜日
        echo '<td class="danger"><span class="text-danger">'.$dayD->format('j').'</span></td>';
      } elseif($j == 6) {
        //土曜日
        echo '<td class="info"><span class="text-info">'.$dayD->format('j').'</span></td>';
      } else {
        //その他平日
        echo '<td>'.$dayD->format('j').'</td>';
      }

      $j = $j + 1;
      if ($j >= 7){
        //土曜日で折り返す
        echo '</tr><tr>';
        $j = 0;
      }
    }  //月ごとの foreach ここまで
?>
          </tr>
        </tbody>
      </table>
    </div><!-- table-responsive end -->
<?php
  }  //1年分の foreach ここまで
?>
  </div><!-- container end -->
</body>
</html>
9
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
15