Béton brut

Problem strony odwrócony

2010-10-26

Po rozwiązaniu wszystkich kluczowych problemów, którymi zajmuje się w obecnej chwili Internet (in vitro, wyklęcia przez lokalnych czarnoksiężników, “przemysł nienawiści”, opodatkowanie podatków, “mord łódzki”) postanowiłem zwrócić swe oczy w kierunku problemu, który dotyka każdego z nas. Chodzi oczywiście o paginację i to, jak obecnie akceptowane rozwiązanie powoduje, że nie da się spokojnie oglądać gołych dup.

Rozważmy standardowego blożka. Blożek wyświetla notatki, powiedzmy, dziesięć notatek. Na dole znajduje się link “Zobacz chopie do tyłu”, który wyświetla kolejne dziesięć notatek. Patrzymy na URI i widzimy, że jest to “strona druga” blożka.

Wizualnie idzie to tak:

Teraz rozważmy książkę, którą piszesz. Czy po napisaniu kolejnej strony nadajesz jej numer jeden i renumerujesz wszystkie wcześniejsze? Nie, to by nie miało sensu, sto pięćdziesiąta strona książki ma dokładnie taki numer. Książkę (hipotetyczną) czytamy od najstarszej napisanej strony do najnowszej strony. Notatki na blogu układa się zwykle w kolejności odwrotnej do daty opublikowania, co powoduje, że czytamy od ostatniej strony do pierwszej. Dlatego też taka paginacja nigdy nikomu nie sprawiała problemu. Ma sens.

Piotr Szotkowski podesłał mi rano stronę z rudymi paniami, utrzymywaną przez Tumblr. Wszystko ładnie i pięknie. Klikam na link i trafiam na http://adres/page/NUMER. Niestety, zdjęcie zostało opublikowane dawno temu, blogi z rudowłosymi publikują bardzo często, trafiam więc na stronę NUMER, która zdjęcia już nie zawiera.

Ujawnił się pewien problem. Do bloga zwykle dokładamy “z przodu” przez co wczorajsza strona dwadzieścia będzie pojutrze stroną czterdzieści pięć. Wysyłanie mnie na konkretną stronę bloga (“zobacz, jaki tu miał dobry okres, z tymi trzema notkami!”) prędzej czy później zaprowadzi mnie na manowce.

Prostym rozwiązaniem, którego nigdy nie widziałem na żywo, byłoby liczenie w drugą stronę. Zakładając, że blogi mało kiedy dodają coś z datą wsteczną i dokładają tylko na kupkę, chcemy żeby strony o identyfikatorach od 1…10 były zgrupowane jako page/1

Jak? Pewnie każdy z Was już wie. Normalnie paginacja to dwie liczby przekazywane do zapytania SQL, a konkretniej do polecenia LIMIT. Pierwszy parametr LIMIT mówi od którego rekordu należy zacząć, drugi ile wyświetlić. Więc:

LIMIT ($PAGE*LIMIT_PAGINACJI), LIMIT_PAGINACJI

a gdybyśmy chcieli liczyć od tyłu (gdzie MAX to liczba notatek):

LIMIT (MAX-($PAGE*LIMIT_PAGINACJI[/ref],LIMIT_PAGINACJI

Przyznaję, że nie jest to idealne rozwiązanie. Jest to jednak wystarczająco dobre rozwiązanie, abym mógł zobaczyć tę rudą, co mi ją Piotrek podesłał rano.