ساخت CMS ساده با PHP - قسمت 4 - ایجاد بخش مدیریت

‏  24 دقیقه
۰۴ اردیبهشت ۱۳۹۳
ساخت CMS ساده با PHP - قسمت 4 - ایجاد بخش مدیریت

به نام خدا و سلام،پوزش بابت تاخیر زیادی که پیش اومد،بدون اتلاف وقت بریم سر اصل مطلب،کا در قسمت‌های قبلی فایل‌های لازم رو ایجاد کردیم،حالا باید بخش مدیریت رو ایجاد کنیم.پوشه ای با نام admin در پوشه اصلی پروژه ایجاد کنید سپس فایل index.php رو ایجاد کنید و کدهای زیر رو داخلش قرار بدین.

header("Location: dashboard.php");

این کد مشخص میکنه باید کاربر رو به فایل dashboard.php هدایت کنیم.چه کاربر آدرس پوشه admin رو بنویسه و چه آدرس کامل فایل dashboard.php رو بنویسه به این فایل منتقل میشه.البته این فایل برای یه کار دیگه هم لازم میشه که بعدا اونو می‌نویسیم.

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

فایل dashboard.php 

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

اما قبل از پر کردن محتوای فایل داشبورد ما باید یکسری توابع رو ایجاد کنیم.توابع رو در فایل functions.php ایجاد می‌کنیم.

تابع get

با تابع get میتونیم اطلاعات هر جدولی خواستیم رو دریافت کنیم.

function get($tbl,$limit=0,$offset=0){
    try {

        if(!empty($limit) && !empty($offset))
        {
            $res=mysql_query("SELECT * FROM {$tbl} LIMIT $offset,$limit");

        }  elseif(!empty ($limit) && empty($offset)) {

            $res=mysql_query("SELECT * FROM {$tbl} LIMIT $limit");

        }else if(empty ($limit) && empty ($offset)){

            $res=mysql_query("SELECT * FROM {$tbl}");
        }
         if($res){
             return $res;
         }

    } catch (Exception $ex) {
        return false;
    }
}

در این تابع limit و offset هم قرار دادیم وبرای زمانی که بخواین صفحه بندی کنیم هم مناسبه یا اینکه تعداد خاصی رو بخوایم برگردونیم.

تابع get_post_by_id

function get_post_by_id($id=null){
    if(!empty($id) && intval($i

d)!==0){ $result= mysql_query("SELECT * FROM posts WHERE post_ID={$id} LIMIT 1"); return mysql_fetch_assoc($result); } }

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

تابع get_page_by_id

function get_page_by_id($id=null){
    if(!empty($id) && intval($id)!==0){       
    $result=  mysql_query("SELECT * FROM pages WHERE page_ID={$id} LIMIT 1");
    return mysql_fetch_assoc($result);
    }
}

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

تابع get_posts_count 

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

function get_posts_count($status=""){
    $sql="";
    if(!empty($status))
    {
        $sql="SELECT COUNT(*) FROM posts WHERE post_status='{$status}'";
    }else{
        $sql="SELECT COUNT(*) FROM posts";
    }
    $result=  mysql_query($sql);
    return mysql_result($result, 0, 0);
}

یه پارامتر هم داره که نوع وضعیت مطلب رو مشخص میکنه،اینکه مطلب منشتر شده یا در مرحله پیش نویس هستش.طبق همون تعداد رو برمیگردونه.اگرم برای پارامتر هیچی ارسال نشه تعداد کل رو میگردونه.

تابع get_pages_count

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

function get_pages_count($status=""){
    $sql="";
    if(!empty($status))
    {
        $sql="SELECT COUNT(*) FROM pages WHERE page_status='{$status}'";
    }else{
        $sql="SELECT COUNT(*) FROM posts";
    }
    $result=  mysql_query($sql);
    return mysql_result($result, 0, 0);
}

 

نکته :

تابع mysql_result با دریافت نتیجه کوئری و هم چنین شماره ستر و ستون مقدار مشخصی رو برمیگردونه که در اینجا چون ما بخث تعداد رو داشتیم همون سطر و ستون 0 مقدار مورد نظر ما هست.

تابع get_comments_count 

این تابع هم مثل تایع‌های  بالا برای دریافت تعداد نظرات استفاده میشه و پارامترش هم وضعیت نظرات رو مشخص میکنه.

function get_comments_count($approved=""){
    $sql="";
    if(!empty($approved))
    {
        $sql="SELECT COUNT(*) FROM comments WHERE comment_approved={$approved}";
    }else{
        $sql="SELECT COUNT(*) FROM comments";
    }
    $result=  mysql_query($sql);
    return mysql_result($result, 0, 0);
}

 تابع get_post_comment_count

ما از این تابع برای دریافت تعداد نظرات یه پست استفاده میکنیم.پارامترش هم وضعیت نظرات رو مشخص میکنه.

function get_post_comment_count($pid,$approved=""){
    $sql="";
    if(!empty($approved))
    {
        $sql="SELECT COUNT(*) FROM comments WHERE comment_post_ID={$pid} AND comment_approved='{$approved}'";
    }else{
        $sql="SELECT COUNT(*) FROM comments WHERE comment_post_ID={$pid}";
    }
    $result=  mysql_query($sql);
    return mysql_result($result, 0, 0);
}

آیدی مطلب رو با pid و وضعیت نظر رو با approved مشخص کردیم.

تابع get_users_count

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

function get_users_count($level=""){
    $sql="";
    if(!empty($level)){
        $sql="SELECT COUNT(user_ID) FROM users WHERE user_level='{$level}'";
    }else{
        $sql="SELECT COUNT(user_ID) FROM users";
    }
    $result=  mysql_query($sql);
    return mysql_result($result,0,0);
}

اون پارامتر level وضعیت کاربر رو که مدیر یا کاربر معمولی هست مشخص میکنه.

خوب دوستان توابع اصلی کار رو فعلا نوشتیم ممکنه در طول دوره آموزش باز هم توابعی رو کم یا اضافه کنیم.حالا چند تا تابع مفید هم می‌نویسیم.

تابع هش کرن داده ها

از این تابع برای هش کردن داده‌ها استفاده میکنیم.

function hash_string($string){
    $salt="@#^&$%)(*HKJH%&^@#[email protected]^&@&*#[email protected]@#*@^*#@H#@Y";
    if(!empty($string)){
        return sha1($salt.sha1($string).$salt);
    }
}

حتما میپرسین کاربردش چیه؟خوب وقتی که کاربری رو ثبت نام کنیم میخوایم پسووردش رو با همین تابع هش کنیم تا غیر قابل دسترسی باشه و بالطبع موقع لاگین هم ازش استفاده میکنیم.اون متغیر salt کمک میکنه هش ما محکمتر باشه.

تابع تبدیل تاریخ شمسی

یه تابع ساده برای تیدیل تاریخ فارسی نوشتیم که بعدا خیای جاها به دردمون میخوره.

function get_persian_date($date){
    return jstrftime("%A %e %B %Y",  strtotime($date));
}

تاریخی که گرفتیم رو با توابع فایل jdf به شمسی تبدیل کردیم.

نکته :

 فایل jdf.php رو حتما در داخل پوشه inc قرار بدین و در بالای فایل functions اونو الصاق کنید.

توابع آدرس سایت و آدرس مدیریت

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

function site_url(){
    return 'http://localhost:2020/CMS';
}
function admin_url(){
     return 'http://localhost:2020/CMS/admin';
}

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

ایجاد صفحه dashboard

من طبق کدهای اصلی bootstrap ساختار زیر رو ایجاد کردم،ساختار زیر یک منوی بالای ثابت که لینک خرو ج و نمایش سایت رو در خودش داره و هم چنین یه ساید بار برای لینک‌های اصلی بخش مدیریت و قسمت محتوای صفحه رو شامل میشه.تمام فایل‌ها اصلی بخش مدیریت این ساختار رو دارند و فقط برای فایل‌های مختلف محتوای اصلی تغییر میکنه.خوب برای بخش داشبورد ما این ساختار رو قرار دادیم.

<?php 
require_once '../init.php';
?>
<!DOCTYPE html>
<html lang="fa">
  <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>مدیریت سایت</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">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
      <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
      <div class="container">
          <div class="row">
              <div class="navbar navbar-default navbar-fixed-top navbar-inverse" role="navigation">
                  <ul class="nav navbar-nav">
                      <li><a target="_blank" href="<?php echo site_url(); ?>">نمایش سایت</a></li>
                       <li><a href="">خروج از سایت</a></li>
                  </ul>
              </div>
          </div>
          <div class="row" style="margin-top: 100px;" >
            <div class="col-xs-12 col-sm-3 col-md-3">
                  <div class="panel panel-primary">
                      <div class="panel-heading">
                          <h3 class="panel-title">پنل مدیریت</h3>
                      </div>
                      <div class="panel-body">
                          <ul class="nav nav-stacked">
                              <li><a href="dashboard.php">داشبورد</a></li>
                              <li>مدیریت مطالب</li>
                              <li class="nav nav-divider"></li>
                              <li><a href="posts.php">همه مطالب</a></li>
                              <li><a href="new-post.php">مطلب جدید</a></li>
                              <li>مدیریت برگه ها</li>
                              <li class="nav nav-divider"></li>
                               <li><a href="pages.php">همه برگه ها</a></li>
                              <li><a href="new-page.php">برگه جدید</a></li>
                               <li>مدیریت کاربران</li>
                              <li class="nav nav-divider"></li>
                               <li><a href="users.php">همه کاربران</a></li>
                              <li><a href="new-user.php">کاربر جدید</a></li>
                               <li>مدیریت نظرات</li>
                              <li class="nav nav-divider"></li>
                               <li><a href="comments.php">همه نظرات</a></li>
                          </ul>
                      </div>
                  </div>
              </div>
            <div class="col-xs-12 col-sm-8 col-md-9">
                   <div class="panel panel-default">
                  <div class="panel-heading">
                      <h3 class="panel-title">هم اکنون</h3>
                </div>
               <div class="panel-body">
                   <div class="row">
                       <div class="col-xs-12 col-sm-12 col-md-4">
                           <table class="table table-bordered">
                               <tr>
                                   <th colspan="2">محتوا</th>
                               </tr>
                               <tr>
                                   <td>مطلب منتشر شده :</td>
                                   <td><span class="badge"><?php echo get_posts_count('published'); ?></span></td>
                               </tr>
                               <tr>
                                   <td>مطلب پیش نویس :</td>
                                   <td><span class="badge"><?php echo get_posts_count('draft'); ?></span></td>
                               </tr>
                             <tr>
                                   <td>برگه‌های منتشر شده :</td>
                                   <td><div class="badge"><?php echo get_pages_count('published'); ?></div></td>
                               </tr>
                                  <tr>
                                   <td>برگه‌های پیش نویس:</td>
                                   <td><div class="badge"><?php echo get_pages_count('draft'); ?></div></td>
                               </tr>
                           </table>
                       </div>
                       <div class="col-xs-12 col-sm-12 col-md-4">
                           <table class="table table-bordered">
                               <tr>
                                   <th colspan="2">نظرات</th>
                               </tr>
                               <tr>
                                   <td>تعداد کل</td>
                                   <td><span class="badge"><?php echo get_comments_count(); ?></span></td>
                               </tr>
                               <tr>
                                   <td>تایید شده</td>
                                   <td><span class="badge"><?php echo get_comments_count(1); ?></span></td>
                               </tr>
                               <tr>
                                   <td>تایید نشده</td>
                                   <td><span class="badge"><?php echo get_comments_count(0); ?></span></td>
                               </tr>
                           </table>
                       </div>
                      <div class="col-xs-12 col-sm-12 col-md-4">
                           <table class="table table-bordered">
                               <tr>
                                   <th colspan="2">کاربران</th>
                               </tr>
                                <tr>
                                   <td>تعداد کل  :</td>
                                   <td><span class="badge"><?php echo get_users_count(); ?></span></td>
                               </tr>
                               <tr>
                                   <td>مشترک</td>
                                   <td><span class="badge"><?php echo get_users_count("user"); ?></span></td>
                               </tr>
                               <tr>
                                   <td>مدیر</td>
                                   <td><span class="badge"><?php echo get_users_count("admin"); ?></span></td>
                               </tr>
                           </table>
                      </div>
                   </div>
               </div>
              </div>
              </div>
          </div>
          <div class="row">
              <div class="col-sm-12" id="admin_footer"></div>
          </div>
      </div>
    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="../js/jquery-1.10.2.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="../js/bootstrap.min.js"></script>https://7learn.com/wp-admin/post.php?post=25478&action=edit#
    <script src="../js/script.js"></script>
  </body>
</html>

اول فایل داشبورد ما فایل init.php رو اضافه کردیم تا به توابع دسترسی داشته باشیم، اگه خوب ساختار رو بررسی کنید از اکثر اون توابعی که در فایل functions ایجاد کردیم استفاده شده. تصویر زیر این محیط رو نشون میده.

php-cms-admin-panelخوب ما توابع اصلی رو نوشتیم و قالب اصلی مدیریت رو هم طراحی کردیم.

ذز قسمت بعدی ما صفحه ارسال مطلب و هم چنین نصب ادیتور رو آموزش میدیم.

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

 

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

نیاز به لاگین

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

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

عامر قدسی پور

سلام
لطفا یا توابع جدید رو با pdo بروز رسانی کنید یا نحوه تغییر را با pdo آموزش دهید من هر کاری میکنم نمیتونم نتیجه بگیرم
کلا لزوم استفاده از pdo چیست؟
آیا میشه به نحو دیگری این اررور برطرف بشه؟

وحید صالحی

این دوره قدیمی هست و دیگه پشتیبانی و آپدیت نمیشه

amir baragy

سلام
یکی از آیتم های عضویت vip برنزی پاسخگویی حداکثر تا 48 ساعت هست.
من در صفحه های قبلی یه چند تا سوال پرسیدم (5 روز پیش) ولی …
تشکر

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

سلام.لینک سوالتون رو ارسال کنید.

amir baragy

سلام
معادل تابع mysql_result در PDO چیست و چه طور استفاده کنیم؟

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

در pdo میتونید تابع fetch رو از متغییر stmt فرخوانی کنید.

محمد حسینی

سلام
این ارور را چطور برطرف کنم ؟
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\xampp\htdocs\inc\db.php on line 3

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

سلام باید کدهای دیتابیس رو از mysql به PDO تغییر بدین.

محمد

سلام و تشکر
این کار چطور انجام میشه ؟ لطفا راهنمایی کامل نمایید . باتشکر

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

سلام توی نت برای PDO یه کلاس php پیدا کنید و تنظیمات دیتابیسش رو ست کنید و سپس از توابعش به جای توبع mysql استفاده کنید.

وحید سبحانی

سلام من وقتی این تنظیمات رو انجام میدم با ارور موتجه میشم نمی دونم مشکل چیه

عنوان ارور

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\wamp\www\CMS\inc\db.php on line 3

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

سلام ب خاطر توابع mysql هست که php اونارو منقضی کرده و در نسخه های بعدی حذف میشن.باید دستورات جایگزین مثل mysqli و PDO استفاده بشن.

mahshid pouya

سلام ببخشید من با mysqli کار میکنم این خط رو میشه بگید چجوری بنویسمش ؟
$res=mysql_query(“SELECT * FROM {$tbl} LIMIT $offset,$limit”);
یا چرا متغیر نا مجدول رو داخل { } گذاشته؟

لقمان آوند

سلام
ساختار کدنویسی با mysqli کمی متفاوته. باید اول یه لینک به دیتابیس بزنید و بعد اون لینک رو به همراه کوئری به تابع mysqli_query پاس بدید. اگر بخواید حرفه ای یاد بگیرید این مورد رو دوره php سایت رو ثبت نام کنید .

mahshid pouya

مرسی از توضیحات کاملتون …
فقط یک سوال دیگه پس با چی مشخص میکنیم چه مقدار از مطالبمون نمایش داده بشه؟ مثلا 4 خط از یک مطالب نمایش داده بشه که بعدش بزنیم : ادامه ی مطلب ؟
باز هم متشکر از جوال کامل و سریعتون
سایتتون عالیه 🙂

وحید صالحی

خواهش می کنم دوست عزیز برای این موردی که فرمودین باید از تابع sustr استفاده کنید .ابتدا باید یه کوئری به دیتابیس بزنید و اطلاعات فیلد مورد نظر رو بخوید بعد مقدار برگشتی فیلد مورد نظر رو که کل مطلب مورد نظر هست رو با تابع sustr و مقادیری که براش ست می کنید کوتاه میکنید یعنی بطور مثال اگر کل حروف متن برگشتی مورد نظر 100 کارکتر باشه با مقداری که به تابع substr می دید مشخص میکنید که از این 100 کارکتر یا هر تعداد کارکتری که پست های سایتتون داره و برگشته یا به عبارتی fetch شده رو مثلا 30 تاش رو نشون بده و بعدش … بزاره.لینک زیر هم میتونه بیشتر کمکتون کنه

لینک
موفق باشید

mahshid pouya

سلام خسته نباشید
ببخشید limit و offset هر کدوم چه چیزی رو محدود میکنند؟ تعداد مطالب که تو صفحه نمایش میده یا تعداد کاراکتری که مثلا از یک مطلب نمایش داده میشه ؟؟ اگر یکم برام توضیحش بدید متشکر میشم
آموزش هاتون عالین هیچ سایتی ندیدم اینجوری کدهارو کامل بگذاره مرسی

لقمان آوند

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

وحید صالحی

سلام دوست عزیز از limit برای نمایش تعداد مشخصی از row هایی که توسط کوئری از دیتابیس میخونیم استفاده میشه بعنوان مثال شما 30 row در دیتابیس داری و می خوای تعداد 10 تا از اونها رو به کاربر نمایش بدی در این حالت از limit استفاده میکنید و چون limit همیشه به آخر سطر ها یا همون row های برگشتی و فراخوانده شده از دیتابیس رجوع مینکه با توجه به مقدار که بهش میدیم مقادیر آخر سطرها رو برمیگیرونه مثلا اگر 10 بهش پاس بدید 10 سطر آخر رو از هر تعداد سطزر موجود رو نمایش میده offset تا حدودی مشابه limit هست با لین تفاوت که با مقداری که بهش پاس میدید مقادیر رو از بین سطر های مورد نظر برمیگردونه مثلا شما همون 30 سطر برگشتی رو دارید و میخواهید سطر های آخر مانند دستور limit نمایش نده بلکه بیاد سطر های بین 10 تا 20 رو نمایش بده در اینصورت از offset استفاده میکنیم
موفق باشید…

لقمان آوند

البته!