Planet Drupal Thailand
Drupal with Open Graph Meta Tags
<
div class="field field-name-body field-type-text-with-summary field-label-hidden">
<
div class="field-items">
<
div class="field-item even">
ความเดิมจากตอนก่อน How to Create Google+ Snippet
ทุกวันนี้การแชร์โพสต์ลงใน social network กลายเป็นเรื่องธรรมดาสามัญไปแล้ว เว็บไซต์ที่เดิมที่ต้อง optimized for search engine ก็ต้องปรับตัวให้เพิ่มการ optimized for social network ด้วย ซึ่งจุดนี้ CMS เองยังก้าวตามไม่ทัน และต้องลงปลั๊กอินช่วยอยู่บ้าง
<
p>จุดสำคัญของการ optimized for social network (ในที่นี้คือ Facebook/Google+) คือต้องแสดง "ภาพ" เป็นตัวอย่างว่าลิงก์ปลายทางจะมีอะไรบ้าง เพื่อเรียกลูกค้าให้เข้าไปชมดู (แน่นอนอยู่แล้วว่า "มีภาพ" มันชวนกดกว่า "ไม่มีภาพ")
Drupal 7 core search (dirty hack) สำหรับภาษาไทย
สืบเนื่อง จากโพสต์ที่แล้ว และ จากปัญหาที่คาใจมานานว่าทำไม Drupal ค้นหาภาษาไทยไม่ได้ พอดี @poakpong เข้ามาทักว่าถ้าจัดการอะไรกับเซิร์ฟเวอร์ไม่ได้เลย แล้วจะทำยังไงให้ Drupal ค้นหาภาษาไทยได้ (ไม่เอา Google CSE ด้วย)
Intro: Solr multi-core + Drupal multi-search + Thai filter with Chef
พักหลังๆ ผมไม่ได้ค่อยสนใจงาน front-end เท่าไหร่ (graphic/template/html/css) เพราะรู้สึกว่าช่วงนี้อะไรๆมันเปลี่ยนเร็วมาก ตามมากแล้วเวียนหัว (แต่เชื่อว่ายังไงๆ HTML + CSS ก็ไม่ตายเพราะทำครั้งเดียวเอามาใช้ได้กับทุกแพลตฟอร์ม) เลยรู้สึกว่างาน back-end มันสนุกกว่า ช่วงนี้เลยรับงานเป็นเสือใบ - ทำทั้งข้างหน้าและข้างหลัง โลกยุคนี้เราสามารถทำอะไรก็ได้ที่เราอยากทำ มีเครื่องมือมากมายให้เราเอามาปรับใช้เพราะหลายๆเรื่องในโลก (opensource) มีคนคิดและทำก่อนเราแล้วทั้งนั้น เรียกมันว่า Crowd Wisdom คงได้มั้ง?
Drupal 7 Upgrade Story
วางแผน
- แนะนำอย่างยิ่งว่า ควรจะซ้อมอัพเกรดบนเครื่องจำลองก่อน เพราะมีรายละเอียดจุกจิกเยอะมาก
- ขั้นตอนการซ้อมอัพเกรดก็ตามปกติของเว็บทั่วไป มีเทคนิคนิดหน่อยคือ empty table หลายๆ อันที่ไม่จำเป็นต้องใช้ พวกแคชและ log ต่างๆ เพื่อให้ตัวฐานข้อมูลมีขนาดเล็กลงให้มากที่สุด
- เทคนิคอีกประการคือ ลง D7 แบบ fresh install ไว้เทียบดูด้วย ว่าการตั้งค่าอะไรต่างกันบ้าง
ขั้นตอน
ทำตาม upgrade.txt ทุกประการ ขั้นตอนแบบย่อๆ มีดังนี้
- แรกสุดคือปิด module กลุ่ม non-core ทิ้งให้หมด อันไหนคิดว่าไม่ใช้ในอนาคตแล้วก็ uninstall ทิ้งไปเลย
- เปลี่ยนธีมเป็น Garland
- จากนั้นล็อกอินด้วย user 1 แล้วเข้า maintenance mode ดังเช่นการอัพเกรดปกติ
- ลบไฟล์ sites/default/default.settings.php
- เปลี่ยน permission ของ sites/default/settings.php ให้เป็น 666 (หรือ 644 แล้วแต่คอนฟิกของเซิร์ฟเวอร์)
- ลบทุกอย่างที่อยู่นอก sites ถ้ามีของอื่นที่ไม่ใช่ไฟล์จาก Drupal ก็แบ็คอัพกันเอง
- ก็อปไฟล์จาก D7 มาทับ
- แก้ไฟล์ .htaccess ถ้าจำเป็น (กรณีของผมคือ แก้ RewriteBase บนเครื่องจำลอง)
- เข้าไปที่ update.php เพื่อรันการอัพเกรด ที่เหลือก็ภาวนาให้มันรอด
อุปสรรคของการอัพเกรด
Table Schema
ปัญหาของ isriya.com คืออัพมาจาก D5 > D6 > D7 มันทำให้ table schema บางอันยังใช้ของ D5 อยู่ (ที่ดันไม่มีปัญหากับ D6 แต่มีปัญหากับ D7)
ผมดูข้อมูลใน Drupal.org แล้วพบว่ามีคนเป็นบ้างประปราย ส่วน table ที่มีปัญหาก็แตกต่างกันไป
กรณีของผมคือ table ชื่อ block มีฟิลด์ชื่อ theme ตั้งชนิดของข้อมูลเป็น varchar(255) ซึ่งเป็นค่าเดิมของ D5 แต่พอมาเป็น D6/D7 มันกลายเป็น varchar(64) ไปแทน ทำให้การรันสคริปต์อัพเดตไม่สมบูรณ์
ทางแก้ก็ไม่ยากคือเข้าไปเปลี่ยนค่าของ table structure ใน MySQL ได้เลย (ไม่มีผลกระทบต่อข้อมูล เพราะข้อมูลที่เก็บจริงคือชื่อธีมซึ่งสั้นมาก) จะแก้ผ่าน phpMyAdmin หรือแก้จาก MySQL console โดยตรงก็แล้วแต่ชอบ
Taxonomy as Field
อันนี้ไม่รู้มีใครเป็นหรือเปล่า แต่กรณีของ isriya.com มีลักษณะเฉพาะคือใช้แท็กเยอะมาก และ D7 ได้เปลี่ยนสถาปัตยกรรมการเก็บข้อมูลของแท็กใหม่ ให้เป็น Field แทน (ตาม Field API)
Field API improvements: Taxonomy terms are now fields, comments and taxonomy terms are fieldable, and fields are also now translatable.
นอกจากมันจะเป็น Field แล้ว มันยังได้คุณสมบัติของ Field ติดมาด้วยคือ Revision ผลก็คือการอัพเกรดฐานข้อมูล จะต้องสร้างตารางใหม่ที่เอา node x tag x revision ซึ่งกินเวลาเป็นชั่วโมงได้
บนเครื่องจำลอง การอัพเกรดฐานข้อมูลสามารถทำได้โดยไม่มีปัญหาอะไร (แค่รอนาน) แต่บนเครื่องจริง กลับรันไม่รอดจนจบ ทางแก้ก็ไม่ยากคือ dump ฐานข้อมูลจากเครื่องจำลองมาใส่เครื่องจริง ก็เป็นอันเสร็จ
Temp Directory
สิ่งที่เพิ่มเข้ามาใน D7 คือเราต้องระบุ path สำหรับ temp/tmp directory ด้วย จากเดิมที่ระบุแค่ path ของ files directory
ตั้งค่าได้ใน Admin/Config/File Systems ส่วนจะตั้งเป็นอะไรก็ขึ้นกับคอนฟิกของเซิร์ฟเวอร์ที่ใช้ครับ
File Compression
อันนี้เป็นปัญหาที่ยังแก้ไม่ได้ คือ คอนฟิกของ D7 กับเซิร์ฟเวอร์ของ CLNOX มีปัญหาเรื่องการบีบไฟล์ CSS/JS ทำให้เวลาเราเลือก Aggregate CSS/JS ในหน้า Performance แล้ว ธีมไม่ขึ้น
ปัญหานี้ไม่เกิดบนเครื่องจำลอง (Ubuntu LAMP) อันนี้กำลังหาทางแก้กับ CLNOX อยู่ว่าเป็นอย่างไรบ้าง แต่ workaround เบื้องต้นคือใช้ D7 แบบไม่บีบ CSS/JS ไปก่อน
Admin Toolbar
ของใหม่ของ D7 ที่เห็นได้ชัดเจนที่สุดคือ Admin Toolbar ที่ปรากฏขึ้นมาเป็น overlay ทับหน้าจอปกติ ช่วยให้การเข้าถึงฟังก์ชันต่างๆ ในหน้า Admin ทำได้สะดวกขึ้น
แต่กรณีของ isriya.com ที่ไม่ได้ลงแบบ fresh install แต่อัพเกรดแทน ปรากฏว่า Admin Toolbar ไม่โผล่ (ไม่ทราบสาเหตุ คาดว่าเป็นเรื่องของคอนฟิก)
ทางแก้คือเปิด Module ชื่อ Toolbar, Overlay, Shortcut แล้วแต่งานที่ใช้ (ถ้าเปิดครบ 3 อันจะเท่ากับ D7 default)
Module
เนื่องจากไม่ต้องใช้ module อะไรที่จำเป็นมาก เบื้องต้นเลยลงไว้เฉพาะ markdown ก่อน ซึ่งก็ไม่มีปัญหาอะไร สามารถทำงานได้ดี
module บางตัวก็ไม่จำเป็นต้องใช้อีกแล้ว เช่น vertical_tab ที่เข้ามาอยู่ใน D7 Core แล้ว
โอกาสนี้ก็ควรลอง module ใหม่ๆ บ้างเช่นกัน ตัวอย่างเช่น Mollom ที่ระยะหลังไม่น่าประทับใจนัก (ทำสแปมหลุดบ่อย) ก็อาจจะไปลองใช้ AntiSpam/Akismet แทน
สรุป
การอัพเกรดจาก D6 > D7 โหดร้ายทารุณมาก เหตุผลเพราะสถาปัตยกรรมข้างล่างเปลี่ยนเยอะ (ระยะห่างระหว่างรุ่น 3 ปี) นี่ยังไม่รวมเรื่อง module ที่ยังเปลี่ยนตามกันไม่ทันอีก
ถ้าทำเว็บใหม่ตอนนี้ก็ควรเริ่มที่ D7 เลย แต่คนที่รัน D6 อยู่แล้วและยังไม่มีเหตุจำเป็นต้องอัพเกรด ก็ควรอยู่กับ D6 นั่นแหละครับ
Type:
How to Create Google+ Snippet
นั่งงมอยู่ครึ่งบ่าย ตอนนี้หายงงแล้วมาเขียนไว้หน่อย กันลืม
ในโลกยุค social network ทุกวันนี้ การแชร์ลิงก์ผ่าน social network กลายเป็นเรื่องปกติธรรมดา ในกรณีของ Twitter คงไม่มีอะไรพิสดารเพราะถือเป็นข้อความธรรมดา (ที่ดันเป็น URL) แต่กรณีของ Facebook/Google+ เวลาเราแปะลิงก์ (หรือกด Like/+1) มันจะขึ้นพรีวิวขึ้นมาให้เห็น

พรีวิวอันนี้ (หรือที่กูเกิลเรียกว่า snippet) จะช่วยให้ลิงก์ของเราน่าอ่านมากขึ้น เพราะมันจะแสดงข้อมูล (metadata) สามอย่างให้คนอ่านเห็น ได้แก่
<
ul>
New Blog's DB
หลังจาก Upgrade drupal 6 มาเป็น 7 แล้วพบ Error จำนวนหนึ่ง (แต่หลังๆ ไม่เจอแล้ว) ก็รู้สึกว่าไอ้ database ที่ใช้อยู่มันเน่าๆ (คือ ซนกับมันมาเยอะ แถมใช้มายาวนาน) ก็เลยหาทางจะทำความสะอาดสักหน่อย ค้นๆ ดูข้อมูล เจอแต่คำแนะนำว่า "ตารางไหนไม่ได้ใช้ให้ลบไปเลย" T T ก็รู้สึกว่ามันโหดไปหน่อย
พอหาวิธีไม่ได้ เลยลองมั่วๆ เอา คือ ติดตั้ง Drupal สะอาดๆ และโมดูล รุ่นที่ตรงกับที่ใช้อยู่จริง แล้วลบข้อมูลใน Database ที่ได้ทิ้งไป (คือ ต้องการตารางสะอาดๆ) แล้วก็ Export data ที่อยู่ใน database เดิม มาใส่ใน database ก้อนใหม่ เฉพาะในตารางที่มีอยู่
ตอนแรกก็นึกว่าจะใช้ไม่ได้ ปรากฏว่ามันใช้ได้ ที่สำคัญ ไอ้ที่เราคิดว่ามัน alter table ไว้จนเน่านั้น อันที่จริงมันไม่ได้เน่าเท่าไหร่ แต่ขยะที่เกินๆ มาคือ ตารางของโมดูลที่เคยติดไว้ แล้วถอดทิ้งไปแล้ว แต่ตารางมันไม่ได้ถอดทิ้งไปด้วย
สรุปว่า ตอนนี้ blog ผมทำงานอยู่บน DB ก้อนใหม่ละ ไม่รู้ว่าจะทำงานราบรื่นดีไม๊
ปล. ที่เอามาเขียนนี่ไม่ใช่อะไร จะทดสอบ DB เฉยๆ :P
Upgrade blog to Drupal7
เมื่อวานเกิดคึก อยากจะอัปเกรด Blog จาก Drupal 6 ไป 7 + โมดูลที่ใช้พร้อมที่จะให้อัปเรกดแล้วด้วย (คือ ใช้ไม่เยอะนัก) ก็เลยจัดซะ แก้คัน เวอร์ชั่นที่อัปคือ จาก 6.22 ไป 7.7
ครั้งแรกลอง ก็ เน่าครับ เรียบร้อย ปิดโมดูลต่างๆ เรียบร้อย แต่ลืมปรับธีมกลับเป็น Default เซ็งเลย เลยกลับมาหา Instruction อ่าน เราผิดเองที่นิสัยไม่ดี ครั้งก่อนอัปจาก 5 มา 6 ก็ประมาณนี้แหละ แบ่บว่าไม่เข็ด
ก็นั่งหาวิธี ซึ่งเรารู้อยู่แล้วว่าในแพกเกจของ Drupal ที่ดาวน์โหลดมามันต้องมีวิธีแนะนำอยู่แล้ว ก็คุ้ยๆ ดู เจอไฟล์ UPGRADE.txt อ่านโดยสรุปๆ แล้ว ได้ขั้นตอนตามนี้
- ตรวจสอบโมดูลและธีมที่ใช้อยู่ ว่ามีให้ใช้ใน 7 หรือเปล่า
- อัปเดตทุกสิ่งทุกอย่างให้เป็นเวอร์ชั่นล่าสุด
- ล๊อกอินเป็น user 1
- ไปสั่ง Off-line ที่ Site maintenance
- เปลี่ยนธีมกลับเป็น Garland เพราะเป็นธีมที่ต้องใช้ในการอัปเกรด
- ปิดทุกโมดูลที่ไม่ใช่ Core และ Core optional แต่ของผมลบทิ้งไปเลย เพราะอัปหลายรอบไม่ผ่าน เลยพยายามเคลียร์ Database แต่ก็มาพบว่า การ Uninstall module นั้น ไม่ได้ช่วยอะไรเท่าไหร่นัก เพราะตารางก็ยังคงเน่าอยู่อย่างเดิม T T
- ลบไฟล์ sites/default/default.settings.php เพราะเดี๋ยวจะต้องเอาของเวอร์ชั่น 7 มาแทน
- ลบไฟล์และโฟลเดอร์ของ Drupal ทั้งหมดทิ้ง ยกเว้นโฟลเดอร์ sites ส่วนของผมอัปต่อเนื่องมาตั้งกะ 4 เลยยังมีโฟลเดอร์ files อยู่ (วางอยู่นอก sites) ก็ เก็บไว้ด้วย
- ถ้ามีโมดูลที่ Uninstall ไปแล้วก็ตามไปลบไฟล์ใน sites/all/ ด้วย
- ดาวน์โหลด DP7 มาไว้ที่ Document root แล้วแตกไฟล์ซะ พร้อมจัดวางไฟล์ให้เข้าที่เข้าทาง
- อย่าลืม .htaccess หรือ robots.txt ด้วย
- แก้ไขสิทธิ์ของไฟล์ sites/default/settings.php ให้เขียนได้ เพราะเดี๋ยวมันต้องเขียนคอนฟิกซ์ใหม่ลงไป
- รัน update.php อย่าลืมแก้ $update_free_access ใน sites/default/settings.php ด้วย
- อัปเสร็จแล้วก็แบคอัปด้วย อีกสักรอบ + แก้ $update_free_access คืน แล้วก็ยกเลิกสิทธิ์การเขียนไฟล์ของ sites/default/settings.php เป็นอันเสร็จพิธี
- อย่าลืมปิด Site-off line ที่ Administration > Configuration > Development > Maintenance mode
ส่วนประสบการณ์ของผมนั้นเลวร้ายมาก อัปยังไงก็ไม่ผ่าน เลยลองเอามาอัปใน Localhost ดันผ่าน ก็เลยย้าย DB จาก Localhost นั่นแหละ ขึ้นไปเลย พอแก้ Config DB วางไฟล์เรียบร้อยแล้ว ก็ยังเข้าเว็บไม่ได้ มันบอกว่าเชื่อมต่อ DB ไม่ได้ ไล่หาอยู่ตั้งนาน ปรากฏว่า มันเขียน Config DB ใหม่ จากบรรทัดเดียวไปเป็น Array แต่ไอ้คอนฟิกเดิมที่มีบันนทัดเดียวมันดันไม่ลบทิ้ง ไม่เราก็ไปไล่แก้ที่ไอ้บรรทัดเดิมอยู่สองสามรอบ - -"
ปล. เดี๋ยวงานช้างก็อัป ubuntuclub นี่แหละ ไม่อยากเลยให้ตาย
ปล2. หลับอัปเกรดแล้วยังมีเออเรอร์โผล่ให้เห็นบ้าง หวังว่าอาการจะไม่หนักนะ DB เน่ามากแล้ว หาเวลาล้างบางไม่ได้สักที
ปรับแต่ง CKEditor สำหรับ Drupal
ช่วงนี้ค้นวิธีโหลดหน้าเว็บให้เร็วขึ้น พร้อมกับเพิ่งเปลี่ยนมาใช้ CKEditor ก็เลยเขียนวิธีปรับแต่งเล็กๆน้อยครับ และทำ patch เพื่อย้ายมา load CKEditor javascript ตรง footer แทน header
Drupal 7, anyway ...
Twitter กับ Facebook ทำให้ผมเขียนอะไรยาวๆ ไม่ได้อีกต่อไป blog เลยร้างไปหลายเดือน แต่ไหนๆก็ไม่ได้ใส่ใจมันเท่าไหร่อยู่แล้ว เลยอัพเดตเป็น Drupal7 มันซะเลย ไม่ต้องกลัวเจ๊ง!
ตอนแรกดูเหมือนง่าย จริงๆมันก็น่าไม่ยาก เพราะผมใช้ contrib modules ใน blog นี้ แค่ไม่กี่ตัว เลยไม่ต้องกังวลมากเวลาอัพเดต database (แต่เนื้อหาบางส่วนก็ยังเพี้ยน เพราะใช้ code filter สำหรับ code block พอเอาออกไปมันเลยเละ!) แต่ปัญหาที่ทำให้เจ็บใจ คือ ผมใช้ Drush ดาวน์โหลด contrib modules แล้วเก็บซอร์สด้วย Git ตอนรันใน localhost ไม่เจอปัญหาอะไร แต่พอ deploy ขึ้น webfaction เจอ error แดงเถือกตลอด
Self-hosted Google Analytics
ช่วงวันสองวันที่ผ่านมา ผมกับ @lewcpe นั่งจูนอัพระบบของ Blognone ให้ทำงานเร็วขึ้น (Let's make the web faster มีประโยชน์มากครับ)
หลักการใหญ่ๆ ของการจูนเว็บ (ไม่นับ database) ที่ผมพอจับความได้คือ
- ลดขนาดของไฟล์รวมลง - อันนี้ตรงไปตรงมา
- ลดจำนวน HTTP request ลง - เป็นผลมาจากวิธีทำงานของ HTTP socket
- ลดการเรียกไฟล์มาจากโดเมนอื่น - เพื่อลดเวลาการ lookup
เว็บปัจจุบันมีการเรียกไฟล์ (ทั้งภาพและ JavaScript) จากโดเมนอื่นๆ เป็นอย่างมาก เช่น ปุ่ม Like, Tweet, FeedBurner, Google Analytics ฯลฯ ซึ่งถ้าเป็นเว็บขนาดเล็กๆ ก็ไม่มีปัญหาอะไรมากนัก แต่สำหรับเว็บที่เริ่มใหญ่อย่าง Blognone มันก็เริ่มมีปัญหา
ทางออกหนึ่งที่เป็นไปได้คือ โฮสต์ไฟล์สคริปต์ไว้บนโดเมนเดียวกันเลย ซึ่งในกรณีของ Google Analytics ที่ใช้ไฟล์ ga.js นั้นทำได้ รายละเอียดอ่านใน Speed Up Google Analytics, use local ga.js
สำหรับผู้ที่ใช้ Drupal ก็สบายโคตรๆ เพราะโมดูล Google Analytics มันทำได้ในตัว แค่ติ๊กตรง locally cache ในหมวด Advance ก็เรียบร้อย

ความคิดเห็นล่าสุด
36 min 39 sec ก่อน
1 วัน 59 min ก่อน
1 วัน 4 hours ก่อน
1 วัน 7 hours ก่อน
3 days 2 hours ก่อน
3 days 4 hours ก่อน
4 days 4 hours ก่อน
4 days 20 hours ก่อน
5 days 4 hours ก่อน
5 days 5 hours ก่อน