Clicky

How to Neatly Dump Variables in Drupal for Debugging | suksit dot com

How to Neatly Dump Variables in Drupal for Debugging

เวลาพัฒนาโมดูล / ธีมใน Drupal สิ่งหนึ่งที่มักจะต้องทำบ่อยๆ คือการ dump ค่าตัวแปรใน Drupal ออกมาดู วิธีที่ง่ายที่สุดคือใช้คำสั่ง print_r(<variable>) แต่ผลลัพธ์ที่ได้ส่วนใหญ่จะเป็น string เละๆ อยู่ในส่วนบนสุดของหน้านั้นๆ ทำให้อ่านลำบากอย่างแรง

เห็น @sugree แนะนำบ่อยๆ ว่าให้ใช้ drupal_set_message() เวลา dump ค่าตัวแปร ลองดูแล้วปรากฏว่ามันใช้ไม่ได้กับ print_r() เนื่องจาก print_r() จะพรินท์ค่าออกมาทันที ไม่ได้ return ค่าเป็น string กลับมาให้ drupal_set_message()

วิธีแก้คือใช้ output buffering ช่วยอีกที สมมติว่าต้องการ dump ค่าในตัวแปร $vars['node'] ก็เขียนโค้ดแบบนี้

@sikachu มาชี้ทางสว่างให้ว่าจริงๆ แล้ว print_r() มัน return ค่าเป็น string กลับมาได้ ถ้าใส่ parameter ตัวที่สองให้เป็น TRUE จากนั้นเอามารวมกับโค้ดที่ @onequad บอกมา จะได้โค้ดสำหรับ dump ตัวแปร $vars['node'] เป็น

<?php
drupal_set_message('<pre>' . htmlspecialchars(print_r($vars['node'], TRUE), ENT_QUOTES) . '</pre>');
?>

จะได้โครงสร้างของตัวแปร $vars['node'] อยู่ในกล่องข้อความของ Drupal อย่างเป็นระเบียบเรียบร้อย อ่านง่ายกว่าเดิมเยอะ :)

6 comments

Sikachu!'s picture
Sikachu! (visitor) says:

print_r ตั้งแต่ PHP 4.3.0 มันสามารถ set parameter ตัวที่สองให้เป็น true เพื่อให้ return string ได้ครับ

drupal_set_message('<pre>' . print_r($vars['node'], true) . '</pre>');
kong's picture
kong says:

อ่าน doc ไม่ละเอียด =.=

ง่ายกว่าเดิมมากๆ ขอบคุณครับ :P

Sikachu!'s picture
Sikachu! (visitor) says:

โอ๊ะ .. reference ครับ

http://th2.php.net/print_r

onequad's picture
onequad (visitor) says:

http://drupal.org/phptemplate แนะนำให้ทำแบบนี้ครับ

<?php
print '<pre>';
print htmlspecialchars(print_r(get_defined_vars(), TRUE), ENT_QUOTES);
print '</pre>';
?>

แต่ถ้าข้อมูลเยอะๆมันจะเดี้ยงเหมือนกัน ไม่รู้ทำไม

noomz's picture
noomz (visitor) says:

ผมเคยเห็นใน user/user-profile.tpl.php เค้าแนะนำอันนี้ครับ

<?php
print '<pre>'. check_plain(print_r($profile, 1)) .'</pre>';
?>
kong's picture
kong says:

แบบนี้ก็ใช้ได้ครับ เพราะ check_plain() มันจะไปเรียกใช้ htmlspecialchars() อีกที แถมพิมพ์สั้นกว่าด้วย :)

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.