Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z smarty
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
gandziorz
Witam,
Mam do wszystkich prośbę jak coś takiego wykonać w smarty?

SQL/php
  1. <?php
  2. //(...)
  3. $strona = (int)$_GET['strona'];
  4. if (empty($strona) or $strona==1) {
  5. $strona = 1;
  6. $str1 = 1;
  7. $str2 = 20;
  8. } else {
  9. $str1 = $strona*20-19;
  10. $str2 = $strona*20;
  11. }
  12.  
  13. //pobieranie danych wg. kryteriow
  14. $sql = "SELECT * FROM ogloszenia WHERE kategoria='$kat' AND status=3 ORDER BY id DESC LIMIT $str1, $str2";
  15. if($res = mysql_query ($sql)) {
  16. $znalazl = mysql_num_rows($res);
  17. $stron = @floor($znalazl/20);
  18. if ($stron < 1) {
  19. $stron = 1;
  20. } elseif ($strona > $stron) {
  21. $strona = $stron;
  22. }
  23. for ($i=1; $i<$stron; $i++) {
  24. $strony = $i;
  25. }
  26. for ($i=1; $i<$znalazl; $i++) {
  27. $wiersz = mysql_fetch_array($res);
  28. $ogloszenia[$i] = $wiersz;
  29. }}
  30.  
  31. $smarty->assign ('ogloszenia', $ogloszenia);
  32. $smarty->assign ('strona', $strona);
  33. $smarty->assign ('stron', $stron);
  34. $smarty->assign ('strony', $strony);
  35. $smarty->assign ('katstr', $kat);
  36. $smarty->assign ('str1', $str1);
  37. $smarty->assign ('str2', $str2);
  38. $smarty->display ('ogloszenia.tpl');
  39. ?>


Smarty:
  1. {section name=a loop=$strony}
  2. <a href="kategoria,{$katstr},{$strony[a]}.html">{$strony[a]}</a>
  3. {if $strona == $strony[a]}
  4. <b><a href="kategoria,{$katstr},{$strony[a]}.html">{$strony[a]}</a></b>
  5. {/if}
  6. {/section}
Zyx
Robisz sekcję i w niej alternatywę: jeżeli nie jest wyświetlany link do aktualnej strony, to dajesz link w jednej formie, a jeżeli to jest aktualna strona, to w innej. Dalsze błędy masz w samym skrypcie:

  1. <?php
  2. $sql = "SELECT * FROM ogloszenia WHERE kategoria='$kat' AND status=3 ORDER BY id DESC LIMIT $str1, $str2";
  3. if($res = mysql_query ($sql)) {
  4. $znalazl = mysql_num_rows($res);
  5. ?>


Otwieramy skrypt na jakiejś stronie i zapytanie zwraca Ci np. 20 rekordów (bo tyle na niej się maksymalnie mieści). Później robisz mysql_num_rows() i on Ci tę liczbę "20" zwraca. Na jej podstawie później próbujesz obliczyć, ile stron trzeba zrobić. To oczywiste, że tak wykonany skrypt zawsze Ci da w rezultacie link do jednej strony. Polecam napisać sobie jakieś uniwersalne rozwiązanie, np. klasę, do której tylko przekazujesz parametry, np. ilość elementów, ilość elementów na stronie oraz link, a ona już automatycznie dba o wygenerowanie listy stron, a nawet ułożenie fragmentu zapytania SQL (naturalnie wszystkie wartości do niego są przeliczane przez skrypt, więc nie ma obawy o SQL Injection). Jej użycie wygląda mniej więcej w ten sposób:

  1. <?php
  2. $ps = new pagesystem($sql -> get('SELECT COUNT(id) FROM tabela'), 30, 'jakasstrona.php');
  3. $stmt = $sql -> query('SELECT * FROM tabela '.$ps -> getLimit());
  4.  
  5. // tutaj sobie pobieramy wyniki
  6.  
  7. // a tu generujemy listę stron
  8. $tpl -> assign('pages', $ps -> make());
  9. ?>


Jeśli chodzi o szablonowe rozwiązanie tego problemu, dodam, że OPT posiada odpowiednią instrukcję do osadzania w szablonie list strony:

Kod
<p>{pagesystem name="ps"}
{page}[ <a href="{@url}">{@title}</a> ]{/page}
{active}[ <strong><a href="{@url}">{@title}</a></strong> ]{/active}
{separator}...{/separator}
{/pagesystem}</p>


Do jego obsługi potrzebna jest właśnie jakaś klasa stronicująca, która implementuje odpowiedni interfejs. Jak się często stronicowania używa, można sobie te wszystkie znaczniki {page} itd. przenieść do osobnego pliku i później jedynie importować.
gandziorz
  1. <?php
  2. $ps = new pagesystem($sql -> get('SELECT COUNT(id) FROM tabela'), 30, 'jakasstrona.php');
  3. $stmt = $sql -> query('SELECT * FROM tabela '.$ps -> getLimit());
  4. ?>

Możesz mi wyjaśnić co tutaj robi np. 30 i jakasstrona.php?

  1. <a href="{@url}">{@title}</a>

Hmnn czyli jak to ma być jeżeli adres ma być kategoria,9,STRONA.html (strona np. 1,2,3,4,5,6 ...) a nazwa tylko liczba strony np. 1,2,3...
Zyx
Ad. 1 - przecież napisałem to smile.gif.

Cytat
(łączna) ilość elementów, ilość elementów na stronie oraz link


Link, do którego mają prowadzić strony. Moja klasa dokleja do niego numer strony automatycznie.

Ad. 2 - właśnie tak, jak podaję (przypominam, że to jest OPT, a nie Smarty smile.gif). W szablonie tylko podajesz miejsce na adres URL (zmienna @url) oraz miejsce na numer strony (zmienna @title). Właściwie to rozwiązanie działa w ten sposób, że piszesz sobie klasę stronicującą, która implementuje odpowiedni interfejs i przekazujesz jej obiekt przez zwykły assign() do parsera. W szablonie wskazujesz ten obiekt, a parser już wtedy, korzystając z niego, automatycznie dokonuje żonglerki, wybierając kod raz ze znacznika "page", raz z "active" itd. i przekazując tam odpowiednie dane. W ten sposób otrzymujesz listę stron.
gandziorz
Wiem że forum nie należy do dawania gotowców ale nie potrafię tego wykonać i dopasować pod mój skrypt.
Możesz mi pomóc?

Link jaki ma być w <a to: kategoria,1,nr.strony.html
Baza:
  1. <?php
  2. "SELECT * FROM ogloszenia WHERE kategoria='$kat' AND status=3"
  3. ?>
Zyx
Z czym konkretnie masz problem? Chodzi o napisanie klasy, tudzież mechanizmu do dzielenia na strony? OK, najprostszy z możliwych tutorial. Zakładam, że w adresie URL przesyłasz numer strony. Teraz mamy prostą arytmetykę:

  1. <?php
  2. // Poniższe zmienne należy sobie samemu zainicjować, tu dałem przykładowe wartości
  3. $positions = 38458; // tyle mamy elementów
  4. $ppp = 40; // tyle elementów chcemy mieć na jednej stronie
  5. $active = 4; // ta strona jest aktywna
  6.  
  7. $mod = $positions % $ppp;
  8. $pages = ($positions - $mod) / $ppp;
  9. if($mod > 0)
  10. {
  11. $pages++;
  12. }
  13.  
  14. if($active < 1)
  15. {
  16. $active = 1;
  17. } 
  18. if($active > $pages)
  19. {
  20. $active = $pages;
  21. }
  22.  
  23. // i w $pages masz łączną ilość stron
  24. ?>


Zapytanie SQL:

  1. <?php
  2. $pdo -> query('SELECT * FROM ogloszenia WHERE kategoria=''.$kat.'' AND status=3 LIMIT '.(($active - 1) * $ppp).', '.$ppp);
  3. ?>


Wyświetlanie: jeżeli chcesz generować to po stronie php, to sobie zrób tablicę np. $pageList o takiej strukturze, że indeks oznacza numer strony, a wartość link. Teraz zrób sobie funkcję służącą do dopisywania do niej wartości z uwzględnieniem zakresu tablicy (tj. żeby numer strony nie był mniejszy od 1 lub większy od $pages). Do tablicy wpisujesz: stronę pierwszą, stronę ostatnią oraz zakres np. od $active-3 do $active+3 - czyli siedem stron będących w otoczeniu $active. Algorytm wyświetlania jest taki: sortujesz te elementy z zachowaniem indeksów (jest odpowiednia funkcja w php do tego) i jedziesz po nim pętlą foreach. Generujesz kod HTML dla każdej strony wraz z linkiem i pamiętasz cały czas w zmiennej numer poprzedniej strony. Jeżeli na początku pętli stwierdzisz, że poprzedni i obecny numer różnią się o więcej niż 1, to mamy przerwę w numeracji i w tym miejscu dodatkowo wstawiasz wielokropek. Wysyłasz to potem do parsera. Ewentualnie wyświetlanie możesz po stronie szablonu zaprogramować, ale nie wiem, jaki by to miało sens - później miałbyś strasznie dużo kopiowania tego i współczułbym Ci, gdybyś chciał np. to później popoprawiać smile.gif.

Klasę stronicującą opartą na tym pomyśle napisałem już dawno temu - wiem, że w którymś artykule moim zamieściłem jej pełen kod źródłowy (tyle że jeszcze w wersji na PHP4). Dołączyłem ją też do Open Power Template'a, tyle że z mechanizmem wyświetlania przerobionym pod ten system szablonów.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.