Friday, August 31, 2012

PHP : มาสร้างปฏิทินกันเถอะ (ตอนที่ 4)


       บทความสุดท้ายแล้วนะครับในเรื่องการทำปฏิทิน โดยก่อนหน้านี้เราได้ทำปฏิทินที่สามารถเลื่อนเปลี่ยนเดือนได้มาแล้ว ในบทความเรื่อง


       ซึ่งเราจะพบว่าหากเรานำไปใช้กับเนื้อหาภายในเว็บไซต์หนึ่งๆนั้นเมื่อเราคลิกเพื่อเลื่อนไปดูเดือนอื่นๆ เราจะพบว่าหน้าเว็บไซต์เราจะต้องถูก รีเฟรช ไปด้วยซึ่งมันอาจจะทำให้เราไม่สะดวกในทุกๆครั้งที่เลื่อนไปดูเดือนต่างๆ (ซึ่งหากเราจะคลิกไปดูเดือนต่างๆ มันก็ไม่สะดวกอยู่แล้ว เดี๋ยวบทความต่อไปเราจะมาเลือกดูเดือนต่างๆแบบง่ายๆกัน)



       ดังนั้นวิธีที่ดีที่สุดคือการทำให้มันไม่ต้องรีเฟรชหน้าใหม่ในทุกๆครั้งที่เลื่อนไปเดือนต่างๆ แล้วเราจะทำอย่างไร วิธีนี้เราสามารถใช้ความสามารถของ Ajax มาใช้ได้ครับนั่นคือ การที่เราต้องทำหน้าที่แสดงปฏิทินขึ้นมาส่วนหนึ่ง และส่วนที่เป็นระบบการสร้างปฏิทินอีกส่วนหนึ่ง โดยการเรียกการทำงานผ่านรูปแบบของ Ajax โดยการใช้ JavaScript นั่นแหละครับ การทำงานแบบนี้เป็นส่วนหนึ่งของรูปแบบที่เรียกว่า XHTML นั่นเอง
       ขั้นตอนที่เราต้องทำงานนี้ ผมขอแบ่งไฟล์เพื่อให้สะดวกในการจัดการใหม่เลยนะครับ โดยใช้ไฟล์เดิมจากบทความที่แล้วมานั่นแหละ แต่เรามาแยก ทำใหม่ให้ดูง่าย จัดการง่ายไปอีกขั้นแค่นั้นเอง

       ไฟล์ที่ต้องใช้

1. ไฟล์ calendar_4.php สำหรับเป็นส่วนของการแสดงผลปฏิทิน

2. ไฟล์ ajaxCalendar.php สำหรับเป็นส่วนของ ระบบที่ใช้สร้างปฏิทิน

3. ไฟล์ styles.css เป็นส่วนของ CSS ใช้สำหรับกำหนดการแสดงผลในหน้าเว็บไซต์

4. ไฟล์ ajax_framework.js ใช้สำหรับเป็นเฟรมเวิร์คของ A่jax

       เริ่มกันเลยนะครับ ก่อนอื่นก็ขอให้คัดลอกโค้ดจากไฟล์ต่างๆตามนี้ไปบันทึกไว้ให้ครบครันกันก่อน แล้วมาอธิบายกันหลังจากนี้ครับ (บันทึกไว้ที่เดียวกันนะครับ)

ไฟล์ calendar_4.php
<html>
<head>
<title>ปฏิทินเบื้องต้น</title>
<link rel="stylesheet" type="text/css" href="styles.css" />
<script src="ajax_framework.js"></script>
<script>
function calendar(now){
 var data= "now=" + now;
 var url = "ajaxCalendar.php";
 ajaxLoad('get',url,data,'mk_calendar');
}
</script>
</head>
<body>
<span id=mk_calendar><script>calendar('');</script></span>
<br />
<span id=sh_time>หน้านี้โหลดเมื่อ : <?echo(date('j F Y') . " @ " . date('G:i:s'));?></span>
</body>
</html>

อธิบายไฟล์ calendar_4.php
       ส่วนนี้เป็นส่วนที่เราจะต้องการให้แสดงผลนะครับ ซึ่งก่อนอื่นเราต้องอ้างอิงถึงไฟล์ที่เราต้องการใช้งานร่วมกันก่อนเพื่อไม่ให้มันน้อยใจ .. ไม่ใช่!! เพื่อไม่ให้เกิดความผิดพลาดในการแสดงผลเพราะว่ามันหากันไม่เจอ อิอิ โดยเราต้องอ้างอิงไฟล์ 2 ไฟล์ด้วยกันคือ
ไฟล์ styles.css ที่ใช้สำหรับการควบคุมการแสดงผลของเว็บไซต์
และ ไฟล์ ajax_framework.js ที่ใช้ในสำหรับเป็นเฟรมเวิร์คของ Ajax

<link rel="stylesheet" type="text/css" href="styles.css" />
<script src="ajax_framework.js"></script>

       เมื่อกำหนดไฟล์ดังกล่าวแล้วผมก็เริ่มทำการสร้างฟังก์ชั่นในการเรียกใช้ Ajax เพื่อการแสดงผลปฏิทินดังนี้

<script>
function calendar(now){
 var data= "now=" + now;
 var url = "ajaxCalendar.php";
 ajaxLoad('get',url,data,'mk_calendar');
}
</script>

       โค้ดดังกล่าวจะเข้าไปดูที่ไฟล์ ajaxCalendar.php และทำการเรียกใช้

ajaxLoad('get',url,data,'mk_calendar');

       ซึ่งจะใช้การส่งแบบ get ไปต้องทำการส่ง data ไปด้วยซึ่งเป็นค่า Timestamp  จากตัวแปร now ที่มาจากไฟล์ ajaxCalendar.php นั่นเอง
       จากนั้นเราก็กำหนดพื้นที่การแสดงผลที่เราต้องการ ตัวอย่างผมทำให้ปฏิทินอยู่ในแท็ก <span> โดยกำหนดให้มี id=mk_calendar

<span id=mk_calendar>...</span>

       สำหรับการเรียกฟังก์ชั่นเพื่อการแสดงปฏิทินนั้นเราต้องทำดังนี้

<script>calendar('');</script>

       ผมได้เพิ่มโค้ดส่วนหนึ่งเข้ามานั่นคือ

<span id=sh_time>หน้านี้โหลดเมื่อ : <?echo(date('j F Y') . " @ " . date('G:i:s'));?></span>

       เป็นส่วนที่ใช้สำหรับแสดงให้เห็นว่าไม่มีการรีเฟรชเกิดขึ้นในขณะที่เราทำการเลื่อนไปยังเดือนต่างๆ ผมจะแสดงตัวอย่างการทำงานให้ดูในหัวข้อต่อไป


ไฟล์ ajaxCalendar.php

<?
$now = strtotime("now");

if(isset($_GET['now']) && !empty($_GET['now'])){
 $now = $_GET['now'];
}

$month = date('n',$now);
$year = date('Y',$now);
$first = strtotime("$year-$month-1");
$first_day = date('w',$first);
$num_day = date('t',$now);
$today = date("Y-n-j");
$TH_Day = array("อา.","จ.","อ.","พ.","พฤ.","ศ.","ส.");
$TH_Month = array(1 => "มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน",
"กรกฏาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม");
$TH_Year = $year+543;

$class = "default";

//$url_togo = $_SERVER['PHP_SELF'] . "?now=";
$last_month = strtotime("-1 month $year-$month");
$next_month = strtotime("+1 month $year-$month");

$url_lastMonth = "<a href=\"javascript: calendar($last_month )\">&laquo;</a>";
$url_nextMonth = "<a href=\"javascript: calendar($next_month )\">&raquo;</a>";

$mk_calendar = "<table border=0 cellspacing=1 cellpadding=7 bgcolor=#FFCC99>
<tr>
 <th>$url_lastMonth</th>
 <th colspan=5>พุทธศักราช  $TH_Year<p>$TH_Month[$month]</th>
 <th>$url_nextMonth</th>
</tr>
<tr bgcolor=#FFFACD><th>" . implode("</th><th>",$TH_Day) . "</th></tr>";

$start = 1 - $first_day;
$w = 1;
for($d = $start; ;$d++){
     $class = "default";
     $date = "$year-$month-$d";

     if($w == 1){
          $class = "sunday";
          $mk_calendar .= "<tr align=center class=$class>";
     }else if($w == 7){
          $class = "saturday";
     }else{
          $class = "default";
     }

     if($d < 1){
          $mk_calendar .= "<td class=$class>&nbsp;</td>";
     }else if($d >= $num_day){
          if($d == $num_day){
                 if($today == $date){
                        $class = "today";
                 }
                 $mk_calendar .= "<td align=center class=$class>$d</td>";
         }else{
                 if($w == 7){
                        $class = "saturday";
                 }else{
                        $class = "default";
                 }
                 $mk_calendar .= "<td class=$class>&nbsp;</td>";
        }
        if($w == 7){
             $mk_calendar .= "</tr>";
             break;
        }
    }else{
         if($today == $date){
              $class = "today";
         }
         $mk_calendar .= "<td align=center class=$class>$d</td>";
    }

    if($w == 7){
        $mk_calendar .= "</tr>";
        $w = 1;
    }else{
        $w++;
    }

}
$mk_calendar .= "</table>";

header("content-type: text/html; charset = UTF-8");
echo $mk_calendar;
?>
อธิบายไฟล์ ajaxCalendar.php
       สำหรับไฟล์นี้คือการยกไฟล์ calendar_3.php มาทั้งหมดแล้วตัดส่วนหัวกับส่วนหางทิ้ง เพราะในส่วนนี้เราใช้เพื่อสร้างปฏิทินเท่านั้น ซึ่งโค้ดในส่วนนี้จะถูกประมวลผลผ่านคำสั่ง calendar() ที่ไฟล์ calendar_4.php อีกที สรุปง่ายๆไฟล์นี้ใช้เพิ่อประมวลผลและสร้างปฏิทินตามระบบเดิมนั่นเอง ไม่ต้องมีการแสดงผลแต่อย่างใด

ไฟล์ styles.css

     .sunday{color: white;background-color:red;}
     .saturday{color: white;background-color:#9900CC;}
     .default{color: black;background-color:white;}
     .today{color: blue;background-color:yellow;}
อธิบายไฟล์ styles.css
       ส่วนนี้ไม่มีอะไรเปลี่ยนแปลงครับมันคือโค้ดที่ใช้ในการกำหนดลักษณะเอกสารอันเดิมของเรา เป็นโค้ด CSS ซึ่งเป็นในส่วนของแท็ก <style>...</style> ตัวเดิมเพียงแต่เรานำมาใส่ในไฟล์ใหม่ แล้วตัดหัว-ท้ายแท็กออกไป
       สำหรับการแสดงผลก็เหมือนเดิมครับไม่ได้ปรับแต่งอะไรเพิ่มเติม

ไฟล์ ajax_framework.js

function ajaxLoad(method, URL, data, displayId) {
 var AJAX = null;
 if(window.ActiveXObject) {  
  AJAX = new ActiveXObject("Microsoft.XMLHTTP"); 
 }
 else if(window.XMLHttpRequest) {  
  AJAX = new XMLHttpRequest(); 
 }
 else {
  alert("Your browser doesn't support AJAX");
  return;
 }

 method = method.toLowerCase();
 URL += "?temp=" + (new Date()).getTime();
 if(method=="get") {
  URL += "&" + data;
  data = null;
 }

 AJAX.open(method, URL);

 if(method=="post") {
  AJAX.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 }
 
 AJAX.onreadystatechange = function() {
  if(AJAX.readyState==4 && AJAX.status==200) {
   var ctype = AJAX.getResponseHeader("Content-Type").toLowerCase();
   ajaxCallback(ctype, displayId, AJAX.responseText);

   delete AJAX;
   AJAX = null;
  }
 }

 AJAX.send(data);
}

function ajaxCallback(contentType, displayId, responseText) {
 if(contentType.match("text/javascript")) {
  eval(responseText);
 }
 else {
  if(displayId==null) {
   return;
  }
  var el = document.getElementById(displayId);
  el.innerHTML = responseText;
 }
}

function getFormData(form_name_or_id) {
 
 var frm = document.forms[form_name_or_id];
 if(frm==null) {
  alert("Form: '" + form_name_or_id + "' not found!");
  return;
 }

 var data = "";
 var num_el = frm.elements.length;
 for(i=0; i<num_el; i++) {
  var el = frm.elements[i];
  if(el.name=="" && el.id=="") {
   continue;
  }
  var param_name = "";
  if(el.name!="") {
   param_name = el.name;
  }
  else if(el.id!="") {
   param_name = el.id;
  }

  var t = frm.elements[i].type;
  var value = "";
  if(t=="text"||t=="password"||t=="hidden"||t=="textarea") {
   value = encodeURIComponent(el.value);
  }
  else if(t=="radio"||t=="checkbox") {
   if(el.checked) {
    value = encodeURIComponent(el.value);
   }
   else {
    continue;
   }
  }
  else if(t=="select-one") {
   value = encodeURIComponent(el.options[el.selectedIndex].value);
  }
  else if(t=="select-multiple") {
   for(j=0; j<el.length; j++) {
    if(el.options[j].selected) {
     if(data!="") {
      data += "&";
     }
     data += param_name + "=";
     data += encodeURIComponent(el.options[j].value);
    }
   }
   
   continue;
  }
  if(data!="") {
   data += "&";
  }
  data += param_name + "=" + value;
 }

 return data;
}
อธิบายไฟล์ ajax_framework.js
       ไฟล์ส่วนนี้เป็นเฟรมเวิร์คสำหรับการทำงานของ Ajax ซึ่งผมนำมาจากหนังสือ พัฒนาเว็บด้วยเทคนิค Ajax และ PHP ของคุณ บัญชา ปะสีละเตสัง โดยนำมาประยุกต์ต่อ ดังนั้นมันจะมีโค้ดบางส่วนที่ไม่จำเป็นต่องานนี้อยู่ด้วย แต่ผมก็เอาติดไว้ก่อนเพราะต่อไปจะมีประโยชน์อย่างยิ่งในบทความต่อๆไป (ใช้ไฟล์นี้เป็นพื้นฐานได้เลย) ผมขออธิบายส่วนที่ต้องใช้ในที่นี้เท่านั้นนะครับ
       การใช้งาน Ajax นั้นก่อนอื่นเราต้องทำการเรียกการใช้งานเมธอดที่ทำให้แสดงผลข้อมูลต่างๆได้นั่นคือ

function ajaxLoad(method, URL, data, displayId) {...

โดยที่
       method คือ ส่วนในการส่งข้อมูลว่าเราจะส่งไปแบบใดจะแบบ get หรือ post
       URL คือ ตำแหน่งของไฟล์ที่เราต้องการส่งข้อมูล
       data คือ ข้อมูลที่เราต้องการส่งไปทำงาน
       displayId คือ ตำแหน่งที่เราต้องการให้แสดงผล

       โดยเริ่มแรกเราต้องตรวจสอบว่าเว็บเบาร์เซอร์ของเรานั้นมันรองรับการทำงานของ Ajax หรือไม่ซึ่งมีข้อแตกต่างกันระหว่างแต่ละเว็บเบาร์เซอร์ที่ต้องตรวจสอบด้วย

var AJAX = null;
 if(window.ActiveXObject) {  
  AJAX = new ActiveXObject("Microsoft.XMLHTTP"); 
 }
 else if(window.XMLHttpRequest) {  
  AJAX = new XMLHttpRequest(); 
 }
 else {
  alert("Your browser doesn't support AJAX");
  return;
 }

       เมื่อเราได้ทำการกำหนดค่าตามที่ต้องการแล้วเราก็ดำเนินการต่อในส่วนของการส่งข้อมูล ซึ่งจะทำตามที่เรากำหนดว่าเราส่งเป็นแบบใด

method = method.toLowerCase();
 URL += "?temp=" + (new Date()).getTime();
 if(method=="get") {
  URL += "&" + data;
  data = null;
 }

 AJAX.open(method, URL);

 if(method=="post") {
  AJAX.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 }
       เมื่อสถานะของเซิร์ฟเวอร์ว่างระบบจะทำการคืนค่าการแสดงผลต่อและจะทำการล้างขั้นตอนการทำงานเดิมทิ้งทั้งหมดเพื่อรับการทำงานใหม่ต่อไป

 
 AJAX.onreadystatechange = function() {
  if(AJAX.readyState==4 && AJAX.status==200) {
   var ctype = AJAX.getResponseHeader("Content-Type").toLowerCase();
   ajaxCallback(ctype, displayId, AJAX.responseText);

   delete AJAX;
   AJAX = null;
  }
 }

 AJAX.send(data);

       จากนั้นเราก็ทำการคืนค่าข้อมูลเพื่อทำการแสดงผล

function ajaxCallback(contentType, displayId, responseText) {
 if(contentType.match("text/javascript")) {
  eval(responseText);
 }
 else {
  if(displayId==null) {
   return;
  }
  var el = document.getElementById(displayId);
  el.innerHTML = responseText;
 }
}


ตัวอย่างการทำงาน

       จะสังเกตได้นะครับว่าทั้งสามภาพแรกนั้น เมื่อเราคลิกเลื่อนไปตามเดือนต่างๆ เวลาที่แสดงด้านล่างนั้นไม่มีการเปลี่ยนแปลงเลย และยังคงทำงานอยู่ที่ไฟล์เดิมไม่มีการแสดงค่าจากการส่งด้วยเมธอด get ให้เห็น อันเป็นผลสืบเนื่องมาจากการใช้เทคนิค Ajax ของเรานั่นเอง




       สำหรับภาพนี้แสดงว่าเราได้ส่งคำสั่งอะไรไปเมื่อเราคลิกปุ่มเลื่อนเดือน นั่นคือเราได้เรียกใช้ ฟังก์ชั่น calendar() โดยมีการส่งค่า Timestamp ไปด้วยนั่นเอง



       ครับสำหรับบทความนี้ก็จบลงด้วยการใช้เทคนิค Ajax มาทำให้การเลื่อนเปลี่ยนเดือนต่างๆได้เนียนตาขึ้นไม่ต้องมีการรีเฟรชหน้าจอให้เกิดความรำคาญแต่อย่างใด แต่มันยังไม่สมบูรณ์ครับ เพราะมันยังไม่สามารถตอบสนองความต้องการของเราได้ดีพอ เช่น หากผมต้องการไปดูวันที่ 26 เดือน พฤศจิกายน ปี พ.ศ. 2531 ผมต้องเลื่อนไปกี่วันกว่าจะถึงเนี่ย ... โห นั่นแหละครับ ในส่วนของบทความต่อไปเราก็จะมาทำการเพิ่มส่วนของการเรียกดูปฏิทินให้เกิดความสะดวกยิ่งขึ้น และเช่นเดิมยังคงใช้เทคนิค Ajax เพิ่อให้เกิดความศิวิไลซ์ต่อไป ฮ่าๆๆ โปรดติดตามได้ในบทความต่อไป



PHP : มาสร้างปฏิทินกันเถอะ(ตอนที่ 5)                                       







ที่มา : ขอขอบคุณไฟล์ ajax_framework.js จาก

บัญชา ปะสีละเตสัง,พัฒนาเว็บด้วยเทคนิค Ajax และ PHP,ซีเอ็ด:กรุงเทพฯ.541หน้า

Ref_Pic : https://encrypted-tbn2.google.com/images?q=tbn:ANd9GcRgpcx_PBrc8WN5fDYv5Ob4d_A0hoB1A4EkzieE6KSSD1iLUUfkfg

No comments:

Post a Comment