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>