Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: "Rekurencyjny" system layout'ów.
Forum PHP.pl > Forum > PHP
mayu11
Witam. Na początek.. opiszę swój problem, mianowicie - chciałbym zrobić coś takiego:

Plik - index.html
  1. <head>
  2. <title>[TITLE]</title>
  3. </head>
  4. <body>
  5. {BODY}
  6. </body>
  7. </html>


Plik - body.html
  1. {HEADER}
  2. <div id="wrapper">
  3. <div id="menu_top">
  4. [MENU_TOP]
  5. </div>
  6. <div id="content">
  7. [CONTENT]
  8. </div>
  9. <div id="menu_right">
  10. [MENU_RIGHT]
  11. </div>
  12. </div>


Plik - header.html
  1. <div id="title">[TITLE]</div>


Na początek do kodu php chciałbym załadować tylko index.html, a następnie użyć jakąś rekurencyjną funkcję, która podstawi pod wszystkie [] - zmienne, a {} - zawartości plików ".html". I chciałbym by ładowało się to NIEZALEŻNIE od struktury tych plików. Czyli gdy dopiszę do index'u np. "{plik2}" to zostanie on automatycznie załadowany.

Póki co myślałem nad czymś takim:
  1. <?php
  2.  
  3. $D['Content'] = file_get_contents('templates/index.html');
  4.  
  5. while(preg_match('/\{[a-zA-Z0-9]\}/i', $D['Content']))
  6. {
  7. // I tutaj jakoś odwołać się do "preg_replace_callback", czy jakoś tak.
  8. }
  9.  
  10. ?>


Jakieś pomysły?

Jakieś pomysły?
d3ut3r
Za pomocą file_get_contents pobierasz zawartość pliku body.html a później znacznik {BODY} zamieniasz na to co wczytasz z pliku.

czyli np wyszukujesz wszystkie znaczniki ograniczone znakami {} do tego co jest w środku dopisujesz ".html" i masz nazwę pliku, plik wczytujesz i podmieniasz znacznik.
sebastian.rozmus
Najprostsze rozwiązanie to najpierw posklejanie wszystkiego do 1 zmiennej. Jak wspomniałeś możesz to zrobić za pomocą preg_replace_callback - wrzucasz wyrażenie regularne które zbiera Ci wszystkie znaczniki, a jako callback wrzucasz funkcję która zwraca zawartość pliku. Potem zmieniasz w tej zmiennej [var] na zmienne. Możesz użyć tej samej funkcji.

Można się pobawić z funkcją eval, ale to już trzeba zabezpieczyć na 4 spusty.

Jeśli chodzi o sam pomysł, to nie jest on zbyt optymalny. Musiałbyś pomyśleć nad jakimś cachowaniem. Jeśli natomist nie radzisz sobie z rozwiązaniem bez cachowania to mogą zacząć się schody. Od biedy możesz skorzystać ze starego zniesławionego smarty lub innego systemu szablonów. Przedewszystkim zastanów się czy napewno system szablonów jest Ci niezbędny i czy nie niesie samych minusów w Twoim przypadki. Zadaj sobie pytanie jak często będzie zmieniany szablon, czy nie lepiej będzie zrobić to w PHP (pliki *.phtml) ?
maniana
  1. function setTags($t) {
  2. global $zmienne;
  3. return 'znalazłem '.$t.' i zawiera ona wartość: '.$zmienne[$t];
  4. }
  5. function replaceTags($txt) { // Wyłapuje ciąg znaków w { i }
  6. return preg_replace("/{([^}]+)}/e", "setTags('\\1')", $txt);
  7. }
  8.  
  9. include ( 'test.tpl' );
  10. $wynik = ob_get_contents();
  11.  
  12. $zmienne = array(
  13. 'template'=>'xXx'
  14. );
  15.  
  16. echo replaceTags($wynik);
test.tpl
  1. <h1>To jest {template}</h1>
To taki przykład dla zamiany zmiennych w {} dla tagów [] piszesz drugą funkcję i za pomocą ob_start i include dołączasz pliki jako zmienna.
prachwal
ja korzystam z PHPTal-a i jestem zadowolny
http://phptal.org/manual/en/split/metal-use-macro.html
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.