با سلام خدمت شما همراهان گرامی روکسو، به قسمت آخر از سری آموزشی ساخت فریم ورک و یک شبکه اجتماعی خوش آمدید. دوست دارم به شما تبریک بگویم و برای همه شما آرزوی موفقیت دارم. امیدوارم که با گذراندن این دوره به دانش شما اضافه شده باشد.
در قسمت قبل دکمه ویرایش (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'); } }
توضیح کد:
حالا باید متد 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>
نکته: دلیل اینکه خوشامدگویی را در قالب لینک قرار داده ایم دو چیز است:
حالا پروژه شما آماده کار است! برای قرار دادن پروژه در سمت سرور یادتان باشد که مواردی مانند موارد زیر را تغییر دهید:
به طور مثال فایل 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');
یعنی پایگاه داده روی همان سروری است که سایت شما روی آن میزبانی می شود. در صورت بروز خطا می توانید با پشتیبانی سایت میزبانی خود صحبت کنید.
دانلود فایل های تکمیل شده و نهایی پروژه
امیدوارم در طول این دوره آموزشی موارد لازم را یاد گرفته باشید و به دانش برنامه نویسی شما افزوده شده باشد. در پناه حق.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.