ถ้าใส่ ชื่อเรื่อง (Node Title) ภาษาไทยยาวๆ มันจะผิดปกติครับ มีวิธีแก้ไหมครับ

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

ผมลองใส่ ชื่อเรื่อง ยาวๆ มันจะผิดปกติโดยตัดชื่อเรื่องให้สั้นเองเลย แล้วจะมีเครื่องหมายอะไรก็ไม่รู้ขึ้นมาแทน (?)
ไม่ทราบว่ามันเกิดขึ้นเพราะอะไรครับ และจะมีวิธีแก้ไหมครับ

ขอบคุณครับ

sugree's picture

มันเกิดจากการตัด utf-8 ขาดระหว่างกลาง ความยาวสูงสุดคือ 128 ตัวอักษร ตามที่กำหนดไว้ใน mysql มันเลยโดนตัดฉับ ซึ่งบังเอิญคำว่า “ทดสอบ” จะยาว 15 ตัวอักษรเมื่อเก็บเป็น utf-8 ทีนี้ตอนเก็บเข้าไปใน mysql ไม่ได้เช็คความยาวสุดท้ายก่อน

ถ้าอยากจะแก้ ผมแนะนำให้เขียนโมดูลฮุคเข้าไปในขั้น hook_nodeapi() เพื่อดัก submit และตัด title ให้เท่ากับ 128 ด้วย drupal_substr() ก่อนที่จะเอาไปทำอย่างอื่นต่อ

mk's picture

จะถามพอดีว่า hook_view กับ hook_nodeapi ต่างกันตรงไหนครับ

sugree's picture
  • hook_view เป็นของโหนดโมดูลมีไว้สำหรับจัดการกับเนื้อหาทุกอย่างเพื่อนำมาแสดงในหน้า view ซึ่งจะบอกว่าเป็นหน้าเดี่ยวหรือหน้ารวม และต้องการแบบสั้นหรือแบบยาว
  • hook_nodeapi เป็นของโมดูลไหนก็ได้ มีไว้เพื่อปรับปรุงหรือเพิ่มเติมโหนดโมดูลที่มีอยู่แล้ว

ยกตัวอย่างง่ายๆ เราทำโหนดชื่อว่า alert ซึ่งมีฟิลด์โขยงนึง และก็มีโหนด warning ซึ่งก็มีฟิลด์อีกโขยงนึง ทั้งสองโหนดจะมี hook_view ของตัวเอง หน้าตาไม่เหมือนกันซักเท่าไหร่ แต่เอาเข้าจริงแล้วบางฟิลด์มันใกล้เคียงกัน หรือเหมือนกัน เช่น สถานที่ ตำแหน่ง ความรุนแรง และอื่นๆ อีกหลายตัว หรือจะสรุปสั้นๆ ว่ามันจะมี CAP ฝั่งอยู่ข้างใน อย่ากระนั้นเลย เราน่าจะเอาฟิลด์พวกนั้นออกไปจาก alert และ warning แล้วใส่ในโมดูลใหม่ชื่อ cap ซึ่งมี hook_nodeapi ใน hook_nodeapi นี้จะมีการเพิ่มฟิลด์เข้าไปในหน้า view และอาจจะทำ hook_form_alter อีกซักอันเพื่อเพิ่มฟิลด์ในหน้า edit วิธีนี้จะทำให้เราเลือกชนิดของโหนดที่ต้องการให้มีฟิลด์เกี่ยวกับ CAP ได้และเพิ่มได้เรื่อยๆ ถ้าอยากเอาไปใส่ใน feed ก็ตรงนี้เหมือนกัน ไม่ต้องทำซ้ำซ้อน

เอ จะว่าผมเข้าใจผิดหรือเปล่า เพราะผมไปเจอ Blog นี้ http://www.bxtra.net/node/1 ที่ต้องทำก็แค่เพิ่มความยาวของ Field title ใน table 2 อันใน mysql ก็คือ Node กับ Node_revisions จาก 128 ให้ยาวขึ้น แล้วก็จะใช้ได้ครับ ผมลองทำเองแล้วก็ทำได้นะ

sugree's picture

ไม่ว่าจะยาวแค่ไหนก็อาจจะพบปัญหานี้ได้เมื่อความยาว title ตัดไม่พอดี การแก้ฐานข้อมูลแม้ว่าจะง่ายแต่ก็มีความเสี่ยงครับ ผมไม่แนะนำให้ใช้วิธีนี้ เพราะตอนอัพเกรด Drupal อาจไม่ราบรื่น

เดี๋ยวนะครับ ผมงง งั้นก็แปลว่าถ้าผมเขียน Module แก้เข้าไป (คือผมเขียนไม่เป็นนะครับ) ผมก็ไม่ต้องแก้ Database หรือครับ? ที่งงเพราะว่ายังไงซะถ้าไม่แก้ แล้ว Database รับได้แค่ 128 bytes ซึ่งถ้าเป็น utf8 หนึ่งตัวอักษรก็จะมากกว่า 1 Bytes นี่ครับ หรือว่าที่คุณ sugree พูดมานี่คือยังไงก็ให้ limit ไว้แค่ 128 bytes แต่ว่าให้ทำตัดให้สวยงามเท่านั้น?

sugree's picture

ถูกต้องครับ

เข้าใจแล้วครับ ขอบคุณครับ

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น