67
تشکر

ساخت یک CMS ساده در PHP

ساخت یک CMS ساده در PHP

ساخت یک CMS ساده در PHP

این مطلب در دسته بندی مطالب پی اچ پی است. پی اچ پی را در اینجا دنبال کنید.

 

امروزه در همه وبسایت ها ما جای پای CMS را میبینیم. CMS یا سیستم مدیریت محتوا امکان ایجاد مدیریت سایت و ایجاد پست و مدیریت نظرات را میدهد. اما قطعا ما نمیخواهیم برای مشتریانمان از WordPress یا Drupal و غیره استفاده کنیم. یا حداقل خودمان برای خودمان یک CMS جداگانه درست کنیم.

ما اینکار را با استفاده از شئ گرایی انجام میدهیم. با استفاده از برنامه نویسی OOP یا مبتی بر شئ کارمان خیلی آسان تر خواهد بود.

 


مراحل پروژه:

ساختن دیتابیس

وصل شدن به دیتابیس

نشان دادن فرم با دو فیلد

ذخیره کردن اطلاعات در در فرم

نمایش داده های ذخیره شده

در ادامه مطلب با ما همراه باشید…

 


ساخت کلاس

ابتدا ما روند کلی کار را در صفحه ای به نام simpleCMS.php نشان میدهیم. در قدم اول کلاس را میسازیم.

class simpleCMS{
    var $host;
    var $username;
    var $password;
    var $database;
		
    public function display_public(){
			
    }
		
    public function display_admin(){
			
    }
		
    public function write(){
			
    }
		
    public function connect(){
			
    }
		
    public function buildDB(){
			
    }
}

میبینید که ما چهار متغیر و پنج متد را ساختیم. خب حالا تابع buildDB را کامل میکنیم.

 


ساختن دیتابیس

public function buildDB(){
    $sql="create table if not exists testDB (
            title varchar(150),
            bodytext text,
            created varchar(100)	
    )";
    return mysql_query($sql);
}

تابع بالا یک کد MySQL را اجرا میکند. ابتدا چک میکند که آیا جدول testDB وجود دارد در صورت وجود نداشتن آن را ایجاد میکند.

 


متصل شدن به دیتابیس

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

public function connect(){
    mysql_connect($this->host,$this->username,$this->password) or die("Could not connect. " . mysql_error());
    mysql_select_db($this-> database) or die("Could not select database. " . mysql_error());
    return $this->buildDB();
}

در تابع بالا ابتدا ما به سرور MySQL وصل میشویم و سپس جدول مربوطه رو انتخاب میکنیم. همانطور که میبینید مقدار بازگشتی این تابع اجرای تابع buildDB است. زیرا ما میخواهیم مطمئن شویم در هربار فراخوانی این تابع بر روی دیتابیس خودمان بازنویسی(Overwrite) نمیکنیم.

 


ساخت فرم

public function display_admin(){
    return <<<ADMIN_FORM
    <form action="{$_SERVER&#91;'PHP_SELF'&#93;}" method="post">
        <label for="title">Title:</label>
        <input name="title" id="title" type="text" maxlength="150" />
        <label for="bodytext">Body Text:</label>
        <textarea name="bodytext" id="bodytext"></textarea>
        <input type="submit" value="Create This Entry!" />
    </form>
ADMIN_FORM;
}

دوباره با یک تابع ساده روبرو هستیم. زمانی که فراخوانی میشود یک فرم HTML ساده را برمیگرداند.

همانطور که میبینید مقدار اکشن فرم برابر با PHP_SELF مقدار دهی شده است. این مقدار باعث میشود که در هر صفحه ای که این تابع فرخوانی شود مقدار action هم آدرس همان صفحه باشد.

نحوه مقدار بازگشتی در این تابع هم جذاب است. به این فرمت استفاده شده در پی اچ پی HEREDOC میگویند. در مورد HEREDOC

 


ذخیره اطلاعات در دیتابیس

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

public function write($p){
    if($p['title'])
    $title=mysql_real_escape_string($p['title']);
    if($p['bodytext'])
        $bodytext=mysql_real_escape_string($p['bodytext']);
    if($title && $bodytext){
        $created=time();
        $sql="insert into testDB values('$title','$bodytext','$created')";
        return mysql_query($sql);
    }else{
        return false;
    }
}

این تابع با استفاده از فرم با متد post فراخوانی میشود که درون متغیر $p قرار میگیرد. در داخل تابع با یک if شروع کردیم که اگر مقدار $p ست نشده بود از آن بگذرد در غیر اینصورت آن را بوسیله تابع mysql_real_escape_string در متغیر مربوطه قرار میدهیم. این عملیات را برای متغیر دوم هم اجرا میکنیم. حالا اگر هر دو متغیر ست شده بودند ما آنها را به همراه زمان جاری در دیتابیس قرار میدهیم.

 


نمایش اطلاعات از دیتابیس

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

public function display_public(){
    $q="select * from testDB order by created desc limit 3";
    $r=mysql_query($query);
    if($r!==FALSE && mysql_num_rows($r) > 0){
        while ($a=mysql_fetch_assoc($r)){
            $title=stripcslashes($a['title']);
            $bodytext=stripcslashes($a['bodytext']);
					
            $entry_display .= <<<ENTRY_DISPLAY
					
            <h2>$title</h2>
            <p>
                $bodytext
            </p>
ENTRY_DISPLAY;
        }
    }else{
        $entry_display=<<<ENTRY_DISPLAY
				
        <h2>This page is under construction</h2>
        <p>
            No enries have been made on this page.
        </p>
ENTRY_DISPLAY;
    }
    $entry_display .=  <<<ADMIN_OPTION
			
    <p class="admin_link">
        <a href="{$_SERVER&#91;'PHP_SELF'&#93;}?admin=1" >Add a new entry</a>
    </p>
ADMIN_OPTION;
    return $entry_display;
}

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

 


استفاده از کلاس نوشته شده

خب حالا شما اولین CMS خودتان را ساختید. حالا زمان استفاده از آن رسیده است.

برای استفاده از این کلاس باید یک صفحه جداگانه درست کنیم. ابتدا فایلی که داخل آن کلاس را نوشتیم به پوشه _class انتقال میدهیم. سپس یک فایل با نام display.php درون پوشه ریشه(منظور بیرون پوشه _class است) درست میکنیم.

درون آن کدهای زیر را قرار میدهیم.

<!DOCTYPE html>
<html>
    <head>
        <title>SimpleCMS</title>
    </head>
    <body>
	
    </body>
</html>

سپس برای استفاده از این کلاس کدهای PHP زیر را درون تگ body قرار میدهیم.

<?php
    include_once('_class/simpleCMS.php');
    $obj= new simpleCMS();
    $obj->host="localhost";
    $obj->username="root";
    $obj->password="";
    $obj->database="testDB";
		
    $obj->connect();

    if ( $_POST )
        $obj->write($_POST);
	
    echo ( @$_GET['admin'] == 1 ) ? $obj->display_admin() : $obj->display_public();
?>

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

 


دانلود فایل های مربوط به این پروژه


نکته مهم: این CMS فقط جهت آموزش ساخت یک دیتابیس ساده و همچنین نحوه کار با OOP در PHP بیان شده است و برای استفاده تجاری مناسب نیست. زیرا دارای چندین حفره امنیتی است.

 

  • خیلی ممون از سایت فوق العادتون

  • بهرام می‌گه:

    سلام ممنون از سایت خوبتون
    اگه ممکنه یه منبع توپ (حالا کتاب یا وب) واسه آموزش پی اچ پی معرفی کنید.

  • sara می‌گه:

    سلام خسته نباشید . ممنون از سایت خوبتون . میخواستم بدونم IDE ای که باهاش کار میکنید چیه؟ همین که الان در این تایپبک استفاده شده ازش
    ممنون میشم زود پاسخ بدبد

    • محسن شفیعی می‌گه:

      سلام
      در زمان این پست از Apatna استفاده میکردم که به خاطر بروزرسانی های دیر گذاشتمش کنار.
      الان از Brackets استفاده میکنم که البته IDE نیست و یک ویرایشگر متن مخصوص برنامه نویسی وب است.

  • yasairane2014 می‌گه:

    سلام دوتا نکته است می خواستم بپرسم
    اولیش اینه:
    زیرا ما میخواهیم مطمئن شویم در هربار فراخوانی این تابع بر روی دیتابیس خودمان بازنویسی(Overwrite) نمیکنیم.
    return $this->buildDB();

    دومی هم می شود بفرماید باگ هایش چی ممنون شما می شوم
    باشتکر

  • مهدی می‌گه:

    سلام تشکر از آموزش خوبتون . میشه درباره این دو خط :

    if ( $_POST )
    $obj->write($_POST);

    echo ( @$_GET[‘admin’] == 1 ) ? $obj->display_admin() : $obj->display_public();

    بیشتر توضیح بدید ؟ تشکر

  • السا می‌گه:

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

    • محسن شفیعی می‌گه:

      سلام
      متاسفانه من کتابی در این زمینه نمیشناسم که بخوام برای شما معرفی کنیم.
      فکر میکنم در دنیای وب تا یک کتاب بیاد ترجمه و چاپ بشه خیلی زود قدیمی میشه. شما باید از اینترنت و به خصوص منابع انگلیسی زبان استفاده کنید.
      برای مثال در لینکی که در انتهای همین نظر گذاشتم نحوه سفارشی سازی محیط ادمین وردپرس رو خیلی خوب و در چند قسمت توضیح میده.
      WPtuts

  • السا می‌گه:

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

  • مومني موگويي می‌گه:

    سلام خسته نباشید بنده می خواستم راجع به توابع بازگشتی توی php بدونم اگه میشه همرا با مثال ممنون از لطفتون استاد

  • حسین می‌گه:

    سلام
    ممنون از مطالب خوبتون !

    ولی بهتر نبود خودتون یه CMS جدید می نوشتید بجای این که این کدها رو کپی کنید ؟؟؟

  • عادل می‌گه:

    سلام مرسی که مثل همیشه جواب میدی. خب معلومه که من یه سایت داینامیک میخوام. پس با این حساب باز هم گذرم افتاد به دو راهی یاد گرفتن برنامه نویسی سمت سرور و دادن هزینه برای برنامه نویسی :-) میشه لطف کنی و بگی تقریبا اون چیزی که من میخوام و خبر داری و همون طور که خودت پیشنهاد دادی “عضو گیری و نظرات و آپلود عکس در ابتدای کار و بقیه موارد بعدا” حول و حوش چقدر در میاد؟ به میلم هم بفرستی ممنون میشم. میخوام لااقل بدونم که اگه رفتم یه جا دیگه سرم کلاه نره.

  • عادل می‌گه:

    سلام خسته نباشی. یادت باشه خواستم یه سیستم مدیریت داشته باشم نشد. حالا بعد از یک هفته سرخوردگی و افسردگی تصمیم گرفتم که کار ناتموم رو تموم کنم.
    آقا محسن یه سوال مهم داشتم: من قالب سایتم رو 80 درصد طراحی کردم 20 درصدش هم مونده متن و مطالب بنویسم. آیا من میتونم روی دکمه های منو که طراحی کردم مثلا بنویسم تماس با ما و عضویت، بعد به یه صفحه لینکش کنم و توی اون صفحه بنویسم “به زودی” یا یه چیزی توی این مایه ها. بعدش هم بعد از یافتن کد خوب تماس با ما اون رو راه اندازی کنم.
    و سوال مهم هم اینه که میشه بعد از راه اندازی سایت اسکریپتهای عضوگیری و نظرات اعضا و آپلود عکس رو توی همون صفحه لینک شده اجرا کرد که روی دکمه منو نوشته بودم عضویت. این طوری دیگه سیستم مدیریت فوق پیشرفته نمیخواد؟ نه؟ چون اصلا یکی از فلسفه های سیستم مدیریت فارسی برای اینه که کسی که از بیخ و بن برنامه نویسی نمیداند از اون استفاده کنه. من که با بقیه صفحات قالبم مشکلی ندارم و راحت میتونم صفحه ایجاد کنم و مطلب توش بنویسم. یا ویرایشش کنم. یعنی در واقع اگه یادت باشه و همون طور که میدونی کار باشگاه لنگ این یه تیکه هست. پس فعلا میخوام به امید خدا راه اندازی بشه.

    • محسن شفیعی می‌گه:

      سلام بستگی داره.
      اول باید ببینید سایت شما داینامیک یا استاتیک. وقتی سایت شما استاتیک باشه یعنی یک بار مطالب داخل سایت میزاری و دیگه بعد از مدتی مطالب تغییری پیدا نمیکنه و صفحه جدیدی ایجاد نمیشه، در این صورت میتونید بعضی از صفحات رو همونطور که خودتون گفتید برای مثال داخلش بنویسید بزودی یا هرچی…
      اما اگه سایت داینامیک باشه، مثل همین آپارنت که مثلا هر چند روز یک بار مطلب جدید اضافه میشه، نظرات جدید نوشته میشه و … بالاخره شما باید از یک سیستم مدیریت محتوا استفاده کنید و ربطی به این نداره که برنامه نویسی فول باشید یا هیچی یاد نداشته باشید، حتی میتونید خودتون یک CMS بسازید و از اون استفاده کنید، چون بدون CMS نمیشه سایت های داینامیک رو مدیریت کرد. اما شما داخل سایت های داینامیک هم میتونید اگه بعضی از قسمت ها هنوز کامل نشده اونها رو بعدا درست کنید. برای مثال صفحه ارتباط با ما آپارنت میتونه داخلش هیچی نداشته باشه و یا نوشته شده باشه بزودی و هرچی اما صفحه اصلی که مطالب قرار میگیره باید درست باشه.

  • a می‌گه:

    ساده و کاربردی :)
    مرسی

  • امین می‌گه:

    سلام
    دستور $_SERVER[‘PHP_SELF’] دراری نقض امنیتی است.

    البته شما گفتید دارای باگ است و فقط صرفا جهت اطلاع بود.

  • aliminaei01 می‌گه:

    باسلام و احترام
    بسیار متشکرم از این سایت بسیار عالی شما

    مطالب خوبی دارین .
    یه سوال دارم در مورد این CMS

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

    • mohsen_shafiee می‌گه:

      خیلی ممنون
      باید یک فیلد به جدولتون در دیتابیس اضافه بکنید که مثلا در اون فیلد عدد 0 نشان دهنده غیر فعال بودن مطلب و عدد 1 نشان دهنده فعال بودن مطلب است.
      بعد هر مطلبی که اضافه میشه در صورتی که شما تایید بکنید عدد 0 به 1 تبدیل میشه
      همچنین در زمان نمایش مطالب باید شرط بزارید تا فقط اونهایی رو نمایش بده که فعال هستند


  • نظرات این مطلب بسته است.