Drupal, Inline and Contemplate   no comments

Posted at 4:18 am in Wired

ช่วงสัปดาห์ที่ผ่านมา มั่วแต่วุ่นๆ อยู่กับการเปิดเว็บข่าวอนิเมะเอามันส์ หลังจากที่มัวลังเลอยู่หลายเดือน ในที่สุดก็ออกมาเป็นรูปเป็นร่าง ซอฟท์แวร์ที่ใช้ในขณะนี้ก็คือ Drupal พอลองเอามาใช้ดูกับงานแบบนี้แล้วค่อนข้างถูกใจในความยืดหยุ่นของมัน

Plugin ที่ใช้ในการทำหน้าเนื้อหาข่าว หลักๆ ก็คือ Content Template กับตระกูล CCK ทั้งหลาย พร้อมด้วย CSS แบบเถื่อนๆ ลงไปบน template อีกนิดหน่อย (เพราะธีมยังไม่เสร็จดี) ซึ่งผลที่ได้ออกมาก็เป็นที่ค่อนข้างพอใจ

ทีนี้ ปัญหามันก็เกิดขึ้น ปัญหาที่ว่าก็คือเมื่อต้องการจะทำ inline image ลงในบทความ ตัวเลือกโมดูลแรกที่จะมองหาก็คือ Inline โดยที่มันจะสร้าง tag เล็กๆ เช่น [inline:hello.jpg] และจะแทนแทคนี้ด้วยภาพที่เราอัพโหลดลงไป

จุดที่เป็นปัญหาคือส่วน “แทนภาพ” ที่ว่านี่ เมื่อมันใช้การเรียกหา $node->body เพื่อมาแทนภาพ แต่การใช้งาน Content template เราจะไม่ได้ใช้ในส่วนนั้น แต่จะเป็น $node->content['body']['#value'] แทน เลยเป็นผลทำให้สิ่งที่แสดงออกมาเลยกลายเป็น raw text [inline:hello.jpg] แทนที่จะเป็นภาพ

เมื่อไปขุดคุ้ยโค้ดดู ก็พบว่าการแทนภาพนั่น ทำผ่านฟังก์ชั่นที่ชื่อ _inline_substitute_tags นั่นก็หมายความว่าสามารถเรียกผ่าน Content template ได้เช่นกัน หากแต่เจ้า _inline_substitute_tags นี่มันดันรับเพียงแค่ชื่อ field ที่เป็น string ดังนั้นจึงไม่สามารถเรียกหา content['body']['#value'] ได้

ทางแก้แบบป่าเถื่อนที่ใช้จึงกลายเป็น มากำหนดค่าให้แก่ $node->body_value ให้เป็น $node->content['body']['#value'] เสียก่อน แล้วค่อยเรียก _inline_substitute_tags($node, 'body_value') เอาอีกที ซึ่งผลที่ได้ออกมาก็ได้ตรงตามที่ต้องการ แต่ถ้ามีเวลาอยากจะลองหาทางอื่นที่ไม่ hack-ish แบบนี้ดู น่าจะดีกว่า

Written by Sirn on September 4th, 2008

Tagged with , ,

Leave a Reply