Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parser szablonów
Forum PHP.pl > Forum > PHP
akurczyk
Napisałem coś takiego:
  1. <?php
  2. $szablon = file_get_contents("szablon.html");
  3. preg_match("#{newsy}(.*?){/newsy}#si", $szablon, $znalezione);
  4. $tablica[0]["tytul"] = "Pierwszy news";
  5. $tablica[0]["tresc"] = "Treść pierwszego newsa";
  6. $tablica[1]["tytul"] = "Drugi news";
  7. $tablica[1]["tresc"] = "Treść drugiego newsa";
  8. $tablica[2]["tytul"] = "Trzeci news";
  9. $tablica[2]["tresc"] = "Treść trzeciego newsa";
  10. foreach($tablica as $wartosc) {
  11.    $temp = str_replace("{tytul}", $wartosc["tytul"], $znalezione[1]);
  12.    $newsy_array[] = str_replace("{tresc}", $wartosc["tresc"], $temp);
  13. }
  14. $newsy = join("", $newsy_array);
  15. $szablon = preg_replace("#{newsy}(.*?){/newsy}#si", $newsy, $szablon);
  16. echo $szablon;
  17. ?>


Szablon:
  1. <title>Newsy</title>
  2. </head>
  3. {newsy}
  4. <h2>{tytul}</h2>
  5. <p>{tresc}</p>
  6. {/newsy}
  7. </body>
  8. </html>


Wydaje mi się że jest to nieoptymalene, i nieprofesjonalnie napisane. Proszę o jakieś sugestje. Co powinienem w tym zmienić??
Riklaunim
Napisz to w Javie to będzie bardzo profesjonalne winksmiley.jpg A tak na poważnie stworzyłeś prosty kod i nie ma co tu dramatyzować z pisaniem tego "profesjonalnie" - bo "profesjonalne" rozwiązanie polegałoby na stworzeniu systemu szablonów ogólnego przeznaczenia ze znacznie większą ilością możliwości (smarty, opt i inne).
l0ud
Istota działania jest zła. Systemy szablonów które tworzą swój nowy język (jak smarty) to przeszłość. Zrezygnuj z szablonów tego typu, a zastąp to czystym PHP, tylko odpowiednio oddzielonym:

index.php
  1. <?php
  2.  
  3. include('views.php');
  4.  
  5. $tablica[0]["tytul"] = "Pierwszy news";
  6. $tablica[0]["tresc"] = "Treść pierwszego newsa";
  7. $tablica[1]["tytul"] = "Drugi news";
  8. $tablica[1]["tresc"] = "Treść drugiego newsa";
  9. $tablica[2]["tytul"] = "Trzeci news";
  10. $tablica[2]["tresc"] = "Treść trzeciego newsa";
  11.  
  12. $szablon = new view('szablon');
  13.  
  14. $szablon->news = $tablica;
  15.  
  16. $szablon->source = new view('szablon');
  17. $szablon->source->news = $tablica;
  18.  
  19. echo $szablon;
  20.  
  21. ?>


views.php
  1. <?php
  2.  
  3. define('VIEWS_DIR','szablony/');
  4. define('PHP_EXT','.php');
  5.  
  6. class view {
  7.  
  8.    private $viewName;
  9.    private $contents = array();
  10.    
  11.    public function __construct($viewName) {
  12.        if (file_exists(VIEWS_DIR.$viewName.PHP_EXT) === false)
  13.            //obsługa błędu - przykładowa - można zmienić na wyjątek etc.
  14.            exit('Plik szablonu nie istnieje');
  15.        $this->viewName = $viewName;
  16.    }
  17.    
  18.    public function __get($name) {
  19.        if (isset($this->contents[$name]))
  20.            return $this->contents[$name];
  21.        else return null;
  22.    }
  23.    
  24.    public function __set($name, $value) {
  25.        $this->contents[$name] = $value;
  26.    }
  27.    
  28.    public function render() {
  29.        if (!include(VIEWS_DIR.$this->viewName.PHP_EXT))
  30.            //obsługa błędu
  31.            exit('Błąd dołączania szablonu');
  32.    }
  33.    
  34.    public function __toString() {
  35.        ob_start();
  36.        $this->render();
  37.        $output = ob_get_contents();
  38.        ob_end_clean();
  39.        return $output;
  40.    }
  41.    
  42. }
  43.  
  44. ?>


szablony/szablon.php
  1. <title>Newsy</title>
  2. </head>
  3. <?php foreach ($this->news as $news) { ?>
  4. <h2><?php echo $news['tytul']; ?></h2>
  5. <p><?php echo $news['tresc']; ?></p>
  6. <?php } ?>
  7. <hr>
  8. <p>Źródło:</p>
  9. <textarea rows="10" cols="50"><?php echo htmlspecialchars($this->source); ?></textarea>
  10. </body>
  11. </html>


Jest to chyba najprostszy przykład, jak to można zrobić, aby pracowało się wygodnie smile.gif Szablony można zagnieżdżać (jak jest w przykładzie - zagnieżdżone jest generowanie źródła strony z szablonu i wstawianie go w textarea). W ten sposób możesz stworzyć całe drzewko szablonów reprezentujące stronę. smile.gif

Pamiętaj tylko, aby w szablonie zminimalizować ilość kodu PHP i zajmować się TYLKO wyświetlaniem danych podanych przez skrypt!
Riklaunim
Cytat(l0ud @ 21.12.2008, 20:53:39 ) *
Istota działania jest zła. Systemy szablonów które tworzą swój nowy język (jak smarty) to przeszłość.


To dlaczego nikt nie rezygnuje z takiej składni szablonów? smile.gif IMHO obecność języka skryptowego w szablonach doprowadza do tego że nagle pojawia się w nich jakaś logika, co jest złe. Mając w pamięci "szablony" CodeIgnitera powiem że szablony z PHP to rozwiązanie dalekie od ideału (choć sprawdza się dla najprostszych skryptów). Dobry przykład to szablony Django - http://docs.djangoproject.com/en/dev/topic...opics-templates i klon dla PHP: http://www.beberlei.de/calypso/ - ogólny pomysł i większość składni jest jak najbardziej udana i warto na czymś takim się opierać.
akurczyk
A co z optymalnością mojego skryptu??
Riklaunim
Duży ruch ci raczej nie grozi, więc i trudno mówić o wydajności danego rozwiązania. Operacje na długich łańcuchach mogą trochę zajmować, ale ogólnie większym "problemem" wydajnościowym będzie pobieranie danych - np. z bazy danych.
l0ud
  1. <?php
  2. IMHO obecność języka skryptowego w szablonach doprowadza do tego że nagle pojawia się w nich jakaś logika, co jest złe.
  3. ?>


Wg mnie, o ile logika ogranicza się do wyświetlania, nie ma żadnego problemu. Zawsze można np. do klasy view dopisać metody pomocnicze, np. cycle(), co umożliwi np. takie coś:

  1. <?php foreach ($this->data as $row) { ?>
  2. <tr>
  3. <td class="color<?php echo $this->cycle(array('1','2')); ?>"><?php echo $row[1]; ?></td>
  4. <td><?php echo $row[2]; ?></td>
  5. </tr>
  6. <?php } ?>


Po pobieżnej analizie przykładów z dokumentacji szablonów Django nie widzę żadnych istotnych korzyści (prócz minimalnym uproszczeniem zapisu) z dołączania dodatkowego kodu typu Calypso. Ale jak kto woli smile.gif Ja tam polecam wg. mnie najprostsze rozwiązanie, czyli 'bezpośrednie' stosowanie PHP - bo przecież po to ono jest? smile.gif
akurczyk
Jeszcze jedno:
Załużmy że w szablonie mam:
Kod
<html>
<head>
<title>Newsy</title>
</head>
<body>
{zalogowany}
<h2>Jesteś zalogowany jako: {login}!</h2>
{/zalogowany}
{niezalogowany}
<h2>Nie jesteś zalogowany!</h2>
{/niezalogowany}
</body>
</html>

W przypadku zalogowania, w skrypcie zamieniam niezalogowany na "nic", a zalogowany na zalogowany bez {zalogowany}{/zalogowany}. Jak wywalić te tagi {zalogowany}{/niezalogowany}, tak aby to co jest po między nimi zostąło nienaruszone??
Riklaunim
Cytat(l0ud @ 21.12.2008, 21:33:34 ) *
Wg mnie, o ile logika ogranicza się do wyświetlania, nie ma żadnego problemu. Zawsze można np. do klasy view dopisać metody pomocnicze, np. cycle(), co umożliwi np. takie coś:

Po pobieżnej analizie przykładów z dokumentacji szablonów Django nie widzę żadnych istotnych korzyści (prócz minimalnym uproszczeniem zapisu) z dołączania dodatkowego kodu typu Calypso. Ale jak kto woli smile.gif Ja tam polecam wg. mnie najprostsze rozwiązanie, czyli 'bezpośrednie' stosowanie PHP - bo przecież po to ono jest? smile.gif


Kod
<?php } ?>

Ładnie to nie wygląda, front-end designer zapewne coś pokopie w tego typu znacznikach... plus jak tego trochę zagnieździsz to będzie jeszcze gorzej. Przydają się też takie funkcjonalności jak dziedziczenie szablonów, obsługa bloków itd. I nie należy zakładać że programista posłucha się ciebie żeby nie wrzucać do szablonu logiki. Jeżeli może - to to zrobi. Swego czasu używałem CI, teraz używam Django i nie mam najmniejszej ochoty ponownie stosować "szablony" zawierające w sobie język skryptowy plus z brakiem funkcjonalności typowych szablonów.


Cytat(akurczyk @ 21.12.2008, 21:44:27 ) *
W przypadku zalogowania, w skrypcie zamieniam niezalogowany na "nic", a zalogowany na zalogowany bez {zalogowany}{/zalogowany}. Jak wywalić te tagi {zalogowany}{/niezalogowany}, tak aby to co jest po między nimi zostąło nienaruszone??

Tworzenie statycznych bloków nie jest zbyt elastyczne ({zalogowany}{/zalogowany}, czy {wiadomości}{/wiadomości}), bo to trochę ogranicza elastyczność parsera. W Django wygląda to ogólnie tak:
Kod
{% if user %}
Witaj {{ user }}
{% else %}
Witaj nieznajomy
{% endif %}

Gdzie za logikę szablonu odpowiada warunek IF wykonany na zmiennej przekazanej do szablonu z widoku.
Crozin
  1. <?php
  2. }
  3. ?>
Też miałem pisać, żeby takiego czegoś za żadne skarby świata w szablon nie pakować winksmiley.jpg
  1. <body>
  2.  <?php forach($a as $b): ?>
  3.  <blah blah></blah blah>
  4.  <?php endforeach; ?>
  5. </body>
I analogicznie: for(): endfor, if(): elseif():, else:, endif;, while():, endwhile(), foreach(), endforeach()

@autor:
Naprawdę nie ma sensu bawić się w takie "systemy szablonów". Jest to wyjątkowo niewygodne (każdy będzie się musiał uczyć nowego zestawu znaczników), w Twoim przypadku kompletnie nieelastyczne - nie ma możliwości zrobienia tak prostej rzeczy jak chociażby wyświetlenie tekstu "AbcdEFg" jako "abcdefg" (małymi literami).
Cytat
To dlaczego nikt nie rezygnuje z takiej składni szablonów?
Jak to nikt? Pomijam tutaj fakt, że PHP sam w sobie to jeden wielki system szablonów, ale spójrz na Symfony, ZF i inne FW.
Cytat
IMHO obecność języka skryptowego w szablonach doprowadza do tego że nagle pojawia się w nich jakaś logika, co jest złe.
Bzdura. winksmiley.jpg Jak ktoś nie potrafi korzystać z szablonu (nie ma znaczenia czy to Smarty czy czysty PHP) to i tak doporawdzi do jakiegoś Spaghetti Code
akurczyk
@Crozin: Fajne rozwiązanie, spróbuję.
Wrućmy do mojego parsera.
Zrobiłem w nim dwie pętle i niemoge się już w tym kodzie połapać:)
  1. <?php
  2. mysql_connect("----","----","----");
  3. mysql_query("SET NAMES utf8");
  4. mysql_query("SET CHARACTER_SET utf8_unicode_ci");
  5. $szablon = file_get_contents("szablon.html");
  6. preg_match("#{kategorie}(.*?){/kategorie}#si", $szablon, $znalezione);
  7. $zapytanie = mysql_query("SELECT identyfikator,tytul FROM kategorie");
  8. $kategorie = "";
  9. while($rekord = mysql_fetch_array($zapytanie)) {
  10.    $temp = str_replace("{nazwa_kategorii}", $rekord["tytul"], $znalezione[1]);
  11.    preg_match("#{fora}(.*?){/fora}#si", $temp, $znalezione2);
  12.    $zapytanie2 = mysql_query("SELECT identyfikator,tytul,opis FROM fora WHERE kategoria=\"".$rekord["identyfikator"]."\"");
  13.    $fora = "";
  14.    while($rekord2 = mysql_fetch_array($zapytanie2)) {
  15.        $temp2 = str_replace("{identyfikator_forum}", $rekord2["identyfikator"], $znalezione2[1]);
  16.        $temp2 = str_replace("{nazwa_forum}", $rekord2["tytul"], $temp2);
  17.        $fora .= str_replace("{opis_forum}", $rekord2["opis"], $temp2);
  18.    }
  19.    $kategorie .= preg_replace("#{fora}(.*?){/fora}#si", $fora, $temp);
  20. }
  21. $szablon = preg_replace("#{kategorie}(.*?){/kategorie}#si", $kategorie, $szablon);
  22. echo $szablon;
  23. ?>


Szablon:
Kod
<html>
<head>
<title>Newsy</title>
</head>
<body>
{kategorie}
<h2>{nazwa_kategorii}</h2>
{fora}
<h3><a href="forum.php?forum={identyfikator_forum}">{nazwa_forum}</a></h3>
<p>{opis_forum}</p>
{/fora}
{/kategorie}
</body>
</html>


Można to jakoś prościej??
Mize
Jeślibyś używał czystego PHP w szablonach to byłoby dużo prościej...

Pobranie danych i wyświetlenie szablonu.

  1. <?php
  2. $Result = mysql_query(' ... ');
  3.  
  4. $aData = array();
  5.  
  6. while( $aFetch = mysql_fetch_array($Result) ) {
  7.  
  8.   $aData[] = $aFetch;
  9.  
  10. }
  11.  
  12. /* Wyswietlanie szablonu... */
  13. include('Template.phtml');
  14. ?>


Szablon.

Kod
<?php foreach($aData AS $Data): ?>

Foo: <?php echo $Data['Bar']; ?>

<?php endforeach; ?>


Pisane z palca, ale dużo prościej.
Nie wiem kto teraz pisze własne systemy template ze sładnią z dupy, która wygląda troche inaczej niż czyste PHP, a działa wolniej. SMARTY = crap.

Pozdrawiam.
Riklaunim
Cytat(akurczyk @ 21.12.2008, 23:25:38 ) *
Można to jakoś prościej??

Prościej to nie znaczy czytelniej i łatwiej w rozbudowie winksmiley.jpg Chcesz robić forum? Użyj frameworka (Kohana, CI, inne) i oddziel zapytania od widoku i od szablonu odpowiedzialnego za wygląd - jeżeli chcesz stworzyć coś funkcjonalnego, co można pokazać smile.gif

Cytat
Nie wiem kto teraz pisze własne systemy template ze sładnią z dupy, która wygląda troche inaczej niż czyste PHP, a działa wolniej. SMARTY = crap.


to napisz serwis pokroju nasza klasa, grono, czy też fotka bez szablonów, stosując PHP, a później próbuj to rozbudowywać i poprawiać. Szablony i inne rozwiązania, wzorce projektowe nie są stosowane po to by kod był szybszy (bo będzie nieco wolniejszy niż napisany jednym ciurkiem), ale żeby ten kod dało się utrzymać, modyfikować i rozwijać. I taka mała notka - szablony smarty są kompilowane do kodu PHP (kesz) i przy kolejnych wywołaniach szablonu te gotowe postacie są stosowane niewidzialnie dla programisty/użytkownika.
Mize
To co wyżej napisałem to był przykład, i chyba nie uważasz, że tak pisze aplikacje? tongue.gif
Tak wyglądaja u mnie template'y i jakoś nie mam problemu z ich przerabianiem.
Wyświetlanie i operowanie na danych to już inna bajka i ten kod wyżej to tylko poglądowy.

Pozdrawiam.
l0ud
Riklaunim, nikt nie miał na myśli całkowitego unikania idei szablonów, a dodatkowych parserów, które robią dodatkowy narzut i wprowadzają swoją składnię.
Podałem swój przykład, jak dość prosto zrobić to bez wyrażeń regularnych i kobył typu smarty. Uzupełniając przykład o instrukcję typu endif; zamiast } imho uzyskamy wystarczająco dobrą czytelność szablonu. Ok, piszesz że szablony są kompilowane do czystego kodu PHP. Ale dlaczego nie mogą być nim od początku?
Riklaunim
Cytat
Ok, piszesz że szablony są kompilowane do czystego kodu PHP. Ale dlaczego nie mogą być nim od początku?

Bo jak np. pisałem firmowego CRMa to osoba odpowiedzialna za interfejs użytkownika nie była programistą server side, a geekiem jQuery/CSS i prace szły bardzo szybko, a CRM wyszedł kompatybilny na poziomie krystyny z gazowni.

Szablony mogą być "od razu" plikami *php, tyle że niekoniecznie musi to być najlepsze rozwiązanie winksmiley.jpg
akurczyk
Zroiłem tak jak mi radziliście. Fajnie to nawet wygląda, szablon tak bardzo się nie zmienie, a zato skrypt zyskał na czytelności i wydajnmości.
Skrypt:
  1. <?php
  2. mysql_connect("mysql2.yoyo.pl","db723710","zaq1@#$");
  3. mysql_select_db("db723710");
  4. mysql_query("SET NAMES utf8");
  5. mysql_query("SET CHARACTER_SET utf8_unicode_ci");
  6. $zapytanie = mysql_query("SELECT * FROM kategorie ORDER BY tytul");
  7. while($rekord = mysql_fetch_array($zapytanie)) {
  8.    $tablica[] = $rekord;
  9. }
  10. $zapytanie2 = mysql_query("SELECT * FROM fora WHERE kategoria=\"PROBLEM\" ORDER BY tytul");
  11. while($rekord2 = mysql_fetch_array($zapytanie2)) {
  12.    $tablica2[] = $rekord2;
  13. }
  14. include("szablon.php");
  15. ?>


Szablon:
Kod
<html>
<head>
<title>Forum</title>
</head>
<body>
<?php foreach($tablica as $rekord): ?>
<h2><?php echo $rekord["tytul"]; ?></h2>
<?php foreach($tablica2 as $rekord2): ?>
<h3><a href="forum.php?forum=<?php echo $rekord["identyfikator"]; ?>"><?php echo $rekord2["tytul"]; ?></a></h3>
<p><?php echo $rekord2["opis"]; ?></p>
<?php endforeach; ?>
<?php endforeach; ?>
</body>
</html>


Mam problem, więcej w drugim zapytaniu (dziesiąta linijka skryptu). Co mam zrobić?questionmark.gif
Crozin
Cytat
Bo jak np. pisałem firmowego CRMa to osoba odpowiedzialna za interfejs użytkownika nie była programistą server side, a geekiem jQuery/CSS
Czy jeżeli założę, ża taka osoba jest w wystarczającym stopniu inteligenta by zrozumieć, że to co jest pomiędzy <?php, a ?> to coś czego ma nie ruaszć? Zresztą wydaje mi się, że chociaż podsatawy podstaw języka PHP za już wcześniej - a jak nie to w dosłownie 5 min kolega z zespołu wytłumaczy bardzo ogólnikowo co to jest.

Tylko... skoro dla frontend developera <?php ... ?> to coś z czym nie wie co robić to czemu inaczej by miało być z { ... }? Jeszcze w dodatku będzie musiał uważać przy pisaniu jakiegoś CSS, JS wewnątrz dok. HTML.
akurczyk
POMOCY!!
erix
Cytat
Mam problem, więcej w drugim zapytaniu (dziesiąta linijka skryptu). Co mam zrobić?

A może byłbyś łaskaw podać treść błędu, a nie się drzeć?
Riklaunim
Cytat(Crozin @ 22.12.2008, 01:06:11 ) *
Czy jeżeli założę, ża taka osoba jest w wystarczającym stopniu inteligenta by zrozumieć, że to co jest pomiędzy <?php, a ?> to coś czego ma nie ruaszć?


Jak chcesz możesz stosować szablony z PHP, ja wolę mieć w szablonach prostą szablonową składnię "trzymającą" porządek i w ładny sposób oferującą dziedziczenie szablonów, czy obsługę bloków (i nie chodzi tu o to że front-end designer nie wie co to PHP/Python, po prostu server side jest wyraźnie oddzielony od client side).


Cytat
POMOCY!!

A wiesz że są funkcje zwracające treść błędu zapytania? Użyj to się dowiesz co jest źle, inaczej to do wróżki można sobie pójść. smile.gif
akurczyk
Niema żadnego błądu, tylko niewiem co napisać zobacz co jest w drugim zapytaniu. Skąd wziąść identyfiaktor kategorii forum w skrypcie?questionmark.gif

Wiem że są funkcje, ale zapytanie jest dobrze skonstruowane więc nie wywala żadnych błędów. Jednak zamiast POMOCY w zapytaniu wolał bym mieć identyfikator kategorii forum. Jeśli zamiast tego podstawię 1 to w pierwszej i drugiej kategorii będą fora z pierwszej kategorii, jeśli podstawię 2 to będą z drugiej, a ja chciałbym aby w pierwszej były z pierwszej a w drugiej z drugiej. POMOCY!!!
Riklaunim
Coś jakby musisz umieścić zapytania o fora z danej kategorii w pętli pobierania kategorii. Coś w stylu:
Kod
while($rekord = mysql_fetch_array($zapytanie)) {

$zapytanie2 = mysql_query("SELECT * FROM fora WHERE kategoria=".$rekord['id']." ORDER BY tytul");
while($rekord2 = mysql_fetch_array($zapytanie2)) {
    $tablica2[] = $rekord2;
}

    $tablica[] = array($rekord, $tablica2);
}
akurczyk
http://www.codemaster2222.yoyo.pl/skrypt.php - niedziała: wyświetla wszystkie fora w każdej kategorii.
Riklaunim
Pomyśl trochę. Jeżeli pobiera wszystkie fora to znaczy że warunek WHERE jest błędny. Zakładając że masz relację jeden do wielu w tabeli for powinna być kolumna z numerem ID danej kategorii - i wstawiając w warunku where id obecnie przemiatanej kategorii musi zadziałać winksmiley.jpg

Dla przykładu fragment struktury mojego forum:
Kod
CREATE TABLE IF NOT EXISTS `rk_category1` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `order` smallint(5) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `rk_forum1` (
  `id` int(11) NOT NULL auto_increment,
  `category_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  `topics` int(10) unsigned NOT NULL,
  `posts` int(10) unsigned NOT NULL,
  `lastposter` varchar(255) default NULL,
  `lasttopic` varchar(255) default NULL,
  `modification_date` datetime NOT NULL,
  `order` smallint(5) unsigned NOT NULL,
  `use_prefixes` tinyint(1) NOT NULL,
  `allow_anonymous` tinyint(1) NOT NULL,
  `use_moderators` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `rk_forum1_category_id` (`category_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Tabela rk_forum1 ma kolumnę "category_id" przechowującą wartość "id" kategorii (rk_category1), do której jest przypisane smile.gif
akurczyk
Jak to ma działeć to ja wie, przecież jak robiłem to samo tylko że w praserże to działało.
Skrytp:
  1. <?php
  2. mysql_connect("mysql2.yoyo.pl","db723710","----");
  3. mysql_select_db("db723710");
  4. mysql_query("SET NAMES utf8");
  5. mysql_query("SET CHARACTER_SET utf8_unicode_ci");
  6. $zapytanie = mysql_query("SELECT * FROM kategorie ORDER BY tytul");
  7. while($rekord = mysql_fetch_array($zapytanie)) {
  8.    $tablica[] = $rekord;
  9.    $zapytanie2 = mysql_query("SELECT * FROM fora WHERE kategoria=\"".$rekord['identyfikator']."\" ORDER BY tytul");
  10.    while($rekord2 = mysql_fetch_array($zapytanie2)) {
  11.        $tablica2[] = $rekord2;
  12.    }
  13. }
  14. include("szablon.php");
  15. ?>

Skrypt najpierw pobiera wszystkie fora z kategorii 1, dopisuje je do tablicy, a puźniej wszystkie z kategorii 2, i też dopisuje je do tablicy.

Szablon:
  1. <title>Forum</title>
  2. </head>
  3. <?php foreach($tablica as $rekord): ?>
  4. <h2><?php echo $rekord["tytul"]; ?></h2>
  5. <?php foreach($tablica2 as $rekord2): ?>
  6. <h3><a href="forum.php?forum=<?php echo $rekord2["identyfikator"]; ?>"><?php echo $rekord2["tytul"]; ?></a></h3>
  7. <p><?php echo $rekord2["opis"]; ?></p>
  8. <?php endforeach; ?>
  9. <?php endforeach; ?>
  10. </body>
  11. </html>
Riklaunim
Po wierszu z $zapytanie2 możesz dać $tablica2[] = array(); żeby wyczyścić tablicę przed zapełnieniem ją kolejnymi forami. Po zakończeniu pętli dla $zapytanie2 musisz tą $tablica2 dodać do głównej tablicy kategorii np:
Kod
$tablica[] = array($rekord, $tablica2);

Usuwając zarazem $tablica[] = $rekord;. Dzięki temu masz jedną tablicę do przekazania do szablonu. $tablica[ELEMENT][0] to dane kategorii, a $tablica[ELEMENT][1] to tablica z forami dla tej kategorii - czyli w szablonie dajesz foreach as $cośtam na $tablica i w nim kolejnego foreach na $cośtam[1] smile.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.