PDA

View Full Version : آموزش: آموزش ساخت یک وب سایت چند زبانه با قابلیت تغییر قالب



mbf5923
جمعه 26 مهر 1392, 18:41 عصر
یا مَن هُوَ بِکُلِ شَئٍ عَلیم
با سلام
قصد دارم توی این تاپیک با کمک دوستان آموزش ساخت یک وبسایت ساده با زبان PHP با استفاده از تکنولوژی های HTML و JAVASCRIPT رو شروع کنم که امیدوارم کمکی در یادگیری خودم و دانستن هرچه بیشتر دوستان عزیز باشه.
هدف نهایی این تاپیک راه اندازی یک وبسایت کوچک شخصی با قابلیت نصب، تغییر Themes و تغییر زبان و همچنین تعامل با کاربر میباشد.
در این آموزش از تکنیک های برنمه نویسی موجود، فقط از OOP تا حدودی استفاده شده است و به گونه ای است که کاربران مبتدی بتوانند کدها و تکنیک ها را متوجه شوند.
لازم به ذکر است در پایان هر پست فایل تکمیل شده تا انتهای همان آموزش قرارداده خواهد شد بدین معنی که در پست آموزشی اول فایل آموزش اول و در پست آموزشی دوم فایل آموزش اول و دوم و الی آخر. در نهایت هم پروژه تکمیل شده همراه با PDF آموزش قرار داده خواهد شد.
در ضمن برای اینکه کاربران بازدید کننده این تاپیک دچار سردرگمی نشوند خواهشی که دارم اینه که از پرسیدن سوال در این تاپیک خودداری کنید و سوالاتتون رو در تاپیک موازی این تاپیک مطرح کنید.
قدم اول رو از پست دوم همین تاپیک برمیداریم.

mbf5923
جمعه 26 مهر 1392, 19:00 عصر
و اما قسمت اول آموزش:
برای شروع یکی از نرم افزار های سرور مجازی مثل Xampp یا Wamp یا Easy PHP رو باید نصب کنید تا بتونید اسکریپت رو در اون اجرا و تست کنید.بنده از Xampp استفاده میکنم و آموزش رو هم برپایه Xampp و ساختار اون پیش میبرم.
در ابتدای کار در پوشه htdocs نیاز به ساخت 5 پوشه با عناوین زیر داریم که در ادامه محتویات هرکدوم رو توضیح خواهم داد:
1- Config که فایل های مربوط به تنظیمات کلی اسکریپت در اون قرار داده میشوند مثل فایل تنظیمات اتصال به دیتابیس و غیره.در این پوشه دو فایل با نام های conf.php و dbconnection.php ایجاد نمایید.
2- Classes که هسته اصلی اسکریپت ما و تمامی کلاسهایی که قصد استفاده از اونها رو داریم در این پوشه جای خواهند گرفت. یک فایل با نام class_core.php در این پوشه بسازید.
3- Language از اونجا که قرار بر این شد که سایت ما قابلیت پشتیبانی از زبان های دیگر رو هم داشته باشه این پوشه رو ایجاد کردیم که بتونیم فایل های مربوط به زبان های مختلف رو در اون قرار بدیم. در این پوشه دو فایل با نام های FA.php و EN.php ایجاد کنید.
4- Include تمامی فایل های جانبی اسکریپت ما در این پوشه قرار خواهند گرفت. در این پوشه یک فایل با نام captcha.php ایجاد نمایید.
5- Themes این پوشه پوسته های مربوط به اسکریپت ما رو در خودش نگهداری میکنه.این فایل ها عمدتا از تگ های html و کدهای javascript و css ها و عکس ها هستند.چون ما در نظر داریم که اسکریپت ما دارای چندین پوسته باشه و در حقسقت کاربر توانایی تغییر ظاهر سایت رو بدون تغییر کدها داشته باشه پس باید در این پوشه هم به تعداد پوسته های مورد نظرمون پوشه ایجاد کنیم.در حال حاضر و در این آموزش ما یک پوسته پیشفرض خواهیم ساخت و پوسته های دیگه به عهده خود شما و سلیقه شما باشه پس در این پوشه یک پوشه با نام default ایجاد میکنیم این به این معنی هستش که من میخوام اسم پوسته اصلی و پیشفرضم رو default بذارم.
توی پوشه default 4 پوشه زیر رو ایجتد میکنیم:
الف) css که تمامی فایل های استایل ما یا همون فایل های css مربوط به قالب default در این پوشه قرار خواهند گرفت.
ب) images حاوی عکس ها و تصاویر بکار رفته در قالب ما خواهد بود.
ج) js فایل های جاوااسکریپت قالب ما در این پوشه قرارداده خواهند شد.
د) template که در حقیقت حاوی کدهای html قالب ما خواهد بود.اما برای اینکه تمایزی بین این فایل ها و فایل های html معمولی قائل شده باشیم پسوند فایل هایی رو که در این پوشه نگهداری میکنیم tpl قرار میدیم.
خوب حالا نیاز به صفحه index داریم که همون homepage اسکریپت ما خواهد بود.فایل index.php رو در پوشه روت که همون htdocs هستش ایجاد کنید.
تا اینجای کار مکان قرارگیری فایل ها مون رو درست کردیم و حالا پوشه های ساخته شده آماده گرفتن فایل های ما هستند.
و اما این اسکریپت نیاز به یک دیتابیس هم داره که فعلا ما یک تیبل در اون احتیاج داریم که خواهیم ساخت:
ساختار تیبل اول ما در دیتابیسمون به شکل زیر هستش:
فیلد sitename که نام سایت ما رو در خودش نگهداری میکنه.
فیلد themes که آدرس پوسته سایت رو در اون قرار میدیم.
فیلد language که زبان مورد استفاده رو در خودش قرار میده.
یک نکته که مورد سئوال خیلی از دوستان هست اینه که از کدوم storage engine استفاده کنیم.به جای اینکه وارد مباحث تخصصی انجین های متفاوت بشیم بهتره به طور کلی اینطوری گفته بشه که برای جداولی که بیشتر بر روی اونها عملیات Select اتفاق میفته تا عملیات insert و update و delete بهتره از myisam استفاده بشه و اگه برعکس قراره بیشتر insert و update و delete اتفاق بیفته از innodb استفاده بشه. این تیبل جون بیشتر باید select رو انجام بده هم از myisam استفاده میکنیم.
در جدول ایجاد شده فعلا به طور دستی این مقادیر رو وارد میکنیم:
برای فیلد sitename مقداری دلخواه وارد کنید.برای فیلد themes مقدار default رو وارد کنید(نام پوشه پیشفرض theme ها که ساختیم)
برای فیلد language هم مقدار FA رو وارد کنید چون فعلا با زبان فارسی کار میکنیم.(اسم فایلی که توی پوشه language ساختیم)
حالا وارد پوشه کانفیگ بشین و مشخصات اتصال به دیتابیس رو در فایل dbconnection.php وارد کنید:

<?php
$hostname='localhost';
$dbname='cms';
$dbuser='root';
$dbpass='';
$dblink=mysql_connect($hostname,$dbuser,$dbpass);
if (!$dblink){
echo '<meta charset="utf-8"/><h1>ارتباط با موتور بانک اطلاعاتی دچار مشکل است</h1>';
die;
}
if (!mysql_select_db($dbname,$dblink)){
echo '<meta charset="utf-8"/><h1>بانک اطلاعاتی یافت نشد</h1>';
die;
}
mysql_query("SET NAMES 'utf8'");
?>


برای شروع ابتدا از پوسته ها شروع میکنیم.
هر سایت در صفحات خودش به طور معمول یک قسمت با نام header یا سرصفحه داره که اطلاعاتی از قبیل نام سایت و لوگوی سایت و... در اون قرار میگیره. معمولا هدر در تمام صفحات سایت تکرار میشه وتکراری هستش یعنی برای یه صفحه طراحی میشه و در تمام صفحات دیگه همون رو تکرار میکنند. با این تفاسیر به این نتیجه میرسیم که باید برای پله اول یک سرصفحه یا هدر برای سایتمون طراحی کنیم.برای این کار میتونید از نرم افزار های طراحی صفحات وب مانند Adobe Dreamweaver کمک بگیرید.
هدری که ما قصد ساختن اون رو داریم خیلی ساده است که میخواهیم فقط شامل نام سایت ما و یک لوگوی دلخواه باشه.همینطور یک منوی خیلی ساده هم زیر اون باشه که بتونیم لینک صفحات مختلف سایتمون رو درون اون قرار بدیم تا کاربر بتونه با کلیک روی اونها به راحتی صفحات سایت ما رو مرور کنه.
خوب هدر من به شکل زیر هستش:

111995

لازمه بگم که رنگ پس زمینه سایتمون رو هم در همین فایل هدر تعیین میکنیم.
بعد از اینکه طراحی ما کامل شد باید یک فایل با نام header.tpl در پوشه template بسازیم و کدهای مربوط به هدر رو درون اون قرار بدیم.همچنین اگه از css استفاده کردیم باید فایل cc مربوط رو در پوشه css بگذاریم که با این کار توی آدرس دهی اون مشکل پیدا میکنید که در ادامه میگم باید چیکار کرد که این مشکل رفع بشه. عکس ها و فایل های جاوای ما هم در پوشه های مربوط به خودشون که قبلا ساختیم قرار میگیرند.
در قرار دادن کدهای مربوط به هدر باید این نکته رو در نظر داشته باشید که:
همونطور که میدونید فایل های html شامل چند تگ داخل خودشون هستند که ابتدا با <html> شروع مشوند و بعد از اون تگ <head> بعدش هم تگ <body> که اول تگ html باز میشه و درون این تگ، تگ head باز میشه و مقادیری مثل زبان صفحه، عنوان صفحه و... در اون قرار داده میشوند و بسته میشه.به زبان علمی تر مقادیری که در تگ head قرار میگیرند در خروجی دیده نمیشوند ولی بر روی خروجی تاثیر میگذارند.
بعد از تگ بسته شدن تگ head نوبت به باز شدن تگ body میرسه که هرچیزی که قراره نمایش داده بشه در اون قرار میگیره البته ممکنه بعضی چیزها هم در اون قرار بگیرن ولی نمایش داده نشوند اما خوب اصل همونی بود که گفته شد.و بعد از اینکه خروجی ها مون مشخص شد تگ body هم بسته شده و در نهایت تگ html که در ابتدای صفحه باز شده بود در انتها بسته میشه.
خوب حالا نکته ما اینجاست که چون ما فعلا فقط هدر سایت رو طراحی کردیم و فایل header.tpl ما شامل تمامی کدهای صفحه ما نیست پس در نتیجه تگ body و html رو در پایان اون نمیبندیم. حالا اینکه پس کجا بسته میشن در ادامه بهش میرسیم.
خوب حالا باید یه جوری این فایل هدر که طراحی کردیم رو به صفحه index.php مرتبط کنیم و در بیان کلی تر در اون نمایش بدیم.
برای اینکار چند راه وجود داره:
1- فایل هدر خودمون رو با دستور include به صفحه ایندکسمون معرفی کنیم یعنی بالای صفحه ایندکس بنویسیم:

<?php
Include ‘themes/default/template/header.tpl’;
?>


2- از تابع file_get_contents استفاده کنیم که ما از همین راه استفاده خواهیم کرد چرا که میخواهیم از جایگذاری استفاده کنیم.کار این تابع اینه که محتویات یک فایل رو در قالب یک string در اختیار ما قرار میده تا بتونیم عملیاتی رو که بر روی یک استرینگ قابل انجامه روی محتویات اون فایل انجام بدیم.
خوب حالا فایل class_core.php رو از پوشه classes باز کنید.همونطور که از اسم این فایل مشخصه قراره یک کلاس باشه. پس باید از کلمه کلیدی class در ابتدای این فایل استفاده بشه تا برای موتور PHP مشخص بشه که رفتار کلاس گونه با این فایل بکنه. نام این کلاس رو هم core میگذاریم:

<?php
class core{
class content
}


خوب توی این کلاس ما قراره تابعی بسازیم که بتونه پوسته های طراحی شده رو به صفحات ما مرتبط کنه اسم این فانکشن رو thmchanger میذاریم.همونطور هم که قبلا گفتیم قراره از تابع file_get_contents برای این منظور استفاده کنیم:


function thmchanger(){
$template= file_get_contents(??);
}


ما در این تابع یک متغیر به نام $template تعریف کردیم که قراره محتوای فایل باز شده رو در خودش نگهداری کنه اما یه مسئله پیش میاد و اینکه تابع file_get_contents چه فایلی رو باز کنه؟!
پس بهتره نام فایلی رو که قراره باز کنه به فانکشنمون ارسال کنیم یعنی فانکشن ما یه ورودی داشته باشه که مقدار اون ورودی برابر با نام پوسته مورد نظر ما باشه و خروجی اون هم محتوای فایل مورد نظرمون یعنی مثل کد زیر تغییر کنه :

function thmchanger($tname){
$template= file_get_contents($tname);
Return $template;
}


حالا ما میتونیم وقتی داریم فانکشن خودمون رو فراخوانی میکنیم نام فایل مورد نظرمون رو هم بهش بدیم.
پس ما باید توی فایل ایندکسمون این تابع رو فراخوانی کنیم پس ابتدا فایل class_core.php رو در اینکس فراخوانی میکنیم تا بتونیم به محتوای اون اشاره کنیم:

<?php
Include (‘classes/ class_core.php’);


حالا باید یه شئ جدید از نوع کلاس core ایجاد کنیم:

$func= new core;
ما اسم این شئ جدید رو $func در نظر گرفتیم که از نوع کلاس core هستش و تمام خصوصیات اون رو در خودش داره.حالا باید تابعی رو که ساختیم فراخوانی کنیم:

$themes = $func->thmchanger(??);
خوب اینکار به شکل بالا انجام میشه. ما یه متغیر به نام $themes تعیریف کردیم و اون رو برابر تابعمون قرار دادیم تا خروجی تابع در اون قرار بگیره اما باز یه مشکل و اون اینکه نام فایل رو چی باید بدیم؟

$themes = $func->thmchanger(‘themes/default/template/header.tpl’);
خوب این در صورتی درسته که بخواهیم از پوسته default استفاده کنیم و اگه از پوسته غیر از اون خواستیم استفاده کنیم چه کاری باید کرد! پس باید راه دیگه ای داشته باشیم که بتونیم متوجه بشیم سایت داره از چه پوسته ای استفاده میکنه و بر اساس اون آدرس دهی کنیم.
اینجاست که نوبت به فایل config.php میرسه.
در این فایل ما یک آرایه انجمنی(آرایه ای که خونه هاش نام داشته باشن) میسازیم و در اون آرایه آدرس های خودمون رو قرار میدیم و هرجا خواستیم فایلی رو صدا بزنیم از این آدرس ها استفاده میکینم.نام آرایه رو $conf میذاریم:

$conf=array(
'var.headtemplate'=>'themes/default/template/header.tpl'
);


خوب ما یک خونه در این آرایه ایجاد کردیم و نام اون رو var.headtemplate گذاشتیم و مقدار themes/default/template/header.tpl در اون قرار دادیم اما باز این مقدار هم صحیح نیست چون فقط پوسته پیشفرض رو معرفی میکنه!
پس باید به سراغ دیتابیس بریم چون توی تیبلی که ساختیم یه قیلدی داشتیم به نام themes که مقدار اون معرف این بود که سایت باید از کدوم پوسته استفاده کنه پس ما باید مقدار اون فیلد رو بدست بیاریم و به جای default در این آدرس قرار بدیم.
پس باید یه ارتباط با دیتابیس برقرار کنیم و مقدار این فیلد رو بخونیم.ارتباط با دیتابیسمون رو در کلاس core انجام میدیم چون این کار به عهده هسته سایت باید باشه پس به فایل class_core.php میریم.
خوب برای اینکه تنظیمات اتصال به دیتابیسمون رو که در فایل dbconnection.php وارد کردیم اینجا دوباره نخواهیم وارد کنیم همون فایل رو ضمیمه class_core.php میکنیم:

include ('./config/dbConnection.php');

حالا یه فانکشن توی کلاسمون ایجاد میکنیم که اطلاعات تیبل ساخته شده رو که من اسمش رو گذاشتم tbl_siteinfo بخونه و برگردونه:

function SiteInfo(){
$query='Select * From tbl_siteinfo';
$result=mysql_query($query);
return $result;
}


اسم این تابع رو siteinfo گذاشتیم که اطلاعات تیبل ما رو select میزنه و نتیجه خام رو برمیگردونه حالا کافیه اون رو داخل فایل config.php فراخوانی کنیم و از مقادیرش متوجه بشیم پوشه پوسته های ما در چه آدرسی قرار داره پس فایل کانفیگ ما به شکل زیر درمیاد:

<?php
include('./classes/class_core.php');
$func= new core;
$result =$func->siteInfo();
if ($result){
$row=mysql_fetch_assoc($result);
$thmaddr=$row['themes'];
}else{
$thmaddr='Default';
}
conf=array(
'var.headtemplate'=>'themes/'.$thmaddr.'/template/header.tpl'
);
?>


خوب همونطور که متوجه شدید ما فایل کلاسمون رو در فایل config ضمیمه کردیم تا بتونیم به محتوای اون دسترسی داشته باشیم بعد از اون یک شئ جدید از کلاس core ایجاد کردیم و نام اون رو $func گذاشتیم سپس تابع siteinfo رو فراخوانی کردیم و مقدار بازگشتی اون تابع رو در داخل متغیری به نام $result قرار دادیم بعد از اون بررسی کدیم که آیا $result دارای مقدار هست یا نه اگه هست مقادیر اون استخراج بشن و داخل متغیری به نام $thmaddr قرار بگیرن و در صورتی که $result دارای مقدار نیست متغیر $thmaddr مقدار default رو درون خودش جای میده.
حالا توی آرایه گفتیم که مقدار $thmaddr رو به جای default در آدرس ما قرار بده تا اگه آدرس قالب ما تغییر کرد مشکلی ایجاد نشه و ما بتونیم آدرس جدید رو فراخوانی کنیم.
خوب حالا که آدرس رو داریم میتونیم توی فایل ایندکسمون عمل فراخوانی رو انجام بدیم پس میریم داخل فایل ایندکس و کد هامون رو به شکل زیر تغییر میدیم:

<?php
include('config/conf.php');
$func= new core;
$themes = $func->thmchanger($conf ['var.headtemplate']);
echo $themes;
?>


همونطور که میبینید اینبار فایل config رو ضمیمه کردم ولی فایل class_core.php رو ضمیمه نکردم چرا؟ چون فایل class_core.php در فایل config.php ضمیمه شده و عملا اینجا وقتی config رو ضمیمه میکنم ضمایم اون هم ضمیمه این فایل میشن و لازم نیست دوباره اینکار رو انجام بدم.
در فراخوانی تابع thmchanger هم به جای آدرس فایل اون خونه آرایه که در فایل کانفیگ تعریف کردیم و آدرس در اونه رو ارسال کردیم و مقدار بازگشتی رو در متغیر $themes قرار دادیم و در نهایت هم $themes رو چاپ کردیم.
اما حالا چند مشکل پیش میاد که باید اونا رو هم رفع کنیم:
1- توی فایل های html باید آدرس فایل css رو به طور دقیق وارد کنیم و مشکل اینجاست که نمیشه بگیم فایل css مورد نظرمون در یک پوشه در یه مسیر دیگه است چون ممکنه مسیرهای ما تفاوت باشن مثل اینجا که فایل header.tpl ما داخل پوشه template هستش و فایل css داخل یه پوشه دیگه به نام css.خوب پس باید یه فکری برای این مشکل بشه.
برای رفع این مشکل ما ابتدا توی فایل کانفیگ آدرس دقیق فایل css رو مشخص میکنیم مثل کاری که برای فایل header انجام دادیم به شکل زیر:

conf=array(
'var.headtemplate'=>'themes/'.$thmaddr.'/template/header.tpl',
'var.cssadr'=>'themes/'.$thmaddr.'/css/'
);

در آرایه قبلیمون یه خونه دیگه به نام var.cssadr تعریف کردم و مقدار اون رو برابر با پوشه ای که فایل های css دراون هستن قرار دادم.
اما حالا مسئله اینه که چطوری به فایل header.tpl بفهمونم که css ها رو از این آدرس load کنه؟
برای این کار وارد فایل header.tpl میشم و در قسمتی که css ها معرفی شدن به شکل زیر عمل میکنم:
<link href="index.css" rel="stylesheet" type="text/css">
در header.tpl من این css فراخوانی شده که خوب اگه فایل css کنار فایلم بود مشکلی نداشت و مشکل اینجاست که فایلم توی یه پوشه دیگه است.
من اون مقدار بالا رو به شکل زیر تغییر میدم:

<link href="var.cssadrindex.css" rel="stylesheet" type="text/css">
همونطور که میبینید نام اون خونه آرایه رو که توی فایل کانفیگ آدرس درست فایل css رو درونش قرار داده بودم رو قبل از نام فایل css اضافه کردم(فاصله نمیخواد اسلش هم توی آرایه گذاشتم پس اینجا دیگه احتیاجی نیست)
اما فایل tpl ما که نمیدونه این یعنی چی پس یه جوری باید بهش بفهمونیم.اینجاست که دوباره به سراغ تابع thmchanger در فایل class_core.php میریم.
توی این تابع میخوام بگم وقتی محتوای فایل خونده شد قبل از اینکه برگردونده بشه به جای var.cssadr مقدار اون رو که در فایل کانفیگ تعریف شده قرار بده پس:

function thmchanger($tname){
$template= file_get_contents($tname);
$template= ereg_replace(‘var.cssadr’,??,$template);
return $template;
}


مشکل رو متوجه شدید؟با چی باید بگیم جاش رو عوض کنه؟ممکنه بگین خوب فایل config.php رو ضمیمه میکنیم و میگیم با مقدار این خونه آرایه جاش رو عوض کنه!مشکلی که در این کار هست اینه که خود این فایل در فایل کانفیگ ضمیمه شده و نمیشه کانفیگ رو هم ضمیمه این یکی کرد.پس راهش چیه؟
اگه دقت کنید توی فایل index.php فایل کانفیگ رو ضمیمه کردیم یعنی به مقدار این خونه از آرایه در اونجا دسترسی داریم پس ما میتونیم اون آرایه رو هم به عنوان ورودی به این تابع ارسال کنیم و در نتیجه میتونیم از مقادیرش استفاده کنیم. پس ابتدا تابع خودمون رو تغییر میدیم تا بتونه یک ورودی دیگه هم داشته باشه:

function thmchanger($tname,$arr){
$template= file_get_contents($tname);
while(list($key, $value) = each($arr)){
$template= ereg_replace($key,$value,$template);
}
return $template;
}


خوب ما یه ورودی دیگه به تابعمون اضافه کردیم که یک آرایه میگیره بعد با یک حلقه تمامی خونه های آرایه رو مرور کردیم و گفتیم هرجایی که مقداریر برابر یکی از کلید های آرایه پیدا کردی اون رو با مقدار قرارگرفته در اون خونه آرایه عوض کن.و در نهایت هم محتوای اصلاح شده رو برگردون.
اما حالا باید توی فایل index.php آرایه ای که در فایل کانفیگ وجود داره رو هم به این تابع ارسال کنیم یعنی محتوای فایل index.php به شکل زیر میشه:

<?php
include('config/conf.php');
$func= new core;
$themes = $func->thmchanger($conf['var.headtemplate'],$conf);
echo $themes;
?>


خوب تا اینجا پس تونستیم آدرس صحیح فایل css رو به فایل پوسته خودمون معرفی کنیم.
2- ما قراره نام سایتمون رو هم بدونیم تا بتونیم توی هدری که طراحی کردیم نشون بدیم.این مقدار رو هم اگه دقت کنید توی تیبل ایجاد شده در دیتابیسمون داریمش توی یک فیلد به نام sitename ذخیره کردیم.خوب حالا چطوری اینکار رو انجام بدیم؟
همونطور که مشخصه ما نیاز داریم این مقدار رو از دیتابیسمون بخونیم و در جای خودش قرار بدیم.اگه دقت کنید میبینید که تابع قبلی که در فایل class_core.php با نام siteInfo ایجاد کردیم داره تمامی مقادیر تیبل ما رو برمیگردونه پس فقط کافی مقدار فیلد sitename رو هم از اون واکشی کنیم و مانند آدرس css که عمل کردیم اون رو هم در جای خودش وارد کنیم.پس وارد فایل کانفیگ میشیم و در قسمتی که مقدار فیلد theme رو واکشی کرده بودیم کد زیر رو هم وارد میکنیم:

$title=$row['sitename'];
مقدار فیلد sitename رو در متغیری به نام $title قرار دادیم.و حالا کافیه یه خونه جدید در آرایه ای که قبلا ساخته بودیم اضافه کنیم و این مقدار رو داخل اون قرار بدیم.پس آرایه ما تا اینجا به شکل زیر میشه:

$conf=array(
'var.title'=>$title,
'var.headtemplate'=>'themes/'.$thmaddr.'/template/header.tpl',
'var.cssadr'=>'themes/'.$thmaddr.'/css/'
)


یه خونه جدید در آرایه با نام var.title اضافه کردیم و مقدار بدست اومده از فیلد sitename رو در اون قراردادیم حالا فقط کافیه وارد فایل header.tpl بشیم و این مقدلر رو بجای تایتل سایت و نامی که در هدر سایت گذاشتیم قرار بدیم یعنی به شکل زیر:

<title>var.title</title>

<a href="index.php"><div id="divheadbanner" style="position:absolute;left:0px;top:0px;width:968px;hei ght:143px;z-index:0"><span>var.title</span></div></a>


خوب دیگه کاری لازم نیست انجام بشه چون تابع thmchanger که در کلاس core نوشتیم خودش بقیه کارها رو انجام میده یعنی این اسامی رو با مقادیرشون عوض میکنه.
3- اما فایل لوگوی ما هم که قراره در هدر نمایش داده بشه یه عکس هست که خوب باید توی پوشه images قرار داده بشه و آدرسش رو در فایل header.tpl وارد کنیم.بهتره برای اینکه همه کارهامون مثل هم باشه و فهم و تغییر کدها مون راحت تر صورت بگیره آدرس عکس هامون رو هم کاری مشابه آدرس css ها براشون انجام بدیم یعنی توی فایل کانفیگ و در آرایه $conf مقدار زیر رو هم اضافه کنیم:

'var.imgadr'=>'themes/'.$thmaddr.'/images/'
خوب حالا آدرس پوشه ای که عکس های ما در اون قرار دارند رو هم داریم و باید به جای آدرس عکس هایی که در header.tpl هست قرار بدیم:

<div id="wb_imglogo" style="position:absolute;left:12px;top:21px;width:100px;h eight:103px;z-index:1;">
<img src="var.imgadrsitelogo.png" id="imglogo" alt="" style="width:100px;height:103px;"></div>

4- فایل های جاوا اسکریپت رو هم نباید نادیده گرفت چون بخش مهمی از طراحی یه سایت رو اون ها بر عهده دارن پس آدرس اونها هم مهمه:

'var.jsadr'=>'themes/'.$thmaddr.'/js/'
و آدرس اونها در فایل های پوسته ما به شکل زیر میشه:

<script type="text/javascript" src="var.jsadrjquery-1.9.1.min.js"></script>
5- خوب حالا بریم سراغ منو ها که متن هاشون باید فارسی باشن!شایدم انگلیسی! عربی چطور؟!
پس زبان سایت رو نمیدونیم چیه که بخواهیم مقادیر این منوها رو به صورت دستی وارد کنیم.زبان سایت رو هم همونطور که حدس زدید باید از همون تیبل موجود در دیتابیس متوجه بشیم که چی هست و براساس اون مقادیر درست رو بر روی منوهامون نمایش بدیم.حالا روش:
وارد فایل کانفیگ میشیم و خط زیر رو برای واکشی نام فایل زبان خودمون به کدها اضافه میکنیم:

include('./language/'.$row['language'].'.php');
خوب ما با اینکار هم واکشی از دیتابیس رو انجام دادیم و هم به طور همزمان فایل زبان رو هم به فایل کانفیگ خودمون ضمیمه کردیم.حالا چرا در ادامه متوجه خواهید شد.
خوب حالا قبل از هر کار دیگه ای بهتره بریم سراغ فایل های زبان و اونها رو هم درست کنیم پس وارد پوشه language میشیم و فایل FA.php رو که قبلا ساختیم باز میکنیم.توی این فایل هم ما یه آرایه میسازیم تا بتونیم مقادیری رو که باید در سایت نمایش داده بشه درونش قرار بدیم. پس به صورت زیر عمل میکنیم:

$lang=array(
'lng.home'=>'صفحه اصلی',
'lng.onlinelearn'=>'آموزش آنلاین',
'lng.abouteme'=>'درباره من',
'lng.contact'=>'ارتباط با من'
)

همونطور که مشاهده میکنید یک آرایه با نام $lang ایجاد کردم و یه سری خونه در اون ایجاد و مقادیر مورد نظرم رو به اونها نسبت دادم حالا باید این مقادیر رو به فایل header.tpl یه جوری نسبت بدیم اما چجوری؟
ما قبلا یه آرایه توی فایل کانفیگ داشتیم که یه سری مقادیر رو درونش قرار دادیم و تونستیم اونها رو در فایل پوسته خودمون جایگذاری کنیم برای اینکه خیلی شلوغ بازی توی کدهامون در نیاورده باشیم به فایل config.php میریم و آرایه ای رو که الان ساختیم با آرایه موجود در اون فایل merge میکنیم یعنی دو آرایه رو به یک آرایه واحد تبدیل میکنیم:

$themvar= array_merge((array)$lang, (array)$conf);
همونطور که میبینید با دستور array_merge دو آرایه رو با هم به یک آرایه به نام $themvar تبدیل کردیم پس الان آرایه $themvar ما هم مقادیر آرایه $lang رو داره و هم مقادیر آرایه $conf رو.و در اینجا متوجه هم شدید که چرا فایل زبان خودم رو به فایل config ضمیمه کردم برای اینکه بتونم به آرایه داخل اون دسترسی داشته باشم. الان باید وارد فایل index.php بشیم و نام جدید رو به عنوان آرایه صحیح معرفی کنم یعنی:

$themes = $func->thmchanger($conf['var.headtemplate'],$conf);
تبدیل میشه به:

$themes = $func->thmchanger($themvar['var.headtemplate'],$themvar);
آخر فایل config.php هم اون دوتا آرایه اولیه رو undet میکنیم تا فضای اشغال شده رم رو رها کنن:

unset($lang,$conf);
حالا برای اینکه مقادیر فایل fa.php ما درون فایل پوسته و به جای مقادیر منوی ما بشینن کافیه وارد فایل header.tpl شده و مقادیر منوها رو به مقادیر زیر تغییر بدیم:

<div id="wb_indexCssMenu1" style="position:absolute;left:267px;top:152px;width:437px ;height:28px;text-align:right;z-index:2;">
<ul>
<li class="firstmain"><a href="contact.php" target="_self">lng.contact</a>
</li>
<li><a href="about.php" target="_self">lng.abouteme</a>
</li>
<li><a href="learn.php" target="_self">lng.onlinelearn</a>
</li>
<li><a href="index.php" target="_self">lng.home</a>
</li>
</ul>
<br>
</div>

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

mbf5923
شنبه 27 مهر 1392, 11:20 صبح
سلام مجدد
در مرحله قبل موفق شدیم هدر سایت رو به صورت داینامیک طراحی و اجرا کنیم.و همینطور چهارچوب اصلی توابعمون رو پیاده سازی کنیم از اینجا به بعد تقریبا کارمون در زمینه طراحی ساده میشه.
توی این مرحله قصد داریم دو تا box در سمت راست صفحه اصلی قرار بدیم تا بتونیم یه سری از مطالب سایت رو در داخل اونها نمایش بدیم.
اولین باکس رو اختصاص میدیم به مطالب پربازدید سایتمون که مثلا لینک 5 تا از پربازدیدترین مطالب رو در اون قرار بدیم و دومین باکس رو میذاریم برای لینک به سایت های دیگه.
اما توی این مرحله چون ما میدونیم مقادیر باکس ها مثل تایتل اونها از کجا باید لود و فراخوانی بشن پس توی طراحیمون از این مقادیر رو لحاظ میکنیم مثلا به جای اینکه تایتل باکس پربازدیدترین ها رو به جای اینکه بذاریم "بیشترین بازدید ها" میذاریم "lng.topview" بدین معنی که مقدار یک خونه از آرایه فایل language رو به جای این قرار بده و سپس کافیه به فایل language.php بریم و یک خونه جدید به آرایه موجود در اون اضافه کنیم به شکل زیر:

'lng.topview'=>'بیشترین بازدیدها'
برای باکس دوم و تایتل اون هم به همین روش عمل میکنیم و مقدار lng.bstlink رو به جای تایتل اون قرار میدیم و در آرایه زبان خط زیر رو اضافه میکنیم:

'lng.bstlink'=>'لینک های مفید'
بعد از اینکه دوتا باکس رو در محل خاص خودشون طراحی کردیم(باید سمت راست سایت ما قرار بگیرن) کافیه کدهای html خودمون رو در فایلی به نام rightmenu.tpl ذخیره کنیم.تفاوت این فایل با فایل header.tpl در این هست که توی این فایل کدهای شروع فایل های html و کدهای پایان html رو حذف میکنیم.کدهای شروع html رو حذف میکنیم چون توی header.tpl موجود بودن و برای این هم قراره همون ها لحاظ بشن و کدهای پایانی رو هم حذف میکنیم چون این پایان کدهای صفحه ایندکس ما نیست. پس کدمون میشه چیزی شبیه کد زیر:

<script type="text/javascript" src="var.jsadrjquery-1.9.1.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-blind.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-bounce.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-clip.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-drop.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-explode.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-fade.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-fold.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-highlight.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-pulsate.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-scale.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-shake.min.js"></script>
<script type="text/javascript" src="var.jsadrjquery.ui.effect-slide.min.js"></script>
<script type="text/javascript" src="var.jsadrwb.rotate.min.js"></script>
<script type="text/javascript" src="var.jsadrwwb9.min.js"></script>
<div id="divrightmenu" style="position:absolute;text-align:right;left:712px;top:201px;width:255px;heigh t:460px;z-index:16;" title="">
<div id="divrightmenu_Container" style="width:255px;position:relative;margin-left:auto;margin-right:auto;text-align:left;">
<div id="divheadtopview" style="position:absolute;text-align:left;left:3px;top:0px;width:250px;height:25p x;z-index:6;" title="">
<div id="wb_imgshowtopview" style="position:absolute;left:5px;top:0px;width:22px;heig ht:22px;filter:alpha(opacity=0);-moz-opacity:0.00;opacity:0.00;z-index:0;">
<a href="#" onclick="ShowObjectWithEffect('divmaintopview', 1, 'blindvertical', 500);ShowObject('wb_imghidetopview', 1);ShowObject('wb_imgshowtopview', 0);Animate('divheadbestlink', '', '226', '', '', '', 500, '');Animate('divmainbestlink', '', '251', '', '', '', 500, '');return false;"><img src="var.imgadrarrow-down.png" id="imgshowtopview" alt="" style="width:22px;height:22px;"></a></div>
<div id="wb_txtheadtopview" style="position:absolute;left:46px;top:4px;width:200px;he ight:19px;text-align:center;z-index:1;">
<span style="color:#000000;font-family:arial;font-size:17px;"><strong>lng.topview</strong></span></div>
<div id="wb_imghidetopview" style="position:absolute;left:5px;top:0px;width:22px;heig ht:22px;z-index:2;">
<a href="#" onclick="ShowObjectWithEffect('divmaintopview', 0, 'blindvertical', 500);Animate('wb_imgshowtopview', '', '', '', '', '100', 500, '');ShowObject('wb_imghidetopview', 0);ShowObject('wb_imgshowtopview', 1);Animate('divheadbestlink', '', '26', '', '', '', 500, '');Animate('divmainbestlink', '', '51', '', '', '', 500, '');return false;"><img src="var.imgadrarrow-up.png" id="imghidetopview" alt="" style="width:22px;height:22px;"></a></div>
</div>
<div id="divmaintopview" style="position:absolute;text-align:left;left:3px;top:25px;width:250px;height:20 0px;z-index:7;" title="">
</div>
<div id="divheadbestlink" style="position:absolute;text-align:left;left:3px;top:225px;width:250px;height:2 5px;z-index:8;" title="">
<div id="wb_txtheadbestlink" style="position:absolute;left:45px;top:4px;width:200px;he ight:19px;text-align:center;z-index:3;">
<span style="color:#000000;font-family:arial;font-size:17px;"><strong>lng.bstlink</strong></span></div>
<div id="wb_imgshowbestlink" style="position:absolute;left:5px;top:0px;width:22px;heig ht:22px;filter:alpha(opacity=0);-moz-opacity:0.00;opacity:0.00;z-index:4;">
<a href="#" onclick="ShowObjectWithEffect('divmainbestlink', 1, 'blindvertical', 500);ShowObject('wb_imghidebestlink', 1);ShowObject('wb_imgshowbestlink', 0);return false;"><img src="var.imgadrarrow-down.png" id="imgshowbestlink" alt="" style="width:22px;height:22px;"></a></div>
<div id="wb_imghidebestlink" style="position:absolute;left:5px;top:0px;width:22px;heig ht:22px;z-index:5;">
<a href="#" onclick="ShowObjectWithEffect('divmainbestlink', 0, 'blindvertical', 500);ShowObject('wb_imgshowbestlink', 1);Animate('wb_imgshowbestlink', '', '', '', '', '100', 500, '');ShowObject('wb_imghidebestlink', 0);return false;"><img src="var.imgadrarrow-up.png" id="imghidebestlink" alt="" style="width:22px;height:22px;"></a></div>
</div>
<div id="divmainbestlink" style="position:absolute;text-align:left;left:3px;top:250px;width:250px;height:2 00px;z-index:9;" title="">
</div>
</div>
</div>

همونطور که میبینید در این کدها من آدرس فایل های جاوااسکریپت رو به روشی که در مبحث قبل اشاره کردم تغییر دادم و همینطور آدرس عکس های استفاده شده رو نیز به آدرس داینامیک اونها تغییر دادم نام باکس ها رو هم که خودتون در حال مشاهده هستید.
از کدها متوجه شدید که مقادیری که قراره از فایل language خونده بشن رو با lng و مقادیری که باید از فایل config خونده و جایگذاری بشن رو با var شروع کردیم تا در بررسی های بعدی بتونیم متوجه بشیم هر مقدار از چه مکانی داره جایگذاری میشه.
توجه داشته باشین که تمامی فایل های مربوط به منوها رو باید به پوشه های موجود انتقال بدیم و در آخر فایل css خودمون هم لازمه کدهای مربوط به استایل این منوها رو اضافه کنیم.توجه داشته باشید که توی فایل rightmenu.tpl دیگه لازم نیست آدرس فایل css خودمون رو وارد کنیم چرا که داریم از یک فایل هم برای header و هم برای rightmenu استفاده میکنیم و این فایل هم در فایل header.tpl فراخوانی شده.
بعد از اینکه تمامی فایل های مربوط به rightmenu.tpl رو در جاهای خودشون قرار دادیم لازمه که اون رو نمایش بدیم.برای این کار وارد فایل index.php میشیم.تا انتهای مبحث قبل محتوای فایل index ما به شکل زیر بود:

<?php
include('config/conf.php');
$func= new core;
$themes = $func->thmchanger($themvar['var.headtemplate'],$themvar);
?>

همونطور که میبینید ما فایل هدر رو در اون فراخوانی کرده بودیم که آدرس صحیح فایل هم در یک آرایه در فایل config قرار داشت .حالا به همین ترتیب باید فایل rightmenu.tpl رو هم به این فراخوانی اضافه کنیم.اما قبل از این کار باید آدرس صحیح این فایل رو هم در آرایه ای که در فایل config قرار داره مشخص کنیم:

'var.rightmenu'=>'themes/'.$thmaddr.'/template/rightmenu.tpl'
پس ما یه خونه جدید در آرایه $conf با نام var.rightmenu ایجاد کردیم و آدرس فایل rightmenu.tpl رو در اون قرار دادیم حالا کافیه در فایل ایندکس از این خونه آرایه به عنوان آدرس صحیح فایل مورد نظرمون استفاده کنیم.پس در فایل ایندکس مقدار زیر رو اضافه میکنیم:

$themes .= $func->thmchanger($themvar['var.rightmenu'],$themvar);
فقط توجه داشته باشید که مقدار جدید باید با مقدار قبلی الحاق بشه تا مقدار قبلی متغیر $themes از بین نره اگه الحاق نکنیم و فقط برابر مقدار جدید قرار بدیم هدرمون رو که قبلا در این متغیر قرار دادیم از بین میره و مقدار جدید به جای اون میشینه و خوب مسلما هدر به نمایش در نمیاد.
در فابل های دیگه خودمون تا اینجای کار لازم نیست تغییری به وجود بیاریم.

mbf5923
سه شنبه 30 مهر 1392, 12:18 عصر
توی قسمت های قبل رسیدیم تا اونجا که هدر سایت و منوی سمت راست رو طراحی کردیم و نمایش دادیم اما توی این مبحث میخوایم لینک های ثبت نام و ورود رو طراحی کنیم و همینطور یه باکس در وسط صفحه خودمون قرار بدیم که بتونیم آخرین ارسال های سایتمون رو در اون به نمایش بذاریم
خوب روش های مقدار گذاری برای عناصر وب سایتمون دقیقا مثل قبل هستش مثلا جایی که لازم هست بنویسیم "نام کاربری" باید یه خونه به آرایه $lang اضافه کنیم و نام اون خونه از آرایه رو در این قسمت وارد کنیم.
اما توی این قسمت ما گفتیم میخوایم یه قسمت هم داشته باشیم که آخرین ارسال ها رو در اون نمایش بدیم پس دوباره اینجا هم نیاز داریم از دیتابیس اطلاعات رو واکشی کنیم.برای اینکار ما در فایل class_core.php یک آرایه برای اینکار ایجاد میکنیم که مقادیری رو که نیاز داریم در اسکریپتمون از دیتابیس واکشی بشن رو در اون قرار بدیم و در مکان های مناسب خودشون قرار بدیم پس یک آرایه با نام $dbvar ایجاد میکنیم:

private $dbvar =array(
'db.marquee'=>''
);

همونطور که ملاحظه میکنید یک خونه در این آرایه قرار دادیم به نام 'db.marquee' که فعلا برای نگهداری اطلاعات آخرین ارسال ها میتونیم ازش استفاده کنیم. پس توی قسمتی که در پوسته ها برای نمایش آخرین ارسال ها در نظر گرفتیم به جای مقدار، نام این خونه از ارایه رو قرار میدیم تا مقدار این خونه در اون قسمت بشینه.من نام پوسته مربوط به این کار رو index.tpl گذاشتم.پس محتویات داخلی اون به شکل زیر خواهد بود:

<div id="divlastpost" style="position:absolute;text-align:left;left:282px;top:201px;width:425px;height :382px;z-index:6;" title="">
<div id="wb_lbllastpost" style="position:absolute;left:80px;top:0px;width:250px;he ight:16px;text-align:center;z-index:0;">
<span style="color:#000000;font-family:arial;font-size:13px;"><strong>lng.lastpost</strong></span></div>
<div id="wb_imgleftframe" style="position:absolute;left:10px;top:5px;width:33px;hei ght:348px;z-index:1;">
<img src="var.imgadrframeleft.gif" id="imgleftframe" alt="" style="width:33px;height:348px;"></div>
<marquee direction="up" scrolldelay="90" scrollamount="4" behavior="scroll" loop="0" style="position:absolute;left:41px;top:31px;width:336px;h eight:292px;z-index:2;" id="Marquee" onmouseover="this.stop()" onmouseout="this.start()"><span style="color:#000000;font-family:arial;font-size:13px;">db.marquee</span></marquee>
<div id="wb_imgtopframe" style="position:absolute;left:42px;top:4px;width:367px;he ight:34px;z-index:3;">
<img src="var.imgadrframetop.gif" id="imgtopframe" alt="" style="width:367px;height:34px;"></div>
<div id="wb_imgrightframe" style="position:absolute;left:377px;top:38px;width:33px;h eight:313px;z-index:4;">
<img src="var.imgadrframeright.gif" id="imgrightframe" alt="" style="width:33px;height:313px;"></div>
<div id="wb_imgdownframe" style="position:absolute;left:43px;top:319px;width:334px; height:30px;z-index:5;">
<img src="var.imgadrframedown.gif" id="imgdownframe" alt="" style="width:334px;height:30px;"></div>
</div>

خوب حالا باید این پوسته های جدید رو هم در فایل کانفیگمون آدرس دهی کنیم و همینطور اونها رو در فایل index.php فراخوانی کنیم.اما قبلش برای اینکه آرایه جدیدمون رو هم جز مقادیری که قراره در پوسته هامون جایگذاری بشه قرار بدیم لازمه که در کلاسمون اون رو با آرایه های قبلی merge کنیم:

$arr= array_merge((array)$arr, (array)$this->dbvar);
حالا آرایه dbvar ما به آرایه موجود قبلیمون اضافه شد که البته فعلا مقدار خاصی نداره و در قسمت های بعدی به مقدار دهی اون هم خواهیم پرداخت.
در فایل کانفیگ هم دو خط زیر رو جهت آدرس دهی دو فایل پوسته جدید اضافه میکنیم:

'var.leftmenu'=>'themes/'.$thmaddr.'/template/leftmenu.tpl',
'var.index'=>'themes/'.$thmaddr.'/template/index.tpl'

دقت کنید فایل language رو هم باید بنا به مقادیری که نیاز داریم تغییر بدیم و مقادیر جدید رو در اون اضافه کنیم که تا اینجای کار فایل language من شامل مقادیر زیر شده:

<?php
$lang=array(
'lng.home'=>'صفحه اصلی',
'lng.onlinelearn'=>'آموزش آنلاین',
'lng.abouteme'=>'درباره من',
'lng.contact'=>'ارتباط با من',
'lng.topview'=>'بیشترین بازدیدها',
'lng.bstlink'=>'لینک های مفید',
'lng.lastpost'=>'آخرین ارسال ها',
'lng.register'=>'عضویت',
'lng.signin'=>'ورود',
'lng.username'=>'نام کاربری',
'lng.password'=>'رمز عبور',
'lng.repassword'=>'تکرار رمز عبور',
'lng.email'=>'پست الکترونیک',
'lng.captcha'=>'تصویر امنیتی',
'lng.confirm'=>'تایید',
'lng.forgotpassword'=>'رمز عبور خود را فراموش کرده اید؟',
'lng.close'=>'بستن',
'lng.refreshcaptcha'=>'برای تغییر عکس کلیک کنید',

)
?>

خوب حالا لازم هست که در فایل index این پوسته ها فراخوانی بشن:

$themes .= $func->thmchanger($themvar['var.leftmenu'],$themvar);
$themes .= $func->thmchanger($themvar['var.index'],$themvar);

من برای قسمت ثبت نام سایت هم از یک کپچا استفاده کردم که یک فایل برای تولید کپچا احتیاج داشتم که بتونه کپچا رو تولید و در قسمت ثبت نام نمایش بده که اون فایل رو در پوشه include که از قبل ایجاد کرده بودم قرار میدم و در داخل فایل leftmenu.tpl که فرم ثبت نام رو در خودش نگه میداره اون رو آدرس دهی میکنم:

<div id="divsignin" style="position:absolute;text-align:left;left:0px;top:201px;width:280px;height:2 00px;z-index:38;visibility:hidden;" title="">
<div id="wb_imgclosesignin" style="position:absolute;left:256px;top:0px;width:22px;he ight:22px;z-index:5;">
<a href="#" onclick="ShowObjectWithEffect('divsignin', 0, 'dropleft', 500);ShowObjectWithEffect('divshowregister', 1, 'slideup', 500);ShowObjectWithEffect('divshowsignin', 1, 'slidedown', 500);return false;"><img src="var.imgadrclose.png" id="imgclosesignin" alt="" style="width:22px;height:22px;"></a></div>
<div id="wb_formsignin" style="position:absolute;left:0px;top:23px;width:277px;he ight:171px;z-index:6;">
<form name="indexForm1" method="post" action="#" enctype="text/plain" id="formsignin">
<div id="wb_lblsigninusername" style="position:absolute;left:88px;top:5px;width:150px;he ight:16px;text-align:right;z-index:0;">
<span style="color:#000000;font-family:arial;font-size:13px;"><strong>lng.username</strong></span></div>
<input type="text" id="txtsigninusername" style="position:absolute;left:23px;top:28px;width:213px;h eight:19px;line-height:19px;z-index:1;" name="indexEditbox1" value="" placeholder="lng.username">
<input type="password" id="txtsigninpassword" style="position:absolute;left:23px;top:82px;width:213px;h eight:19px;line-height:19px;z-index:2;" name="indexEditbox2" value="" placeholder="lng.password">
<div id="wb_lblsigninpassword" style="position:absolute;left:88px;top:60px;width:150px;h eight:16px;text-align:right;z-index:3;">
<span style="color:#000000;font-family:arial;font-size:13px;"><strong>lng.password</strong></span></div>
<input type="submit" id="signinsubmit" name="" value="lng.confirm" style="position:absolute;left:80px;top:130px;width:96px;h eight:25px;z-index:4;">
</form>
</div>
</div>
<div id="divshowsignin" style="position:absolute;text-align:left;left:0px;top:152px;width:130px;height:2 5px;z-index:39;cursor:pointer;" title="" onclick="ShowObjectWithEffect('divsignin', 1, 'dropleft', 500);ShowObject('divshowregister', 0);ShowObject('divshowsignin', 0);return false;">
<div id="wb_lblshowsignin" style="position:absolute;left:0px;top:2px;width:125px;hei ght:19px;text-align:center;z-index:7;">
<div dir="rtl"><span style="color:#0000ff;font-family:arial;font-size:17px;"><strong>lng.signin</strong></span></div></div>
</div>
<div id="divshowregister" style="position:absolute;text-align:left;left:0px;top:180px;width:130px;height:2 5px;z-index:40;cursor:pointer;" title="" onclick="ShowObjectWithEffect('divregisster', 1, 'dropleft', 500);ShowObject('divshowregister', 0);ShowObject('divshowsignin', 0);return false;">
<div id="wb_lblshowregister" style="position:absolute;left:0px;top:3px;width:125px;hei ght:19px;text-align:center;z-index:8;">
<div dir="rtl"><span style="color:#0000ff;font-family:arial;font-size:17px;"><strong>lng.register</strong></span></div></div>
</div>
<div id="divregisster" style="position:absolute;text-align:left;left:0px;top:201px;width:280px;height:3 80px;z-index:41;visibility:hidden;" title="">
<div id="wb_imgcloseregister" style="position:absolute;left:256px;top:2px;width:22px;he ight:22px;z-index:25;">
<a href="#" onclick="ShowObjectWithEffect('divshowregister', 1, 'slideup', 500);ShowObjectWithEffect('divshowsignin', 1, 'slidedown', 500);ShowObjectWithEffect('divregisster', 0, 'dropleft', 500);return false;"><img src="var.imgadrclose.png" id="imgcloseregister" alt="" style="width:22px;height:22px;"></a></div>
<div id="wb_indexForm1" style="position:absolute;left:0px;top:29px;width:273px;he ight:334px;z-index:26;">
<form name="indexForm1" method="post" action="#" enctype="text/plain" id="indexForm1">
<input type="text" id="txtregisterusername" style="position:absolute;left:23px;top:39px;width:213px;h eight:19px;line-height:19px;z-index:14;" name="indexEditbox1" value="">
<input type="password" id="txtusernamepassword" style="position:absolute;left:23px;top:87px;width:213px;h eight:19px;line-height:19px;z-index:15;" name="indexEditbox2" value="">
<input type="password" id="txtregisterrepassword" style="position:absolute;left:23px;top:133px;width:213px; height:19px;line-height:19px;z-index:16;" name="indexEditbox3" value="" autocomplete="off">
<input type="email" id="txtregistermail" style="position:absolute;left:23px;top:180px;width:213px; height:19px;line-height:19px;z-index:17;" name="indexEditbox4" value="">
<div id="wb_registercaptcha" style="position:absolute;left:23px;top:225px;width:213px; height:36px;z-index:18;">
<img src="./include/captcha.php" alt="Click for new image" title="Click for new image" style="cursor:pointer;width:100px;height:38px;" onclick="this.src='./include/captcha.php?'+Math.random()">
<input type="text" id="registercaptchaEdit" style="position:absolute;left:105px;top:16px;width:113px; height:20px;line-height:20px;;" name="captcha_code" value=""></div>
<input type="submit" id="submithregister" name="" value="lng.confirm" style="position:absolute;left:79px;top:297px;width:96px;h eight:25px;z-index:19;">
<div id="wb_lblregisterusername" style="position:absolute;left:88px;top:16px;width:150px;h eight:16px;text-align:right;z-index:20;">
<span style="color:#000000;font-family:arial;font-size:13px;"><strong>lng.username</strong></span></div>
<div id="wb_lblregisterpassword" style="position:absolute;left:88px;top:67px;width:150px;h eight:16px;text-align:right;z-index:21;">
<span style="color:#000000;font-family:arial;font-size:13px;"><strong>lng.password</strong></span></div>
<div id="wb_lblregisterrepassword" style="position:absolute;left:88px;top:113px;width:150px; height:16px;filter:alpha(opacity=98);-moz-opacity:0.98;opacity:0.98;text-align:right;z-index:22;">
<span style="color:#000000;font-family:arial;font-size:13px;"><strong>lng.repassword</strong></span></div>
<div id="wb_lblregisteremail" style="position:absolute;left:88px;top:160px;width:150px; height:16px;text-align:right;z-index:23;">
<span style="color:#000000;font-family:arial;font-size:13px;"><strong>lng.email</strong></span></div>
<div id="wb_lblregistercaptcha" style="position:absolute;left:88px;top:206px;width:150px; height:16px;text-align:right;z-index:24;">
<span style="color:#000000;font-family:arial;font-size:13px;"><strong>lng.captcha</strong></span></div>
</form>
</div>
</div>

ziziii
چهارشنبه 11 دی 1392, 08:17 صبح
با سلام
بقیه آموزش چی شده؟

mbf5923
چهارشنبه 23 بهمن 1392, 22:35 عصر
مدتی این مثنوی تاخیر شد!
از دوستان معذرت میخوام بابت تاخیری که در این تاپیک به وجود اومد.چند وقتی گرفتار بودم و امکان نوشتن نداشتم.
اما میخوام یه تغییر کوچیک در آموزش ایجاد کنم و اون هم این باشه که یه جورایی برنامه رو شی گرا تر کنیم تا در توسعه ها هم بتونیم ساده تر عمل کنیم.یه جورایی به جداسازی کدهای html از کدهای برنامه هم بیشتر نزدیک میشیم البته خارج کردن کدهای php از بین کدهای html.
امشب که گذشت ولی با یاری خدا فردا قسمت اول آموزش رو تکمیل و قرار میدم.

mbf5923
پنج شنبه 24 بهمن 1392, 15:52 عصر
و اما بعد:
همونطور که عرض کردم کمی روش کار رو تغییر میدیم که بیشتر به oop و mvc نزدیک بشیم و در توسعه هم کمی دستمون بازتر بشه.
برای شروع کار یک ساختار کلی رو پیاده سازی میکنیم که این ساختار رو برای هر وب سایت میتونیم داشته باشیم و بعد از اون با این ساختار یک سایت تست(دفترچه تلفن آنلاین) هم راه اندازی خواهیم کرد.
اما شروع پیاده سازی ساختار کلی:
ما قصد داریم که تمام درخواست هایی که به سایت ما میرسه رو در یک صفحه که همون صفحه ایندکس باشه بررسی کنیم و جواب مناسب رو به کاربر برگردونیم.پس ابتدای کار باید یک فایل htaccess بسازیم و در اون بگیم که تمامب در خواست ها به فایل ایندکس رجوع داده بشنوهمینطور کاری کنیم که کاربر سایت به جای اینکه صفحات رو با پسوند اونها وارد کنه مثل login.php فقط وارد کنه login پس یک مخفی سازی پسوند هم پیاده سازی کنیم.
برای شروع یک فایل .htaccess ایجاد کنید و کد زیر رو در داخل اون بنویسید:

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

بدین ترتیب تمام درخواست ها در قالب یک request به صفحه index.php فرستاده میشن و ما در اونجا باید درخواست ها رو بررسی و عکس العمل مناسب نشون بدیم.
خوب حالا چطور در صفحه ایندکس بفهمیم درخواست کاربر چی بوده؟ برای ادامه کار یک فایل با نام index.php ایجاد کنید و کد زیر رو در داخل اون بنویسید:

$requestURI = explode('/', $_SERVER['REQUEST_URI']);
در خط بالا $_SERVER['REQUEST_URI'] چی رو برمیگردونه؟آدرسی مانند آدرس زیر رو در نظر بگیرید:

http://127.0.0.1/index.php
حالا توی این صفحه مقدار $_SERVER['REQUEST_URI'] دقیقا برابر 127.0.0.1/index.php خواهد بود.خوب حالا ما قراره تمام در خواست ها رو در هیمن صفحه مدیریت کنیم پس باید بفهمیم کاربر ما بعد از آدرس سایت چه مقداری رو نوشته مثلا index یا login یا register و... و یا ممکنه فقط آدرس رو وارد کرده باشه که بر اساس اون تصمیم بگیریم که چه محتوایی رو به کاربر نمایش بدیم پس باید مقدار بعد از آدرس رو از این مقدار جدا کنیم برای اینکار همونطور که میبینید از دستور explode استفاده میکنیم. با اینکار متغیر $requestURI یک آرایه خواهد بود که در خانه صفر آرایه مقدار 127.0.0.1 و در خانه یک اون مقدار index.php قرار گرفته.همینجا لازمه بگیم که این صفحه یعنی همین index که ساختیم قرار نیست از خودش محتوایی رو به نمایش بگذاره و صرفا اطلاعات رو از کاربر دریافت کرده و اونها رو در اختیار قسمت های دیگه برنامه قرار میده و در نهایت محتوای نهایی رو از اونها دریافت کرده و نمایش میده.میشه بگیم یه ایزوله ایتدایی رو قصد داریم در اینجا انجام بدیم.
خوب حالا از آرایه $requestURI باید صفحه ای رو که کاربر درخواست داده استخراج کنیم و همونطور که گفتیم این مقدار در خانه یک آرایه قرار گرفته پس دستور زیر ابن کار رو برای ما انجام خواهد داد:

$page=$requestURI[1];
حالا متغیر $page مشخص کننده نوع درخواست هستش و باید براساس اون محتوا درخواست بشه.اما محتوا از کجا درخواست بشه و چطوری؟ما یک کلاس رو برای اینکار در نظر میگیریم که نام page مورد تقاضا توسط کاربر رو به اون میدیم و اون خودش اطلاعات رو پردازش و نمایش میده.برای اینکه این کلاس رو بسازیم یک فولدر با نام app در کنار ایندکس خودتون ایجاد کنید.توی این پوشه هم پوشه دیگیری بانام core ایجاد کنید.در داخل این پوشه یک فایل php با نام core.php ایجاد کنید.ما میخوایم مسئولیت اصلی برنامه رو به این فایل محول کنیم و تون تصمیم گیری چگونگی نمایش محتوا رو بر عهده داشته باشه.در ضمن این فایل خودش یک کلاس خواهد بود.پس ابتدای به امر کلاسی با نام core در داخل این فایل ایجاد میکنیم:

<?php
class core{
{

توی این کلاس یک تابع نیاز داریم که اطلاعات رو منظم کرده و نمایش بده اسم این تابع رو view میگذاریم:

public function view($requestpage){
{

همونطور که مشاهده میکنید برای این تابع یک ورودی هم در نظر گرفتیم که در حقسقت مقداری هست که از صفحه ایندکسمون میخواهیم بهش ارسال کنیم و این مقدار مشخص میکنه تابع ما باید بر روی کدوم صفحه شروع به کار کنه و کاربر ما چه صفحه ای رو تقاضا داده اما از اونجایی که سایت ما قراره multistyle و Multilanguage باشه نیاز داریم که بدونیم کدوم استایل رو و کدوم زبان رو جهت نمایش انتخاب کنیم.این اطلاعات رو ما در دیتابیسی که خواهیم ساخت داریمشون.پس تا اینجای کار رو داشته باشین تا بریسم سراغ دیتابیسمون و برگردیم.
ما یه دیتابیس ایجاد میکنیم با نام tellbook که کد اون رو در زیر میبینید:
CREATE DATABASE IF NOT EXISTS `tellbook` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
توی این دیتابیس اولین جدولی رو که ایجاد میکنیم siteinfo نامگذاری میکنیم این جدول رو برای نگهداری اطلاعات پایه سایت در نظر خواهیم گرفت.اطلاعاتی از قبیل زبان سایت،قالب سایت و نام سایت.ساختار این جدول هم به صورت زیر خواهد بود:
CREATE TABLE IF NOT EXISTS `tbl_siteinfo` (
`id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`language` char(5) NOT NULL,
`theme` char(25) NOT NULL,
`sitename` char(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

خوب حالا که جدول ما ایجاد شد یه سری اطلاعات پیشفرض رو وارد اون میکنیم. برای فیلد language مقدار FA، برای فیلد theme مقدار default و برای فیلد sitename مقدار "دفترچه تلفن آنلاین" رو وارد کنید.خوب حالا جدول اطلاعات پایه آماده است و ما قرار شد اطلاعات این جدول رو در کلاس core واکشی کنیم و بر اساس اون محتوا رو به کاربر نمایش بدیم.پس کاملا مشخص هستش که نیاز به برقراری ارتباط با دیتابیس داریم پس ابتدای به امر نیاز داریم اطلاعات مربوط به ارتیاط با دیتابیس رو در داخل یک فایل وارد کنیم که در حقیقت اطلاعاتی شامل نام سرور یوزر و پسورد ارتباط و هیمنطور نام دیتابیس خواهد بود.پس توی پوشه app یک پوشه با نام config ایجاد کنید و در داخل اون یک فایل php به نام dbconf.php بسازید سپس وارد این فایل بشید و اطلاعات زیر رو وارد کنید.اگه اطلاعاتتون با اینها تفاوت داره اطلاعات صحیح رو وارد کنید:

<?php
$host='localhost';
$user='root';
$pass='';
$dbname='tellbook';
?>

از اونجا که قرار هستش نزدیک به oop پیش بریم پس یک کلاس برای ارتباط با دیتابسمون هم ایجاد میکنیم که هربار که احتیاج به ارتباط با دیتابیس داریم از اون استفاده کنیم.برای ایجاد این کلاس مراحل زیر رو انجام بدید.
توی پوشه app یک پوشه با نام classes ایجاد کنید.توی این پوشه یک فایل php با نام bind.php بسازید.حالا وارد این فایل شده و یک کلاس با نام bind در اون مانند زیر ایجاد کنید:راستی بگم میخوایم از pdo برای ارتباط با دیتابیسمون استفاده کنیم.

<?php
class Bind{
{

در بدنه کلاس یک متغیر از نوع اختصاصی با نام $link بسازید تا بتونیم هندل ارتباط دیتابیس رو در درون اون نگهداری کنیم:

private $link=null;
حالا توی فراخوانی کلاس کد زیر رو بنویسید:

public function __construct(){
include($_SERVER['DOCUMENT_ROOT'].'/app/config/dbconf.php');
try{
$this->link=new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$this->link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
die( 'Connection failed: ' . $e->getMessage());
}
$this->link->exec("SET NAMES 'utf8'");
}

خوب همونطور ک میبینید ما در فراخوانی کلاس اومدیم و فایل کانفیگی رو که اطلاعات ارتباط با دیتابیس در اون قرار داره رو ضمیمه کردیم.بعد از اون در داخل بدنه try سعی بر ارتباط با دیتابیس کردیم.در صورتی که ارتباط برقرار بشه از try خارج میشیم و دستور بعد از اون که تنظیم collation مسیر ارتباطی هست اجرا میشه در غیر اینصورت پیغام عدم ارتباط با دیتابیس ظاهر و برنامه خاتمه پیدا میکنه.همونطور که مشاهده میکنید هندل ارتباط رو هم داخل متغیر $link قرار دادیم.خوب توی pdo برای بستن یک ارتباط کافیه که هندل ارتباطی رو از بین ببریم پس در اتمام کار کلاس اقذام به خالی کردن هندل میکنیم به صورت زیر:

public function __destruct(){
$this->link=null;
}

این تیکه کد دیگه خودش کاملا گویا هستش و نیاز به توضیحی نداره.
و اما حالا قسمت اصلی این کلاس که کار با دیتابیس هست عملیات هایی مثل select و insert و update و ... به عهده این قسمت هستش:

public function bind($query,$data=null){
if(is_null($data)){
$result = $this->link->query($query);
$result->setFetchMode(PDO::FETCH_ASSOC);
return $result;
}else{
$this->link->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$result = $this->link->prepare($query);
$result->execute($data);
$result->setFetchMode(PDO::FETCH_ASSOC);
return $result;
}
}

خوب این تابع دارای 2ورودی هستش ورودی اول رشته تقاضای ما رو شامل میشه مثلا

Select * from tbl_siteinfo
اما ورودی دوم که به صورت پیشفرض null هستش مقادیری رو که در رشته تقاضا باید قرار بگیرند رو مشخص میکنه.حالا کی از اون استفاده میشه؟ گاهی ممکنه ما مقادیری رو بخواهیم از کاربر بگیریم و بر اساس اونها یه select رو اجرا کنیم خوب یادتون هست که توی تابع mysql اون مقدار رو از mysql_real_scape_string عبور میدادیم تا مطمئن باشیم دستورات sql در بین عبارت وارد شده توسط کاربر برنامه ما را باخطر مواجه نسازد خوب اینجا هم از روشی جدید که همون کار رو میکنه استفاده میکنیم.مثلا:

Select * from tbl_siteinfo where id=1
فرض کنید یک رو کاربر وارد کرده پس به جای اون هرچیز دیگری میتونه بذاره مثل یه تیکه کد sqlپس در این مواقع در pdo ما از روشی مانند زیر استفاده میکنیم

$data=array(“id”=>1);
Select * from tbl_siteinfo where id=:id

و بعد این مقادیر رو به تابعمون ارسال میکنیم.تابعی که در بالا نوشتیم اگه مقدار data برابر با null باشه کوئری رو به صورت یک رشته امن میبینه و اجراش میکنه اما اگه $data هم ارسال شده باشه میفهمه که این کوئری امن نیست و خودش باید امنش کنه و بعد اجراش کنه.در هر صورت بعد از اجرای کوئری مقدار بازگشتی از دیتابیس رو نوع واکشیش رو مشخص میکنیم(result->setFetchMode(PDO::FETCH_ASSOC);) و اون رو به فراخوان تابع برمیگردونیم.
تا اینجای کار باشه تا مابقی رو انشاالله در پست بعدی عرض خواهم کرد.