» » Paging – навігація по сторінках

Paging – навігація по сторінках

В кожному проекті присутня посторінкова навігація або пейджинг.
І щоб кожного разу не “винаходити велосипед”, я написав кілька функцій пейджингу і юзаю їх постійно.
Нагадаю, мій код розділяє логіку і дизайн, тому з системами побудованими за принципом MVC проблем не повинно бути.

Спочатку конфіги:
//paging
$giRowOnPage = 10;
$giRangePaging = 1; //1*2+1=3 номера сторінки в пейджингу, якщо =1, то будуть три цифри 1 2 3
$gaPagingLink = array(
  'first' => '<<',
  'prev' => '<',
  'next' => '>',
  'last' => '>>'
);
//paging


Тепер 3 основні функції:
getPageFromUrl
/**
 * витягуємо номер сторінки з урли
 * @author Sergunik
 * @param arr $gaPar глобальний масив параметрів, аналог $_GET
 * @return int $page
 */
function getPageFromUrl($gaPar) {
  foreach ($gaPar as $v) {
    if(preg_match('/^page_(\d+)$/', $v, $page)) {
      return $page[1];
    }
  }
  return 1;
}
generetePaging
/**
 * генератор нумерації сторінок (пейджингу)
 * @author Sergunik
 * @param str $query селект до mysql
 * @param str $url ссилка на сторінку
 * @return arr
 * Array (
    [rows] => 6
    [pages] => 2
    [page] => 1
    [limit_begin] => 0
    [limit_count] => 3
    [links] => Array (
            [0] => Array (
                    [url] => /statistic/search/page_1
                    [char] => 1
                )
            [1] => Array (
                    [url] => /statistic/search/page_2
                    [char] => 2
                )
        )
  )
 */
function generetePaging($query, $url) {
  global $db;
  global $gaPagingLink, $giRowOnPage, $giRangePaging, $gaPar;

  if(empty($query)) {
    return false;
  }

  $aPaging['rows'] = mysql_num_rows($db->myQuery($query));

  if ($aPaging['rows']>$giRowOnPage) {
    $aPaging['pages'] = intval(ceil($aPaging['rows'] / $giRowOnPage));
  } else {
    return false;
  }

  $aPaging['page'] = getPageFromUrl($gaPar);
  if ($aPaging['page']>1) {
    $aPaging['limit_begin'] = ($aPaging['page'] - 1) * $giRowOnPage;
  } else {
    $aPaging['limit_begin'] = 0;
  }
  $aPaging['limit_count'] = $giRowOnPage;

  $range = $giRangePaging*2+1;
  $url = rtrim($url, '/');
  $aPaging['links'] = array();
  if($aPaging['pages']<$range) {
    for($i=1;$i<=$aPaging['pages'];$i++) {
      $aPaging['links'][] = array(
        'url' => $url.'/page_'.$i,
        'char' => $i
      );
    }
  } else {
    $aPaging['links'][] = array(
      'url' => $url.'/page_1',
      'char' => $gaPagingLink['first']
    );
    $aPaging['links'][] = array(
      'url' => $url.'/page_'.((1==$aPaging['page'])?$aPaging['page']:$aPaging['page']-1),
      'char' => $gaPagingLink['prev']
    );

    $left = $aPaging['page']-$giRangePaging;
    $right = $aPaging['page']+$giRangePaging;

    if($left<1) {
      $res = 1-$left;

      $left += $res;
      $right += $res;
    } elseif ($right>$aPaging['pages']) {
      $res = $aPaging['pages']-$right;

      $left += $res;
      $right += $res;
    }
    for($i=$left;$i<=$right;$i++) {
      $aPaging['links'][] = array(
        'url' => $url.'/page_'.$i,
        'char' => $i
      );
    }

    $aPaging['links'][] = array(
      'url' => $url.'/page_'.(($aPaging['pages']==$aPaging['page'])?$aPaging['page']:$aPaging['page']+1),
      'char' => $gaPagingLink['next']
    );
    $aPaging['links'][] = array(
      'url' => $url.'/page_'.$aPaging['pages'],
      'char' => $gaPagingLink['last']
    );
  }

  return $aPaging;
}
print_paging
/**
 * виводим на екран пейджин, якщо він потрібен
 * @author Sergunik
 * @param arr $aPaging масив, який одержуєм з generetePaging()
 * @return true
 */
function print_paging($aPaging) {
  if($aPaging) {
    print('<div style="margin:5px auto; text-align:center;">');
    foreach($aPaging['links'] as $v) {
        print('<a href="'.$v['url'].'" style="margin-right:5px; padding:0 3px; color:#000;">'.$v['char'].'</a>');
    }
    print('</div>');
  }
}

Тепер спосіб використання:
В контролері чи модулі пишемо:
$query = 'SELECT * FROM `bookmark` WHERE `UserId`=1';

$aPaging = generetePaging($query, '/main/bookmark');
$aBookmark = $db->fetchRows($query.(($aPaging)?' LIMIT '.$aPaging['limit_begin'].','.$aPaging['limit_count']:''));

А в темплейті після виведення масиву $aBookmark, виводимо блок пейджингу:
if($aPaging) print_paging($aPaging);

Ось і все :)


468 24.11.13



Напівжирний Нахилений текст Підкреслений текст Перекреслений текст | Вирівнювання по лівому краю По центру Вирівнювання по правому краю | Вставка смайликів Вибір кольору | Прихований текст Вставка цитати Перетворити вибраний текст з транслітерації в кирилицю Вставка спойлеру