maki-o memo

制作に関する私的なメモです

phpでカレンダーを作りました

カレンダーを作ったので、メモ。

まず、表示したい月を決めます。
たとえば、現在の月を表示したいなら、

$nowts = time();

という、現在のタイムスタンプを格納する変数をつくる。
これを起点日とします。
今日以前は表示したくないカレンダーを作りたかったので、
この変数を基準に必要なパラメータを出していきます。

  • $stweek = date("w",$nowts);//起点日の曜日番号
  • $stday = date("j",$nowts);//起点日
  • $edday = date("t",$nowts);//起点日の月の最終日

まず、$nowts の月の残り日数を計算します。

$nokori = $edday-($stday-1);

起点日から-1をしないと引きすぎてしまいます。
ここに、$stweekを足します。
カレンダーは週単位で計算しないといけないので、起点日の週の既に終わった日も プラスしてあげないといけません。
なので、

$nokori += $stweek;

これをさらに、週の日数である、7で割り、切り上げます。
そうすると、計算すべき週数が出ます。

$nokori = ceil($nokori/7);

これで、必要なパラメータが揃いました。
これを処理して、smartyのテンプレートで表示したいので、加工しやすいように 配列を作ります。

forの入れ子で作りました。
式は以下。

for ($i = 0; $i<$nokori;$i++) { //処理する週数分繰り返し
    for ($j = 0;$j<7;$j++) { //一週間は7日なのでその分繰り返し
        if ($stweek != 0) { //最初の週の、当日に至るまでの日の処理
            $cal_ary[$i][$j]["day"] = "";
            $stweek--;
        } else {
            if ($stday <= $edday) { //最終日に至るまで、$stdayをインクリメントしながら挿入
                $cal_ary[$i][$j]["day"] = $stday;
                $stday++;
            } else {
                $cal_ary[$i][$j]["day"] = "";
            }
        }
    }
}

以上です。
テンプレート側の記述は以下。

<table>
    <tr>
        <th>日</th>
        <th>月</th>
        <th>火</th>
        <th>水</th>
        <th>木</th>
        <th>金</th>
        <th>土</th>
    </tr>
    {foreach from=$cal_ary item=value}
    <tr>
    {foreach from=$value item=value2}
        <td>{if $value2.day != ""}{$value2.day}{else}-{/if}</td>
    {/foreach}
    </tr>
    {/foreach}
</table>

プロフィール

フロントエンドエンジニア

Tomokazu Makita

名古屋でフリーランスでWeb制作してます。 フロントエンドのことを主にやってます。
a-blog cmsを使用したサイト制作が得意です。
お仕事のご相談随時受付中。

雪山大すき。冬は雪山の合間に仕事します。
財布はいつも吹雪です。

エントリーリスト

タグ