آموزش ساخت cms خبري – قسمت سوم


در اين بخش از آموزش مي خواهيم نحوه صفحه بندي (آرشيو) اطلاعات در يافتي از ديتا بيس رو بررسي کنم.
جهت کاهش حجم کار از توضيح موارد تکراري پرهيز شده است.
اول قصد داشتم صفحات HTML و کلاس تمپليت رو توضيح بدم ولي چون ديدم خيلي ها با صفحه بندي مشکل دارند, اين بخش رو اولويت دادم.
ابتدا به ديتا بيس متصل مي شويم.اينکار را قبلا انجام داديم فقط فايل رو فراخواني مي کنيم.

کد PHP:
<?php
// توصيه مي شود اين ثابت رو در تمام اسکريپت ها به نامي دلخواه و غير قابل حدس بزارين
define ('news_security',true);
include('config.php');

با متغيري که در config.php تعريف کرديم تعداد نمايش اخبار رو در صفحه نشان داده ايم.اين متغير news_limit نام داشت.
حالا تعداد کل اخبار موجود در ديتا بيس رو بيرون مي کشيم و به يک متغير نسبت مي دهيم.
براي اينکار query مناسبي مي نويسيم:

کد PHP:
$query = "SELECT COUNT(*) as num FROM data";
$total_pages = mysql_fetch_array(mysql_query($query));
$total_pages = $total_pages['num'];

براي اطلاعات بيشتر از mysql_fetch_array به آدرس http://ir.php.net/manual/en/function.mys…-array.php مراجعه کنيد.
براي دريافت صفحه مورد تقاضا از GET استفاده مي کنيم.براي جلوگيري از خطا بررسي مي کنيم که شماره صفحه درخواست شده يا نه.
start شماره اولين خبري است که بايد در صفحه مورد تقاضا نمايش داده شود.
و اگر صفحه اول باشيم خوب بايد اين مقدار برابر 1 باشه.
تابع abs همون قدر مطلق هست که اگه کاربري خواست اذيت کنه و مقدار منفي داد خطايي نشان داده نشود!
و با is_numeric جلوي داده هاي غير عددي رو مي گيريم. براي مثال کاربر مي نويسه page=ali يا page=-1 اونوقته که حسابي حالش جا مياد! اين مشکل رو من در خيلي از سايت ها ديدم که برطرف نشده!

کد PHP:
if (isset($_GET['page']))
{
$page = $_GET['page'];
if(!is_numeric("$page")){
$page=1;
}
$page = abs($page);

حدث مي زنيد چرا در کد زير اين رابطه رو گذاشتم؟

کد PHP:
$start = ($page - 1) * $news_limit+1;

چون مثلا اگه صفحه 10 باشيم يعني 9 صفحه رو رد کرديم.حالا اگه بخواهيم در هر صفحه 10 خبر نمايش داده بشه يعني 90 خبر رو رد کرديم!خوب طبيعي که بايد در صفحه 10 اولين خبر شماره 91 باشه!
حالا اگه طرف زرنگي کنه و مقدار صفر بده خوب ما نوشتيم page-1 اونقته که باز منفي ميشه!بنابراين ما يکبار ديگه از قدر مطلق استفاده مي کنيم.
ولي اينم مشکل داره!چون از ميشه 0-1 *10+1 يعني ميشه 9 ! پس در صفحه اصلي از خبر 9 نمايش داده مي شود.يک کا ر مهم اينه که ما به کاربر تفاوت نشون نديم!پس به جاي قدر مطلق مي نويسم:

کد PHP:
if ($page == "0" ) {  $start = "1";  }
}
else
{
$page=1;
$start = 0;
}

حالا در اين مرحله اطلاعات رو دريافت مي کنيم.

کد PHP:
$sql = "SELECT * FROM data data NEWS_LIMIT $start, $news_limit";
$result = mysql_query($sql) or die (mysql_error());
$result = mysql_fetch_assoc($result);

قبل از نمايش هر چيزي يک سري متغير از قبيل شماره صفحه جاري قبل و بعدي و آخرين صفحه تعريف مي کنيم.

کد PHP:
//مقدار دکمه صفحه قبل
$prev = $page - 1;
مقدار دکمه صفحه بعد
$next = $page + 1;
//مقدار آخرين صفحه
$lastpage = ceil($total_pages/$news_limit);

همونطور که ديديد از تابع ceil استفاده کرديم.در واقع با اين کار نتيجه به دست آمده رو گرد مي کنيم.فرض کنيم کل 25 باشد و بخواهيم تو هر صفحه 10 خبر نشون بديم.در اين صورت 25/11 مي شه 2.5 که اين براي مقدار آخرين صفحه مناسب نيست.بنابراين با تابع ceil مقدار رو گرد مي کنيم.
البته اين تابع مقدار رو به اولين عدد صحيح بزرگتر ممکن گرد مي کنه.
حالا کل مقاديري که بايد چاپ بشه رو به يک متغير نسب مي ديم و بعد اونو چاپ مي کنيم.
در کد زير از يک style مخصوص استفاده شده که در پايان کار استايل رو مي نويسيم.
توجه داشته باشيد منظور از فعال بودن يا نبودن که در کد زير گفتم اينه که دکمه هايي که لينک لازم نيست داشته باشند رو با style مخصوص به خود کم رنگ کنيم.

کد PHP:
$pagination = "";

$pagination .= "<div class=\"pagination\">";
//و در غير اينصورت غير فعال  اگه صفحه آخر نبوديم دکمه فعال شود
if ($page != $lastpage){

$pagination.= "<a href=\"pager.php?page=$lastpage \">آخرين صفحه</a>";
}
else{
$pagination.= "<span class=\"disabled\">آخرين صفحه</span>";
}
// اگر در صفحه آخر نيستيم پس صفحه بعدي وجود داره! در غير اينصورت دکمه غير غعال نشون مي ديم!
if ($page<$lastpage){
$pagination.= "<a href=\"pager.php?page=$next \">صفحه بعد</a>";
}else{
$pagination.= "<span class=\"disabled\">صفحه بعد</span>";
}

حلقه for سه آرگومان اصلي دارد که بايد حتما مقدار دهي شوند.
آرگومان اول نام متغير,دوم شرط اتمام حلقه و سوم گام حرکت مي باشد.
وجود آرگومان سوم اين حلقه باعث برتري اون نسبت به حلقه while شده!چون در حلقه while طرف با ننوشتن گام حرکت (امان از فراموشکاري) باعث مي شه که برنامه هنگ کنه! اما در for خطا رخ مي دهد.از ديگر مزيت هاي حقه for سرعت بالاي اون هست.
شکل کلي حلقه به صورت زير است

کد PHP:
for (مقدار دهي اوليه;شرط اتمام;گام حرکت)
{
//دستورات لازم
{
کد PHP:
// از حلقه براي نمايش صفحات استفاده مي کنيم.
for ($counter = 1; $counter <= $lastpage; $counter++)
{
// شناسايي صفحه جاري
if ($counter == $page)
{
$pagination.= "<span class=\"current\">$counter</span>";
}
else
{
$pagination.= "<a href=\"pager.php?page=$counter\">$counter</a>";
}}
$pagination.= "&nbsp;&nbsp;";
//و بعد نمايش دکمه صفحه قبل
if ($page > 1)
{
$pagination.= "<a href=\"pager.php?page=$prev\">صفحه قبل</a>";
}
else
{
$pagination.= "<span class=\"disabled\">صفحه بعد</span>";
}
$pagination.= "</div>\n";

در نهايت کدهاي زير را در فايلي با نام page.php در پوشه include ذخيره کنيد.

کد PHP:
<?php
// security
define ('news_security',true);
include('config.php');
include('template.php');
$news_limit=10;

$query = "SELECT COUNT(*) as num FROM data";
$total_pages = mysql_fetch_array(mysql_query($query));
$total_pages = $total_pages['num'];

if (isset($_GET['page']))
{
$page = $_GET['page'];
if(!is_numeric("$page")){
$page=1;
}
$page = abs($page);
$start = ($page - 1) * ($news_limit) + 1;
if ($page == "0" ) {  $start = "1";  }
}
else
{
$page=1;
$start = 0;
}

$sql = "SELECT * FROM data LIMIT $start, $news_limit";
$result = mysql_query($sql) or die (mysql_error());
$result = mysql_fetch_assoc($result);

$prev = $page - 1;
$next = $page + 1;
$lastpage = ceil($total_pages/$news_limit);
$pagination = "";

$pagination .= "<div class=\"pagination\">";
if ($page != $lastpage){

$pagination.= "<a href=\"pager.php?page=$lastpage \">آخرين صفحه</a>";
}
else{
$pagination.= "<span class=\"disabled\">آخرين صفحه</span>";
}
if ($page<$lastpage){
$pagination.= "<a href=\"pager.php?page=$next \">صفحه بعد</a>";
}else{
$pagination.= "<span class=\"disabled\">صفحه بعد</span>";
}
// از حلقه براي نمايش صفحات استفاده مي کنيم.
for ($counter = 1; $counter <= $lastpage; $counter++)
{

if ($counter == $page)
{
$pagination.= "<span class=\"current\">$counter</span>";
}
else
{
$pagination.= "<a href=\"pager.php?page=$counter\">$counter</a>";
}}
$pagination.= "&nbsp;&nbsp;";
//دکمه صفحه قبل
if ($page > 1)
{
$pagination.= "<a href=\"pager.php?page=$prev\">صفحه قبل</a>";
}
else
{
$pagination.= "<span class=\"disabled\">صفحه بعد</span>";
}
$pagination.= "</div>\n";
?>

و اين هم style براي آزمايش چون اين کد رو در قالب که ان شالله در جلسه آينده مي سازيم استفاده خواهيم کرد.

کد PHP:
/*
Plugin Name: WP-Digg Style Paginator
Plugin URI: http://www.mis-algoritmos.com/2007/09/09/wp-digg-style-pagination-plugin-v-10/
Author: Victor De la Rocha
Author URI: http://www.mis-algoritmos.com
*/

/*CSS black style pagination*/
div.pagination {
padding: 3px;
margin: 3px;
text-align:center;
color:#a0a0a0;
font-size:80%;
}
div.pagination a {
border: 1px solid #909090;
margin-right:3px;
padding:2px 5px;
background-image:url('bar.gif');
background-position:bottom;
text-decoration: none;
color: #c0c0c0;
}
div.pagination a:hover, div.meneame a:active {
border: 1px solid #f0f0f0;
background-image:url(invbar.gif);
background-color:#404040;
color: #ffffff;
}
div.pagination span.current {
margin-right:3px;
padding:2px 5px;
border: 1px solid #ffffff;
font-weight: bold;
background-color: #606060;
color: #ffffff;
}
div.pagination span.disabled {
margin-right:3px;
padding:2px 5px;
border: 1px solid #606060;
color: #808080;
}

</style>

من کد بالا رو از يک سايت خارجي (http://www.phpeasystep.com/php-cate.php?…agination) در يافت کردم.البته به دلايل آموزشي کد رو خيلي ساده تر کردم.البته کد اصلي اشکالاتي هم داشت.چون کد رو سريع نوشتم ممکنه اشکالاتي در اون وجود داشته باشه.بنابراين ممنون مي شم اشکال يا پيشنهاد هاي گل خودتون رو بدونم.
در جلسه آينده کلاس تمپليت و صفحه اصلي رو بررسي مي کنيم!
موفق و پيروز و سربلند باشد.

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

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

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.