Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Постраничная навигация
 
 автор: Axxil   (16.11.2007 в 18:02)   письмо автору
 
 

Многим нужна, вопросы задаются постоянно.
Решил выложить своё решение.
1. Строится именно pagebar. Вне зависимости откуда берутся данные
2. Логика полностью отделена от шаблона
3. "Перемотки" вперёд - назад нет. Их функции выполняют крайние страницы блока.
4. Текущая страница всегда в центре, если есть возможность.
Сам код:


<?
  
/**
  /* @param $currentPage- текущая страница
  /* @param $allItems - общее количество элементов
  /* @param $itemsOnPage  - количество элементов на странице
  /* @param $blockLength - длина блока пейджера. (сколько страниц в пределах одной прокрутки) 
  */
    
function pager($currentPage,$allItems,$itemsOnPage,$blockLength){
      
// Подготовительные работы
      
if($blockLength%0){
        
$blockLength++;
      }
      
$add floor($blockLength/2);
      
$numOfPages ceil($allItems/$itemsOnPage);
      
$ret = array();
      
// Определяем границы блока
      
$firstInBlock $currentPage $add;
      
$lastInBlock $currentPage $add;
      
// Строим массив пейджера
      
if($firstInBlock <= 1){
        
$firstInBlock 1;
        
$lastInBlock $blockLength;
      }else{
        
$ret['first'] = 1;
      }
      if(
$lastInBlock>=$numOfPages){
        
$lastInBlock $numOfPages;
        
$firstInBlock $numOfPages $add*2;
      }else{
        
$ret['last'] = $numOfPages;
      }
      for(
$i=$firstInBlock;$i<=$lastInBlock;$i++){
        
$ret['current'][] = $i;
      }
      return 
$ret;
    }
?>

Пример использования:

<?
  $current 
= ((int)$_GET['page'] == 0)?1:(int)$_GET['page'];
  
$pager =  pager($current,1200,20,10);
?>
<style>
  a.current{
    font-weight:bold;
    color: blue;
  }
</style>
<?if(isset($pager['first'])){?>
  <a href="test.php?page=<?=$pager['first']?>">&laquo;</a>
  &nbsp;
<?}?>
<?
foreach($pager['current'] as $p){?>
  <a <?if($p == $current) echo "class='current'";?> href="test.php?page=<?=$p?>"><?=$p?></a>&nbsp;
<?}?>
<?
if(isset($pager['last'])){?>
  &nbsp;
  <a href="test.php?page=<?=$pager['last']?>">&raquo;</a>
<?}?>


На здоровье :)

   
 
 автор: exp   (16.11.2007 в 18:36)   письмо автору
 
   для: Axxil   (16.11.2007 в 18:02)
 

при переходе по ссылке test.php?page=-5
не высвечивается номер текущей страницы ))

так-же ?page=45676545

скрипт наверное будет пытаться их открыть если в пример использования не добавить чего-нибудь )

   
 
 автор: Axxil   (16.11.2007 в 22:47)   письмо автору
 
   для: exp   (16.11.2007 в 18:36)
 

ну так на то он и пример использования :)
дальше уже полёт фантазии

   
 
 автор: mihdan   (18.11.2007 в 23:30)   письмо автору
 
   для: Axxil   (16.11.2007 в 22:47)
 

Просто что-то. Не пробовали что-нибудь типа навигации яндекса написать - намного удобнее

   
 
 автор: Axxil   (19.11.2007 в 12:38)   письмо автору
 
   для: mihdan   (18.11.2007 в 23:30)
 

Так это и есть в стиле яндекса :)
просто перемотки на N страниц вперёд-назад нет. Сразу переходы к первой и последней странице.
Мне кажется перемотка на N страниц избыточна. Обычно люди листают страницы подряд и мало кто пользуется переходом на 10 страниц вперёд.
Но при желании перемотку в этот код можно добавить за пару минут.

PS а усложнять в этом деле ничего и не надо. Из-за запутанных объяснений (когда мешают постраничный вывод из базы и построение блока навигации) у начинающих создаётся впечатление что постраничная навигация это что-то запредельно сложное.

   
 
 автор: mihdan   (19.11.2007 в 13:10)   письмо автору
 
   для: Axxil   (19.11.2007 в 12:38)
 

Я раньше тож думал что перемотка не нужна пока сам не начал ее юзать. А то что сделать за пару минут - вы правы. Молодец что выложил - мож пригодиться кому-то

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования