ساخت CMS ساده با PHP - قسمت 13 - فرم نظر دهی و نمایش لیست نظرات

‏  26 دقیقه
۱۶ مرداد ۱۳۹۳
ساخت CMS ساده با PHP - قسمت 13 - فرم نظر دهی و نمایش لیست نظرات

در ادامه آموزش ساخت CMS ساده با php در خدمت شما هستیم با با ایجاد بخش نظردهی در وب سایت و ایجاد فرم ارسال نظر و هم چنین بخش نمایش لیست نظرات در مطلب یا برگه مربوطه.

در ابتدا فرم ارسال نظر رو ایجاد می‌کنیم و سپس هم بخش نمایش نظرات رو ایجاد می‌کنیم،اول از همه لازم داریم تا چند تا تابع رو تعریف کنیم که لازم داریم.

فهرست محتوای این مقاله

تابع دریافت نظرات

در فایل functions تابع get_comments به صورت زیر تعریف میشه.

function get_comments($pid){
    if(!empty($pid))
    {
        $query=mysql_query("SELECT * FROM comments WHERE comment_post_ID={$pid} AND comment_approved=1");
        return mysql_num_rows($query)>0?$query:FALSE;  
    }
    return FALSE;

}

این تابع با توجه به آیدی مطلب یا برگه نظرات رو برمیگردونه.

تابع دریافت گراواتار نظر دهنده

برای نشون دادن گراواتار کاربر، یه تابع دیگه به صورت زیر  تعریف می‌کنیم.

function get_avatar($email){
 if(!empty($email)){
     $size = 47;
      return "http://www.gravatar.com/avatar/" . md5( strtolower( trim( $email ) ) ). "?s=" . $size;
 }else
 {
     return "images/avatar.jpg"; 
 }

}

ایمیل کاربر رو به این تابع ارسال می‌کنیم و آدرس گراواتار رو دریافت میکنیم.

خوب حالا در فایل view.php در پایین صفحه و بعد از بخش نشون دادن تعداد نظرات اون مطلب یا برگه،فرم ارسال نظر رو به صورت زیر ایجاد میکنیم.

<div id="comment_form">
	<h3 class="comment_form_title">دیدگاه خود را بیان کنید :</h3>
	<form action="" method="post" role="form" name="comments" class="form-horizontal" >
		<div class="form-group">
			<label for="author" class="col-sm-2 control-label">نام :</label>
			<div class="col-sm-5">
				<input type="text" class="form-control" name="author" required="">
			</div>
		</div>
		<div class="form-group">
			<label for="email" class="col-sm-2 control-label">ایمیل :</label>
			<div class="col-sm-5">
				<input type="email" class="form-control" name="email" required="">
			</div>
		</div>
		<div class="form-group">
			<label for="url" class="col-sm-2 control-label">وب سایت :</label>
			<div class="col-sm-5">
				<input type="text" class="form-control" name="url">
			</div>
		</div>
		<div class="form-group">
			<label for="content" class="col-sm-2 control-label">نظر شما :</label>
			<div class="col-sm-9">
				<textarea name="content" class="form-control" rows="6" required=""></textarea>
			</div>

		</div>
		<div class="form-group">
			<div class="col-sm-offset-2 col-sm-10">
				<button type="submit" name="submit_comment_form" class="btn btn-primary">ثبت نظر</button>
			</div>
		</div>
	</form>
</div>

این فرم رو طبق ساختار پیش فرض بوت استرپ ایجاد کردیم،حالا برای ارسال فرم و ثبت نظر کاربر کدهای زیر رو در بالای صفحه و در قسمت کدهای php قرار میدیم.

if(isset($_POST['submit_comment_form'])){
    $author=mysql_real_escape_string(strip_tags($_POST['author']));
    $email=  mysql_real_escape_string(strip_tags($_POST['email']));
    $url=  mysql_real_escape_string(strip_tags($_POST['url']));
    $content= mysql_real_escape_string(strip_tags($_POST['content']));
    if(empty($author) || empty($email) || empty($content))
    {
        $err=true;
        $message="لطف فیلد‌های لازم را پر نمایید";
    }
    else
    {
        $pid=isset($post_id)?$post_id:$page_id;
        $date=  strftime("%Y-%m-%d %H:%M:%S",time());
        $sql="INSERT INTO comments (comment_post_ID,comment_user_ID,comment_author,comment_author_email,comment_author_url,comment_body,comment_date,parent_id,comment_approved)";
        $sql.=" VALUES({$pid},0,'{$author}','{$email}','{$url}','{$content}','{$date}',0,0)";
        $res=  mysql_query($sql);
        if($res)
        {
            $success=true;
            $message="نظر شما با موفقیت ثبت گردید";
        }else{
            $err=true;
            $message="خطایی رخ داده است لطفا بعدا امتحان کنید";
        }
    }
}

در اینجا چک می‌کنیم فرم ارسال شده باشه بعدش مقادیر فرم رو میگیرم و بررسی میکنیم خالی نباشه،بعد از این با یه کوئری اونو در دیتابیس ثبت می‌کنیم،شناسه مطلبی که باید براش نظر رو ثبت کنیم یا post_id هستش یا page_id که به یه شرط اونو بدست میاریم.

نمایش لیست نظرات

برای نمایش لیست نظرات مطلب یا صفحه،در بخش ارسال نظر . بالای اون کدهای زیر رو می‌نویسیم.

<div class="panel panel-primary">
  <div class="panel-heading">
	  <h3 class="panel-title">نظرات</h3>
  </div>
  <div class="panel-body">
  <ol id="comment-list">
	  <?php
	  $pid=isset($post_id)?$post_id:$page_id;
	  $comments= get_comments($pid);
	  if($comments):
	  while($comment=  mysql_fetch_assoc($comments)):?>
	  <li class="comment" id="comment-<?php echo $comment['comment_ID']; ?>">
		  <div class="comment-meta">
			  <div class="user_avatar"> <img class="avatar" src="<?php echo get_avatar($comment['comment_author_email']); ?>"></div>
			  <div class="author-name"><?php echo $comment['comment_author']; ?></div>
		  </div>
		  <div class="clearfix" ></div>
		  <div class="comment-text">
			  <?php echo $comment['comment_body']; ?>
		  </div>
	  </li>
	  <?php endwhile;else: ?>
	  <li class="comment">
		  هیچ نظری برای این مطلب وجود ندارد
	  </li>
	  <?php endif; ?>
  </ol>    
  </div>
</div>

با استفاده از پنل‌های بوت استرپ یه پنل ایجاد کردیم و با تابع get_comments نظرات مطلب یا برگه رو دریافت می‌کنیم اگر نظری وجود داشته باشه اونو در یه حلقه نمایش میدیم.برای نمایش آواتار کاربر هم از همون تابع get_avatar استفاده کردیم.

بعد از این فقط میمونه کار استایل دادن به این بخش که ما به صورت زیر نوشتیم.

/*Comments*/
#comment-list{
    list-style: none;
}
#comment-list li{
    margin-bottom: 20px;
    margin-left: 10px;
    padding: 5px;
    position: relative;
     box-shadow: 0px 0px 2px #BBBBBB;
    -webkit-box-shadow: 0px 0px 1px #BBBBBB;
    -moz-box-shadow: 0px 0px 1px #BBBBBB;
}
#comment-list .comment-meta{
    margin-top: 10px;
}
#comment-list .author-name{
    font-weight: bold;
    float: right;
    margin: 20px 5px 0 0;
}
#comment-list .user_avatar{
    float: right;
    margin: 5px;
}
#comment-list .avatar{
    width: 47px;
    height: 47px;
    border:4px solid #EEEEEE;
    box-shadow: 0px 0px 3px #999999;
    -webkit-box-shadow: 0px 0px 3px #999999;
    -moz-box-shadow: 0px 0px 3px #999999;
}
#comment-list div.comment-text{
    margin:0px 80px 20px 0;
    text-align: justify;
    line-height: 22px;
}

خوب کدهای کامل صفحه برای ارسال و نشون دادن نظرات هر مطلب یا صفحه به صورت زیر در میاد:

<?php
require_once 'init.php';
    $message="";
    $err=false;
    $success=false;
if (isset($_GET['p'])) {
    $post_id = intval($_GET['p']);
    $post = get_post_by_id($post_id);
    if (!$post) {
        redirect("404.php");
    }
}
if (isset($_GET['page_id'])) {
    $page_id = intval($_GET['page_id']);
    $page = get_page_by_id($page_id);
    if (!$page) {
        redirect("404.php");
    }
}
if(isset($_POST['submit_comment_form'])){
    $author=mysql_real_escape_string(strip_tags($_POST['author']));
    $email=  mysql_real_escape_string(strip_tags($_POST['email']));
    $url=  mysql_real_escape_string(strip_tags($_POST['url']));
    $content= mysql_real_escape_string(strip_tags($_POST['content']));
    if(empty($author) || empty($email) || empty($content))
    {
        $err=true;
        $message="لطف فیلد‌های لازم را پر نمایید";
    }
    else
    {
        $pid=isset($post_id)?$post_id:$page_id;
        $date=  strftime("%Y-%m-%d %H:%M:%S",time());
        $sql="INSERT INTO comments (comment_post_ID,comment_user_ID,comment_author,comment_author_email,comment_author_url,comment_body,comment_date,parent_id,comment_approved)";
        $sql.=" VALUES({$pid},0,'{$author}','{$email}','{$url}','{$content}','{$date}',0,0)";
        $res=  mysql_query($sql);
        if($res)
        {
            $success=true;
            $message="نظر شما با موفقیت ثبت گردید";
        }else{
            $err=true;
            $message="خطایی رخ داده است لطفا بعدا امتحان کنید";
        }
    }
}
?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title><?php
            echo isset($post) ? $post['post_title'] : '';
            echo isset($page) ? $page['page_title'] : '';
            ?></title
        <!-- Bootstrap -->
        <link href="css/bootstrap.css" rel="stylesheet">
        <link href="css/bootstrap-rtl.css" rel="stylesheet">
        <link href="css/bootstrap-theme.css" rel="stylesheet">
        <link href="css/style.css" rel="stylesheet">
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="navbar navbar-default navbar-static-top" role="navigation">
                    <ul class="nav navbar-nav">
                        <li><a href="http://localhost:2020/CMS">خانه</a></li>
                        <?php echo create_menu(); ?>
                    </ul>
                </div>
            </div>
            <div class="row">
                <div class="col-md-8">
                    <div class=" panel panel-default">
                        <div class="panel-heading">
                            <h3 class="panel-title">
                                <?php
                                echo isset($post) ? $post['post_title'] : '';
                                echo isset($page) ? $page['page_title'] : '';
                                ?>
                            </h3>
                            <span style="margin-top: -15px;" class="pull-left">
                                <?php
                                echo isset($post) ? get_persian_date($post['post_date']) : '';
                                echo isset($page) ? get_persian_date($page['page_date']) : '';
                                ?>
                            </span>
                        </div>
                        <div class="panel-body">
                            <p><?php
                                echo isset($post) ? $post['post_body'] : '';
                                echo isset($page) ? $page['page_body'] : '';
                                ?></p>
                        </div>
                    </div>
                    <?php if (isset($post)): ?>
                        <div id="comments" class="alert alert-info text-center ">
                            <span>تعداد نظرات این مطلب : </span>
                            <span> <?php
                        echo get_post_comment_count($post_id,1);
                        ?></span>
                        </div>
                    <?php endif; ?>
                       <div class="panel panel-primary">
                      <div class="panel-heading">
                          <h3 class="panel-title">نظرات</h3>
                      </div>
                      <div class="panel-body">
                      <ol id="comment-list">
                          <?php
                          $pid=isset($post_id)?$post_id:$page_id;
                          $comments= get_comments($pid);
                          if($comments):
                          while($comment=  mysql_fetch_assoc($comments)):?>
                          <li class="comment" id="comment-<?php echo $comment['comment_ID']; ?>">
                              <div class="comment-meta">
                                  <div class="user_avatar"> <img class="avatar" src="<?php echo get_avatar($comment['comment_author_email']); ?>"></div>
                                  <div class="author-name"><?php echo $comment['comment_author']; ?></div>
                              </div>
                              <div class="clearfix" ></div>
                              <div class="comment-text">
                                  <?php echo $comment['comment_body']; ?>
                              </div>
                          </li>
                          <?php endwhile;else: ?>
                          <li class="comment">
                              هیچ نظری برای این مطلب وجود ندارد
                          </li>
                          <?php endif; ?>
                      </ol>    
                      </div>
                  </div>
                     <?php if($err): ?>
                  <div class="alert alert-warning">
                      <?php echo $message; ?>
                  </div>
                  <?php elseif ($success): ?>
                  <div class="alert alert-success">
                    <?php echo $message; ?>
                  </div>
                  <?php endif; ?>
                    <div id="comment_form">
                        <h3 class="comment_form_title">دیدگاه خود را بیان کنید :</h3>
                        <form action="" method="post" role="form" name="comments" class="form-horizontal" >
                            <div class="form-group">
                                <label for="author" class="col-sm-2 control-label">نام :</label>
                                <div class="col-sm-5">
                                    <input type="text" class="form-control" name="author" required="">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="email" class="col-sm-2 control-label">ایمیل :</label>
                                <div class="col-sm-5">
                                    <input type="email" class="form-control" name="email" required="">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="url" class="col-sm-2 control-label">وب سایت :</label>
                                <div class="col-sm-5">
                                    <input type="text" class="form-control" name="url">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="content" class="col-sm-2 control-label">نظر شما :</label>
                                <div class="col-sm-9">
                                    <textarea name="content" class="form-control" rows="6" required=""></textarea>
                                </div>

                            </div>
                            <div class="form-group">
                                <div class="col-sm-offset-2 col-sm-10">
                                    <button type="submit" name="submit_comment_form" class="btn btn-primary">ثبت نظر</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
                <div class="col-md-4">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            <h3 class="panel-title">اخرین مطالب</h3>
                        </div>
                        <div class="panel-body">
                            <ul class="posts-list">
                                <?php
                                $latest = get("posts", 10);
                                while ($post = mysql_fetch_assoc($latest)):
                                    ?>
                                    <li ><a href="view.php?p=<?php echo $post['post_ID']; ?>"><?php echo $post['post_title']; ?></a></li>
                                <?php endwhile; ?>
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <script src="js/jquery-1.10.2.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
        <script src="js/script.js"></script>
    </body>
</html>

امیدوارم که از مطلب هم استفاده کافی رو ببرید.

موفق وپیروز باشید.

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

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.

نظرات کاربران

سید علی

سلام
چرا قسمت 14 بخش نظرات نداره؟؟؟
یه سوال در مورد قسمت 14.
به طور معمول ما برای ایجاد سیستم لاگین باید از جلسه ها استفاده کنیم و به همین دلیل به محض این که کاربر مرورگر رو ببنده از سایت خارج میشه.
میخواستم بدونم بهتر نیست از کوکی ها استفاته کنیم و یه زمانی (مثلا 90 دقیقه) رو بهش اختصاص بدیم؟
ممنون از مطالب خوبتون

لقمان آوند

اضافه شد .
اشتباها غیر فعال شده بود .

سید علی

ممنون.

شمس اباد

چون توی صفحه view.php خطایی زیر نمایش داده میشه:
نظرات

Notice: Undefined variable: page_id in C:\xampp\htdocs\1\view.php on line 114
هیچ نظری برای این مطلب وجود ندارد

وپس از ارسال نظر خطای زیر رو میده:
Notice: Undefined variable: page_id in C:\xampp\htdocs\1\view.php on line 32

کیوان علی محمدی

کدها کاملا تست شده و کار میکنه،خطا میگه که متغییر page_id تعریف نشده،ببینید در کدهای خودتون و در خط های 114 و 32 متغییر page_id به چه صورتی تعریف شده.

شمس اباد

با سلام.لطفا فایلهای پروژه رو هم قرار دهید.با تشکر

کیوان علی محمدی

سلام بله حتما تا یکی دو روز آینده قرار میگیره.