カレンダーを柔軟に作成 - PHPプロ!Q&A掲示板

3482

  • 0P

カレンダーを柔軟に作成

質問日時 / 2011年11月16日 13:24    回答数 / 1件

Questioner:  koyaman  このエントリーをはてなブックマークに追加 

キーワード / 次の月    前の月   

小山です。
phpで小さなカレンダーを作成して(php名:daycalender.php function名:daycalender)、index.phpでdaycalenderを呼出して表示させています。

<<前の月,次の月>>をクリックすると該当する月のカレンダーを表示させたいのですが、やり方がよくわかりません。

"jQuery"などで該当月を引数にしてphpのfunctionを呼出すのか、phpの再帰呼出しというのを利用するのでしょうか。


カレンダーは、PostgreSQLのデータを呼出して作成しています。
index.php daycalender呼出し部分。
<?php
<省略>
echo("<ul class=\"midasi-ul\">"."\n");
echo("<li>"."\n");
echo("<div id=\"indexcontainer\">"."\n");
echo("<ul class=\"indextabs\">"."\n");
echo("<li><a href=\"saisin.html\">最新情報</a></li>"."\n");
echo("<li><a href=\"osirase.html\">お知らせ</a></li>"."\n");
echo("<li><a href=\"othercont.html\">その他コンテンツ</a></li>"."\n");
echo("</ul>"."\n");
echo("<div id=\"indexpanel\"></div>"."\n");
echo("</div>"."\n");
echo("</li>"."\n");
echo("<li class=\"midasi-li\">"."\n");
echo("<div id=\"getureicontainer\">"."\n");
daycalender();
echo("</div>"."\n");
echo("</li>"."\n");
echo("</ul>"."\n");
echo("</div>"."\n");
?>

daycalender.php全文
<?php
function daycalender() {
//文字化け防止
echo("<link rel=\"stylesheet\" href=\"php/daycalender.css\" type=\"text/css\">"."\n");
echo "<div id=\"calender\">";
//コネクション呼出
require_once("../data/pgcon.php");
require_once("php/phpfunc.php");

//コネクション作成
$con=pgcon();

if (!$con) {
echo("接続できません。");
exit;
}

//クライアント側は、常に"UNICODE"
pg_set_Client_encoding($con,"UNICODE");

//年月変数初期セット
//セキュリティ対策
$year=getNumeric($_GET['year']); //年
$month=getNumeric($_GET['month']); //月


//daycalender.phpからみたpgcon.phpのPATHの設定
$path="../";
//GETデータのチェック:GETデータがなければ現在の西暦年
if (!$year) {
 $year=nowyear($path);
}


//GETデータのチェック:GETデータがなければ現在の西暦月
if (!$month) {
 $month=nowmonth($path);
}


echo "<span id=\"akaji\">赤字&nbsp;休市日</span>&nbsp;&nbsp;<span id=\"aoji\">青字&nbsp;臨時開市日</span>";

/************************************/
/*   休日数と開市日を取得する。
/***********************************/
$sql="select sum(x.kyu) as kyuiti,sum(x.kai) as kaiiti from ";
$sql.="(select count(hiduke) as kyu,0 as kai from tyosekit ";
$sql.="where date_part('YEAR',hiduke)=".$year. " ";
$sql.="and date_part('MONTH',hiduke)=".$month. " ";
$sql.="and kyuitibi not in(0,10) ";
$sql.="union all ";
$sql.="select 0 as kyu,count(hiduke) as kai from tyosekit ";
$sql.="where date_part('YEAR',hiduke)=".$year." ";
$sql.="and date_part('MONTH',hiduke)=".$month. " ";
$sql.="and kyuitibi  in(0,10))x";
//休市日と、開市日の結果を取得する。
$kyuiti=pg_query($con,$sql);

while($kyurow=pg_fetch_row($kyuiti)) {
echo "<div id=\"yasumi\">休市日:".$kyurow[0]. "日&nbsp;&nbsp;開市日:".$kyurow[1]."日</div>"."\n";
}

echo "<div id=\"monthlink\">"."\n";
echo "<ul>"."\n";
echo "<li class=\"before\"><a href=\"<?=daycalender() ?>\"><<前の月</a></li>"."\n";
echo "<li class=\"next\">次の月>></li>"."\n";
echo "</ul>"."\n";
echo "</div>"."\n";

//ひと月のデータを取得する。
$str="select hiduke,tyosekicd,tyosekiname,mangetucd,mangetu,geturei,kyuitibi,event,";
$str .="date_part('YEAR',hiduke) as _year,date_part('MONTH',hiduke) as _month,date_part('DAY',hiduke) as _day ";
$str .="from tyosekit where date_part('YEAR',hiduke)=".$year." and date_part('MONTH',hiduke)=".$month . "order by hiduke";
//echo $str."\n";

//月末日を取得
$endday=getMonthEndDay($year,$month);

//カレンダー行数初期化
$calrow=0;


//SQLを実行
$result=pg_query($con,$str);
if (!$result) {
echo("result Error");
exit;
}

//月単位のテーブル
echo "<table>\n";
echo "<tr>\n";
echo "<td colspan=\"7\" class=\"type1\">".$month."月</td>";
echo "</tr>\n";
echo "<tr><td class=\"type2\">日</td><td class=\"type3\">月</td><td class=\"type3\">火</td><td class=\"type3\">水</td>";
echo "<td class=\"type3\">木</td><td class=\"type3\">金</td><td class=\"type3\">土</td></tr>";
echo "<tr>\n";

while($rerow=pg_fetch_row($result)) {
//曜日を取得
$weekday=getweek($rerow[8],$rerow[9],$rerow[10]);
//echo $weekday . "\n";

/*各テーブルのクラスを休市日に応じてセットする。*/
switch ($rerow[6]) {
case 0: //出勤日
$td="<td class=\"type5\">";
break;
case 1: //日曜,祭日,市場休市日
case 2:
$td="<td class=\"type4\">";
break;
case 10: //開市日
$td="<td class=\"type6\">";
break;
}


//1日のみ日付のセットをする。
if ($rerow[10]==1) {
switch ($weekday) {
case "日":
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td>";
break;
case "月":
echo "<td class=\"type5\">&nbsp;</td>\n".$td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td>";
break;
case "火":
echo "<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n".$td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td>";
break;
case "水":
echo "<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n".$td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td>";
break;
case "木":
echo "<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n".$td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td>";
break;
case "金":
echo "<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n".$td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td>";
break;
case "土":
//土曜日なのでカレンダーの行数をカウント
$calrow+=1;
echo "<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td><td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n".$td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td></tr>";
break;
}
/**********************/
/*   月末時の処理     */
/**********************/
} elseif ($rerow[10]==$endday) {
switch ($weekday) {
case "日":
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td><td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n";
break;
case "月":
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td><td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n";
break;
case "火":
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td><td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n";
break;
case "水":
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td><td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n";
break;
case "木":
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td><td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n";
break;
case "金":
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td><td class=\"type5\">&nbsp;</td>\n";
break;
case "土":
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td></tr>";
break;
}
//月末なのでカレンダーの行数をカウント
$calrow+=1;
//カレンダー5行で終了する時は、もう一行追加。
if ($calrow==5) 
{
echo "<tr><td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td>\n<td class=\"type5\">&nbsp;</td></tr>\n";
}

} else {
//1日,月末以外
//土曜日のみ改行をつける。
//日曜日は、行の始まりをセット。
if ($weekday=="土") {
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td></tr>";
//カレンダーの行数をカウント
$calrow+=1;

    } elseif ($weekday=="日") {
echo "<tr>".$td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td>";
} else {
echo $td.$rerow[10]."<div class=\"disp1\">".$rerow[2]."</DIV></td>";
}
}
}
echo "</table>";
/************************while文終了*****************************/

echo "</div>";
//クローズする。
pg_close($con);
}
?>

何かヒントでもよいのでよろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01signal>>CODE <?php $year=getNumeric($_GET['year']); //

回答一覧

並び替え:

A01 満足
answerersignal [11月16日 13:36]

  1. <?php
  2. $year=getNumeric($_GET['year'])//年
  3. $month=getNumeric($_GET['month'])//月
これがちゃんと動いてるなら
$year = 2011
$month = 11
のとき
  1. <a href="?year=2011&month=10">前の月</a>
  2. <a href="?year=2011&month=12">次の月</a>
を表示すればいいだけですね

jQueryを使いたければ使ってもいいですし、再帰をどこで使いたいのか
わからないですけど、使えるなら使ってもいいと思います。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)