บทความสุดท้ายแล้วนะครับในเรื่องการทำปฏิทิน โดยก่อนหน้านี้เราได้ทำปฏิทินที่สามารถเลื่อนเปลี่ยนเดือนได้มาแล้ว ในบทความเรื่อง
ซึ่งเราจะพบว่าหากเรานำไปใช้กับเนื้อหาภายในเว็บไซต์หนึ่งๆนั้นเมื่อเราคลิกเพื่อเลื่อนไปดูเดือนอื่นๆ เราจะพบว่าหน้าเว็บไซต์เราจะต้องถูก รีเฟรช ไปด้วยซึ่งมันอาจจะทำให้เราไม่สะดวกในทุกๆครั้งที่เลื่อนไปดูเดือนต่างๆ (ซึ่งหากเราจะคลิกไปดูเดือนต่างๆ มันก็ไม่สะดวกอยู่แล้ว เดี๋ยวบทความต่อไปเราจะมาเลือกดูเดือนต่างๆแบบง่ายๆกัน)
ดังนั้นวิธีที่ดีที่สุดคือการทำให้มันไม่ต้องรีเฟรชหน้าใหม่ในทุกๆครั้งที่เลื่อนไปเดือนต่างๆ แล้วเราจะทำอย่างไร วิธีนี้เราสามารถใช้ความสามารถของ 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 )\">«</a>"; $url_nextMonth = "<a href=\"javascript: calendar($next_month )\">»</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> </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> </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
สำหรับไฟล์นี้คือการยกไฟล์ 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
ส่วนนี้ไม่มีอะไรเปลี่ยนแปลงครับมันคือโค้ดที่ใช้ในการกำหนดลักษณะเอกสารอันเดิมของเรา เป็นโค้ด 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 นั้นก่อนอื่นเราต้องทำการเรียกการใช้งานเมธอดที่ทำให้แสดงผลข้อมูลต่างๆได้นั่นคือ
โดยที่
method คือ ส่วนในการส่งข้อมูลว่าเราจะส่งไปแบบใดจะแบบ get หรือ post
URL คือ ตำแหน่งของไฟล์ที่เราต้องการส่งข้อมูล
data คือ ข้อมูลที่เราต้องการส่งไปทำงาน
displayId คือ ตำแหน่งที่เราต้องการให้แสดงผล
โดยเริ่มแรกเราต้องตรวจสอบว่าเว็บเบาร์เซอร์ของเรานั้นมันรองรับการทำงานของ Ajax หรือไม่ซึ่งมีข้อแตกต่างกันระหว่างแต่ละเว็บเบาร์เซอร์ที่ต้องตรวจสอบด้วย
การใช้งาน 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"); }
เมื่อสถานะของเซิร์ฟเวอร์ว่างระบบจะทำการคืนค่าการแสดงผลต่อและจะทำการล้างขั้นตอนการทำงานเดิมทิ้งทั้งหมดเพื่อรับการทำงานใหม่ต่อไป
จากนั้นเราก็ทำการคืนค่าข้อมูลเพื่อทำการแสดงผล
ตัวอย่างการทำงาน
จะสังเกตได้นะครับว่าทั้งสามภาพแรกนั้น เมื่อเราคลิกเลื่อนไปตามเดือนต่างๆ เวลาที่แสดงด้านล่างนั้นไม่มีการเปลี่ยนแปลงเลย และยังคงทำงานอยู่ที่ไฟล์เดิมไม่มีการแสดงค่าจากการส่งด้วยเมธอด get ให้เห็น อันเป็นผลสืบเนื่องมาจากการใช้เทคนิค Ajax ของเรานั่นเอง
ครับสำหรับบทความนี้ก็จบลงด้วยการใช้เทคนิค Ajax มาทำให้การเลื่อนเปลี่ยนเดือนต่างๆได้เนียนตาขึ้นไม่ต้องมีการรีเฟรชหน้าจอให้เกิดความรำคาญแต่อย่างใด แต่มันยังไม่สมบูรณ์ครับ เพราะมันยังไม่สามารถตอบสนองความต้องการของเราได้ดีพอ เช่น หากผมต้องการไปดูวันที่ 26 เดือน พฤศจิกายน ปี พ.ศ. 2531 ผมต้องเลื่อนไปกี่วันกว่าจะถึงเนี่ย ... โห นั่นแหละครับ ในส่วนของบทความต่อไปเราก็จะมาทำการเพิ่มส่วนของการเรียกดูปฏิทินให้เกิดความสะดวกยิ่งขึ้น และเช่นเดิมยังคงใช้เทคนิค Ajax เพิ่อให้เกิดความศิวิไลซ์ต่อไป ฮ่าๆๆ โปรดติดตามได้ในบทความต่อไป
PHP : มาสร้างปฏิทินกันเถอะ(ตอนที่ 5)
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หน้า
No comments:
Post a Comment