Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: System Szablonów - Zapętlanie Subsekcji
Forum PHP.pl > Forum > Przedszkole
kawuha
Witam, jestem tu pierwszy raz więc warto się z wszystkimi przywitać. smile.gif
Mam mały problem: Napisałem klasę odpowiedzialną za kompilowanie szablonów, ale nie udało mi się rozwiązać problemu zapętlania subsekcji:
template.php
  1. <?
  2. class Template
  3. {
  4.   var $uncompiled; // szablon nie skompilowany
  5.   var $compiled; //szablon skompilowany
  6.  
  7.   var $sub_uncompiled; // nieskompilowana zawartość subsekcji
  8.   var $sub_compiled; // skompilowana zawartość subsekcji
  9.  
  10.   var $tpl_vars = array(); // wartości szablonu(bez subsekcji), np. {NEWS}
  11.   var $sub_vars = array(); // wartości subsekcji, np. {newsrow.NEWS}
  12.  
  13.   var $subsection = array(); // występujące w szablonie subsekcje
  14.   var $template;
  15.  
  16.  
  17.   function LoadTemplate($template)
  18.   {
  19.     if(!file_exists($template))
  20.       die (&#092;"<span style='color: red; font-family: Garamond;'><center>Błąd Krytyczny:<br>nBrak szablonu <b>$template</b>. Skontaktuj się z administratorem serwisu.</center></span>\");
  21.     else
  22.     {
  23.       $this -> template = $template;
  24.       $fp = fopen($template, r);
  25.       $this -> uncompiled = fread($fp, filesize($template));
  26.       fclose($fp);
  27.     }
  28.   }
  29.  
  30.   function Subsection()
  31.   {
  32.     for($i = 0; $i <= count($this -> subsection); $i++)
  33.     {
  34.       $sub = $this -> subsection[$i];
  35.       reset($this -> sub_vars);
  36.       while(list($key, $value) = each($this -> sub_vars))
  37.       {
  38.         $text = str_replace(&#092;"{\".$sub.\".\".$key.\"}\", $value, $this -> uncompiled);
  39.         $this -> uncompiled = $text;
  40.       }
  41.     }
  42.     return $this -> uncompiled;
  43.   }
  44.  
  45.   function Compile()
  46.   {
  47.     while(list($key, $value) = each($this -> tpl_vars))
  48.     {
  49.       $text = str_replace(&#092;"{\".$key.\"}\", $value, $this -> uncompiled);
  50.       $this -> uncompiled = $text;
  51.       $this -> compiled = $text;
  52.     }
  53.     $this -> compiled = &#092;"n<!-- \". $this -> template .\" -->n\". $this -> compiled .\"n<!-- /\". $this -> template. \" -->n\";
  54.     return $this -> compiled;
  55.   }
  56. }
  57. ?>

index.php
  1. <?
  2. include_once('template.php');
  3.  
  4. $tpl = new Template;
  5.  
  6. $tpl -> LoadTemplate(&#092;"template/index_body.tpl\");
  7.  
  8. $tpl -> sub_vars = array(
  9.      &#092;"TITLE\" => \"tytuł\",
  10.      &#092;"AUTHOR\" => \"autor\",
  11.      &#092;"DATE\" => \"data\",
  12.      &#092;"NEWS\" => \"news\"
  13.      );
  14. $tpl -> subsection = array(
  15.      &#092;"newsrow\"
  16.      );
  17. $tpl -> Subsection();
  18.  
  19. $tpl -> tpl_vars = array(
  20.      &#092;"LINK\" => \"linki\"
  21.      );
  22. $tpl -> Compile();
  23. echo $tpl -> compiled;
  24. ?>

index_body.tpl
  1. <table align="center" width="450" height="10" cellpadding="0" cellspacing="0">
  2.     <tr><td>
  3.     <table align="center" width="440"  cellpadding="0" cellspacing="0">
  4.       <tr><td align="center" width="440" height="30">
  5.         <b>Wie&para;ci</b>
  6.       </td></tr>
  7.       <tr><td align="center" width="440">
  8.  
  9.         <!-- BEGIN newsrow -->
  10.         <table align="center" width="420" cellpadding="0" cellspacing="0">
  11.           <tr><td width="420" height="10">
  12.             &nbsp;<b>{newsrow.TITLE}</b>
  13.           </td></tr>
  14.           <tr><td width="420" height="10">
  15.             &nbsp;<a href="command.php">{newsrow.AUTHOR}</a>,&nbsp;&nbsp;{newsrow.DATE}
  16.           </td></tr>
  17.           <tr><td valign="top" width="420">
  18.           </td></tr>
  19.           <tr><td valign="top" width="420">
  20.             &nbsp;{newsrow.NEWS}
  21.           </td></tr>
  22.           <tr><td align="center" width="420" height="10">
  23.           </td></tr>
  24.         </table>
  25.         <table align="center" width="420" height="20" cellpadding="0" cellspacing="0">
  26.           <tr><td>
  27.           </td></tr>
  28.         </table>
  29.         <!-- END newsrow -->
  30.  
  31.       </td></tr>
  32.       <tr><td align="center" width="440">
  33.         {LINK}
  34.       </td></tr>
  35.     </table>
  36.     </td></tr>
  37.   </table>

Jak widać napisałem funkcję, która znajduje wszystkie dane do zamiany z odpowiednią sekcją(tu akurat {newsrow.COŚ_TAM}), ale nie umiem napisać funkcji, któraby wzięła tekst znajdujący się pomiędzy <!-- BEGIN newsrow --> a <!-- END newsrow --> i zapętliłaby go odpwiednią ilość razy(np. tyle ile jest newsów w bazie danych) dodawając za każdym razem odpowiednią wartość między {}(np. za pierwszym razem w {newsrow.NEWS} wstawiłoby news1, za kolejnym news2, itd.).
Pomoże mi ktoś?

----------
Prosze uzywac [php] do umieszczania kodu php
hwao
mazy
  1. {if $newsy}
  2. <!--news-->
  3. {section name=news loop=$newsy}
  4. {$newsy[news].cosTam}
  5. {else}
  6. nie ma newsów
  7. {/if}


do numerowania mozesz uzyć np.:
Kod
{counter}
kawuha
Hmm... niestety nie rozumiem jak dzięki temu miałbym rozwiązać mój problem, ponieważ nadal nie wiem jak zapętlić. sad.gif

PS. A może jest coś czego nie rozumiem(XML? Wiem, że to jest rozszerzalny język znaczników, ale nigdy go nie używałem. Zna ktoś dobry kurs tongue.gif)?
mazy
biggrin.gif to smarty;) jesli go uzyjesz to tak bedzie wygladalo wyswietlenie tablicy z newsami tongue.gif
kawuha
Cytat(mazy @ 2004-06-17 16:30:53)
biggrin.gif to smarty;) jesli go uzyjesz to tak bedzie wygladalo wyswietlenie tablicy z newsami tongue.gif

To mogłeś napisać :](i skąd ten XML w nagłówku kodu?). Rozważam możliwość wykorzystania Smarty, ale chciałbym rozwiązać mój problem z szablonami również. biggrin.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.