Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Szablony...
Forum PHP.pl > Forum > PHP
kicaj
Jestem ciekaw jak Wy postepujecie z wyswietlaniem wynikow z np. z bazy piszac swoje templatesy...

Zalozmy ze mamy takie szablon:
  1. <table border="1">
  2. <tr>
  3. <td>lewa</td>
  4. <td>srodek</td>
  5. <td>prawa</td>
  6. </tr>

Teraz w jego srodku chcialbym wyswietlic tabelke ktora zawiera rekordy z MySQL, np. 5 wierszy? W jaki sposob Wy to rozwiazujecie?

P.S. Chodzi o jak najprostsze rozwiazania:)
mpps
zależy.
jeżeli rekordy mają nagłówki, to warto zastosować coś takiego:
  1. <? $result = mysql_query("SELECT * FROM news") or die("BAD QUERY");
  2. ?>
  3. <table border="1">
  4. <tr>
  5. <td>lewa</td>
  6.  
  7. <!-- środek początek -->
  8. <td>
  9. <table border="1">
  10. <? while($rek = mysql_fetch_array($result))
  11. {
  12. ?>
  13. <tr>
  14. <td>
  15. <?
  16. echo $rek[0]; //nagłówek rekordu, np. data
  17. ?>
  18. </td>
  19. </tr>
  20. <tr>
  21. <td>
  22. <?
  23. echo $rek[1]; //rekord
  24. ?>
  25. </td>
  26. </tr>
  27. <?
  28. }
  29. ?>
  30. </table>
  31. </td>
  32. <!-- środek koniec -->
  33.  
  34. <td>prawa</td>
  35. </tr>

przykład?
newsy, gdzie każdy news będzie miał swoją datę jako nagłówek.
jeżeli nie, to wystarczy zwykły <BR>.
można też połączyć obydwa rozwiązania.
np. (piszę w skrócie):
  1. <TD>
  2. rekord_data
  3. <BR>
  4. rekord_news
  5. </TD>
kicaj
eekh, nie zrozumiales...
mpps
to rozwiń myśl, chyba, że uważasz, że dla innych jest wystarczająco czytelnie.
chętnie poczytam odpowiedzi, bo też mnie to interesuje.
kicaj
Okey:)
Wiekszosc robi szablony tak:
  1. <?php
  2. $tpl -> setValue( 'nazwa', 'Jakas tam wprowadzona nazwa' );
  3. $tpl -> Display();
  4. ?>

W szablonie {nazwa} zamienia na "Jakas tam..."
I teraz jak Wy rozwiazujecie wyswietlanie wynikow np. z bazy danych, gdzie wiersze sa automatycznie generowane?
chfast
Ja bym zrobił tak:
Wszystkie wiersze z wyniku zapytania wrzuciłbym do jednej tablicy. I przekazałbym tą całą tablcę do systemu szablonów, który obsługuje tablice i tam już wszystko wyświetlał. W Smarty służą do tego znacznik section i foreach. To bardziej uniwersalny sposób.

Drugi, który przychodzi mi do głowy, Wykorzystując ADOdb i Smarty:
Po wykonaniu zapytania za pomocą ADOdb przekazałbym do Smarty cały obiekt $Result. Myśle, że możnaby go ładnie wyświetlić korzystając z możliwości Smarty.

Pisze teoretycznie, bo nie mam czasu sprawdzać. Innych systemów szablonów nie znam. Jakby coś było niejasne w mojej wypowiedzi to pytaj.
kicaj
Chce napisac wlasne szablony. I zacialem sie na wyswietlaniu wynikow z bazy mysql? Nie wiem kompletnie jak to rozwiazac... Kombinuje jak zrobic zeby dany wiersz byl powtarzany tyle razy ile jest rekordow w bazie smile.gif Ma ktos jakis pomysl?
chfast
Cytat(kicaj_ @ 2004-09-11 19:43:40)
Chce napisac wlasne szablony. I zacialem sie na wyswietlaniu wynikow z bazy mysql? Nie wiem kompletnie jak to rozwiazac... Kombinuje jak zrobic zeby dany wiersz byl powtarzany tyle razy ile jest rekordow w bazie smile.gif Ma ktos jakis pomysl?

No to ja cię nie rozumiem. Chcesz napisać funkcję w twoim systemie szablonów? Jeśli tak to wykorzystaj php. Jeśli nie to nie wiem co ty kombinujesz..
M4chu
Zrob tak jak w smarty, np
  1. <?php
  2. $wiersze = $db->getRows(&#092;"SELECT (...)\");
  3. $tpl->setValue('wiersze', $wiersze);
  4. ?>

  1. {foreach $wiersze as $wiersz}
  2. <tr>
  3. <td>{$wiersz['pole']</td>
  4. </tr>
  5. {/foreach}
FiDO
Cytat(kicaj_ @ 2004-09-11 20:43:40)
I zacialem sie na wyswietlaniu wynikow z bazy mysql? Nie wiem kompletnie jak to rozwiazac... Kombinuje jak zrobic zeby dany wiersz byl powtarzany tyle razy ile jest rekordow w bazie smile.gif Ma ktos jakis pomysl?

To co Ty piszesz system szablonow zintegrowany z baza danych? Po co.. Wystarczy zrobic obsluge tablic w szablonach i tyle.
A z bazy pobrac najpierw wszystko, wprowadzic do tablicy i dopiero przypisac do zmiennej w szablonie. Bez uzycia zadnych klas do bazy jest to kilka(nascie) linijek, ale z klasami to nie ma problemu, moze to byc jedna linijka..
  1. <?php
  2.  
  3. // AdoDB
  4. $rs = $db->GetAll(&#092;"SELECT...\");
  5.  
  6. ?>
kicaj
  1. <?php
  2. class Templates
  3. {
  4. function setFile() 
  5. //...
  6.  
  7. function setValue( $name, $value )
  8. {
  9. if( is_array( $value ) )
  10. {
  11. // ...questionmark.gif
  12. }
  13. else
  14. {
  15. $this -> array_name[] = &#092;"{\" . $name . \"}\";
  16. $this -> array_value[] = $value;
  17. }
  18. }
  19.  
  20. function Display()
  21. {
  22. echo str_replace( $this -> array_name, $this -> array_value, $this -> set_file );
  23. }
  24. }
  25.  
  26. $query = &#092;"SELECT * FROM calendar LIMIT 15\";
  27. $results = mysql_query( $query );
  28.  
  29. $a = array();
  30.  
  31. while( $row = mysql_fetch_array( $results ) )
  32. {
  33. $a[] = $row['day'];
  34. }
  35.  
  36. $tpl = new Templates;
  37. $tpl -> setFile( 'index.html', 'tpl' );
  38. $tpl -> setValue( 'title', 'Witamy!' );
  39. $tpl -> setValue( 'a', $a );
  40. $tpl -> Display();
  41. ?>
Jak to mam przerobic zeby dzialalo poprawnie, tak jak bym chcial?
FiDO
Musisz dorobic obsluge tablic w klasie do szablonow. W przypadku klasy, ktora nie kompiluje szablonow do kodu php, tylko robi wszystko w locie, nie jest to takie hop siup, musisz troche poczytac, najlepiej jakies inne klasy ktore takie cos maja.
chfast
Ja bym to zrobił inaczej.
  1. <?php
  2. class Templates
  3. {
  4. function setFile()
  5. //...
  6.  
  7. function setValue( $name, $value )
  8. {
  9. $this->vars[$name] = $value;
  10. return true;
  11. }
  12.  
  13. function Display()
  14. {
  15. // Patrz niżej
  16. }
  17. }
  18. ?>

Zastosowałbym dwa znaczniki w szablonie. Jeden do obsługi płaski zmiennych, drugi do obsługi tablic. Ten drugi musiałby chyba przypominać {foreach} lub {section} z Smarty. Nie widze raczej sposobu, żeby zrobić to prościej, będzie konieczne zastowanie wyrażeń regularnych. No chyba, że ustalisz sobie pewien stały schemat wyświetlania tablic i będziesz konkretny wygląd regulował stylami CSS. Ale ty byłoby zbytnie uproszczenie...
kicaj
Hehe, tak sie meczylem a tylko bylo potrzebna petla foreach" title="Zobacz w manualu PHP" target="_manual() tongue.gif

O to co wykombinowalem:
  1. <?php
  2. class Templates
  3. {
  4.     //...
  5.  
  6.     function setSection( $name, $values )
  7.     {
  8.         // Ta funkcja dziala narazie tylko i wylacznie z ponizszym szablonem :)
  9.         // Rozbudowa pozniej...
  10.         preg_match_all( '/({@wiersze})(.*?)({/@wiersze})/is', $this -> set_file, $matches );
  11.  
  12.         $new_line = '';
  13.         
  14.         $a = &#092;"{\" . $name . \"}\";
  15.  
  16.         foreach( $values as $value )
  17.         {
  18.             $new_line .= str_replace( $a, $value, $matches[2][0] );
  19.         }
  20.         
  21.         $this -> set_file = preg_replace( '/({@wiersze})(.*?)({/@wiersze})/is', $new_line, $this -> set_file );
  22.     }
  23.  
  24.     //...
  25. }
  26.  
  27. while( $row = mysql_fetch_array( $results ) )
  28. {
  29.     $match_home[] = $row['match_home'];
  30.     $match_guest[] = $row['match_guest'];
  31. }
  32.  
  33. $tpl = new Templates;
  34. $tpl -> setFile( 'index.html', 'tpl' );
  35. $tpl -> setSection( 'lewa', $match_home );  
  36. $tpl -> setSection( 'prawa', $match_guest );  
  37. $tpl -> Display();
  38. ?>
Szablon:
  1. <table border="1">
  2. {@wiersze}
  3. <tr>
  4. <td>{lewa}</td>
  5. <td>{prawa}</td>
  6. </tr>
  7. {/@wiersze}

Problem polega na tym ze jesli ustawie dwa razy `setSection()` to nie zamienia mi tego drugiego, krotko mowiac: metoda dziala tylko dla pierwszego (tutaj dla {lewa}). Jak to przeboic zeby zamienialo obydwa?
SHiP
http://ship.me2.pl/index.php?d=7&id=22

Tam masz arta(mojego autorstwa biggrin.gif) jak napisać własny systm szablonów... Z petlami, instrukcjami warunkowymi i w ogóle smile.gif Metoda jest inna niż u wszystkich innych kolegów phpistów biggrin.gif Przynajmniej ja takiej jak moja nie widziałem.. Moze sie przyda...
jbiz
w TemplatePower wygladaloby to tak:

Kod
<table border="1">
<tr>
<!-- START BLOCK : blok -->
<td>{wiersz}</td>
<!-- END BLOCK : blok -->
</tr>
</table>


  1. <?php
  2.  
  3. $tpl = new TemplatePower( &#092;"szablon.tpl\" );
  4. $tpl->prepare();
  5. $zap = mysql_query(&#092;"SELECT pole FROM tabela\");
  6. while ($odp = mysql_fetch_array ($zap) )
  7. {
  8. $tpl->newBlock(&#092;"blok\");
  9. $tpl->assign(&#092;"wiersz\", $odp['pole']);
  10. }
  11. $tpl->printToScreen();
  12.  
  13. ?>


chyba nie da sie przejrzysciej smile.gif
ja bym nie podolal wlasnego template systemu napisac to wiem na sete, szczegolnie ze ten jest bardzo cacy i za darmo smile.gif
kicaj
Hehe juz "wierszowanie" mam za soba smile.gif

Teraz zastanawia mnie jak rozwiazywane sa formularze i ich validacja.

Mam takie szablony:
form.php - formularz logowanie (nick, haslo, submit)
panel.php - strona widoczna po zalogowaniu

Moge zrobic tak:
Kod
{if $submit}
panel.html
{elseif $submit}
form.html
{endif $submit}

Ale ten sposob mnie ogranicza.
W samym php zrobilbym to tak:
  1. <?php
  2. $ctrl = 0;
  3.  
  4. if( isset( $_POST['sumit'] ) )
  5. {
  6. if( empty( $login ) )
  7. {
  8. echo &#092;"Wpisz nick!\";
  9. }
  10. elseif( empty( $haslo ) )
  11. {
  12. echo &#092;"Wpisz haslo!\";
  13. }
  14. else
  15. {
  16.  $ctrl = 1;
  17.  echo &#092;"Okey!\";
  18.  }
  19. }
  20.  
  21. if( $ctrl == 0 )
  22. {
  23. //formularz
  24. }
  25. ?>

Jak by to mialo wygladac z szablonami?
Wstawianie tyle {if} itp do szablonow mija sie z celem...
SHiP
dajesz blok w pliku tpl {errors}

i później
  1. <?php
  2. $ctrl = 0;
  3.  
  4. if( isset( $_POST['sumit'] ) )
  5. {
  6. if( empty( $login ) )
  7. {
  8. $err=&#092;"Wpisz nick!\";
  9. }
  10. elseif( empty( $haslo ) )
  11. {
  12. $err&#092;"Wpisz haslo!\";
  13. }
  14. else
  15. {
  16.  $ctrl = 1;
  17.  $err=&#092;"Okey!\";
  18.  }
  19. }
  20.  
  21. if( $ctrl == 0 )
  22. {
  23. //formularz
  24. }
  25. ?>


I póżniej przkazujesz zmienną $err jako blok {errors}
Troche złą nazwe dałem nie chce mi sie poprawwać tongue.gif
kicaj
Okey, jakos to poszlo, jak cos to wroce to tego smile.gif

Teraz mam cos takiego - kod w szablonie:
Kod
{session ? plik1.html : plik2.html}

Ma to za zadanie jak zwykly warunek if" title="Zobacz w manualu PHP" target="_manual() w formie skroconej.
Teraz, jak mozna zrobic zeby ta `session` bylo zmienna i gdy np. sesja jest aktywna to by byl includowany `plik1.html`?
Jakies pomysly?
Ace
hm, mysle ze powinienes w jakis sposob identyfikowac zmienne, czyli np...
{$session ? plik1.html : plik2.html} $ - w smarty wystepuje i tak identyfikowana jest zmienna. Tez mozesz zrobic to w ten sposob
MoD
Tak, warto by identyfikować zmienne bo jak ktoś wpisze "{if}" albo jakąś inną komendę to parser może zgłupieć. A żeby nie było tak jak w smarty to można dać np. @ albo ^
kicaj
No i kolejne rozwazania...

Mamy:
- klase obslugujaca userow (wyswietlanie, logowanie, edytowanie, itp).
- prosty szablon i jego klase

Jak zrobic zeby odpowiednie rzeczy byly robione w odpowiedniej klasie?
Bo wlasnie tu sie gubie i traci to wszystko sens...

Chetnie zobaczylbym jakis prosty kod...
Yarecki
Cytat(kicaj_ @ 2004-09-24 00:30:41)
Jak zrobic zeby odpowiednie rzeczy byly robione w odpowiedniej klasie?
Bo wlasnie tu sie gubie i traci to wszystko sens...

Ja np. staram się nie mieszać operacji logicznych z wizualizacją i tak klasa User ma metody add, del, getPassword, setPassword, get... itd., przy czym zadna z metod nie kożysta z szablonów, tylko zwraca dane do wyświetlenia przez return.

Inną sprawą jest np. system newsów z komentarzami. Jeśli chce się, aby przy każdym newsie była wyświetlana liczba komentarzy to, albo robi się jedno zapytanie do tablicy newsow, a później wiele zapytan przez obiekt komentarzy do tab. komentarzy (mało wydajne). Albo robi się wszystko z poziomu obiektu newsów jednym zapytaniem.

Coś mnie naszło na pisanie takich mini opowiadań dzisiaj :-P

BTW. OOP wcale nie jest takie łatwe i naturalne jak się o tym pisze w artykułach na różnych wortalach.
MoD
Skoro jesteśmy przy szablonach, kiedy wstawić warunek sprawdzający czy jest już skompilowany szablon questionmark.gif
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.