Хелп плиз с навигацией :\
Главная страница :
1 | 2 | 3 | 4 | 5 | 6 | >>
При нажатии на "6" :
<< | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | >>
При нажатии на "11" :
<< | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | >>
и т.д.
Причем :
для 1-й страницы (главной) ссылка идет как : index.html
для 2-й : index1.html
для 3-й : index2.html
и т.д.
У кого-нить есть такого плана php-скрипт?
Делаешь выборку с COUNT(id), потом смотришь запрошенную пользователем страницу $page = $_GET['page'], делишь её на количество новостей на странице, пишешь цикл от $i = 1 до количество страниц ($pages = $page / количество новостей на странице). Если $i == 1 и $page != 1, то это будет <<<, иначе, если $i == $pages и $page != $pages, то это будет >>>, иначе, если $i < $page+6 и $i > $page-6, то, если $i == $page, это будет запрошенная страница (выделяем жирным, без <a href='...'></a>), иначе это будет страница от 2 до 11 (если запрошена 6 страница).
Вообщем принцип понятен, я думаю. ;)
Код:
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
// вычисляем первый оператор для LIMIT
$limit=abs($page*20);
$result = mysql_query ("SELECT * FROM base ORDER BY `lasttime` DESC LIMIT $limit,20");
while ($row = mysql_fetch_array($result)){
// всякие блаблабла, то что необходимо вывести
}
// вычисляем первый оператор для LIMIT
$limit=abs($page*20);
$result = mysql_query ("SELECT * FROM base ORDER BY `lasttime` DESC LIMIT $limit,20");
while ($row = mysql_fetch_array($result)){
// всякие блаблабла, то что необходимо вывести
}
собсно цифровая навигация (номера страниц):
Код:
$q="SELECT count(*) FROM `base`";
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];
$num_pages=ceil($total_rows/20);
for($i=1;$i<=$num_pages;$i++) {
if ($i-1 == $page) {
print ("<b>");
echo $i." ";
print ("</b>");
$next_page=$i+1;
$prev_page=$i-1;
} else {
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> ";
}
}
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];
$num_pages=ceil($total_rows/20);
for($i=1;$i<=$num_pages;$i++) {
if ($i-1 == $page) {
print ("<b>");
echo $i." ";
print ("</b>");
$next_page=$i+1;
$prev_page=$i-1;
} else {
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> ";
}
}
ссылки "следующая" и "предыдущая":
Код:
if ($prev_page <= 0){
print "";
} else {
echo '<a href='.$_SERVER['PHP_SELF'].'?page='.$prev_page.'><b> <-- </b></a>';
}
if ($next_page > $num_pages){
print "";
} else {
echo '<a href='.$_SERVER['PHP_SELF'].'?page='.$next_page.'><b> --> </b></a>';
}
print "";
} else {
echo '<a href='.$_SERVER['PHP_SELF'].'?page='.$prev_page.'><b> <-- </b></a>';
}
if ($next_page > $num_pages){
print "";
} else {
echo '<a href='.$_SERVER['PHP_SELF'].'?page='.$next_page.'><b> --> </b></a>';
}
Код:
$startItem - порядковый номер записи
$itemsCount - всего записей из БД, которые могут быть
$unitsPerPage - записей показываемых на одной странице
$unitsInNavbar - сколько ссылок будет в "листалке"
$URLString - опционально, если хочется получить уже готовые ссылки, типа article8.htm - в этом случае параметр $URLString будет выглядеть как article%d.htm
//============================================
function GetNavArray($startItem, $itemsCount, $unitsPerPage, $unitsInNavbar, $URLString=null)
{
$num_units_all=ceil($itemsCount/$unitsPerPage);
$actual_block=floor(($startItem/$unitsPerPage)/$unitsInNavbar);
$end_block=$num_units_all/$unitsInNavbar;
$start_unit=floor(($actual_block*$unitsInNavbar)+1);
$end_unit=$start_unit+$unitsInNavbar;
for($n=$start_unit; $n<$end_unit; ++$n){
$val = (int)(($n*$unitsPerPage)-$unitsPerPage);
if($val<=$startItem) $ret['actual_unit'] = $n;
$ret['pages'][$n] = is_null($URLString) ? $val : sprintf($URLString, $val);
}
$start_unit!=1 ? $ret['prev_arrow'] = $actual_block * (($unitsPerPage * $unitsInNavbar) - $unitsPerPage) : $ret['prev_arrow'] = 0;
$actual_block < floor($num_units_all/$unitsInNavbar) ? $ret['next_arrow'] = $end_unit * $unitsPerPage - $unitsPerPage : $ret['next_arrow'] = 0;
if(!is_null($URLString)){
$ret['prev_arrow'] = $ret['prev_arrow'] ? sprintf($URLString, $ret['prev_arrow']) : 0;
$ret['next_arrow'] = $ret['next_arrow'] ? sprintf($URLString, $ret['next_arrow']) : 0;
}
return $ret;
}
//========================================================
Т.е., например GetNavArray(200, 30000, 20, 5, "article%d.htm") вернёт вот такой массив:
Код:
Array
(
[actual_unit] => 11
[pages] => Array
(
[11] => article200.htm
[12] => article220.htm
[13] => article240.htm
[14] => article260.htm
[15] => article280.htm
)
[prev_arrow] => article160.htm
[next_arrow] => article300.htm
)
// mfender; codenet.ru
$itemsCount - всего записей из БД, которые могут быть
$unitsPerPage - записей показываемых на одной странице
$unitsInNavbar - сколько ссылок будет в "листалке"
$URLString - опционально, если хочется получить уже готовые ссылки, типа article8.htm - в этом случае параметр $URLString будет выглядеть как article%d.htm
//============================================
function GetNavArray($startItem, $itemsCount, $unitsPerPage, $unitsInNavbar, $URLString=null)
{
$num_units_all=ceil($itemsCount/$unitsPerPage);
$actual_block=floor(($startItem/$unitsPerPage)/$unitsInNavbar);
$end_block=$num_units_all/$unitsInNavbar;
$start_unit=floor(($actual_block*$unitsInNavbar)+1);
$end_unit=$start_unit+$unitsInNavbar;
for($n=$start_unit; $n<$end_unit; ++$n){
$val = (int)(($n*$unitsPerPage)-$unitsPerPage);
if($val<=$startItem) $ret['actual_unit'] = $n;
$ret['pages'][$n] = is_null($URLString) ? $val : sprintf($URLString, $val);
}
$start_unit!=1 ? $ret['prev_arrow'] = $actual_block * (($unitsPerPage * $unitsInNavbar) - $unitsPerPage) : $ret['prev_arrow'] = 0;
$actual_block < floor($num_units_all/$unitsInNavbar) ? $ret['next_arrow'] = $end_unit * $unitsPerPage - $unitsPerPage : $ret['next_arrow'] = 0;
if(!is_null($URLString)){
$ret['prev_arrow'] = $ret['prev_arrow'] ? sprintf($URLString, $ret['prev_arrow']) : 0;
$ret['next_arrow'] = $ret['next_arrow'] ? sprintf($URLString, $ret['next_arrow']) : 0;
}
return $ret;
}
//========================================================
Т.е., например GetNavArray(200, 30000, 20, 5, "article%d.htm") вернёт вот такой массив:
Код:
Array
(
[actual_unit] => 11
[pages] => Array
(
[11] => article200.htm
[12] => article220.htm
[13] => article240.htm
[14] => article260.htm
[15] => article280.htm
)
[prev_arrow] => article160.htm
[next_arrow] => article300.htm
)
// mfender; codenet.ru