Numery kolejnych podstron

Chciałem się zapytać Was w jaki sposób mogę sobie zrobić na mojej stronie internetowej numerowanie podstron ?

W taki sposób żebym tutaj: http://www.history.is.net.pl/uzytkownicy pod tą tabelką z użytkownikami miał po prawej stronie napis typu: Idź do strony: i tutaj obok numerki każdej z podstron, które byłyby linkami. Coś jak jest tutaj to zrobione: Klik

Generalnie chodzi o to, żebym na jednej podstronie miał w tabelce 30 użytkowników, a jak ktoś kliknie cyferje 2 to bedę miał kolejne 30 użytkowników. Jak takie coś zrobić na mojej stronce http://www.history.is.net.pl ?

Czt ktoś może mi pomóc w tej sprawie ? Bardzo Was prosze o pomoc :frowning:

Moja strona wogóle nie opiera się o baze mysql więc chciałbym to stronicowanie zrobic bez użycia bazy danych.

Czy mógłby mi ktoś pomóc w tym ?

Jedyną moja jakby bazą danych jest taki plik: sqlite.php

<?php

class DB {

    protected $db;

    const OK = 0;

    const ERROR_INVALID_QUERY = 1;

    const ERROR_INVALID_QUERY_PARAM = 2;

    const ERROR_UNKNOWN = -1;


    static protected $types = array(

        'boolean' => SQLITE3_INTEGER, // hack

        'integer' => SQLITE3_INTEGER,

        'string' => SQLITE3_TEXT,

        'NULL' => SQLITE3_NULL,

        'double' => SQLITE3_FLOAT

    );


    protected $error = 0;


    public function __get ($key) {

        if ($key === 'error') {

            return $this->error;

        }


        return null;

    }


    public function __construct ($db) {

        $this->db = new SQLite3($db);

    }


    protected function prepare ($query, $params = array()) {

        $db = $this->db;


        $q = $db->prepare($query);


        if ($q) {

            foreach ($params as $param => $value) {

                $type = gettype($value);


                if (isset(self::$types[$type])) {

                    $q->bindValue($param, $value, self::$types[$type]);

                } else {

                    $this->error = self::ERROR_INVALID_QUERY_PARAM;

                    return null;

                }

            }


            return $q;

        }


        $this->error = self::ERROR_INVALID_QUERY;

        return null;

    }


    public function selectAll($query, $params = array()) {

        $q = $this->prepare($query, $params);

        $result = array();


        if ($q && ($r = $q->execute())) {

            $this->error = self::OK;


            while ($row = $r->fetchArray(SQLITE3_ASSOC)) {

                $result []= $row;

            }

        }


        return $result;

    }


    public function select ($query, $params = array()) {

        $q = $this->prepare($query, $params);


        if ($q && ($r = $q->execute())) {

            $this->error = self::OK;


            return $r->fetchArray(SQLITE3_ASSOC);

        }


        return null;

    }


    public function query ($query, $params = array()) {

        $q = $this->prepare($query, $params);


        if ($q && $q->execute()) {

            $this->error = self::OK;

            return true;

        }


        return false;

    }

}

?>

Natomiast dane na temat użytkowników zarejestrowanych na mojej stronie są tutaj: uzytkownicy.php

<?php

if (!defined('IN_APP')) {

    exit;

}

?>

» Użytkownicy

Lp. Nazwa Użytkownika Email gg Miejscowość
<?php echo $index + 1; ?> <?php echo _e($uzytkownik[‘login’]); ?> ?php if ($uzytkownik[‘gg’]) { ? ?php echo $uzytkownik[‘skad’]; ?

W drugim pliku (uzytkownicy.php) korzystasz z tablicy $uzytkownicy, w której trzymasz wszystkie dane. Te dane pobierasz z bazy, ale zamiast pobierać wszystkie, musisz mieć indeks początkowy i końcowy i pobierać tylko tę część z bazy (odpowiedni WHERE w zapytaniu SQL). Te indeksy będą się zmieniały dla każdej podstrony - zresztą zamiast indeksów początkowego i końcowego wystarczy Ci numer strony (od 1 do n), a wtedy indeks początkowy to (-1)* a indeks końcowy to *-1 przy numeracji indeksów od 0. Dodatkowo pamiętaj, że ostatnia strona może nie być pełna.

Parametr numer strony możesz przekazywać do skryptu (uzytkownicy.php) poprzez jakąś zmienną (metoda GET). No i musisz znać liczbę stron (liczbę pozycji), żeby wiedzieć, ile linków z indeksami wygenerować.

W tym przypadku używaj po prostu właściwego indeksowania tablicy $uzytkownicy.

A czy mógłbyś mi to prościej wutlumaczyć na jakimś może przykładzie na którym mógłbym się wzorować co i jak zrobić ?

Wszystkie zmiany zaczynają się od linii

<?php foreach ($uzytkownicy as $index => $uzytkownik) {

która będzie bardziej rozbudowana:

<?php

  $liczba_stron = floor(($zakres + $pozycji_na_stronie - 1) / $pozycji_na_stronie);

  for ($index = 1; $index <= $liczba_stron; $index++) {

    echo "Idź do strony " . $index . "
";

  }

?>[/code]

Przy założeniu, że zmienne zakres i pozycji_na_stronie mają poprawne wartości (jak użyto w kodzie powyżej). Linka do bieżącej strony można wytłuścić i nie robić “klikalnym” dla zaznaczenia miejsca, gdzie jesteśmy (kod if ($index == $strona) echo “tu jesteś”; else “to echo co już jest powyżej”).

Uwaga: kod nie był testowany - napisałem go na czysto w Notepad++, więc jakby co, to mogą wyjść jakieś błędy/literówki - ale z tym sobie pewnie poradzisz.

<?php

  $pozycji_na_stronie = 30;

  if (isset($_GET['strona']) && is_numeric($_GET['strona']))

    $strona = intval($_GET['strona']);

  else

    $strona = 1;

  $poczatek = ($strona - 1) * $pozycji_na_stronie;

  $koniec = $strona * $pozycji_na_stronie;

  $zakres = count($uzytkownicy);

  if ($koniec > $zakres)

    $koniec = $zakres;

  for ($index = $poczatek; $index < $koniec; $index++) {

    $uzytkownik = $uzytkownicy[$index];


?>
<?php echo $index + 1; ?>

Potem już kod jest taki sam, jak masz.

Zmienna strona jest indeksowana od 1 i jej wartość jest przekazywana (po kliknięciu na link przez nas wygenerowany - info na końcu) jako parametr linka. Zmienne poczatek i koniec są indeksowane (jak Pan Bóg PHP przykazał) od 0, podobnie jak pozycje w tablicy uzytkownicy (pomijam w tym opisie znak $ na początku zmiennych), a zmienna koniec trzyma wartość o 1 większą niż ostatnia wartość do wyświetlenia (numer pierwszej pozycji na następnej stronie) - tak jest łatwiej operować, warunki są czytelniejsze, kod krótszy i mniej (zbędnych) operacji arytmetycznych (jak widać).



Teraz gdzieś u siebie na stronie musisz wygenerować stosowną listę z linkami do poszczególnych stron. Jak to umieścisz u siebie, pozostawiam Twojej inwencji, podam Ci tylko kod generujący prostą listę takich odnośników:

Pablo_Wawa zrobiłem tak jak napisałeś w pliku uzytkownicy.php:

<?php

if (!defined('IN_APP')) {

    exit;

}

?>

» Użytkownicy

Lp. Nazwa Użytkownika Email gg Miejscowość
<?php echo $index + 1; ?> <?php echo _e($uzytkownik[‘login’]); ?> ?php if ($uzytkownik[‘gg’]) { ? ?php echo $uzytkownik[‘skad’]; ?

[code]Parse error: syntax error, unexpected $end in /home/users/history/public_html/templates/uzytkownicy.php on line 35 Fatal error: spl_autoload() [function.spl-autoload]: Class Slim_Http_Cookie could not be loaded in /home/users/history/public_html/Slim/Http/CookieJar.php on line 285

Możesz mi pomóc przy tym ? Bardzo Cię prosze.

Pisząc

miałem na myśli to, że tej linijki już nie ma! Wywal ją zatem (i tę następną kończącą “?>” również).

Pablo_Wawa zrobiłem to w taki sposób jak widać poniżej tylko, że wtedy na mojej stronce widać wyświetalny napis „Idź do strony” dwa razy. :frowning:

http://www.history.is.net.pl/uzytkownicy

Jak zrobić żeby było tak jak tutaj jest to zrobione -> Zobacz sobie

I żeby mój link z „Idź do strony” zaczynał się równo od tabelki z użytkownikami ?

<?php

if (!defined('IN_APP')) {

    exit;

}

?>

» Użytkownicy

Lp. Nazwa Użytkownika Email gg Miejscowość
<?php echo $index + 1; ?> <?php echo _e($uzytkownik[‘login’]); ?> ?php if ($uzytkownik[‘gg’]) { ? ?php echo $uzytkownik[‘skad’]; ?

Możesz mi pomóc ? żeby mi to działało coś na tej zasadzie jak mam to zrobione w księdze góści numerowanie: http://www.history.is.net.pl/ksiega

Kolor czerwony oznacza kolor strony na której aktualnie się znajdujemy.

Żeby link nie był taki: http://www.history.is.net.pl/uzytkownicy?strona=1

Tylko np. taki: http://www.history.is.net.pl/uzytkownicy/1

Podany kod to tylko przykład - cieszę się, że działa poprawnie (sprawdziłem na Twojej stronce). :slight_smile:

Jeśli chciałbyś jeden wiersz (pod tabelką z listą użytkowników) z kolejnymi numerami stron (jak w podanym przez Ciebie przykładzie), to zamiast tego kodu

<?php

  $liczba_stron = floor(($zakres + $pozycji_na_stronie - 1) / $pozycji_na_stronie);

  for ($index = 1; $index <= $liczba_stron; $index++) {

    echo "Idź do strony " . $index . "
";

  }

?>

[/code]
który Ci podałem wcześniej, użyj np. tego kodu

[code]<?php $liczba_stron = floor(($zakres + $pozycji_na_stronie - 1) / $pozycji_na_stronie); $nawigacja = “Idź do strony”; for ($index = 1; $index <= $liczba_stron; $index++) { $nawigacja .= " " . $index . ""; } echo $nawigacja . " "; ?>

Co do tego, żeby zamiast linka ?strona=x można było używać /x to musisz to sobie skonfigurować na serwerze w mod_rewrite:

http://gajdaw.pl/varia/przyjazne-url-mod-rewrite/print.html

http://sprawnymarketing.pl/artykuly/mod-rewrite/

Zresztą korzystasz już z tego w księdze.

Teraz byłoby ok, ale ten link nie wiem jak zrobić żeby wyglądał tak jak chce. Jak to sobie ustawić, żeby było tak jak w księdze ? masz jakiś pomysł ?

I jak zrobić żeby „Idź do strony” było ciutkie wyżej pod tabelką z użytkownikami i żeby ten napis wyrównać z tabelką ?

I jak jestem na stronie 1 to żeby jedynka była czerwona a jak na stronie numer 2 to żeby 2 była czerwona ?

A jeśli chodzi o

to tutaj kwestia jest w pozycjonowaniu kodu HTML przez CSS - nie będzie łatwo zrobić to porządnie, bo tabelka jest wycentrowana (a tekst możesz przesunąć w prawo zwiększając margines lewy).

Najlepiej będzie obudować tabelkę (TABLE) w jakiegoś DIV’a i w nim po tabelce umieścić tę listę stron/linków - czyli w swoim kodzie przed

tak by wyszło
i kodzie z linkami do stron daj
i zobacz, czy to pomogło (mówię o jednym
otwierającym i jednym
zamykającym).

Dodane 19.12.2012 (Śr) 16:38

Już o tym wspomniałem wcześniej (ale kodu nie podałem - nie mogę Ci przecież wszystkiego pisać), możesz to zrobić tak:

<?php

  $liczba_stron = floor(($zakres + $pozycji_na_stronie - 1) / $pozycji_na_stronie);

  $nawigacja = "Idź do strony";

  for ($index = 1; $index <= $liczba_stron; $index++) {

    if ($index == $strona)

      $nawigacja .= " " . $index . "";

    else

      $nawigacja .= " " . $index . "";

  }

  echo $nawigacja . "
";

?>[/code]
gdzie musisz jeszcze w stylach CSS zdefiniować klasę wybrana, np tak:

[code]a.wybrana { font-weight: bold; color: red; }

Style masz w dwóch plikach: reset.css i style.css

A co do skróconych linków, to powiedz mi, jak to masz zrobione w księdze? Nie o kod strony mi chodzi (bo ten widzę), ale o to, jak sobie ustawiłeś konfigurację mod_rewrite (bo przecież nie masz pliku o nazwie 1 w folderze http://www.history.is.net.pl/ksiega/).

Kod ksiega.php nie jest potrzebny, bo tego się tam nie robi (skróconych linków). Masz w katalogu księga plik o nazwie .htaccess? Pokaż jego zawartość.

Co do CSS to wygląda w porządku, poprawiony kod dla linków podam Ci jutro.

Znalazłem coś takiego w pliku .htaccess

Order allow,deny

Deny from all



RewriteEngine On

RewriteBase /


RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php [QSA,L]
  1. Jesteś pewny, że to jest plik dokładnie z folderu ksiega?

  2. Jeśli tak, to jakie masz pliki w tym folderze ksiega (nazwy plików,nie zawartość)?

Pytam, bo coś mi tu nie gra… :frowning:

Nie mam foldery ksiega, mam tylko folder templates w którym są pliki typu: uzytkownicy.php, ksiega.php, newsy.php itd.

Plik .htaccess znajduje się w folderze głównym strony razem ze wszystkimi innymi plikami i folderami. Masz jakiś może pomysł ?

Czekam na ten kod od Ciebie :slight_smile:

Zauważyłem też, że moje numerowanie stron w księdze gości jeśli chodzi o linki wygląda tak:

  1. <?php if ($stron > 0) { for ($i = 1; $i <= $stron; $i++) { ?>
  2. <?php if ($i == $strona) {?><?php } ?><?php echo $i; ?><?php if ($i == $strona) {?><?php } ?><?php } } ?>
    [/code] Natomiast numerowanie newsow na stronie glownej jesli chodzi o linki wyglada tak:

[code]<?php if ($stron > 1) { ?>

Natomiast myśmy zastosowali takie rozwiązanie dlatego może te linki nie wyświetla tak jak powinno:

<?php

  $liczba_stron = floor(($zakres + $pozycji_na_stronie - 1) / $pozycji_na_stronie);

  $nawigacja = "Idź do strony";

  for ($index = 1; $index <= $liczba_stron; $index++) {

    if ($index == $strona)

      $nawigacja .= " " . $index . "";

    else

      $nawigacja .= " " . $index . "";

  }

  echo $nawigacja . "
";

?>[/code]


Linki powinny wyglądać tak:

[code]http://www.history.is.net.pl/uzytkownicy/1
A wyglądają tak:

http://www.history.is.net.pl/uzytkownicy?strona=1

Możesz mi pomóc ?

W końcu wyszło “na jaw” to, że Ty już masz w swoim kodzie ładnie opracowane generowanie linków do stron - w tym przypadku księgi. Nasz (w większości zaproponowany przeze mnie) kod użyty w uzytkownicy.php jest trochę podobny. Przerobię go by był dla użytkowników identyczny jak jest w księdze:

  1. <?php if ($stron > 0) { for ($i = 1; $i <= $stron; $i++) { ?>
  2. <?php if ($i == $strona) {?><?php } ?><?php echo $i; ?><?php if ($i == $strona) {?><?php } ?><?php } } ?>
    [/code]

Ale to nie znaczy, że to zadziała. To na razie wygeneruje ładne linki w formacie takim, jak w księdze - przy tych zmianach w CSS, jakie wcześniej zaproponowałeś (to nie zmiany, ale normalna zawartość CSS, która jest używana również w ksiega.php).

Teraz najważniejsze - Te skrócone linki http://www.history.is.net.pl/ksiega/1 są dzięki plikowi .htaccess (tym w głównym folderze) interpretowane na jakąś postać typu http://www.history.is.net.pl/ksiega.php?strona=1, z tym, że nie wiem (jeszcze), jaka zmienna jest używana w pliku ksiega.php do oznaczenia numeru bieżącej strony do wyświetlenia (w tym przykładzie użyłem zmiennej strona) - musisz zobaczyć, jak to jest w tym pliku .htaccess i ewentualnie również zrobić podobne wpisy odpowiadające uzytkownicy.php. Nie musisz podawać tu kodu tego pliku, ale podaj nazwę zmiennej, która odpowiada na numer strony, bo taką właśnie zmienną trzeba w nim potem używać (ja “wymyśliłem” nazwę strona i taka zmienna jest potem używana w kodzie - być może trzeba to będzie teraz zmienić - albo w kodzie uzytkownicy.php, albo we wpisie .htaccess).

Czy wszystko jest teraz jasne? Co do tych skróconych linków, to jak masz czas, przeczytaj sobie te artykuły, których linki podałem wcześniej:

Umieściłem kod który podałeś ale on nie działa ponieważ nie wyświetla mi wogóle tabelki na stronie :frowning:

<?php

if (!defined('IN_APP')) {

    exit;

}

?>

» Użytkownicy

Lp. Nazwa Użytkownika Email gg Miejscowość
<?php echo $index + 1; ?> <?php echo _e($uzytkownik[‘login’]); ?> ?php if ($uzytkownik[‘gg’]) { ? ?php echo $uzytkownik[‘skad’]; ?
  1. ?php if ($stron 0) { for ($i = 1; $i = $stron; $i++) { ?
  2. ?php if ($i == $strona) {??php } ??php echo $i; ??php if ($i == $strona) {??php } ??php } } ?
    [/code]

W pliku ksiega.php jest używana zmienna $i oraz $strona

Mozesz mi pomóc to zrobić ?

Wpisz kod

$stron = floor(($zakres + $pozycji_na_stronie - 1) / $pozycji_na_stronie);

przed kodem generującym linki, czyli np. zastąp kod

<?php

} ?>

kodem

<?php

  }

  $stron = floor(($zakres + $pozycji_na_stronie - 1) / $pozycji_na_stronie);

?>

No i jeszcze musisz mieć w pliku .htaccess takie same wpisy dotyczące uzytkownicy , jakie są dla ksiega , żeby linki dla kolejnych stron działały.

Teraz już działa prawie, ale tylko zamiast słowa „Idź do strony:” pisze mi „Strony:”

http://www.history.is.net.pl/uzytkownicy/1

Jakby się dało ten napis podnieść troche wyżej pod tabelke i lekko przesunąć tak, żeby był od krawędzi tabelki. Czy dałoby się tak ?

Co do napisu, to jest on zdefiniowany w pliku CSS:

.content .pagination:before {

    content: "Strony:";

    padding: 3px;

}

Jesli zmienisz tutaj to tekst, to w księdze też będzie zmienione. Jeśli to Ci nie pasuje, musisz dodać nową klasę, zdefiniować ją w CSS i użyć w kodzie strony. Przy okazji możesz ustawić w tej klasie ujemny margines górny i w ten sposób przesunąć tekst do góry.

Wciąż linki nie działają - brak wpisu w .htaccess