ทำโมดูล “หน้าที่สร้างเอง” ให้กับ Maxsite
เคยลองเล่น cms อยู่หลายตัวเหมือนกันครับ แต่ก็มาลงท้ายที่ Maxsite เพราะความอิสระในการสร้างโมดูลและเท็มเพลตของเว็บ ที่จริงผมทำโมดูลเพิ่มเยอะเหมือนกัน แต่ไม่สามารถนำไปแจกให้ใครใช้ได้ เพราะหลังจากที่ได้ Maxsite มา ผมก็จัดการแก้ซะแทบจะหมดทุกไฟล์ และผมก็ไม่สามารถนำโมดูลของคนอื่นมาใช้ได้เช่นกัน ๕๕๕๕๕ สมน้ำหน้าตัวเอง!!! แต่คิดๆ ดูแล้ว ก็ดีเหมือนกันที่แจกไม่ได้ เพราะผมอยากเห็นคนไทยบินได้ …..??? คุ้นๆ นะคำนี้ ก็ทำนองนี้แหละแต่คงไม่ถึงกับบินได้หรอก ก็เห็นท่านอื่นๆ เอามาแจกกันเยอะเหมือนกัน แล้วเป็นไงล่ะ ต้องคอยมาตอบคำถามซ้ำซากอยู่ทุกวี่ทุกวัน สงสารคนแจกน่ะ ไม่มีไรมากหรอก
บ่นมาพอสมควร เข้าเรื่องเลย วันนี้มีโมดูล มาแนะนำ 1 โมดูล เป็นโมดูลที่ cms อื่นๆ เขามีใช้กันหมด แต่ไม่มีใน Maxsite นั่นก็คือ “หน้าที่สร้างเอง” …มันยังไงกันล่ะ …..อยากรู้เหรอ…..ตามมาดูดิ
มันเกิดจากการที่ผมต้องทำเว็บ 1 เว็บ แล้วเอาไปใช้กับแต่ละฝ่ายภายในสถาบันการศึกษาแห่งหนึ่ง ซึ่งแต่ละฝ่ายก็มีเนื้อหาของเว็บไม่เท่ากัน เช่น
- ฝ่าย ก. มี ประวัติ, เกี่ยวกับเรา, กฏระเบียบ, ข้อแนะนำ
- ฝ่าย ข. มี ประวัติ, เกี่ยวกับเรา, โครงสร้างการทำงาน, ยุทธศาสตร์
- ฝ่าย ค. มี ประวัติ, เกี่ยวกับเรา, หลักสูตร, แผนการเรียน, ขั้นตอนการทำวิทยานิพนธ์
นึกออกมั๊ยว่าบางเว็บต้องตัดบางโมดูลออก บางเว็บต้องทำเพิ่ม และโมดูลเหล่านั้นก็มีลักษณะที่เป็นบทความหน้าเดียวจบ แล้วถ้ามันมีสัก 10 ฝ่าย ผมคงต้องลบๆ เพิ่มๆ กันตายเลย ฉนั้น ผมจึงเลือกที่จะไม่ลบและไม่ทำเพิ่มในส่วนตรงนั้น แต่ผมเลือกที่จะทำเพิ่มขึ้นมา 1 โมดูล นั่นคือ “หน้าที่สร้างเอง” ตามชื่อโมดูลเลยครับ อยากได้หน้าอะไรก็ทำเพิ่มเอาเอง
เริ่มล่ะนะ
ขั้นแรกก็ไปเพิ่มในตาราง “web_groups” จำนวน 3 ฟิลด์ คือ page_add, page_edit, page_del
ต่อไป ทำตารางขึ้นมาใหม่ ตามนี้ (ไม่เหมือนตามนี้ก็ได้ แล้วแต่จินตนาการ)
CREATE TABLE `web_page` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`menuname` varchar(50) NOT NULL,
`filename` varchar(50) NOT NULL,
`topmenu` char(1) NOT NULL default ‘0′,
`leftmenu` char(1) NOT NULL default ‘1′,
`sort` int(5) NOT NULL default ‘0′,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=tis620 AUTO_INCREMENT=1 ;
จากนั้นก็ไปเพิ่ม MySQL Table และ Permission Name ในไฟล์ /includes/config.in.php
สร้างไดเร็คทอรี่ขึ้นมาเพื่อเอาไว้เก็บเนื้อหาของหน้าที่เราสร้าง (ไฟล์เนื้อหาที่สร้างขึ้นมาจะเป็น text file)
ขั้นต่อไปเป็นการสร้างไฟล์ในส่วนของ Admin
ผมก็อปปี้มาจาก /modules/admin/news.php ก็คือเอามาจากโมดูลข่าวนั่นเอง
- ตัดส่วนของการ split page ออก เพราะคงไม่มีใครสร้างขึ้นมาถึง 20 หน้าหรอกนะ
- ตัดส่วนของการ Multiple Delete ออก
- เอาส่วนของการปรับเลื่อนลำดับขึ้น/ลง มาจาก news_category
- แก้ไขฟอร์ม ดังนี้
1) ชื่อ : ชื่อของหน้าที่สร้าง เอาไว้เรียกหน้านั้นขึ้นมาแสดง (บังคับให้ใช้เฉพาะภาษาอังกฤษ)
2) ชื่อเมนู : เป็นข้อความที่แสดงที่เมนูด้านบนหรือด้านข้าง
3) มีตัวเลือกให้เลือกว่า ให้แสดงลิงค์ที่เมนูด้านบน และ แสดงที่เมนูด้านข้าง
4) มีช่องใส่เนื้อหาของหน้านั้น

พอมีการบันทึก ข้อมูล ชื่อ, ชื่อเมนู, แสดงที่เมนูด้านบน, แสดงที่เมนูด้านซ้าย, ชื่อไฟล์, การเรียงลำดับ จะถูกเก็บลงฐานข้อมูล ส่วนเนื้อหาจะถูกเขียนลง text file ที่มีชื่อเหมือนกับที่เราบันทึกลงในฐานข้อมูล ขึ้นตอนมีดังนี้
$REF = TIMESTAMP ; // กำหนดชื่อไฟล์โดยใช้ time stamp
$db->connectdb(DB_NAME,DB_USERNAME,DB_PASSWORD); // ติดต่อ database
$res[maxsort] = $db->select_query(”SELECT sort FROM “.TB_PAGE.” ORDER BY sort DESC “); // ดึงค่า sort ที่มากที่สุดออกมา
$arr[maxsort] = mysql_fetch_array($res[maxsort]); // ดึงค่า sort ที่มากที่สุดออกมา
$SORT = $arr[maxsort][sort]+1 ; // ดึงค่า sort ที่มากที่สุดออกมา แล้วเพิ่มค่าเข้าไปอีก 1
// บันทึกลงฐานข้อมูล
$db->add_db(TB_PAGE,array(
“name”=> $_POST[NAME],
“menuname”=> $_POST[MENUNAME],
“filename”=> $REF,
“topmenu”=> intval($_POST[TOPMENU]),
“leftmenu”=> intval($_POST[LEFTMENU]),
“sort”=> $SORT
));
$db->closedb ();// เขียนลง text file
$Filename = TIMESTAMP.”.txt”;
$txt_name = “files/page/”.$Filename.”";
$txt_open = @fopen(”$txt_name”, “w”);
@fwrite($txt_open, “”.$_POST[DETAIL].”");
@fclose($txt_open);
หน้าที่แสดง page ทั้งหมดก็เป็นแบบนี้ครับ แล้วแต่ใครจะสรรสร้าง

ส่วนในการแสดงผลที่เมนู ก็เป็นการ query มาจาก Database
<li><a href=”?name=index”>หน้าแรก</a></li>
<?php
$db->connectdb(DB_NAME,DB_USERNAME,DB_PASSWORD);
$res[page] = $db->select_query(”SELECT name,menuname FROM “.TB_PAGE.” WHERE leftmenu=’1′ ORDER BY sort “);
while($arr[page] = $db->fetch($res[page])){
echo ‘<li><a href=”?file=page&op=’.$arr[page][name].’”>’.$arr[page][menuname].’</a></li>’;
}
?>
เมนูด้านบน

เมนูด้านซ้ายมือ

และที่สำคัญ ไฟล์ที่ใช้ในการเรียก page เหล่านั้นขึ้นมา ผมสร้างไว้ที่ /modules/index/page.php ในไฟล์ page.php มีโค้ดดังนี้ (อ่าน comment เอาเองนะ อธิบายให้หมดแล้ว)
<?php
$db->connectdb(DB_NAME,DB_USERNAME,DB_PASSWORD); // Connect DB
$res[content] = $db->select_query(”SELECT * FROM “.TB_PAGE.” WHERE name=’”. $_GET[op].”‘ “); // Query page information from database.
$arr[content] = $db->fetch($res[content]);
$db->closedb (); // Disconnect DB$File = “files/page/”.$arr[content][filename].”.txt”; // Read text file
$file_open = @fopen($File, “r”);
$content = @fread ($file_open, @filesize($File));
$Detail = stripslashes(FixQuotes($content));
?>
<div class=”content-header”><?php echo $arr[content][menuname];?> <!– Input “menuname” in page header –>
<?php
if($_SESSION[’admin_user’]){
// Show edit button for admin
echo ‘<a href=”?name=admin&file=page&op=page_edit&id=’.$arr[content][id].’”><img src=”images/admin/edit.gif” border=”0″ alt=”แก้ไข” ></a>
‘;
}
?>
</div>
<br />
<?php echo $Detail; // Show Page Content ?>
<br />
<br />
….จบแล้ว
เดี๋ยว upload เสร็จจะเอามา preview ให้ดูว่ามันเป็นยังไง
คิดว่าคนที่เคยพัฒนาโมดูลของ Maxsite น่าจะอ่านรู้เรื่องนะ ส่วนคนที่ไม่เคยพัฒนาก็ลองพัฒนาดู จะใช้จมูกคนอื่นหายใจตลอดไปคงไม่ได้หรอก เผื่อเวลาที่คนอื่นเขาเป็นหวัด เราจะหายใจไม่ออกเท่านั้นเอง …แถมติดหวัดอีกต่างหาก
7 Comments
Make A CommentComments RSS Feed TrackBack URL
July 22nd, 2008 at 10:57 pm
สุดยอดครับ ไอเดียดี
นับถือ ๆ
July 25th, 2008 at 11:23 am
เจ๋งมากเลยครับ
July 25th, 2008 at 12:10 pm
ผมว่าเอามาแจกเลยครับจะง่ายกว่าครับ
July 28th, 2008 at 9:15 am
ใช่ครับ เอามาแจกมันจะง่ายมากๆ ง่ายเกินไปจนไม่มีคุณค่าใดๆ
August 4th, 2008 at 9:41 pm
ติดตรงที่เลื่อนลำดับอ่ะครับ งงมากเลยติดอยู่ตรงนี้ที่เดียวเลยครับ
August 11th, 2008 at 12:04 pm
แรกๆ ผมก็งงกับการเลื่อนลำดับนะ แต่ตอนนี้จับทางได้ละ เดี๋ยวจะเอาโค้ดมาอธิบาย แต่ไปลองดูก่อนนะ
จุดแรก ก็ตรงคำสั่ง mysql ที่ order by ว่าเราสั่งให้เรียงจากน้อยไปมาก หรือมากไปน้อย การเขียนโค้ดในขั้นตอนของการเลื่อนลำดับก็จะต่างกันออกไป
เช่น ถ้าเรียงจากน้อยไปมาก
หากต้องการเลื่อนลง จะต้องบวกค่า sort เข้าไปอีก 1 ($setsort = $arr[page][sort]+1)
แล้วหาว่ามีรายการไหนที่ค่า sort = $setsort ก็ให้ลบค่า sort ลงไป 1
คือการสลับค่ากันนั่นเอง
ผมแก้ไขโค้ดตรงนี้ ไม่เหมือนกับของ maxsite แล้วจะเอามาอธิบายแบบละเอียด
November 17th, 2008 at 7:55 pm
อธิบายไม่เคลียร์คับ ในส่วนของ Admin งงมากๆๆ แต่ก้อขอบคุณคับ ที่ทำขึ้นมา