کد خبر: 196
تاریخ انتشار: ۵ خرداد ۱۳۹۱ - ۱۱:۵۱


در این بخش از آموزش می خواهیم نحوه صفحه بندی (آرشیو) اطلاعات در یافتی از دیتا بیس رو بررسی کنم.
جهت کاهش حجم کار از توضیح موارد تکراری پرهیز شده است.
اول قصد داشتم صفحات 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 شماره اولین خبری است که باید در صفحه مورد تقاضا نمایش داده شود.
و اگر صفحه اول باشیم خوب باید این مقدار برابر ۱ باشه.
تابع 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 - ۱) * $news_limit+1;

چون مثلا اگه صفحه ۱۰ باشیم یعنی ۹ صفحه رو رد کردیم.حالا اگه بخواهیم در هر صفحه ۱۰ خبر نمایش داده بشه یعنی ۹۰ خبر رو رد کردیم!خوب طبیعی که باید در صفحه ۱۰ اولین خبر شماره ۹۱ باشه!
حالا اگه طرف زرنگی کنه و مقدار صفر بده خوب ما نوشتیم page-1 اونقته که باز منفی میشه!بنابراین ما یکبار دیگه از قدر مطلق استفاده می کنیم.
ولی اینم مشکل داره!چون از میشه ۰-۱ *۱۰+۱ یعنی میشه ۹ ! پس در صفحه اصلی از خبر ۹ نمایش داده می شود.یک کا ر مهم اینه که ما به کاربر تفاوت نشون ندیم!پس به جای قدر مطلق می نویسم:

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

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

کد 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 - ۱;
مقدار دکمه صفحه بعد
$next = $page + ۱;
//مقدار آخرین صفحه
$lastpage = ceil($total_pages/$news_limit);

همونطور که دیدید از تابع ceil استفاده کردیم.در واقع با این کار نتیجه به دست آمده رو گرد می کنیم.فرض کنیم کل ۲۵ باشد و بخواهیم تو هر صفحه ۱۰ خبر نشون بدیم.در این صورت ۲۵/۱۱ می شه ۲٫۵ که این برای مقدار آخرین صفحه مناسب نیست.بنابراین با تابع 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 = ۱; $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 > ۱)
{
$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 - ۱) * ($news_limit) + ۱;
if ($page == "۰" ) {  $start = "۱";  }
}
else
{
$page=1;
$start = ۰;
}

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

$prev = $page - ۱;
$next = $page + ۱;
$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 = ۱; $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 > ۱)
{
$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: ۳px;
margin: ۳px;
text-align:center;
color:#a0a0a0;
font-size:80%;
}
div.pagination a {
border: ۱px solid #۹۰۹۰۹۰;
margin-right:3px;
padding:2px ۵px;
background-image:url('bar.gif');
background-position:bottom;
text-decoration: none;
color: #c0c0c0;
}
div.pagination a:hover, div.meneame a:active {
border: ۱px solid #f0f0f0;
background-image:url(invbar.gif);
background-color:#404040;
color: #ffffff;
}
div.pagination span.current {
margin-right:3px;
padding:2px ۵px;
border: ۱px solid #ffffff;
font-weight: bold;
background-color: #۶۰۶۰۶۰;
color: #ffffff;
}
div.pagination span.disabled {
margin-right:3px;
padding:2px ۵px;
border: ۱px solid #۶۰۶۰۶۰;
color: #۸۰۸۰۸۰;
}

</style>

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



نظرات بينندگان
انتشار يافته: بدون دیدگاه