آموزش ساخت CMS با php

ساخت یک سیستم مدیریت محتوای ساده (CMS):

حال با هم یک CMS بسیار ساده می‌سازیم، cms ما دارای دو بخش اصلی است. قسمت عمومی public area و قسمت ادمین admin area، به قسمت عمومی همه دسترسی دارند اما برای ورود به قسمت ادمین باید یوزرنیم و پسورد داشته باشند، درقسمت ادمین می‌توان محتوا و همینطور admin یا admin ها را مدیریت کرد.
ابتدا دیتابیس را ایجاد می‌کنیم .
در قسمت‌های قبل subjecs و pages را ساختیم جدول دیگری که باید بسازیم admins می‌باشد که دارای id،username و hashedPassword است.
بیاید جدول admin را ایجاد کنیم. با یوزر darkoob_cms که با هم ساختیم وارد mysql می‌شویم و جدولمان رامی‌سازیم.

حالا فایلها و فولدرهای خود را ایجاد می‌کنیم، پوشه‌ای به نام darkoobweb می‌سازیم داخل آن دو پوشه به نام های includes و public ایجاد می‌کنیم داخل public سه پوشه و 3 فایل به نام‌های css,images,js,admin.php,index.php,manageContent.php می‌سازیم، در داخل includes هم یک پوشه به نام layouts می‌سازیم، که داخل آن footer.php و header.php قرار می‌دهیم، درون این دو فایل کدهای html مربوط به footer و header را می‌نویسیم.
Header.php

در پوشه includes فایل functions.php را می‌سازیم، بعد در این فایل کدهای مورد نیاز را خواهیم نوشت.
خوب بیایید ظاهر admin.php را درست کنیم :

اگر به این صفحه مراجعه کنید، باید به آدرس http://localhost/darkoobweb/public/admin.php برویم. صفحه html ای را می‌بینید اما زیبا نیست، پس فایلی به نام public.css در داخل پوشه css که در پوشه public وجود دارد ایجاد می‌کنیم شما می‌توانید فایل css نوشته شده خود را قرار دهید.

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

ظاهر را کمی مرتب کردایم، اکنون وقت آن است که به دیتابیس متصل شویم.

اتصال به دیتابیس:

برای اتصال به دیتابیس مانند کدی که در بخش (چگونه با php به MySql متصل شویم ) نوشتیم عمل می‌کنیم. البته با کمی تفاوت و آن تفاوت این است که دیگر کدهای اتصال را در تک تک صفحاتی که نیاز دارند وارد نمی‌کنیم بلکه فایلی به نام dbConnection.php در پوشه includes می‌سازیم و کدهای اتصال را در آن قسمت وارد می‌کنیم :

در footer.php هم مانند قبل بعد از اتمام کار با دیتابیس connection را می‌بندیم .

Footer.php

این هم از footer .

اگر به یاد داشته باشید ما کویری را می‌نوشتیم، سپس چک می‌کردیم آیا کویری اجرا شده است؟ یا با خطا رو به رو شده است؟

برای آن یک فانکشن در function.php می‌نویسسم و مانند کد بخش قبل عمل نخواهیم کرد.
Function.php

صفحه را رفرش کنید، باید سمت چب منوی خود را ببینید.

phptutotial28

کامل کردن navigation :
همان طور که می‌بینید فقط نام منو را می‌بینیم و زیر منوها را نمی‌توان دید، زیر منوها را در دیتابیس در جدول pages ساختیم.حتما به یاد دارید!
برای اینکه زیر منوها را نمایش دهیم، به یک حلقه while دیگر درون حلقه while که نام منوها را نمایش می‌دهد نیاز داریم به کد زیر دقت کنید.
Admin.php

 

Refactoring :

اگر دقت کرده باشید کدهای بالا طولانی و شلوغ است همین طورممکن است صفحات دیگری هم داشته باشیم که نیاز به منو داشته باشند، در این صورت مجبوریم دوباره کویری‌های خود را داخل هر صفحه بنویسم برای اینکه کد تمیزتری داشته باشم، همچنین نیاز نباشد هردفعه کد طولانی بنویسم می‌توانیم در function.php برای کدهایی که ممکن است زیاد تکرار شوند فانکشن‌هایی تعریف کرده و از آن فانکشن‌ها استفاده کنیم.
دو فانکشن در function.php برای گرفتن subject و گرفتن page ها می‌سازیم و کدهای خود را در آن کپی می‌کنیم .

Function.php

دقیقا همان کدهای قبل است با این تفاوت که باید pageSet و result را return کنیم. همچنین در فانکشن findPagesForSubject باید مقدار subject id را به عنوان ورودی دریافت کنیم .
و این هم تغییرات در کدهای admin.php و manageContent.php
Admin.php :

حال بیاید کاری کنیم تا وقتی کاربر برروی یک subject یا page کلیک کرد آن موضوع یا صفحه بزرگ شود، هم چنین آی دی پیج یا سابجت برای ما به نمایش درآید.

پس ما نیاز داریم از تگ a استفاده کنیم هم چنین در داخل css خود تغییر کوچکی ایجاد می‌کنیم .

Public.css:

با فانکشنی که در function.php ایجاد کردیم دیگر نیازی به بسیاری از کدهای درون manageContent.php نیز نیست.

manageContent.php

همان طور که می‌بینید، در manageContent.php ابتدا چک کرده‌ایم اگر کویری پارامتر subject وجود داشت مقدار آن را در selectSubjectId قرار دهد و مقدار selectPageId را null قرار دادیم برای کویری پارامتر page نیز چنین کاری کردیم، اگر هیچ کدام وجود نداشته باشند مقدار هر دو را null قرار می‌دهیم، اولین باری که صفحه شما بالا می‌آید مقدار آنها null خواهد بود دراین صورت هیچ یک ار subject ها یا page ها در حالت انتخاب وجود ندارد و هیچ id چاپ نمی‌شود، اولین باری که بر روی یکی از لینک ها کلیک کنید، id آن را گرفته شده و در کویری پارامتر موردرنظر خواهد گرفت، این کار باعث می‌شود لینک مورد نظر دارای کلاس selected شود هم چنین id برای ما چاپ می‌شود.

تا اینجا توانیستیم id سابجکت و پیج را بگیریم و چاپ کنیم، حالا به جای id آن نام subject یا پیج را چاپ می‌کنیم، برای این کار دو فانکشن در function.php می‌نویسیم یکی برای subject و دیگری برای page
Function.php

این فانکشن‌ها مانند findAllSubject و findPagesForSubject هستند تفاوت در این است که مقدار برگشتی این فانکشن ها یک associative array می‌باشد، حال به manageContent باز می‌گردیم و چک می‌کنیم اگر متغییر selectSubjectId مقدار داشت هدر به نام Manage subject تغییر کند و نام آن سابجکت را برای ما چاپ کند، برای page همچنین کاری را نجام می‌دهیم.

manageContent.php

می‌بیند که بالای صفحه کد زیادی وجود دارد، کد تمیزتری را با هم خواهیم نوشت، یک فانکشن دیگر در function.php برای کد بالا می‌نویسیم.
Function.php

در فانکشن navigation هم تغییرات کوچکی اعمال می‌کنیم .

حالا کدهای اضافه در manageContent را حذف می‌کنیم :
manageContent.php

خیلی تمیزتر شد .

ایجاد منوی جدید :

برای ایجاد منوی‌جدید نیاز به یک فرم داریم که بتوانیم نام منو position آن و visible بودن آن را تعیین کنیم، به یاد داشته باشید منوی جدید یعنی ساخت یک رکورد جدید در جدول subjects .
ابتدا در ManageContent.php در div نویگیشین یک لینک ایجاد می‌کنیم، تا ما را به صفحه‌ای ببرد که در آنجا منو را ایجاد می‌کنیم، نام این صفحه را newSubject.php می‌گذاریم .
manageContent.php

صفحه newSubject.php بسیار شبیه به manageContent.php می‌باشد با این تفاوت که یک فرم در آن قرار می‌دهیم .
newSubject.php

برای گرفتن position یک select ایجاد می‌کنیم، تعداد position ها را می‌گیریم و در یک حلقه for قرار می‌دهیم. در این مثال ما 5 position را داریم و اگر یکی بیشتر نمایش ندهیم، در هنگام ایجاد subject جدید نمی‌توانیم position 6 را اتنخاب کنیم پس یکی به تعداد position های موجود اضافه می‌کنیم .
همان طور که در کد بالا می‌بیند action فرم ما را به صفحه‌ای به نام createSubject.php منتقل می‌کنید، این صفحه شامل دستورات insert در داخل دیتابیس است، در آموزش‌های قبل فایلی به نام databaseInsert.php نوشتیم دقیقا مشابه همان کار را انجام می‌دهیم .
قبل از آن برای redirect کردن فانکشنی به نام redirectTo در function.php می‌سازیم.
Function.php

همچنین برای کار با session داخل پوشه includes فایلی به نام session.php می‌سازیم .
Session.php

در این فایل فانکشنی به نام message ساختیم که محتوای session ما را درون div class=message چاپ می‌کند، محتوای session[‘message’] پیامی است که در صفحه createSubject.php برای کاربر چاپ می‌شود، حالا نوبت ساخت این صفحه است .

اگر به یاد داشته باشید از فانکشن mysql_real_escape_string برای جلوگیری از sqlInjection استفاده می‌کردیم، برای این فانکشن هم فانکشن دیگری در function.php ایجاد می‌کنیم :

Function.php

حالا باید فانکشن message را در فایلهای manageContent.php و newSubject.php قرار دهیم تا در صورت بودن پیغام آن را برای کاربر چاپ کند.
manageContent.php

newSubject.php

برای اینکه پیام متمایز باشد در فایل public.css خود چند خط ساده css هم اضافه می‌کنیم .

حالا سابجکت جدیدی ایجاد کنید می‌بینید که پیام برای شما چاپ می‌شود.
phptutotial29

phptutotial30

در تصاویر بالا می‌بینید که من tutorials را با position 6 ایجاد کردم و پیغام مبنی بر ایجاد این منو برای من چاپ شد .
Validation :
برای اعتبار سنجی از فانکشن‌هایی که قبلا در validationFunctions.php با هم ساختیم استفاده می‌کنیم، فایلی به همین نام در پوشه includes ایجاد می‌کنیم .
validationFunctions.php

در گذشته گفتیم این فانکشن‌ها به چه شکل کار می‌کنند، فانکشن formErrors را نیز در function.php قرار می‌دهیم .

حالا در reateSubject.php اعتبارسنجی را انجام می‌دهیم :

حال تنها کاری که باید انجام شود فراخوانی فانکشن‌ها در newSubject.php است .

newSubject.php

به آدرس http://localhost/darkoobweb/public/newSubject.php

بروید و سعی کنید بدون وارد کردن اطلاعات سابجکتی ایجاد کنید، باید مانند من با پیغام خطا مواجه شوید .

ویرایش :

اگر به یاد داشته باشید در گذشته فایلی به نام databasesUpdate.php را با هم ساختیم و همین طور صفحه newSubject.php را برای ایجاد subject نوشتیم، من از این دو برای نوشتم صفحه‌ی ویرایش استفاده خواهم کرد .

شروع می‌کنیم، صفحه‌ای به نام editSubject.php در پوشه public می‌سازیم در این صفحه اعتبار سنجی و ویرایش را انجام خواهیم داد، شما می‌توانید دو صفحه داشته باشید .

بیشتر این کدها را قبلا نوشته و توضیح دادیم، پس فکر نمی‌کنم نیازی به توضیح باشد.

در صفحه manageContent.php نیز تغییر کوچکی برای ایجاد یک لینک در صفحه ایجاد می‌کنیم این لینک قرار است با استفاده از کویری استرینگ id سابجکت مورد نظر را به صفحه editeSubject.php انتقال دهد.

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

phptutotial32 phptutotial33

phptutotial34

در ادامه قسمت 19 می‌خواهیم عمل Delete را انجام دهیم.
حذف Delete :
صفحه‌ای به نام deleteSubject.php می‌سازیم و کدهای زیر را در آن قرار می‌دهیم شما با کدها آشنایی دارید پس توضیج خاصی لازم نیست، فقط این نکته را در نظر بگیرید، قبل از عمل delete چک می کنیم آیا subject دارای page هست یا خیر اگر دارای page بود عمل حذف انجام نشود.
deleteSubject.php

درeditSubject.php نیز یک لینک برای این صفحه ایجاد کردیم

حالا شما بیاید چیزی مشابه تصاویر زیر را ببینید .

phptutotial35

متوجه شدیم که چگونه می‌توان سابجکت جدید را ایجاد ،ویرایش و حذف کرد، حالا نوبت pages است، قبل از دیدن کدها پیشنهاد می‌کنم خودتان تلاش کنید و کدها را بنویسید، همچنین من کدها را کمی مرتب کردم .
ManageContent.php

newPage.php

editPage.php

deletePage.php

ساخت قسمت عمومی Public area :

قبل از ساخت این قسمت به این سوال پاسخ دهید، چه چیزی باید در این قسمت نمایش داده شود ؟
اول اینکه اگر subject یا page دارای مقدار visible = false است نباید در این قسمت نمایش داده شود، دوم اینکه در قسمت منو زیر منوها وقتی نشان داده شوند که روی منو اصلی همان subject کلیک شده باشد، سوم باید دقت کنیم اگر پیجی را غیر فعال کردیم منظور visible =false کاربر نتواند از طریق مقدار دادن یه url به آن پیج دست‌رسی پیدا کند.

برای مثال: اگر پیج با id شماره 5 را غیر فعال کردیم کاربر نباید با وارد کردن چنین آدرسی به صفحه دست‌رسی پیدا کند http://localhost/darkoobweb/public/index.php?page=5
کار دیگری که می‌خواهیم انجام دهیم این است زمانی که در قسمت admin هستیم title دارای پسوند admin باشد، مثال: darkoobweb admin
موضوع دیگر در مورد نمایش content صفحه‌هات است. از فانکشن nl2br در کد خود برای نمایش کانتنت استفاده کرده‌ایم این فانکشن به جای تمام خط های جدید که آغاز به نوشتن آنها می‌کنیم یک تگ br قرار می‌دهد .
متغییری به نام laoutContext هم در نظر گرفتم که مقدار آن زمانی که در صفحه‌هات admin هستیم admin و زمانی که در صفحات public باشیم public خواهد بود.
بهتر است اول خودتان سعی کنید کدها را بنویسید، اگر به یاد داشته باشید صفحه‌ای به نام index.php داشتیم ،کار را از آنجا آغاز می‌کنیم .
Index.php

Function.php تغییرات و فانکشن‌های اضافه شده من

header.php

تغییر در deleteSubject.php

تغییر در deletePage.php

اضافه شدن layoutContext در newSubject.php

layoutContext را در editSubject.php,editPage.php,newPage.phpنیز با مقدار admin باید اضافه کنید آن هم قبل از فراخوانی header
تغییر در editSubject.php

شناسایی کاربر User Authentication :

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

کار را با ساختن دو فانکشن در فایل function.php آغاز می‌کنیم :
Function.php

سپس در داخل پوشه public فایل‌هایی به نام های manageAdmin.php, newAdmin.php, editAdmin.php, deleteAdmin می‌سازیم .
manageAdmin.php

newAdmin.php

editAdmin.php

deleteAdmin.php

حالا می‌توانیم admin را ایجاد ویرایش و یا حذف کنیم، مشکل دیگری وجود دارد و آن این است که password ها را کد نکردیم.
رمزنگاری پسورد Encrypting password :
برای رمز نگاری پسورد من 3 فانکشن در function.php ایجاد کردم .

سپس در newAdmin.php و editAdmin.php هنگامی که می‌خواهیم پسورد را در متغییر hashPassword قرار دهیم اول آن را به function خود می‌دهیم .

اما باید بدانید php ورژن 5.5 فانکشن‌هایی برای رمزنگاری در اختیار شما می گذارد مانند:

برای چک کردن پسورد می‌توانید از password_verify استفاده کنید، در کدی که باهم نوشتیم فانکشن passwordEncrypt تقریبا همان کار passwrd_hash و فانکشن passwordCheck تقریبا همان کار password_verify را انجام می‌دهد.
پیشنهاد می‌کنم در مورد رمز نگاری و فانکشن‌های آن در php بیشتر تحقیق و مطالعه کنید، همین طور اگر دوست دارید از کتابخانه استفاده کنید می‌توانید به آدرس گیت مراجعه کنید.

ساخت صفحه ورود Login Page :

ابتدا صفحه‌ای به نام login.php ایجاد کنید.

سپس در function.php فانکشنی به نام attemptLogin و findAdminByUsername ایجاد می‌کنیم .

در صفحه admin.php نیز از session[‘userName’] برای چاپ نام کاربر استفاده می‌کنیم.
Admin.php

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

خوب فانکشن confirmLoggedIn را در صفحه‌هات مربوط به admin اضافه کنید .
برای logout کردن صفحه‌ای به همین نام می‌سازیم و سپس ساده‌ترین کد به شکل زیر خواهد بود :

در اینجا ساخت cms ما تمام شد .
می‌توانید کدها را تغییر دهید و امکانات این cms ساده را افزایش دهید .
حتما صفحه php.net را مطالعه کنید، و در مورد فانکشن‌ها و دیگر امکانات php بیشتر تحقیق کنید.

شاد و سلامت باشید.

پیشنهاد می‌کنم این مقالات هم بخوانید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp
Share on facebook