بسيار اتفاق مي‌افتد که شما بخواهيد در شرايطي خاص و معمولاً پس از اتفاق افتادن يک رويداد، پيامي را تنها يکبار به کاربر سايت نمايش دهيد. رويدادهايي همچون: ثبت‌نام، ارسال يک فرم، بروز خطا و ...

در سيستم مديريت محتواي دروپال يک دستور براي اين کار وجود دارد که در هر ماژول يا صفحات قالبي که به زبان php‌هستند مي‌توان از آن استفاده کرد.

ساختار کلي:  که شکل کلي آن عبارت است از:

drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE);

در ساختار اين دستور پارامترهاي زير قابل دريافت است(در بين پرانتز مي‌توان 3 پارامتر به اين فانکشن ارسال نمود):

پارامتر توضيح

$message

پيامي است که مي خواهيم به کاربر نمايش دهيم. اگر اين پرامتر ارسال نشود، دستور NULL را به اين متغير نسبت مي‌دهد.

$type

نوع پيام است. در صورتي که نوع پيام تعيين نشود، نوع status لحاظ خواهد شد. اين متغير مي‌تواند اين مقادير را بپذيرد:

 - status :‌ وضعيت

- warning : هشدار

- error : خطا

توجه داشته باشيد که در هنگام نمايش پيام به کاربر، وضعيت تعيين شده براي يک پيام به صورت يک کلاس براي کادر پيام‌ها تعيين مي‌شود.

$repeat

مربوط به تکرار پيام است. در روند بارگذاري سايت ممکت است يک خط دستور پيام چند بار فراخواني شود و اين منجر به تکرار يک پيام مي‌شود. مثلاً اگر سايت در سايت توسط يک ماژول چند بار ايميل ارسال شود و در هر بار بخواهد بگويد که ايميلي ارسال شد، منظره خوبي در جلوي کاربر نمايش داده نخواهد شد. اما مي‌توان با ارسال پارامتر repeat به صورت False از وقوع تکرار يک پيام جلوگيري نمود.

 

نحوه عملکرد دستور:

اين دستور پيام را به جلسه يا سشن(session) کاربر حاضر اضافه مي‌کند. بنابراين در مرور همان کاربر و در همان جلسه‌اي که براي وي باز شده قابل نمايش است و به هيچ عنوان کاربر ديگري نمي‌تواند با پيام کاربر ديگر مواجه شود. البته بايد توجه داشته باشيد که پيام‌هايي که توسط اين دستور به کاربر نمايش داده مي شوند در ديتابيس ذخيره نمي‌گردند و نمي‌توان بعداً پيگيري نمود. براي درج يک پيام در ديتابيس از دستور ديگري مانند watchdog مي‌توان بهره برد.

از آنجا که ممکن است ماژول‌هاي مختل اقدام به درج پيام براي کاربر نمايند بنابراين $message‌ بايد از نوع آرايه باشد.

اين دستور چنانچه ساختارش در زير آورده شده اين اقدامات را انجام مي‌دهد:

  1. ابتدا پارامتر $message‌ را چک مي‌کند. اگر اين پارامتر داراي محتوايي بود، جلسه کاربر را از لحاظ وجود پيامي ديگر چک مي‌کند(فقط در دروپال 6)، اگر قبلاً پيامي نباشد متغير message‌ را در جلسه کاربر($_SESSION['messages'] ) به صورت آرايه تعريف مي‌کند.
  2. سپس جلسه کاربر را از لحاظ وجود متغير نوع پيام ($_SESSION['messages'][$type] ) چک مي‌کند.و اگر اين متغير وجود نداشته باشد آن را به صورت آرايه تعريف مي‌کند.
  3. حالا اين دستور چک مي‌کند که آيا اين پيام قبلاً در مورد رويدادي ديگر در جلسه کاربر وجود دارد يا خير. اگر وجود نداشته باشد و يا وجود داشته باشد اما پارامتر $repeat به صورت مثبت(True) برگردانده شده باشد، پيام مذکور را براي نمايش به کاربر در آرايه جلسه کاربر درج مي‌نمايد.
  4. در نهايت اين دستور تمام پيام‌هايي که براي کاربر ست شده است را برمي‌گرداند.

اگر اين دستور بدون هيچ پارامتري فراخواني شود، همه پيام‌هاي ثبت شده قبلي خوانده مي شود.

نحوه نمايش پيام در صفحه:

جايگاه نمايش پيام و شکل و استايل آن در قالب سايت تعيين مي‌شود. طراح قالب بايد در جايگاه مناسب پيام، معمولاً زير هدر و منوي بالاي سايت و يا بالاي محتواي اصلي صفحه و در جايي که جلوي چشم کاربر است، $message‌ را نمايش دهد.

مي‌توان از دستور زير در فايل page.tpl.php استفاده کرد(مانند قالب گارلند):

<?php if ($show_messages && $messages): print $messages; endif; ?>

سپس در فايل style.css (فايل استايل قالب) براي هر سه نوع پيام استايل جداگانه نوشته مي‌شود:

.messages.status{
     border: 1px solid #ddd;
     padding:10px;
     background: #C0EDC0;
}

.messages.warning {
     border: 1px solid #ddd;
     padding:10px;
     background: #F7B9B9;
}

.messages.error {
     border: 1px solid #ddd;
     padding:10px;
     background: #F7D18A;
}

جايگاه اين دستور:

جايگاه اين دستور فايل includes\bootstrap.inc مي‌باشد و ساختار اين دستور در دروپال 6 به شکل زير است:

function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
  if ($message) {
    if (!isset($_SESSION['messages'])) {
      $_SESSION['messages'] = array();
    }

    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }

    if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type][] = $message;
    }
  }

  // messages not set when DB connection fails
  return isset($_SESSION['messages']) ? $_SESSION['messages'] : NULL;
}

تمرين:

خط زير را در هر جايي از فايل page.tpl.php قالب سايت خود بين دو تگ php قرار دهيد:

<?php

drupal_set_message('اين يک پيام آزمايشي است');

drupal_set_message('آزمايش پيام هشدار','warning');

drupal_set_message('آزمايش پيام هشدار','error');

?>

تعداد امتیازدهندگان: 15486
مسیر کوتاه: rangine.ir/node/1068