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>
					