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
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
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.
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
Podany kod to tylko przykład - cieszę się, że działa poprawnie (sprawdziłem na Twojej stronce).
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
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:
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/).
Order allow,deny
Deny from all
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
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:
<?php if ($stron > 0) { for ($i = 1; $i <= $stron; $i++) { ?>
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:
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.