Paginacja - wyświetlanie 8 odnośników

0

Witam!

Bazuję na kodzie tej starej paginacji z Waszego forum (a konkretniej to chyba z phpbb2): [php] Stronicowanie/Paginacja (wyświetlanie ilości stron)

I udało mi się to ostylizować, wszystko śmiga, ale stwierdziłem, że chciałbym, aby ta paginacja działała w zakresie 1 - 8 i tyle.

Obecnie, jeśli mamy przykładowo 12 stron do wyświetlenia w tej paginacji i jesteśmy obecnie na ostatniej stronie (12) to paginacja układa się następująco:

<< 1 2 3 ... 5 6 7 8 9 10 11 12 >>

Ja chciałbym, aby zawsze było te 8 stron, czyli powyższy przykład wyglądałby tak:

<< 5 6 7 8 9 10 11 12

czyli mamy 8 odnośników paginacji i żadnych kropek, podziałów w środku i innych cudów.
Efekt ma być podobny do tego, który można zaobserwować chociażby na youtube w paginacji filmów.

Czy ktoś byłby na tyle łaskaw i pomógł mi ten kod ukrócić tak, abym otrzymał zamierzony efekt?

Pozdrawiam!

0

odświeżam

0

Wklej kod, to Ci powiem jak przerobić ;)

0

Oto kod:

function pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = true)
{
    $temp = new Template();
    $temp->set_filenames(array(
        'body' => 'pagination_body.tpl')
    );
     
    $total_pages = ceil($num_items/$per_page); // ilość stron
 
    $amp = strpos($base_url, '?') !== false ? '&amp;' : '?'; // czy łączyć "?" czy "&"
    if ($total_pages == 1 || !$num_items) // ilość elementów = 1?
    {
        if ($start_item % $per_page == 0)
        {
            $temp->assign_block_vars('one_item', array());
            return $temp->pparse('body');
        }
        else
        {
            $temp->assign_block_vars('starting', array(
                'U_LINK' => $base_url . $amp . 'start=0')
            );
            return $temp->pparse('body');
        }
    }
 
    $on_page = floor($start_item / $per_page) + 1; // ilosc na strone
    $page_string = ($add_prevnext_text && $on_page!=1 || $start_item % $per_page != 0) ? '<div class="elements"><a href="'. $base_url . $amp . 'start=' . max(0,($on_page-2)*$per_page) . '">&#171;</a></div>' : ''; // poczatkowy << (o ile jestesmy dalej niz na 1 stronie)
 
    if ($total_pages>10) // wiecej niz 10 stron
    {
        for($i = 1; $i <= 3; $i++) // poczatkowe 3 strony wyswietlane zawsze
        {
            $page_string .= ($i == $on_page) ? '<div class="active">' . $i . '</div>' : '<div class="elements"><a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a></div>';
        }
 
        $start1=max(4,floor($on_page/2)-1); // ustalenie poczatku i konca 2 czesci ( 3 ... [tutaj] ... srodek ... ... koniec)
        $end1=max(4,min($total_pages-3,floor($on_page/2)+1));
 
        $start2=max($end1+1,min($total_pages-6,max(4,$on_page-4))); // ustalenie poczatku i konca 3 czesci ( 3 ... ... ... [tutaj] ... ... koniec)
        $end2=max(6,min($total_pages-3,$on_page+4));
 
        $start3=max($end2+1,min($total_pages-3,floor($on_page+($total_pages-$on_page)/2)-2));  // ustalenie poczatku i konca 4 czesci ( 3 ... ... ...  ... ... [tutaj] ... koniec)
        $end3=min($total_pages-3,max(4,floor($on_page+($total_pages-$on_page)/2)));
 
        if ($start1>4)
        {
            $page_string .= '<div class="separator">...</div>'; // jesli 2 czesc sie zaczyna dalej niz na 4 stronie
        }
        if ($start2>=$end1) // jesli 2 czesc w ogole istnieje
        for($i = $start1; $i <= $end1; $i++)
        {
            $page_string .= ($i == $on_page) ? '<div class="active">' . $i . '</div>' : '<div class="elements"><a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a></div>';
        }
        if ($start2-$end1>1) // jesli 2 czesc jest przynajmniej o 1 odlegla od nastepnej
        {
            $page_string .= '<div class="separator">...</div>';
        }
        for($i = $start2; $i <= $end2; $i++) // srodkowa czesc
        {
            $page_string .= ($i == $on_page) ? '<div class="active">' . $i . '</div>' : '<div class="elements"><a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a></div>';
        }
 
        if ($start3-$end2>1) // jesli 4 czesc jest przynajmniej o 1 odlegla od nastepnej
        {
            $page_string .= '<div class="separator">...</div>';
        }
        for($i = $start3; $i <= $end3; $i++) // 4 czesc
        {
            $page_string .= ($i == $on_page) ? '<div class="active">' . $i . '</div>' : '<div class="elements"><a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a></div>';
        }
 
        if ($end2<$total_pages-3) // jesli ostatnia czesc jest konczy sie na wiecej niz 3 strony od konca
        {
            $page_string .= '<div class="separator">...</div>';
        }
 
        for($i = $total_pages-2; $i <= $total_pages; $i++) // koncowe strony
        {
            $page_string .= ($i == $on_page) ? '<div class="active">' . $i . '</div>' : '<div class="elements"><a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a></div>';
        }
    }
    else // mniej niz 10 sttron - wyswietlamy cala liste
    {
        for($i = 1; $i <= $total_pages; $i++)
        {
            $page_string .= ($i == $on_page) ? '<div class="active">' . $i . '</div>' : '<div class="elements"><a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a></div>';
        }
    } // dodanie koncowej >>, jesli nie jestesmy na ostatniej stronie
    $page_string .= ($on_page == $total_pages || !$add_prevnext_text) ?'': '<div class="elements"><a href="'. $base_url . $amp . 'start='.$on_page*$per_page . '">&#187;</a></div>';
 
    $ret = $temp->assign_block_vars('other', array(
        'U_OTHER' => $page_string)
    );
    return $temp->pparse('body');
}
0

Ja rozumiem, że DRY i te sprawy, ale to trochę za bardzo rozlazłe jest do takiego zastosowania jakie chcesz uzyskać :>

0

Dlaczego rozlazłe? Po prostu ten kod dzieli strony w stylu: 1 2 3 ... 45 46 47 48 49
A ja chcę, aby wyświetlał obecną stronę + 3 strony zapasu z prawej i 3 strony zapasu z lewej, czyli (zakładając, że obecna strona to 40):

<< 37 38 39 40 41 42 43 >>

i tyle.

0

To do podmiany. Pisane z palca, ale powinno działać. Da się to zoptymalizować. Ja bym to w ogóle przepisał, bo ten kod to tragedia.

if ($total_pages>7) // wiecej niz 7 stron
    {
        $start=max(1,$on_page - 3); //ustalenie poczatku paginacji
        $end=max($total_pages, $start + 7); //Ze względy na pierwszego if'a to max jest niepotrzebne - wystarczyłoby $Start + 7, ale zostawiam dla bezpieczeństwa.
       
        for($i = $start; $i <= $end; $i++)
        {
            $page_string .= ($i == $on_page) ? '<div class="active">' . $i . '</div>' : '<div class="elements"><a rel="nofollow" href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a></div>';
        }
    }
0

Będąc na pierwszej stronie, wyświetla wszystkie wyniki (12 stron), a bedąc na stronie 12, wylicza dalsze strony dla (ktorych nie ma juz wynikow do wyswietlenia).
Dlaczego mowisz, ze kod jest az tak zly ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1