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>