مشاهده مقادیر متغیر ها و آرایه ها در برنامه نویسی ماژول دروپال

مشاهده مقادیر متغیر ها و آرایه ها در برنامه نویسی ماژول دروپال

مشاهده مقادیر متغیر های برنامه نویسی در debugger

وقتی مشغول برنامه نویسی هستید و نیاز به تست برنامه خود دارید، از ابزارهای trace و debugger برای مشاهده و کنترل مقدار هایی که درون متغیر های برنامه نگهداری می شوند، استفاده می کنید. در محیط های برنامه نویسی مانند Eclipse، Netbeans و Visual Studio برای زبان های نظیر C++، C# و Java به آسانی می توان از امکانات debugger آنها برای مشاهده متغیر ها (watch) استفاده کرد. ولی برای برنامه نویسان PHP راه اندازی یک محیط debugger به صورتی که در زبان های دیگر دیده می شود، کمی دشوار است. ولی همچنان نیاز به مشاهده مقادیری که در متغیر های برنامه نگهداری شده اند برای بررسی عملکرد کدی که نوشته می شود، وجود دارد.

مشاهده مقادیر متغیر ها در PHP

در زبان برنامه نویسی PHP توابعی چون print_r و یا debug_backtrace، توابع مفیدی برای مشاهده مقادیر متغیر ها و بررسی اجرای یک برنامه هستند. اغلب تابع print_r برای مشاهده مقادیر یک آرایه تو در تو و یا یک شیء (object) به کار برده می شود. مثلا به این نمونه توجه کنید که در فایل index.php مقداری که متغیر سراسری $language در خود نگهداری می کند را با استفاده از print_r نمایش داده ایم:

define('DRUPAL_ROOT', getcwd());

require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
global $language;
print_r($language);
menu_execute_active_handler();

و نتیجه به این شکل در سایت دروپالیکا نمایش داده می شود:

استفاده از تابع print_r در سایت دروپالیکا

البته اگر سورس صفحه را نگاه کنید، خروجی این تابع را به صورت منظم و بهتری مشاهده می کنید:

استفاده از تابع print_r در سایت دروپالیکا - مشاهده در سورس صفحه

مشاهده مقادیر متغیر ها و آرایه ها در دروپال

وقتی یک ماژول جدید برای دروپال می نویسید، طبیعی است که مانند هر برنامه نویس PHP نیاز دارید مقدار متغیر ها و آرایه ها را بررسی کنید ولی این تنها دلیلی نیست که شما در دروپال می خواهید مقدار یک متغیر، آرایه یا شیء را مشاهده کنید. معمولا در برنامه نویسی ماژول دروپال، نیاز دارید با API دروپال کار کنید، توابعی از آن را صدا بزنید و یا یک یا چند تابع hook را پیاده سازی کنید. ممکن است در مستندات تکنیکی API دروپال و یا ماژول های دیگری که API خاصی ارائه می کنند، اطلاعات کافی در مورد داده های موجود در یک متغیر یا یک آرایه ورودی توابع یا خروجی که بر می گردانند، بیان نشده باشد. بنابراین در این موقعیت ها، به این نیاز برخورد می کنید که مثلا داده های ورودی یا خروجی چنین تابعی را خودتان بررسی کنید. پس به دنبال راهی برای مشاهده مقادیر متغیر ها و آرایه ها خواهید بود.

با اینکه به آسانی در یک فایل PHP می توان از تابع print_r استفاده کرد و نتیجه گرفت، ولی در برنامه نویسی ماژول دروپال، در بعضی مواقع نمی توان از این تابع به صورت مستقیم استفاده کرد و خروجی را مستقیما از این تابع در صفحه مشاهده کرد. ولی راه به کلی بسته نیست. در اینجا دو روش دیگر برای مشاهده مقادیر متغیر ها در دروپال معرفی می شود.

  1. نمایش مقدار متغیرها با ماژول devel

    ماژول devel را در سایت دروپالی خود نصب کنید. در جایی از کد ماژولی که می نویسید و می خواهید متغیر و یا آرایه ای را مشاهده کنید، از تابع dpm استفاده کنید. این تابع مقداری که در متغیر ورودی آن نگهداری می شود را به شکل منظم و ساختار یافته ای در ناحیه messages نمایش می دهد. بنابراین برای استفاده از این تابع ضمن اینکه ماژول devel باید فعال باشد، در قالب (theme) سایت باید محلی برای نمایش پیام ها (messages) در نظر گرفته شده باشد. نمونه استفاده از این تابع را در ادامه می بینید:

    global $language;
    
    dpm($language);

    که برای این نمونه نتیجه ای که مشاهده می شود به این شکل است:

    استفاده از تابع dpm در سایت دروپالیکا -

  2. نوشتن یک تابع سفارشی توسط خودتان

    ممکن است مایل نباشد یک ماژول جداگانه مانند devel در سایت خود نصب کنید. یا اینکه شیوه نمایش خروجی dpm مورد نظر شما نیست و بخواهید همه مقادیر به صورت باز و مانند خروجی تابع print_r مشاهده شوند. در این صورت می توانید خود دست به کار شوید و یک تابع در ماژول خود پیاده سازی کنید، که خروجی print_r را در ناحیه  messages سایت دروپالی شما نمایش دهد.

    در حقیقت تابع print_r طوری پیاده سازی نشده است که لزوما خروجی آن در صفحه نمایش داده شود. بلکه می توان مسیر آن را تغییر داد. تابع print_r آرگومان ورودی دیگری نیز می گیرد که در صورتی که TRUE باشد، خروجی را به صورت یک رشته بر می گرداند. بنابراین شما می توانید به آسانی خروجی print_r از نمایش یک متغیر را به صورت رشته ای در اختیار داشته باشید. مثلا:

    $string = print_r($language, TRUE);

    در این مثال خروجی تابع print_r در متغیر $string ذخیره می شود. و حالا شما می توانید عملیات مورد نظر خود را با آن انجام بدهید.

    چون ما میخواهیم خروجی print_r را در ناحیه messages دروپال نمایش بدهیم، باید از تابع drupal_set_message استفاده کنیم. این تابع در API دروپال تعریف شده است که یک رشته در ورودی دریافت می کند و آن را در ناحیه messages نمایش می دهد.  برای اینکه نتیجه تابع print_r روی صفحه سایت در حالت نمایش، به درستی مشاهده شود، آن را درون تگ های pre قرار می دهیم. همچنین برای اطمینان از اینکه در هر شرایطی (مثلا در قالب های فارسی) رشته خروجی به صورت چپ چین نمایش داده می شود خصوصیت های CSS تگ pre را به صورت درون متنی (inline) مقدار دهی می کنیم. که در نهایت چنین تابعی داریم:

    function custom_dpm($param) {
    	drupal_set_message('<pre style="direction: ltr !important; text-align: left !important">' . print_r($param,TRUE) . "</pre>");
    }

    اکنون می توانیم از تابعی که خود نوشته ایم، متغیر ها را کنترل کنیم. برای نمونه:

    global $language;
    
    custom_dpm($language);

    که نتیجه آن به صورت زیر مشاهده می شود:

    مشاهده خروجی تابع custom_dpm در سایت دروپالیکا

نظرات

وقتی از dpm برای نمایش یک متغیر استفاده می کنیم، بعضی وقت ها کار می کند و بعضی وقت ها کار نمی کند و مقادیر را نشان نمی دهد، مشکل از چیست؟

تصویر admin
علی آقا! باید توجه داشته باشید که این تابع dpm فقط وقتی با ادمین لاگین هستید، کار می کند. ماژول devel چند پرمیشن دارد که می توانید آنها را برای نقش های مختلف فعال کنید. اگر اشتباه نکنم تابع dpm با پرمیشن access devel information مرتبط است. البته علل دیگری نیز ممکن است وجود داشته باشد.

ارسال نظر