За последние 24 часа нас посетили 16113 программистов и 1547 роботов. Сейчас ищут 913 программистов ...

скрипт постраничной навигации, проблема привязки к сайту

Тема в разделе "PHP для новичков", создана пользователем semjaza, 20 мар 2014.

  1. semjaza

    semjaza Новичок

    С нами с:
    22 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    Проблемка такая-задался мыслью переделать свой сайт www.юдиз.рф...в том числе и навигацию постраничную...так как она была написана не мной и случайно получилось прикрутить её на сайт...сейчас стараюсь осмыслить каждую строчку php кода на сайте...чтобы не возникало кучи "###кода"...
    Смысл такой -есть страница статей,которые выводятся в цикле foreach...
    Код (Text):
    1.  
    2. <?foreach($statii as $item):?>
    3. <div class="krug"><?=$item['views'];?></div>
    4.         <div class="zag_stat"><a id="zagolovok" href="index.php?category_id=statii&t=<?=$item['title_url'];?>"><span><?=$item['title'];?></span></a><br /> <!--заголовок статьи-->
    5.         <span class="author_stat">Автор статьи:&nbsp;&nbsp;<span class="author_cvet"><?=$item['author'];?></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<!--автор статьи-->
    6.         <span class="data_stat">Дата размещения:&nbsp;&nbsp;<span class="data_cvet"><?=$item['date'];?>/<?=$item['time'];?></span></span><!--дата размещения статьи-->
    7.         </div><br />
    8.         <div class="krug2"><img src="userfiles/news/<?=$item['img'];?>"/></div><!--картинка к статье-->
    9.         <div class="obram"><img src="images/obram_pravo.png"/></div><!--элемент оформления-->
    10.         <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><!--текст статьи,обработанный функцией обрезки символов-->
    11.         <br /><br />
    12. <div class="line"></div><!--элемент оформления-->
    13. <?endforeach;}?>
    нашёл целый класс в инете для пагинатора...
    Код (Text):
    1.  
    2. <?php
    3. /**
    4.  * @author Artem aka Moskitos <arty-komarov@yandex.ru>
    5.  */
    6. class SimPageNav
    7. {
    8.     protected $id;
    9.     protected $startChar;
    10.     protected $prevChar;
    11.     protected $nextChar;
    12.     protected $endChar;
    13.      
    14.     /**
    15.      * Конструктор
    16.      * @param string $id        - атрибут ID элемента <UL> - постраничной навигации
    17.      * @param string $startChar - текст ссылки "В начало"
    18.      * @param string $prevChar  - текст ссылки "Назад"
    19.      * @param string $nextChar  - текст ссылки "Вперед"
    20.      * @param string $endChar   - текст ссылки "В конец"
    21.      */
    22.     public function __construct( /*string*/ $id     = 'pagination',
    23.                                  /*string*/ $startChar = '&laquo;',
    24.                                  /*string*/ $prevChar  = '&lsaquo;',
    25.                                  /*string*/ $nextChar  = '&rsaquo;',
    26.                                  /*string*/ $endChar   = '&raquo;'  )
    27.     {
    28.       $this->id = $id;
    29.       $this->startChar = $startChar;
    30.       $this->prevChar  = $prevChar;
    31.       $this->nextChar  = $nextChar;
    32.       $this->endChar   = $endChar;
    33.     }  
    34.      
    35.   /**
    36.    * Получить HTML - код постраничной навигации
    37.    * @param int $all        - Полное кол-во элементов (Материалов в категории)
    38.    * @param int $limit      - Кол-во элементов на странице
    39.    * @param int $start      - Текущее смещение элементов
    40.    * @param int $linkLimit  - Количество ссылок в состоянии
    41.    * @param string $varName - Имя GET - переменной которая будет использоваться в постр. навигации.
    42.    * @return string
    43.    */
    44.     public function getLinks( /*int*/ $all, /*int*/ $limit, /*int*/ $start, $linkLimit = 10, $varName = 'start' )
    45.     {
    46.       // Нихрена не делаем, если лимит больше или равен кол-ву всех элементов вообще,
    47.       // И если лимит = 0. 0 - будет означать "не разбивать н астраницы".
    48.       if ( $limit >= $all || $limit == 0 ) {
    49.         return NULL;
    50.       }    
    51.          
    52.       $pages     = 0;       // кол-во страниц в пагинации
    53.       $needChunk = 0;       // индекс нужного в данный момент чанка
    54.       $queryVars = array(); // ассоц. массив полученный из строки запроса
    55.       $pagesArr  = array(); // пременная для промежуточного хранения массива навигации
    56.       $htmlOut   = '';      // HTML - код постраничной навигации
    57.       $link      = NULL;    // формируемая ссылка
    58.        
    59.       // В этом блоке мы просто строим ссылку - такую же, как та, по которой
    60.       // пришли на данную страницу, но извлекаем из неё нашу GET-переменную:
    61.       parse_str($_SERVER['QUERY_STRING'], $queryVars ); //   &$queryVars
    62.        
    63.       // Убиваем нашу GET-переменную
    64.       if( isset($queryVars[$varName]) ) {
    65.         unset( $queryVars[$varName] );
    66.       }
    67.        
    68.       // Формируем такую же ссылку, ведущую на эту же страницу:
    69.       $link  = $_SERVER['PHP_SELF'].'?'.http_build_query( $queryVars );
    70.  
    71.       //--------------------------------------------------------
    72.        
    73.       $pages = ceil( $all / $limit ); // кол-во страниц
    74.        
    75.       // Заполняем массив: ключ - это номер страницы, значение - это смещение для БД.
    76.       // Нумерация здесь нужна с единицы. А смещение с шагом = кол-ву материалов на странице.
    77.       for( $i = 0; $i < $pages; $i++) {
    78.           $pagesArr[$i+1] = $i * $limit;
    79.       }
    80.        
    81.       // Теперь что бы на странице отображать нужное кол-во ссылок
    82.       // дробим массив со значениями [№ страницы] => "смещение" на
    83.       // Части (чанки)
    84.       $allPages = array_chunk($pagesArr, $linkLimit, true);
    85.        
    86.       // Получаем индекс чанка в котором находится нужное смещение.
    87.       // И далее только из него сформируем список ссылок:
    88.       $needChunk = $this->searchPage( $allPages, $start );
    89.        
    90.       // Формируем ссылки "В начало", "передыдущая" ------------------------------------------------
    91.        
    92.       if ( $start > 1 ) {
    93.         $htmlOut .= '<li><a href="'.$link.'&'.$varName.'=0">'.$this->startChar.'</a></li>'.
    94.                     '<li><a href="'.$link.'&'.$varName.'='.($start - $limit).'">'.$this->prevChar.'</a></li>';  
    95.       } else {
    96.         $htmlOut .= '<li><span>'.$this->startChar.'</span></li>'.
    97.                     '<li><span>'.$this->prevChar.'</span></li>';
    98.       }
    99.       // Собсно выводим ссылки из нужного чанка
    100.       foreach( $allPages[$needChunk] AS $pageNum => $ofset )  {
    101.         // Делаем текущую страницу не активной:
    102.         if( $ofset == $start  ) {
    103.             $htmlOut .= '<li><span>'. $pageNum .'</span></li>';            
    104.             continue;
    105.         }        
    106.         $htmlOut .= '<li><a href="'.$link.'&'.$varName.'='. $ofset .'">'. $pageNum . '</a></li>';
    107.       }
    108.          
    109.       // Формируем ссылки "следующая", "в конец" ------------------------------------------------
    110.          
    111.       if ( ($all - $limit) >  $start) {
    112.         $htmlOut .= '<li><a href="' . $link . '&' . $varName . '=' . ( $start + $limit) . '">' . $this->nextChar . '</a></li>'.
    113.                     '<li><a href="' . $link . '&' . $varName . '=' . array_pop( array_pop($allPages) ) . '">' . $this->endChar . '</a></li>';            
    114.       } else {
    115.         $htmlOut .= '<li><span>' . $this->nextChar . '</span></li>'.
    116.                     '<li><span>' . $this->endChar . '</span></li>';        
    117.       }        
    118.       return '<ul id="'.$this->id.'">' . $htmlOut . '<ul>';
    119.     }
    120.  
    121.     /**
    122.      * Ищет в каком чанке находится сраница со смещением $needPage
    123.      * @param array $pagesList массив чанков (массивов страниц разбитый по лимиту ссылок на странице)
    124.      * @param int $needPage - смещение
    125.      * @return number Ключ чанка в котором есть нужная страница
    126.      */
    127.     protected function searchPage( array $pagesList, /*int*/$needPage )
    128.     {
    129.         foreach( $pagesList AS $chunk => $pages  ){
    130.             if( in_array($needPage, $pages) ){
    131.                 return $chunk;
    132.             }
    133.         }
    134.         return 0;
    135.     }    
    136. }
    Автор при использовании предлагает вставить код на страницу вида

    Код (Text):
    1.  
    2. //Пользоваться очень просто:
    3.  
    4. $start = isset($_GET['start']) ? intval($_GET['start']) : 0;
    5.  
    6. $pageNav = new SimPageNav();
    7.  
    8. echo $pageNav->getLinks( 110, 7, $start, 5, 'start' );
    Это всё безусловно работает,НО

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

    Код (Text):
    1.  
    2. echo "<ul>";
    3.     //перебираем в цикле массив и выводим на экран
    4.     for($i = 0; $i < count($arr[$parent_id]);$i++) {
    5.         echo "<li><a href=\"?category_id={$arr[$parent_id][$i]['title_url']}&parent_id={$parent_id}\""
    6.         .($_GET['category_id'] == $arr[$parent_id][$i]['title_url'] ? ' class="menu-active"':'')
    7.         .">{$arr[$parent_id][$i]['title']}</a>";
    8.         //рекурсия - проверяем нет ли дочерних категорий
    9.         view_cat($arr,$arr[$parent_id][$i]['title_url']);
    10.         echo "</li>";
    11.     }
    12.     echo "</ul>";
    Понимаю что вроде как изобретаю велосипед,но хочу сделать универсальный пагинатор....понятный для себя...

    помогите начинающему программисту)))
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ты же часть ссылок выводишь это надо смотреть на запрос к базе что бы конкретней сказать.

    Товарищ а как вы относитесь к работе за идею? Мне тут надо для себя 2 не сложные страницы нарисовать, но нет дизайнера.
    Со своей стороны помогу постичь волшебный и загадочный мир программирования.
     
  3. semjaza

    semjaza Новичок

    С нами с:
    22 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    можно))ТЗ?направленность?цветовая гамма?особые пожелания?))))жду))