みんなのスケジュール帳

 「KOMOカレンダー」を使って、みんなで書き込めるスケジュール帳を作って見ました。自分だけで使うには管理画面とか認証機能を付けなくては行けませんが、一応その前段階のスクリプトと言う事で…。もし会員のみが使用可能とかしたいのであれば、.htaccessファイルを使ってフォルダ自体にアクセス制限をかけてもいいかも(^^ゞ

 尚、ログ保存用ファイルが必要ですのでお忘れなく_(._.)_

<?php
//============初期設定============
$last_year = 2037;
$wday_color = "#000000"; //平日の文字色は黒
$sat_color = "#0000ff"; //土曜日の文字色は青
$sun_color = "#ff0000"; //日曜日の文字色は赤
$reg_color = "#ffccff"; //今日の日付の背景色は淡いピンク
//変数$yearがセットされていなければ当年
$year = (!isset($year)) ? date("Y") : $year; ←条件演算子
//変数$monthがセットされていなければ当月
$month = (!isset($month)) ? date("n") : $month; ←条件演算子
$today = date("Y/n/j"); //今日の日付データ
$data_max = 100; //データ最大記録数
$data_file = './log.dat';
[条件演算子]
(式1) ? (式2) : (式3);
式1がtrueの場合に式2を、式1がfalseの場合に式3を返します。

赤色部分が今回の追加分
$todayは、今日の日付データを文字列で取得しています。
$data_maxは、ログに保存する記事の最大数です。
$data_fileは、ログ保存用のファイル指定です。
if($action == 'regist'){
 if($subject && $comment){
  //ここから書き込みデータの調整
  if($ayear && $amonth && $aday){
   $date = $ayear . "/" . $amonth . "/" . $aday;
  }
  $code = time(); //現在の秒数をゲット
  $subject = htmlspecialchars($subject);
  $subject = nl2br($subject);
  $subject = str_replace("\r", "", $subject);
  $subject = str_replace("\n", "", $subject);
  $comment = htmlspecialchars($comment);
  $comment = nl2br($comment);
  $comment = str_replace("\r", "", $comment);
  $comment = str_replace("\n", "", $comment);
  //ログファイルの区切文字(",")と区別するために文字コード(&#44)に書き換える。
  $subject = str_replace(",", "&#44;",$subject);
  $comment = str_replace(",", "&#44;",$comment);
  //日付の重複をチェック
  $message = file($data_file);
  $chk_flag = 0;
  for($i = 0; $i <= count($message); $i++){
   list($ccode,$cdate,$ccomment,$csubject) = split( ",", $message[$i]);
   if($date == $cdate){
    $chk_flag++;
    break;
   }
  }
  unset($message);
  if($chk_flag < 1){
   $message = file($data_file);
   //配列要素を文字列により連結
   $input_msg = implode(",", array($code,$date,$comment,$subject));
   $fp = fopen($data_file, "w");
   rewind($fp);
   fputs($fp, "$input_msg\n");
   //最大記録数の調整
   if($data_max <= count($message)){
    $msg_num = $data_max - 1;
   }else{
    $msg_num = count($message);
   }
   for($i = 0; $i < $msg_num; $i++){
    fputs($fp, $message[$i]);
   }
   fclose($fp);
   unset($message);
  }
 }
}
新規追加部分です。

いつもの記事書き込み部分ですが、注意しなくては行けないのは、同じ日付のログがあれば書き込みしないようにしなくてはいけない点です。

まず
$data_fileを読み取って、フォームから送られて来た変数$dateの内容と、ログ中の変数$cdateの内容とを照合します。もし、同じ日付があれば、変数$chk_flagの値を一つ増やし、break文でループから抜けます。

次に
$chk_flagの値をチェックし、値が「0」のままなら初めて、フォームから送られて来た各データをログファイルに書き込みます。ついでに最大記録数の調整も行っています。
if($action == 'update'){
 $repdata = file($data_file);
 $fp = fopen($data_file, "w");
 for($i=0; $i<count($repdata); $i++){
  list($rcode,$rdate,$rcomment,$rsubject) = split( ",", $repdata[$i]);
  if ($date == $rdate) {
   $comment = nl2br($comment);
   $comment = str_replace("\r", "", $comment);
   $comment = str_replace("\n", "", $comment);
   $repdata[$i] = "$code,$date,$comment,$subject\n";
   fputs($fp, $repdata[$i]);
  } else {
   fputs($fp, $repdata[$i]);
  }
 }
 fclose($fp);
}
新規追加部分です。

ログファイルのアップデート(修正)処理の部分です。

ここではログファイルを
書き込みモード「w」で開いて、フォームから送られて来た変数$dateの内容と、ログ中の変数$rdateの内容が一致すれば、そのログの内容をフォームから送られて来た新たな内容に置き換えて、ログファイルに書き込んでいます。

ここで注意が必要なのは、ログデータの各行末に改行文字「
\n」が付いている点です。コメントの中の改行文字の処理をしなくては行けないので、わざと$commentと$subjectの順番を反対にしています。

もし、$commentが並びの最後にあった場合、データを分割した際に行末の改行文字「
\n」が分割後の$commentに付加されてしまう為、アップデートを行う度に、ログの最後の改行処理が増えて行ってしまいます。あらら…(+_+)
if($action == 'delete'){
 $deldata = file($data_file);
 $fp = fopen($data_file, "w");
 for($i=0; $i<count($deldata); $i++){
  list($dcode,$ddate,$dcomment,$dsubject) = split(",", $deldata[$i]);
  if ($code != $dcode) {
   fputs($fp, $deldata[$i]);
  }
 }
 fclose($fp);
}
?>
新規追加部分です。

ここもお決まりの記事削除処理部分です。フォームから送られて来た変数
$codeの内容と、ログ中の変数$dcodeの内容が一致しなければ再度ログファイルに書き込む事によって、該当の記事を削除しています。

ここは日付データで条件判断をしていません。飽くまでも、記事番号を使っています。
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis">
<TITLE>KOMOカレンダー</TITLE>
</HEAD>
<BODY>
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded">
<P><FONT SIZE="6" COLOR="#006600">KOMOカレンダー</FONT></P>
<P>
<TABLE BORDER="0">
<TR><TD>
<TABLE BORDER="3" CELLSPACING="1" CELLPADDING="1">
<TR>
<TD COLSPAN="7">
<SELECT NAME="year">

<?php
for($i = 2002; $i <= $last_year; $i++){
 echo "<option value=" . $i . (($i == $year) ? ' selected' : '') . ">" . $i . "年\n";
}
?>

</SELECT>
<SELECT NAME="month">

<?php
for($i = 1; $i <= 12; $i++){
 echo "<option value=" . $i . (($i == $month) ? ' selected' : '') . ">" . $i . "月\n";
}
?>

</SELECT>
<INPUT TYPE="SUBMIT" NAME="Submit" VALUE="更新"></TD>
</TR>
<TR>
<TD>
<P ALIGN="CENTER"><FONT COLOR="red">日</FONT>
</TD>
<TD>
<P ALIGN="CENTER">月
</TD>
<TD>
<P ALIGN="CENTER">火
</TD>
<TD>
<P ALIGN="CENTER">水
</TD>
<TD>
<P ALIGN="CENTER">木
</TD>
<TD>
<P ALIGN="CENTER">金
</TD>
<TD>
<P ALIGN="CENTER"><FONT COLOR="blue">土</FONT>
</TD>
</TR>

<?php

//その月の初日のタイムスタンプを取得
$time = mktime(0, 0, 0, $month, 1, $year);
//その月の初日の曜日を取得
$day_of_first = date("w", $time);
//その月の日数を取得
$date_of_month = date("t", $time);
//その月の週数を取得
$week_of_month = ceil($date_of_month / 7);
if(($date_of_month % 7 > 7 - $day_of_first) || ($date_of_month % 7 == 0 && $day_of_first != 0)){
 $week_of_month++;
}
//カレンダーを出力
for($i = 1; $i <= $week_of_month * 7; $i++){
 if($i % 7 == 1){
  echo "<tr>";
 }
 if(($i - 1 < $day_of_first) || ($i > $date_of_month + $day_of_first)){
  echo "<td>&nbsp;</td>";
 }else{
  if($i % 7 == 1){
   $color = $sun_color;
  }elseif($i % 7 == 0){
   $color = $sat_color;
  }else{
   $color = $wday_color;
  }
従来と同じ。詳しくは「KOMOカレンダー」のページをご覧下さい。
  //日付を整形
  $day = $i - $day_of_first;
  $date_str = $year . "/" . $month . "/" . $day;
  if($date_str == $today){
   echo "<td width=30 height=30 align=right valign=top bgcolor=$reg_color>";
 ←背景色を指定
  }else{
   echo "<td width=30 height=30 align=right valign=top>";
  }
  $message = file($data_file);
  $day_flag = 0;
  for($j=0; $j<count($message); $j++){
   list($code,$date,$subject,$comment) = split( ",", $message[$j]);
   if($date_str == $date){
    $day_flag++;
    break;
   }
  }
  if($day_flag > 0){
   echo "<a href=$PHP_SELF?action=edit&date_str2=" . $date_str . ">$day</a>";
  }else{
   echo "<font color=" . $color . ">$day</font>";
  }
  echo "</td>";
 }
新規修正部分です。

まず最初にこの部分に表示する日付を生成します。変数
$dayがそうです。次に年月日の文字列に当たる$date_strを生成します。

次に初期設定部分で求めていた今日の日付文字列
$today$date_strとを比較し、今日の日付のセルのバックカラーを、初期設定部分で指定した色に変えます。

そしてデータファイルを開き、この日の日付データがログ中に存在するかどうか調べます。もしあれば、変数
$day_flagの値を一つ増やして、break文でループらか抜けます。

最後にこの
$day_flagの値を元に、この部分の日付データ(数字)にリンクを付けるかどうか決めます。
 if($i % 7 == 0){
  echo "</tr>\n";
 }
}
?>

</TABLE></FORM>
</TD><TD>
従来と同じ。
<?php
if($action == 'add'){
 echo "<form action=$PHP_SELF method=POST>\n";
 echo "<input type=hidden name=action value=regist>\n";
 echo "<table border=0>\n";
 echo "<tr><td></td><td><font color='red'>お好きな日付に登録できます。</font></td></tr>\n";
 echo "<tr><td align=right>日付:</td><td><select name=ayear>";
 for($i = 2002; $i <= $last_year; $i++){
  echo "<option value=" . $i . (($i == $year) ? ' selected' : '') . ">" . $i . "</option>";
 }
 echo "</select>年 <select name=amonth>";
 for($i = 1; $i <= 12; $i++){
  echo "<option value=" . $i . (($i == $month) ? ' selected' : '') . ">" . $i . "</option>";
 }
 echo "</select>月 <select name=aday>";
 for($i = 1; $i <= 31; $i++){
  echo "<option value=" . $i . ">" . $i . "</option>";
 }
 echo "</select>日\n";
 echo "</td></tr>\n";
 echo "<tr><td align=right>題名:</td><td><input type=text size=35 name=subject></td></tr>\n";
 echo "<tr><td align=right>コメント:</td><td><textarea name=comment rows=5 cols=50></textarea></td></tr>\n";
 echo "<tr><td></td><td><input type=submit value=登録/更新> <input type=reset value=リセット></td></tr>\n";
 echo "</table></form>\n";
新規追加部分です。

ここは新規登録の際の、書き込みフォームの表示部分です。

日付部分は、指定のフォームになるよう、ドロップダウンリストを使って日付を選択するようにしています。

新規登録ですので、各項目の
valueには何も値を持たせていません。
}elseif($action == 'edit'){
 $message = file($data_file);
 for($i = 0; $i <= count($message); $i++){
  list($code,$date,$comment,$subject) = split( ",", $message[$i]);
  if($date_str2 == $date){
   $e_code = $code;
   $e_date = $date;
   $e_subject = $subject;
   $e_comment = str_replace("<br />", "\n", $comment);
   break;
  }
 }
 unset($message);
 echo "<form action=$PHP_SELF method=POST>\n";
 echo "<input type=hidden name=action value=update>\n";
 echo "<input type=hidden name=code value=$e_code>\n";
 echo "<table border=0>\n";
 echo "<tr><td align=right>日付:</td><td>$e_date</td></tr>\n";
 echo "<input type=hidden name=date value=$e_date>\n";
 echo "<tr><td align=right>題名:</td><td><input type=text size=35 name=subject value=$e_subject></td></tr>\n";
 echo "<tr><td align=right>コメント:</td><td><textarea name=comment rows=5 cols=50>$e_comment</textarea></td></tr>\n";
 echo "<tr><td></td><td><input type=submit value=修正/更新> <input type=reset value=リセット></td></tr>\n";
 echo "<tr><td></td><td><a href=$PHP_SELF?action=delete&code=" . $e_code . ">この記事を削除</a> <a href=$PHP_SELF?action=add>新規登録</a></td></tr>\n";
 echo "</table></form>\n";
新規追加部分です。

ここはログ編集の際の、修正フォームの表示部分です。修正ですので、当然一旦ログファイルを開いて、同じ日付のデータを探して持って来ています。ここで抽出したデータを修正フォームの各項目の
valueの値に持たせています。
}else{
 $message = file($data_file);
 $e_flag = 0;
 for($i = 0; $i <= count($message); $i++){
  list($code,$date,$comment,$subject) = split( ",", $message[$i]);
  if($today == $date){
   $e_flag++;
   $e_code = $code;
   $e_date = $date;
   $e_subject = $subject;
   $e_comment = str_replace("<br />", "\n", $comment);
   break;
  }
 }
 unset($message);
 if($e_flag > 0){
  echo "<form action=$PHP_SELF method=POST>\n";
  echo "<input type=hidden name=action value=update>\n";
  echo "<input type=hidden name=code value=$e_code>\n";
  echo "<table border=0>\n";
  echo "<tr><td></td><td><font color='red'>今日のスケジュールは既に登録されています。</font></td></tr>\n";
  echo "<tr><td align=right>日付:</td><td>$e_date</td></tr>\n";
  echo "<input type=hidden name=date value=$e_date>\n";
  echo "<tr><td align=right>題名:</td><td><input type=text size=35 name=subject value=$e_subject></td></tr>\n";
  echo "<tr><td align=right>コメント:</td><td><textarea name=comment rows=5 cols=50>$e_comment</textarea></td></tr>\n";
  echo "<tr><td></td><td><input type=submit value=修正/更新> <input type=reset value=リセット></td></tr>\n";
 }else{
  echo "<form action=$PHP_SELF method=POST>\n";
  echo "<input type=hidden name=action value=regist>\n";
  echo "<table border=0>\n";
  echo "<tr><td></td><td><font color='red'>今日のスケジュールはまだ登録されていません。</font></td></tr>\n";
  echo "<tr><td align=right>日付:</td><td><input type=text size=15 name=date value=$today></td></tr>\n";
  echo "<tr><td align=right>題名:</td><td><input type=text size=35 name=subject></td></tr>\n";
  echo "<tr><td align=right>コメント:</td><td><textarea name=comment rows=5 cols=50></textarea></td></tr>\n";
  echo "<tr><td></td><td><input type=submit value=登録/更新> <input type=reset value=リセット></td></tr>\n";
 }
 echo "<tr><td></td><td><a href=$PHP_SELF?action=add>新規登録</a></td></tr>\n";
 echo "</form></table>\n";
}
?>
新規追加部分です。

ここはこのページを開いた際のデフォルトのフォームの表示部分です。今日の日付データ
$todayを使って、ログファイル中に同じ日付のログがないかまず調べます。

もしあれば、変数
$e_flagの値を一つ増やして、各項目のデータを抽出し整形した後、break文にてループを抜けます。

後は変数
$e_flagの値を元に、今日の日付のログが既に存在する場合と、そうでない場合との、書き込みフォームの表示部分の切替をします。
</TD></TR>
</TABLE>
</FORM>
</BODY>
</HTML>
表組みを閉じ、HTML表示を終了します。

 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。

HOME