کدنویسی دکمه‌ی Delete و تکمیل نهایی پروژه

Coding the Delete Button and Finalizing the Project

پروژه ساخت شبکه ی اجتماعی: کدنویسی دکمه ی delete و تکمیل نهایی پروژه (قسمت آخر)

با سلام خدمت شما همراهان گرامی روکسو، به قسمت آخر از سری آموزشی ساخت فریم ورک و یک شبکه اجتماعی خوش آمدید. دوست دارم به شما تبریک بگویم و برای همه شما آرزوی موفقیت دارم. امیدوارم که با گذراندن این دوره به دانش شما اضافه شده باشد.

در قسمت قبل دکمه ویرایش (edit) را تکمیل کردیم، حالا نوبت دکمه Delete است. از پوشه controller فایل Posts.php را باز کرده و تابعی به نام delete بنویسید که پارامتر id را می گیرد. اگر یادتان باشد کلید delete را به شکل متفاوتی طراحی کردیم؛ این کلید در واقع یک form است که درخواست POST را به سمت سرور ارسال می کند. بنابراین باید چک کنیم که آیا درخواست ارسال شده از نوع POST است یا خیر. اگر از نوع POST بود آنگاه متدی به نام deletePost تعریف میکنیم تا پست را حذف کند:

public function delete($id){
      if($_SERVER['REQUEST_METHOD'] == 'POST'){ 
        // Get existing post from model
        if($this->postModel->deletePost($id)){
          flash('post_message', 'Post Removed');
          redirect('posts');
        } else {
          die('Something went wrong');
        }
      } else {
        redirect('posts');
      }
    }

توضیح کد:

  • درخواست ارسالی چک می شود تا از نوع POST باشد (یعنی کاربر URL را به صورت دستی وارد نکرده باشد).
  • اگر درخواست از نوع POST بود، متد deletePost پست را حذف کرده و یک flash message برای کاربر نمایش داده می شود که پست حذف شد ('Post Removed'). سپس کاربر به صفحه اولیه پست ها منتقل می شود.
  • در غیر این صورت پیام die نمایش داده می شود.

حالا باید متد deletePost را تعریف کنیم بنابراین به فایل Post.php در پوشه models بروید و آن را کدنویسی کنید:

public function deletePost($id){
      $this->db->query('DELETE FROM posts WHERE id = :id');
      // Bind values
      $this->db->bind(':id', $id);

      // Execute
      if($this->db->execute()){
        return true;
      } else {
        return false;
      }
    }

توضیح کد:

ابتدا با استفاده از دستور DELETE (زبان SQL) گفته ایم که چه ردیفی حذف شود. سپس مقدار placeholder را به مقدار اصلی bind می کنیم و در آخر با دستور execute آن را اجرا می کنیم. در جلسات قبل نیز چنین توابعی را نوشته ایم. (در صورتی که با زبان SQL و یا کار با پایگاه داده آشنایی ندارید به دوره های مربوطه‌شان مراجعه کنید).

حالا می توانیم برای اطمینان از اینکه هر کس تنها می تواند پست خودش را پاک کند، تابع delete را مانند تابع edit ویرایش کنیم. اگر یادتان باشد تابع edit به این شکل بود:

public function edit($id){
      if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // Sanitize POST array
        $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

        $data = [
          'id' => $id,
          'title' => trim($_POST['title']),
          'body' => trim($_POST['body']),
          'user_id' => $_SESSION['user_id'],
          'title_err' => '',
          'body_err' => ''
        ];

        // Validate data
        if(empty($data['title'])){
          $data['title_err'] = 'Please enter title';
        }
        if(empty($data['body'])){
          $data['body_err'] = 'Please enter body text';
        }

        // Make sure no errors
        if(empty($data['title_err']) && empty($data['body_err'])){
          // Validated
          if($this->postModel->updatePost($data)){
            flash('post_message', 'Post Updated');
            redirect('posts');
          } else {
            die('Something went wrong');
          }
        } else {
          // Load view with errors
          $this->view('posts/edit', $data);
        }

      } else {
        // Get existing post from model
        $post = $this->postModel->getPostById($id);

        // Check for owner
        if($post->user_id != $_SESSION['user_id']){
          redirect('posts');
        }

        $data = [
          'id' => $id,
          'title' => $post->title,
          'body' => $post->body
        ];
  
        $this->view('posts/edit', $data);
      }
    }

یکی از مهم ترین خطوط این کد قسمت بررسی مالکیت (Check for owner) است. ما هم می توانیم این قسمت را در تابع delete پیاده سازی کنیم:

public function delete($id){
      if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // Get existing post from model
        $post = $this->postModel->getPostById($id);
        
        // Check for owner
        if($post->user_id != $_SESSION['user_id']){
          redirect('posts');
        }

        if($this->postModel->deletePost($id)){
          flash('post_message', 'Post Removed');
          redirect('posts');
        } else {
          die('Something went wrong');
        }
      } else {
        redirect('posts');
      }
    }

در کد بالا ابتدا پست مربوطه را fetch کرده ایم (پستی که کاربر روی دکمه delete آن کلیک کرده است) و سپس بررسی می کنیم که آیا فردی که روی Delete کلیک کرده است صاحب آن پست است یا خیر؟ در صورتی که صاحب پست نباشد به صفحه posts منتقل می شود.

این کار فقط از جهت محکم کاری است! توجه داشته باشید که دکمه delete برای کاربری که صاحب پست نباشد نمایش داده نخواهد شد. از طرفی با بررسی درخواست (POST بودن یا نبودن) مطمئن می شویم که کاربر URL مربوط به حذف را وارد مرورگر خود نکرده باشد. بنابراین به احتمال زیاد همین دو مورد کافی باشد اما اگر دوست دارید از نتیجه کار مطمئن شوید می توانید مانند ما از این کد نیز استفاده کنید.

تا اینجای کار پروژه ما تقریبا تکمیل شده است اما چند قابلیت دیگر هم مانده است که برای زیباتر شدن برنامه لازم هستند. به طور مثال بهتر است کنار گزینه logout در نوار ابزار، نام کاربر نیز نمایش داده شود تا بداند با چه حسابی وارد شده است. بنابراین به فایل navbar.php (پوشه views>inc بروید و قسمت پایینی کد را بدین شکل تغییر دهید:

<ul class="navbar-nav ml-auto">
          <?php if(isset($_SESSION['user_id'])) : ?>
          <li class="nav-item">
              <a class="nav-link" href="#">Welcome <?php echo $_SESSION['user_name']; ?></a>
            </li>
          <li class="nav-item">
              <a class="nav-link" href="<?php echo URLROOT; ?>/users/logout">Logout</a>
            </li>
          <?php else : ?>
            <li class="nav-item">
              <a class="nav-link" href="<?php echo URLROOT; ?>/users/register">Register</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="<?php echo URLROOT; ?>/users/login">Login</a>
            </li>
          <?php endif; ?>
        </ul>

نکته: دلیل اینکه خوشامدگویی را در قالب لینک قرار داده ایم دو چیز است:

  • اگر تگ a را حذف کنیم استایل بوت استرپ به هم می ریزد. شما می توانید آن را به شکل دلخواه تغییر و دوباره استایل دهی کنید.
  • همچنین بعدا می توانید این لینک را روی صفحه پروفایل کاربر تنظیم کنید.

حالا پروژه شما آماده کار است! برای قرار دادن پروژه در سمت سرور یادتان باشد که مواردی مانند موارد زیر را تغییر دهید:

  • تغییر اطلاعات پایگاه داده با توجه به سرور خریداری شده.
  • حذف یا تغییر اطلاعات کاربران در صورت نیاز (اگر می خواهید پایگاه داده را import کنید تا جداول را از ابتدا نسازید).
  • اطلاعات دیگر موجود در فایل config
  • ویرایش اطلاعات htaccess.
  • و...

به طور مثال فایل htaccess. در پوشه public از پروژه ما باید تغییر کند:

<IfModule mod_rewrite.c>
  Options -Multiviews
  RewriteEngine On
  RewriteBase /shareposts/public
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>

ما دیگر با دیرکتوری shareposts کار نمی کنیم بنابراین باید آن را حذف کنیم:

<IfModule mod_rewrite.c>
  Options -Multiviews
  RewriteEngine On
  RewriteBase /public
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>

اگر خواستید پروژه را در یک دیرکتوری در سرور قرار دهید آن گاه باید نام دیرکتوری را به قبل از public اضافه کنید.

نکته: اکثر شرکت های میزبانی کد زیر را قبول می کنند:

  define('DB_HOST', 'localhost');

یعنی پایگاه داده روی همان سروری است که سایت شما روی آن میزبانی می شود. در صورت بروز خطا می توانید با پشتیبانی سایت میزبانی خود صحبت کنید.

دانلود فایل های تکمیل شده و نهایی پروژه

امیدوارم در طول این دوره آموزشی موارد لازم را یاد گرفته باشید و به دانش برنامه نویسی شما افزوده شده باشد. در پناه حق.

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

دیدگاه‌های شما (1 دیدگاه)

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

fatemebghri
01 آذر 1398
سلام با خرید اشتراک جادویی می توان ویدیو های که رایگان نیستند هم استفاده کرد؟؟؟؟؟؟؟

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

روکسو
02 آذر 1398
سلام. خیر، خرید اشتراک جادویی فقط برای دسترسی به مقالات جادویی روکسوپلاس است. برای مشاهده ی دوره های ویدیویی سایت روکسو، باید دوره ها را خریداری کنید.

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