第19回 スケジューラーを作ろう(9) - スケジューラー完成 - - PHP基礎講座

PHP基礎編

Saity先生のPHP基礎講座

Lecutures on PHP

第19回 スケジューラーを作ろう(9) - スケジューラー完成 - (その2)

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

デザインを整えて

  • これで機能的には一通りそろったかな。
  • あとは、見た目ですね~。このままじゃちょっと。。。saity
  • よし、じゃあCSSとHTMLのデザインを熊ちゃんにお願いしてみよう。お願いします、熊ちゃん!
  • わかりました。それではささっとやっつけてしまいましょう。
  • わっ。(い、いつの間に現れたんだろう。。。
  • (カタカタ...)ふぅ。。。こんな感じでしょうか。

schedule_calendar.php

<?php

// カレンダーの年月をタイムスタンプを使って指定
if (isset($_GET["date"]) && $_GET["date"] != "") {
 
$date_timestamp $_GET["date"];
} else {
 
$date_timestamp time();
}
$month date("m"$date_timestamp);
$year date("Y"$date_timestamp);

$first_date mktime(000$month1$year); 
$last_date mktime(000$month 10$year); 

// 最初の日と最後の日の「日にち」の部分だけ数字で取り出す。
$first_day date("j"$first_date);
$last_day date("j"$last_date);

// 全ての日の曜日を得る。
for($day $first_day$day <= $last_day$day++) {
 
$day_timestamp mktime(000$month$day$year);
 
$week[$day] = date("w"$day_timestamp);
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>カレンダー</title>
<style type="text/css">
 a:link {color: #3366FF; background-color: transparent; 
 text-decoration: none; font-weight: bold;}
 a:visited {color: #2B318F; background-color: transparent; 
 text-decoration: none; font-weight: bold;}
 a:hover {color: #00BFFF; background-color: transparent;
 text-decoration: underline;}
 body {color: #333333; background-color: #FFFFFF;}
 table {border: 1px solid #CCCCCC; border-collapse: collapse;
 margin-bottom: 1em;}
 td {border: 1px solid #CCCCCC; width: 2.5em; height: 2.5em;
 text-align: right; vertical-align: bottom; padding: 2px;}
 th {border: 1px solid #CCCCCC; color: #333333;
 background-color: #F0F0F0; padding: 5px;}
</style>
</head>
<body>
<table border="1">
 <tr>
  <th colspan="2"><a href="schedule_calendar.php?date=
<?php print(strtotime("-1 month"$first_date)); ?>">前月</a></th>
  <th colspan="3"><?php print(date("Y"$date_timestamp) . "年" date("n"$date_timestamp) . "月"); ?></th>
  <th colspan="2"><a href="schedule_calendar.php?date=
<?php print(strtotime("+1 month"$first_date)); ?>">次月</a></th>
 </tr>
 <tr>
  <th>日</th>
  <th>月</th>
  <th>火</th>
  <th>水</th>
  <th>木</th>
  <th>金</th>
  <th>土</th>
 </tr>
 <tr>
  <?php
  
// カレンダーの最初の空白部分
  
for ($i 0$i $week[$first_day]; $i++) {
   print(
"<td></td>\n");
  }

  
$filename "samplefile.txt";
  
$schedule_list file($filename);
  for (
$day $first_day$day <= $last_day$day++) {
   if (
$week[$day] == 0) {
    print(
"</tr>\n<tr>\n");
   }

   
// スケジュールが存在するかどうかチェックする 
   
$exist_schedule false
   foreach (
$schedule_list as $lineno => $line) {
    list(
$schedule_date$title$body) = explode("|"$line);
    if (
$schedule_date == $year $month sprintf("%02d"$day)) {
     
$exist_schedule true;
     break;
    }
   }

   
// スケジュールが存在したらリンクをつける
   
if ($exist_schedule) {
    print(
"<td><a href=\"schedule_list.php?year=" .$year 
"&month="$month "&day=$day\">$day</a></td>\n");
   } else {
    print(
"<td>$day</td>\n");
   }
  }

  
// カレンダーの最後の空白部分
  
for ($i $week[$last_day] + 1$i 7$i++) {
   print (
"<td></td>\n");
  }
  
?>
 </tr>
</table>
<a href="schedule_edit.php">スケジュールの新規作成</a>
</body>
</html>

schedule_list.php

<?php
  $filename 
"samplefile.txt";
  
$schedule_list file($filename);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>スケジュール一覧</title>
<style type="text/css">
 a:link {color: #3366FF; background-color: transparent;
 text-decoration: none; font-weight: bold;}
 a:visited {color: #2B318F; background-color: transparent;
 text-decoration: none; font-weight: bold;}
 a:hover {color: #00BFFF; background-color: transparent;
 text-decoration: underline;}
 body {color: #333333; background-color: #FFFFFF;}
 table {border: 1px solid #CCCCCC; border-collapse: collapse;
 margin-bottom: 1em;}
 td {border: 1px solid #CCCCCC; height: 2.5em; 
     vertical-align: middle; padding-left: 1em; padding-top: 2px; 
     padding-right: 1em; padding-bottom: 2px;}
 th {border: 1px solid #CCCCCC; color: #333333; 
     background-color: #F0F0F0; padding: 5px;}
</style>
</head>
<body>
<table border="1">
 <tr>
  <th>日付</th>
  <th>タイトル</th>
  <th>内容</th>
  <th>編集</th>
  <th>削除</th>
 </tr>

<?php
foreach ($schedule_list as $lineno => $line) {
 list(
$schedule_date$title$body) = explode("|"$line);
 if (
$schedule_date == date("Ymd"mktime(000$_GET["month"],
 
$_GET["day"], $_GET["year"]))) {
  print(
"<tr>\n");
  print(
"<td>$schedule_date</td>\n");
  print(
"<td>$title</td>\n");
  print(
"<td>$body</td>\n");
  print(
"<td><a href=\"schedule_edit.php?lineno=$lineno&mode=edit\">編集する</a></td>\n");
  print(
"<td><a href=\"schedule_edit.php?lineno=$lineno&mode=
  delete\">削除する</a></td>\n"
);
  print(
"</tr>\n");
 }
}
?>
</table>
</body>
</html>

※編集部注:「samplefile.txt」がない場合は警告が出ますのでご自分で作成してください。

  • おおっ。相変わらずきれいな画面、さすが熊ちゃん☆
  • あれ?今回出てきた[ a:link { ・・・ } ]みたいな指定のしかた、初めて見るわ。タグの後ろをコロン(:)で区切るのは、以前は教わらなかったような。。。
  • そうですね。この、コロンで区切った後ろの部分は、前のタグ(ここでは<a>タグ)の状態別にスタイルを定義しているんです。
  • うーん・・・??
  • 今の場合であれば、a:linkはまだアクセスをしたことがないリンク、a:visitedはすでにアクセスしたことのあるリンク、a:hoverは今マウスが乗っているリンクの状態をそれぞれ表しているんです。saity
  • ふむ~。たしかに、<a>タグってそういういろんな状態がありますもんね。
  • やはりPHP講座なので深い話は避けますが、このように指定することで、リンクの状態に応じてスタイルを柔軟に変更できるんですよ。
  • なるほろ。。。 またひとつCSSの勉強になったわ☆
  • うんうん、そうだね~。熊ちゃん、ありがとう!
  • いえいえ。それでは私はこの辺で。
  • ありがとうございました~。

最後に

  • これでスケジューラの画面も整いましたね!
  • そうだね。さて、これらに加えて、以前作成していた登録、編集用のschedule_edit.phpも再掲しておこう。

schedule_edit.php

<?php
$filename 
"samplefile.txt";

if (isset(
$_POST["regist"])) {
  
// 登録の処理を開始する
  // 入力チェック
  
$error_message array();

  if (isset(
$_POST["year"]) && is_numeric($_POST["year"]) 
   && 
$_POST["year"] > 2000) {
    
$year $_POST["year"];

  } else {
    
$error_message[] = "年を正しく入力してください。";

  }
  if (isset(
$_POST["month"]) && is_numeric($_POST["month"]) && 
   
$_POST["month"] > && $_POST["month"] < 13) {
    
$month $_POST["month"];
  } else {
    
$error_message[] = "月を正しく入力してください。";
  }
  if (isset(
$_POST["day"]) && is_numeric($_POST["day"]) &&
   
$_POST["day"] > && $_POST["day"] < 32) {
    
$day $_POST["day"];
  } else {
    
$error_message[] = "日を正しく入力してください。";
  }
  if (isset(
$_POST["title"]) && $_POST["title"]) {
    if (
strstr($_POST["title"], "|")) {
      
$error_message[] = 
        
"申し訳ありませんが、タイトルに|文字は使えません。";
    } else {
      
$title $_POST["title"];
    }
  } else {
    
$error_message[] = "タイトルを入力してください。";
  }
  if (isset(
$_POST["body"]) && $_POST["body"]) {
    if (
strstr($_POST["body"], "|")) {
      
$error_message[] = "申し訳ありませんが、内容に|文字は使えません。";
    } else {
      
$body $_POST["body"];
    }
  } else {
    
$error_message[] = "内容を入力してください。";
  }
  if (!
count($error_message)) {
    
// 内容の改行を<br>タグに変換する
    
$body str_replace(array("\r\n""\r""\n"), "<br>"$body);
    
$schedule_date sprintf("%04d%02d%02d"$year$month$day);
    
$new_line $schedule_date."|".$title."|".$body."\n";
    if (isset(
$_POST["lineno"])) {
      
schedule_edit($filename$_POST["lineno"]);
    } else {
      
$fp fopen($filename"a");
      
fwrite($fp$new_line);
      
fclose($fp);
    }
    
// カレンダー画面へリダイレクト
    
header("Location: http://localhost/schedule_calendar.php");
    exit;
  }
} elseif (isset(
$_GET["mode"]) && $_GET["mode"] == "delete") {
  
schedule_edit($filename$_GET["lineno"]);
  
header("Location: http://localhost/schedule_calendar.php");
  exit;
} else {
  if (isset(
$_GET["lineno"])) {
    
$lineno intval($_GET["lineno"]);
    
$schedule_list file($filename);
    
$line $schedule_list[$lineno];
    if (!
$line) {
      
// スケジュールが見つからなかった場合
      
print("指定されたスケジュールは見つかりません");
      exit;
    }
    list(
$schedule_date$title$body) = explode("|"$line);
    
$year intval(substr($schedule_date04));
    
$month intval(substr($schedule_date42));
    
$day intval(substr($schedule_date62));
  }
}

function 
schedule_edit ($filename$linenumber) {
  
$schedule_list file($filename);
  
$fp fopen($filename"w");
  foreach (
$schedule_list as $lineno => $original_line) {
    if (
$lineno == $linenumber) {
      if (isset(
$_GET["mode"]) && $_GET["mode"] == "delete") {
        
// 何も書き込まない
      
} else {
        
fwrite($fp$GLOBALS["new_line"]);
      }
    } else {
      
fwrite($fp$original_line);
    }
  }
  
fclose($fp);
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head> 
<title>スケジュール登録</title> 
<style type="text/css">
   h1 {color: #666666; font-size: 1.3em; font-weight: bold;
   border-left: 10px solid #99CC99; border-bottom: 2px 
   solid #99CC99;}
   form {color: #333333; background-color: #FFFFFF;}
   label {font-weight: bold; color: #333333; 
   background-color: transparent;}
   input, textarea {border: none; color: #333333;
   background-color: #FFFFFF;}
   #schedule-year {width: 3em; border-bottom: 1px solid #000000;}
   #schedule-month {width: 2em; border-bottom: 1px solid #000000;}
   #schedule-day {width: 2em; border-bottom: 1px solid #000000;}
   #label-year, #label-month, #label-day {margin-right: 5px;}
   #schedule-title {margin-bottom: 10px; width: 20em;
   border-bottom: 1px solid #000000;}
   #schedule-body {width: 20em; height: 15em; border: 1px 
   solid #000000;}
   #regist {font-weight: bold; padding: 3px;
   border-top: 3px double #CCCCCC; border-right: 3px 
   double #333333; border-bottom: 3px double #333333; 
   border-left: 3px double #CCCCCC; color: #333333; 
   background-color: #EDECEC;}
   #error-message {font-weight: bold; color: #DD5757;
   background-color: transparent;}
   #error-message li {list-style: circle; line-height: 1.5;}
</style>
</head> 
<body> 
<h1>スケジュール登録</h1> 
<?php
// エラーメッセージを出力する
if (count($error_message)) {
  print(
"<div id=\"error-message\"><ul>");
  foreach (
$error_message as $message) {
    print(
"<li>".$message."</li>");
  }
  print(
"</ul></div>");
}
?>
<form action="schedule_edit.php" method="post">
  <input type="text" name="year" id="schedule-year"
  value="<?php print(htmlspecialchars($yearENT_QUOTES)); ?>" /> 
<label for="schedule-year" id="label-year">年</label>
  <input type="text" name="month" id="schedule-month"
  value="<?php print(htmlspecialchars($monthENT_QUOTES)); ?>" /> 
<label for="schedule-month" id="label-month">月</label>
  <input type="text" name="day" id="schedule-day"
  value="<?php print(htmlspecialchars($dayENT_QUOTES)); ?>" /> 
<label for="schedule-day" id="label-day">日</label>
<dl>
  <dt><label for="schedule-title" id="label-title">タイトル </label></dt>
  <dd><input type="text" name="title" id="schedule-title"
  value="<?php print(htmlspecialchars($titleENT_QUOTES)); ?>" />
  </dd>
  <dt><label for="schedule-body" id="labe-body">内容</label></dt>
  <dd><textarea name="body" id="schedule-body"><?php
print(htmlspecialchars($bodyENT_QUOTES));
?></textarea> 
  </dd>
  </dl>
<?php
if (isset($_GET["lineno"])) {
?>
<input type="hidden" name="lineno" id="lineno" value=
"<?php print(htmlspecialchars($linenoENT_QUOTES)); ?>">
<input type="submit" name="regist" id="regist" value="更新する" />
<?php
} else {
?>
<input type="submit" name="regist" id="regist" value="登録する" />
<?php
}
?>
</form>
</body>
</html>
  • 編集後の移動先だけ、カレンダーになるように変更したよ。さぁ、これでスケジューラーの機能はそろって、ひとまず、完成かな。
  • ふぅ~、 ここまでくるのにずいぶんかかりましたね(><;)
  • そうだね~。でも、だいぶPHPに慣れてきたんじゃないかな?
  • そりゃもう。。。基本的な構文とかはもう見慣れてきましたよ!
  • よかった☆これで、次にステップアップしていけるなぁ♪saity
  • むむっ、なにやら期待させますね。。。
  • うんうん。今までは、本当に基本的なことを説明するために教え切れなかった物も多いからね。これからは、また新しいアプリケーションを作成しながら、もっと様々なことを吸収していこう☆
  • おおお~。よぅし、これからもがんばっていこー♪
  • 1
  • 2
  • Saity先生

本名:海原才人 アシアル株式会社所属

PHPスクール講師。同時に、現役システムエンジニアとしてシステム開発も行っている。

携帯電話でWebサイトが見られるようになった事をきっかけに、Webの普及の早さに驚愕し、Webプログラミングに興味をもつ。 その後、PHPによるWebプログラミングと出会い、その習得のしやすさと多機能さに魅了され、数多くのシステム開発をPHPでこなしてきた。 現在は、PHPの魅力とシステム開発で蓄積したノウハウをPHPスクールで多くの人に伝える事に熱意を燃やしている。

「教育において、教わる側が解からない事に罪はなく、教える側が興味を持たせられない事が罪だ」というのが講師としての信念。 生徒にPHPの面白さ・素晴らしさを伝えるため、魅力的な講義を展開する事に全力を注ぐ。

ご意見・感想フォーム

今回の「Saity先生のPHP基礎講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

  



Pick Up Q&A

Q
セッションがいいのか、それともデータベースがいいのか教えて下さい。
 このエントリーをはてなブックマークに追加 
A
>ボタンをクリックしたら選んだ商品情報を持っておきたいと思っています。 そのくらいのことならセッションもしくはCookie(期限短め:場合によってはブラウザ閉じるまで)でいいんじゃないですかね。 #わ...

>>続きを読む

一つの目安として、ECサイトの購入情報など絶対に消えてはいけないものはDBに、カートなどの一時的に使用する情報や、ユーザに任意のタイミングで消去されても構わないものはセッションにと使い分けるといいでしょう。

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