ساخت Flash Message ها

?How to Create Flash Messages

25 بهمن 1399
پروژه ساخت شبکه ی اجتماعی: ساخت Flash Message ها

در قسمت قبل فرم ثبت نام را تکمیل و با استفاده از آن کاربری را با رمز عبور هش شده در سیستم ثبت کردیم. اگر از جلسه قبل یادتان باشد پس از ثبت نام به صفحه login (ورود) redirect می شدیم. در این قسمت می خواهیم تابعی کمکی بسازیم که با استفاده از آن بتوانیم از Flash messages ها استفاده کنیم. Flash message ها پیام هایی هستند که معمولا یک بار و آن هم برای چند ثانیه نمایش داده می شوند (به طور مثال: ورود شما موفقیت آمیز بود و...).

بنابراین وارد پوشه helpers شده و یک فایل جدید به نام session_helper.php بسازید. ما برای پیاده سازی طرح خود از session ها استفاده می کنیم. به طور خلاصه session ها متغیرها و اطلاعات موقتی هستند که هنگامی که ما بخواهیم یا هنگامی که کاربر مرورگر خود را ببندد از بین می روند. برای شروع یک session و برای اینکه session ما در تمامی صفحات سایت قابل دسترسی باشد با دستور زیر شروع می کنیم:

session_start();

با این دستور Session ما شروع می شود. همچنین فایل session_helper.php را در تمام برنامه بارگذاری خواهیم کرد.

حالا باید تابعی برای flash message ها بسازیم:

function flash($name = '', $message = '', $class = 'alert alert-success'){

  }

از آنجا که از بوت استرپ استفاده می کنیم کلاس این flash message را روی alert alert-success تنظیم کرده ایم. شما می توانید این مورد را بر اساس سلیقه خود تغییر دهید. طرز استفاده از این تابع به این صورت خواهد بود که تابعی به نام flash را به شکل زیر صدا بزنیم:

flash('register_success', 'You are now registered');

و این تابع پیام You are now registered را آماده کند و با کد زیر آن را نمایش دهیم:

// DISPLAY IN VIEW - echo flash('register_success');

قسمت class در تابع flash نیز به صورت پیش فرض success است اما در صورت نیاز می توانید آن را نیز به عنوان پارامتر سوم به تابع بدهید تا override شود.

برای شروع کار ابتدا باید مطمئن شویم name (که نام متغیر session ما خواهد بود) خالی نباشد:

if(!empty($name)){

	}

حالا اگر message نوشته و وارد شده است اما session ای برای آن وجود ندارد باید آن را بسازیم بنابراین داخل همین شرط if می گوییم:

function flash($name = '', $message = '', $class = 'alert alert-success'){
    if(!empty($name)){
      if(!empty($message) && empty($_SESSION[$name])){
       
        $_SESSION[$name] = $message;
        $_SESSION[$name. '_class'] = $class;

(empty($message! یعنی message خالی نباشد و شرط بعدی یعنی sesssion مربوط به name خالی باشد (یعنی ساخته نشده است). ساختن session ها نیز کار آسانی است بنابراین [SESSION[$name را با message$ می سازیم. برای session مربوط به کلاس هم از ساختار زیر استفاده می کنیم:

name$ به علاوه رشته "class_"

شما می توانید بر اساس سلیقه خود برنامه را تغییر دهید. این راه، روشی است که ما انتخاب کرده ایم. اگر به کد نگاه کنید متوجه مشکلی می شوید؛ اگر session از قبل تعریف و ساخته شده بودند چطور؟ مثلا کاربر قبلا login شده باشد! به همین دلیل باید این مسئله را قبل از ساختن Session ها چک کنیم:

function flash($name = '', $message = '', $class = 'alert alert-success'){
    if(!empty($name)){
      if(!empty($message) && empty($_SESSION[$name])){

        if(!empty($_SESSION[$name])){
          unset($_SESSION[$name]);
        }

        if(!empty($_SESSION[$name. '_class'])){
          unset($_SESSION[$name. '_class']);
        }

        $_SESSION[$name] = $message;
        $_SESSION[$name. '_class'] = $class;

دستور unset یک session را از شما می گیرد و آن را از بین می برد اما دستور ()session_destroy تمام Session های شما را یک جا حذف می کند. بنابراین باید مراقب این مسئله باشید.

حالا چه زمانی باید session را نمایش دهیم؟ اگر message خالی باشد اما session مربوط به name خالی نباشد باید پیام را نشان دهیم:

function flash($name = '', $message = '', $class = 'alert alert-success'){
    if(!empty($name)){
      if(!empty($message) && empty($_SESSION[$name])){
        if(!empty($_SESSION[$name])){
          unset($_SESSION[$name]);
        }

        if(!empty($_SESSION[$name. '_class'])){
          unset($_SESSION[$name. '_class']);
        }

        $_SESSION[$name] = $message;
        $_SESSION[$name. '_class'] = $class;
      } elseif(empty($message) && !empty($_SESSION[$name])){
        $class = !empty($_SESSION[$name. '_class']) ? $_SESSION[$name. '_class'] : '';
        echo '<div class="'.$class.'" id="msg-flash">'.$_SESSION[$name].'</div>';
        unset($_SESSION[$name]);
        unset($_SESSION[$name. '_class']);
      }
    }
  }

توضیح کد:

برای تعیین متغیر class به این روش عمل کرده ایم:

  • اگر ['SESSION[$name. '_class خالی نباشد باید داخل message برود
  • در غیر این صورت یک رشته خالی ("") را برایش قرار می دهیم. در این صورت کلاس پیام همان success پیش فرض خواهد بود.

حالا باید یک div را نمایش دهیم که حاوی پیام ما باشد بنابراین:

        echo '<div class="'.$class.'" id="msg-flash">'.$_SESSION[$name].'</div>';

پس از نمایش این پیام هم باید مطمئن شویم که session ها را حذف کرده ایم. چرا؟ به دلیل اینکه کاربر یک بار login یا register می شود و نباید در تمام صفحات سایت پیام «با موفقیت وارد شدید» یا چنین پیام هایی را داشته باشیم.

حالا وارد فایل bootstrap.php شوید و با استفاده از دستور require_once تابعی را که نوشتیم بارگذاری کنید:

 require_once 'helpers/session_helper.php';

سپس از پوشه controllers وارد فایل Users.php شوید. به قسمت ثبت نام کاربر و redirect شدن آن بروید (جلسه قبل) و کد را بدین شکل تغییر دهید:

// Register User
          if($this->userModel->register($data)){
            flash('register_success', 'You are registered and can log in');
            redirect('users/login');
          } else {
            die('Something went wrong');
          }

به کد بالا آرگومان class را ندادیم. چرا؟ به این دلیل که مقدار پیش فرض برای class همان alert alert-success است و بوت استرپ این کلاس را با رنگ سبز نمایش می دهد که متناسب با کار ما است. حواستان باشد که تا اینجای کار چیزی نمایش داده نمی شود. برای نمایش دادن پیام باید به صفحه ای برویم که کاربر به آن redirect می شود (یعنی login). بنابراین فایل login.php را از پوشه view>users باز کنید. سپس قبل از تگ <h2> پیام زیر را وارد کنید:

<?php require APPROOT . '/views/inc/header.php'; ?>
  <div class="row">
    <div class="col-md-6 mx-auto">
      <div class="card card-body bg-light mt-5">
        <?php flash('register_success'); ?>
        <h2>Login</h2>
        <p>Please fill in your credentials to log in</p>
        <form action="<?php echo URLROOT; ?>/users/login" method="post">
          <div class="form-group">

به تابع flash آرگومان name (مقدار register_success) را داده ایم تا آن را نمایش دهد.

برای تست عملکرد برنامه به محیط PHPMyAdmin بروید و از جدول users کاربری که در جلسه قبل ساخته بودیم را حذف کنید. سپس با اطلاعات دلخواه یک کاربر دیگر را ثبت نام کنید تا بتوانیم کار برنامه را تست کنیم.

پس از ثبت نام باید به صفحه login منتقل شده و پیام you are registered and can log in برایتان نمایش داده شود.

امیدوارم از این قسمت لذت برده باشید. در قسمت بعد روی login کردن کاربران کار خواهیم کرد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش ساخت شبکه اجتماعی توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.