Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скрипт постраничной навигации, проблема привязки к сайту 
:(
    Опции темы
semjaza
Дата 19.3.2014, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.1.2014

Репутация: нет
Всего: нет



Проблемка такая-задался мыслью переделать свой сайт...в том числе и навигацию постраничную...так как она была написана не мной и случайно получилось прикрутить её на сайт...сейчас стараюсь осмыслить каждую строчку php кода на сайте...чтобы не возникало кучи "###кода"...
Смысл такой -есть страница статей,которые выводятся в цикле foreach...
Код

<?foreach($statii as $item):?>
<div class="krug"><?=$item['views'];?></div>
        <div class="zag_stat"><a id="zagolovok" href="index.php?category_id=statii&t=<?=$item['title_url'];?>"><span><?=$item['title'];?></span></a><br /> <!--заголовок статьи-->
        <span class="author_stat">Автор статьи:&nbsp;&nbsp;<span class="author_cvet"><?=$item['author'];?></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<!--автор статьи-->
        <span class="data_stat">Дата размещения:&nbsp;&nbsp;<span class="data_cvet"><?=$item['date'];?>/<?=$item['time'];?></span></span><!--дата размещения статьи-->
        </div><br />
        <div class="krug2"><img src="userfiles/news/<?=$item['img'];?>"/></div><!--картинка к статье-->
        <div class="obram"><img src="images/obram_pravo.png"/></div><!--элемент оформления-->
        <p class="text_stat"><?=str_size($item['text']),'...';?><a id="dalee" href="index.php?category_id=statii&t=<?=$item['title_url'];?>"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Читать далее →</span></a></p><!--текст статьи,обработанный функцией обрезки символов-->
        <br /><br />
<div class="line"></div><!--элемент оформления-->
<?endforeach;}?>


нашёл целый класс в инете для пагинатора...
Код

<?php
/**
 * @author Artem aka Moskitos <[email protected]>
 */
class SimPageNav
{
    protected $id;
    protected $startChar;
    protected $prevChar;
    protected $nextChar;
    protected $endChar;
     
    /**
     * Конструктор
     * @param string $id        - атрибут ID элемента <UL> - постраничной навигации
     * @param string $startChar - текст ссылки "В начало"
     * @param string $prevChar  - текст ссылки "Назад"
     * @param string $nextChar  - текст ссылки "Вперед"
     * @param string $endChar   - текст ссылки "В конец"
     */
    public function __construct( /*string*/ $id     = 'pagination', 
                                 /*string*/ $startChar = '&laquo;', 
                                 /*string*/ $prevChar  = '&lsaquo;', 
                                 /*string*/ $nextChar  = '&rsaquo;', 
                                 /*string*/ $endChar   = '&raquo;'  )
    {
      $this->id = $id;
      $this->startChar = $startChar;
      $this->prevChar  = $prevChar;
      $this->nextChar  = $nextChar;
      $this->endChar   = $endChar;
    }   
     
  /**
   * Получить HTML - код постраничной навигации
   * @param int $all        - Полное кол-во элементов (Материалов в категории) 
   * @param int $limit      - Кол-во элементов на странице
   * @param int $start      - Текущее смещение элементов
   * @param int $linkLimit  - Количество ссылок в состоянии
   * @param string $varName - Имя GET - переменной которая будет использоваться в постр. навигации.
   * @return string
   */
    public function getLinks( /*int*/ $all, /*int*/ $limit, /*int*/ $start, $linkLimit = 10, $varName = 'start' )
    {
      // Нихрена не делаем, если лимит больше или равен кол-ву всех элементов вообще,
      // И если лимит = 0. 0 - будет означать "не разбивать н астраницы".
      if ( $limit >= $all || $limit == 0 ) {
        return NULL;
      }     
         
      $pages     = 0;       // кол-во страниц в пагинации
      $needChunk = 0;       // индекс нужного в данный момент чанка
      $queryVars = array(); // ассоц. массив полученный из строки запроса
      $pagesArr  = array(); // пременная для промежуточного хранения массива навигации
      $htmlOut   = '';      // HTML - код постраничной навигации
      $link      = NULL;    // формируемая ссылка
       
      // В этом блоке мы просто строим ссылку - такую же, как та, по которой
      // пришли на данную страницу, но извлекаем из неё нашу GET-переменную: 
      parse_str($_SERVER['QUERY_STRING'], $queryVars ); //   &$queryVars
       
      // Убиваем нашу GET-переменную
      if( isset($queryVars[$varName]) ) {
        unset( $queryVars[$varName] );
      }
       
      // Формируем такую же ссылку, ведущую на эту же страницу:
      $link  = $_SERVER['PHP_SELF'].'?'.http_build_query( $queryVars );
 
      //-------------------------------------------------------- 
       
      $pages = ceil( $all / $limit ); // кол-во страниц
       
      // Заполняем массив: ключ - это номер страницы, значение - это смещение для БД.
      // Нумерация здесь нужна с единицы. А смещение с шагом = кол-ву материалов на странице.
      for( $i = 0; $i < $pages; $i++) {
          $pagesArr[$i+1] = $i * $limit;
      }
       
      // Теперь что бы на странице отображать нужное кол-во ссылок
      // дробим массив со значениями [№ страницы] => "смещение" на 
      // Части (чанки)
      $allPages = array_chunk($pagesArr, $linkLimit, true);
       
      // Получаем индекс чанка в котором находится нужное смещение.
      // И далее только из него сформируем список ссылок:
      $needChunk = $this->searchPage( $allPages, $start );
       
      // Формируем ссылки "В начало", "передыдущая" ------------------------------------------------
       
      if ( $start > 1 ) {
        $htmlOut .= '<li><a href="'.$link.'&'.$varName.'=0">'.$this->startChar.'</a></li>'.
                    '<li><a href="'.$link.'&'.$varName.'='.($start - $limit).'">'.$this->prevChar.'</a></li>';   
      } else {
        $htmlOut .= '<li><span>'.$this->startChar.'</span></li>'.
                    '<li><span>'.$this->prevChar.'</span></li>'; 
      }
      // Собсно выводим ссылки из нужного чанка
      foreach( $allPages[$needChunk] AS $pageNum => $ofset )  {
        // Делаем текущую страницу не активной:
        if( $ofset == $start  ) {
            $htmlOut .= '<li><span>'. $pageNum .'</span></li>';            
            continue;
        }        
        $htmlOut .= '<li><a href="'.$link.'&'.$varName.'='. $ofset .'">'. $pageNum . '</a></li>';
      }
         
      // Формируем ссылки "следующая", "в конец" ------------------------------------------------
         
      if ( ($all - $limit) >  $start) {
        $htmlOut .= '<li><a href="' . $link . '&' . $varName . '=' . ( $start + $limit) . '">' . $this->nextChar . '</a></li>'.
                    '<li><a href="' . $link . '&' . $varName . '=' . array_pop( array_pop($allPages) ) . '">' . $this->endChar . '</a></li>';            
      } else {
        $htmlOut .= '<li><span>' . $this->nextChar . '</span></li>'.
                    '<li><span>' . $this->endChar . '</span></li>';         
      }         
      return '<ul id="'.$this->id.'">' . $htmlOut . '<ul>';
    }
 
    /**
     * Ищет в каком чанке находится сраница со смещением $needPage
     * @param array $pagesList массив чанков (массивов страниц разбитый по лимиту ссылок на странице)
     * @param int $needPage - смещение
     * @return number Ключ чанка в котором есть нужная страница
     */
    protected function searchPage( array $pagesList, /*int*/$needPage )
    {
        foreach( $pagesList AS $chunk => $pages  ){
            if( in_array($needPage, $pages) ){
                return $chunk;
            }
        }
        return 0;
    }    
}


Автор при использовании предлагает вставить код на страницу вида

Код

//Пользоваться очень просто:
 
$start = isset($_GET['start']) ? intval($_GET['start']) : 0;
 
$pageNav = new SimPageNav();
 
echo $pageNav->getLinks( 110, 7, $start, 5, 'start' );


Это всё безусловно работает,НО

не могу понять как его связать с содержимым страницы?
понятно что через URL, но хоть убейте ...
у меня url формируется в рекурсивной функции...вот кусочек
Код

echo "<ul>";
    //перебираем в цикле массив и выводим на экран
    for($i = 0; $i < count($arr[$parent_id]);$i++) {
        echo "<li><a href=\"?category_id={$arr[$parent_id][$i]['title_url']}&parent_id={$parent_id}\""
        .($_GET['category_id'] == $arr[$parent_id][$i]['title_url'] ? ' class="menu-active"':'')
        .">{$arr[$parent_id][$i]['title']}</a>";
        //рекурсия - проверяем нет ли дочерних категорий
        view_cat($arr,$arr[$parent_id][$i]['title_url']);
        echo "</li>";
    }
    echo "</ul>";


Понимаю что вроде как изобретаю велосипед,но хочу сделать универсальный пагинатор....понятный для себя...

помогите начинающему программисту)))
PM MAIL   Вверх
Sanchezzz
Дата 25.3.2014, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Код

    /** 
     * Количество страниц
     * $count - количество записей 
     * $topage - по сколько выводить на страницу
     **/
    function countPage($count , $topage ){
        return ceil($count / $topage);
    }

    /** 
     * Получить старт выборки из бд.
     * $page - номер страницы 
     * $topage - по сколько выводить на страницу
     **/
    function startPage($page ,  $topage){
        return ($topage*($page-1));
    }
    
    /** 
     * Постраница в виде массива с приятными отступами количеством страниц, например как на хабре...
     * $page - номер страницы на которой мы находимся
     * $countPage - Общее количество страниц
     * $leftright - Количество страниц с каждой стороны
     **/
    function pageArr($page = 1 , $countPage = 50, $leftright=6){
        $arrPage  = array();
        $startpage= ($page-$leftright);
        if($startpage<1)$startpage=1;
        $endpage = $page+$leftright;
        if ($endpage>$countPage) $endpage=$countPage;
        for ($i=$startpage;$i<=$endpage;$i++) :
            $arrPage[$i] = $i;
        endfor;
        return $arrPage;
    }


startPage - offset для СУБД
countPage  получить количество страниц при известном лимите и количества записей
pageArr отдает нам массив, который просто нужно вывести через цикл например через foreach

БОНУС

Код

    /*
    *   Функция возвращает текущий URL удаляя из текущего URL указанные параметры и заменяя их новыми
    *   @param $param  новые параметры
    *   @param $clear_param удаляемые параметры,
    *   можно указывать массив или строку со значениями через запятую.
    *
    *    <a href="<?=current_url('sort=price','sort')?>">Сортировать по цене</a>
    */
    function current_url($param, $clear_param = array() ){
        $arr = array();
        $url = $_SERVER['REQUEST_URI'];
        $url = parse_url($url);
        if(isset($url['query'])){
            parse_str($url['query'], $arr);
            if(is_string($clear_param))  $clear_param = explode(',',$clear_param);
            foreach($clear_param as $item)    unset($arr[$item]);
            parse_str($param, $arr2);
            $arr =array_merge($arr,$arr2);    
        }
        return $url['path'] . (count($arr) > 0  ?'?' . http_build_query($arr):'');
    }


Я думаю из этого моёго добра, вы сделаете хорошее



--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.