in Blog

ทำ Template และทดสอบ Multi Lang บน Concrete5 แก้เซ็ง

ช่วงตะเวรหางาน+แวะไปคุยทำให้ผมใช้งบประมาณที่เหลืออยู่น้อยนิด เหลืออยู่น้อยนิดลงไปอีก ก็เลยเครียดหนัก :P ทำให้ต้องหาอะไรคลายเครียดในแบบที่ไม่ใช้การเขียนโปรแกรมวุ่นวาย หรือ เขียน Management Console สำหรับ Cloud Infrastructure อะไรพวกนั้น ก็เลยหยิบ Concrete5 มาติดตั้งและทำเว็บเล่นๆ ขึ้นมาสักเว็บหนึ่ง อ้อที่แน่ๆ ต้องทำ Template ใหม่ด้วย และได้ความรู้ที่ได้ไปร่ำเรียน 960 CSS Framework มาใช้งาน ทำให้การออกแบบ Template โดยที่ไม่ใช้เครื่องมือหรูหราอย่าง Dreamweaver ก็สามารถทำ Template สวยๆ ได้เช่นกัน อ้อ ลืมบอกไป ผมไม่มี? Dreamweaver หรอกครับ ผมมีแค่ Eclipse กับ gEdit คิดว่าผมจะใช้อะไรล่ะ :P

เล่าให้ฟังเบื้องต้นก่อน ผมมักจะออกแบบ Web ผ่านโปรแกรมกราฟิกอย่าง Inkscape เป็นหลัก ซึ่งจะช่วยให้เรามีมุมมองแบบ Virtual Design ได้เร็ว และเห็นภาพว่าเว็บไซต์ที่ออกมาจะเป็นหน้าตาอย่างไร จากนั้นก็ค่อยแปลงจากไฟล์กราฟิกแบบ Vector ให้กลายเป็น HTML? รูปภาพ และ CSS ที่เราต้องใช้ จากนั้นก็ค่อยจัดเข้ารูปแบบ Template ของ Concrete5 วิธีการคงไม่เล่าให้ฟังโดยละเอียดครับ แต่ที่อยากทกสอบและคาใจมากที่สุดคือ Multi Language บน Concrete5 เนื่องจากยังไม่อยากซื้อ Extension นี้ ก็เลยขอทำเองดีกว่า วิธีการทำ Multi Language บนก็ง่ายๆ ครับ คือ เรียงลำดับของหน้าให้ถูก ดังนี้

http://www.example.com/en <– หน้าหลักของเว็บภาคภาษาอังกฤษ
http://www.example.com/en/product <– หน้าผลิตภัณฑ์และบริการของเว็บภาคภาษาอังกฤษ

http://www.example.com/th <– หน้าหลักของเว็บภาคภาษาไทย
http://www.example.com/th/product <– หน้าผลิตภัณฑ์และบริการของเว็บภาคภาษาไทย

หรืออาจจะวางแบบนี้ก็ได้เช่นกัน

http://www.example.com/en <– หน้าเปล่าทำ redirect โดยใช้ META Tag กระโดดไปที่ home
http://www.example.com/en/home <– หน้าหลักของเว็บภาคภาษาอังกฤษ
http://www.example.com/en/product <– หน้าผลิตภัณฑ์และบริการของเว็บภาคภาษาอังกฤษ

http://www.example.com/th <– หน้าเปล่าทำ redirect โดยใช้ META Tag กระโดดไปที่ home
http://www.example.com/th/home <– หน้าหลักของเว็บภาคภาษาไทย
http://www.example.com/th/product <– หน้าผลิตภัณฑ์และบริการของเว็บภาคภาษาไทย

วิธีการของผมอาจจะไร้สาระไปหน่อยแต่ก็ใช้ได้ผลล่ะครับ อันนี้เป็น trick ง่ายๆ จากนั้นก็ไปเพิ่ม script เพื่อทำ link ไปยังหน้าภาษาต่างๆ ให้ตรงกัน ใช้แนวคิดง่ายๆ คือ พิจารณาว่าหน้าปัจจุบันคือหน้าอะไร แล้วใส่หน้าต่อท้าย /en/ หรือ /th/ เวลาเราคลิกลิงค์เพื่อเปลี่ยนภาษาจะทำให้กระโดดไปยังหน้าปัจจุบันแต่คนละภาษาเสมอ เหมาะกับเว็บหลายภาษาที่มีหน้าเท่าๆ กัน ตัวอย่างเช่น หน้าผลิตภัณฑ์และบริการ ในลิงค์ภาษาอังกฤษและภาษาไทยก็ควรจะมีลิงค์ให้ถูกต้องดังนี้

<a href="/en/product">EN</a> | <a href="/th/product">TH</a>

ตัวอย่าง

เอาล่ะ ปัญหาที่ตามมาจากการทดสอบ Concrete5 บน Hosting ที่ผมใช้บริการอยู่ดันไปติดปัญหาของ PHP fast-cgi เข้าไปอีก คิอไม่สามารถใช้งาน URL สวยๆ ได้เลย นั่นก็หมายความว่าอุตส่าห์ทำ Template แถมสนับสนุน Multi Language ไดเแล้ว กลับได้หน้าขาวๆ กับคำว่า “No input file specified.” ซะงั้น ก็เลยได้ทำให้ได้เข้าไปแก้ไข Code ของ Concrete5 อีกนิดหน่อย โดยเข้าไปแก้ไขการอ่านค่าของหน้าเว็บ ที่ไฟล์ concrete/libraries/request.php ปรับแก้ไขดังนี้

จากโค้ดเดิม

$path = Request::parsePathFromRequest('ORIG_PATH_INFO');

แก้เป็น

$path = Request::parsePathFromRequest('REDIRECT_URL');
if (!$path) {
$path = Request::parsePathFromRequest('ORIG_PATH_INFO');
}

แก้ .htaccess เป็น

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
</IfModule>

เท่านี้ก็เรียบร้อยแล้ว :)