Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] parser szablonow z subsekcjami
Forum PHP.pl > Forum > PHP
Rudi1204
Witam!
Na stronie museum.webcity.pl jest przykład jak zrobić parser szablonów bez subsekcji.
Już nie raz ktoś pytał na tym forum jak zrobić by miał subiekcje. Odpowiedzi były rożne, a nawet dostałem, gdy sam pytałem taką, że to jest "wymyślanie na nowo kola"...:| no może i jest ale i tak dalej drążyłem ten temat i po paru(nastu) ;p nie przespanych nocach udało się!! :]

Pytanie jest tylko czy to jest wydajne i co o tym sadzicie? W razie pytań piszcie :]

plik class_template.php
  1. <?php
  2.  
  3. // parser szablonów
  4. class template
  5. {
  6.    var $unparsed = array(0 => '');
  7.    var $parsed = '';
  8.    var $blocks = array('default' => '');
  9. //#nowe#
  10.    var $subFile = ''; // sciezka do pliku do metody subsection
  11.    var $subRange =''; // przechowuje zakres subsekcji
  12.    var $subTpl = array(0 => ''); // tymczasowy szablon z tymczasowymi zmiennymi
  13.  
  14.    function load($plik)
  15.    {
  16.        $this -> unparsed = @file('./tpl/'.$plik.'.html'); // podaje adres szablonów
  17.    //#nowe#
  18.        $this -> subFile = @file_get_contents('./tpl/'.$plik.'.html');
  19.    }
  20. //#nowe
  21.    function sub_range($subStrings)
  22.    {
  23.        $subUnprased = $this -> subFile;
  24.        foreach($subStrings as $subString)
  25.        {
  26.        // wyciągam sobie zakres zmiennych
  27.            preg_match("#<!--[".$subString."]-->(.*?)<!--[/".$subString."]-->#is", $subUnprased, $subResult);
  28.            $subRangeResult['{'.$subString.'}']=$subResult[1];
  29.        // podmieniam zakres zmiennych na tymczasowe inne zmienne do szablonu
  30.            $subUnprased=preg_replace("#<!--[".$subString."]-->(.*?)<!--[/".$subString."]-->#is",'{'.$subString.'}',$subUnprased);
  31.        }
  32.        
  33.        // zamieniam bloki z zakresem w tablicy ze stringa na kolejny wymiar tablicy
  34.        // dlaczego?? poniewaz funkcja load wczytuje plik metoda file
  35.        // ktora zamienia plik szablonu na tablice
  36.        foreach($subStrings as $subString)
  37.        {
  38.            $subRangeResult['{'.$subString.'}']=preg_split("/(r?\n)/", trim($subRangeResult['{'.$subString.'}']));
  39.        }
  40.        $this -> subRange = $subRangeResult;
  41.        $this -> subTpl = preg_split("#(\n)#is", $subUnprased);
  42.    }
  43.    
  44.    function parse()
  45.    {
  46.        $this -> parsed = "";
  47.        $cnt = count($this -> unparsed);
  48.        for($i = 0; $i <= $cnt; $i++)
  49.        {
  50.            $tekst = $this -> unparsed[$i];
  51.            $found = array();
  52.            if(preg_match_all("#{(.+?)}#is", $tekst, $found))
  53.            {
  54.                foreach($found[1] as $block)
  55.                {
  56.                    $block_names[] = '{'.$block.'}';
  57.                    $block_values[] = &$this -> blocks[$block];
  58.                }
  59.                $tekst = str_replace($block_names, $block_values, $tekst);
  60.            }
  61.            $this -> parsed .= $tekst;
  62.        }
  63.    }
  64. }
  65. ?>


plik index.php
  1. <?php
  2.  
  3.    // dodatkowa funkcja - opcjonalne
  4.    function subDestylate($text)
  5.    {
  6.        $text=ereg_replace(" {2,}"," ",$text);
  7.        $text = ereg_replace("\t", "", $text);
  8.        $text = ereg_replace("\n", "\n\t", $text);
  9.        return $text;
  10.    }
  11.  
  12.    include_once('class_template.php');
  13.  
  14.    $tpl = new template;
  15.    $tpl -> load("main_index");
  16.  
  17. // wyznaczam zakres bloków subsekcji i wpisuję ich nazwę
  18.    $subStrings = array('test');
  19. // wrzucam tablice z zakresem w celu "wyciecia blokow zakresu"    
  20.    $tpl -> sub_range($subStrings);
  21. // w tej zmiennej przechowywane sa w tablicy "bloki zakresu"
  22.    $subBlocks = $tpl -> subRange;
  23.  
  24. // zamiana danych w bloku subsekcji
  25.    
  26. // tablica ze zmiennymi ktore chce wprowadzic
  27.    $tablica_test=array('test1', 'test2', 'test3', 'test4');
  28. // TUTAJ ISTOTNA SPRAWA !!
  29. // przypisuje do $tpl -> unprased tablice $subArray z kluczem takim
  30. // jaki nazwa bloku ktory podmieniam + klamry
  31. // czyli: {"nazwa"} , tutaj bedzie {test}
  32.    $tpl -> unparsed = $subBlocks['{test}'];
  33.  
  34. // wrzucam zmienna tpl w petle i podmieniam zgodnie
  35. // z podanym wzorcem na stronie museum.webcity.pl
  36.    foreach($tablica_test as $zmienna)
  37.    {
  38.        $tpl -> blocks = array('$d' => $zmienna);
  39.        $tpl -> parse();
  40.    // wynik dodaje do zmiennej $sub_test
  41.    // a "\n" jest po to by kolejne bloki byly
  42.    // w nowych liniach podczas podgladu zrodla strony w przegladarce
  43.        $sub_test .= "\n". $tpl -> parsed;
  44.    }
  45.  
  46. // przypisuje do $tpl zamiast funkcji "load()"
  47. // tymczasowy szablon (patrz klasa)
  48.    $tpl -> unparsed = $tpl -> subTpl;
  49.  
  50.    // podmieniam bloki szablonu tymczasowego
  51.    // i otrzymuje ostateczny rezultat
  52.        $tpl -> blocks = array(
  53.        "BLOK1" => "dana1",
  54.        "BLOK2" => "dana2",
  55.        "BLOK3" => "dana3",
  56.    // bardzo istotna rzecz !!
  57.    // w miejscu gdzie mielismy zakres
  58.    // funkcja sub_range wstawila nazwe zakresu subsekcji
  59.    // do szablonu tymczasowego tutaj nazywa sie "test"
  60.    // a wstawila w sposob "{test}" by pozniej jak bedzie parser
  61.    // parsowal szablon tymczasowy podmienila ja na zmienna sub_test
  62.    // czyli wynik parsowania bloku subsekcji (zakresu)
  63.        "test" => subDestylate($sub_test)
  64.    // wykorzystalem jeszcze sobie funkcje subDestylate
  65.    // ktora ladnie uklada nam bloczek w podgladzie zrodla strony w przegladarce
  66.    );
  67. // szablon tymczasowy parsuje
  68.    $tpl -> parse();
  69. // wyswietlam wynik koncowy
  70.    echo $tpl -> parsed;
  71. ?>


plik szablonu, main_index.html, tu akurat umieszczony w katalogu tpl
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  4. <title>Untitled Document</title>
  5. </head>
  6. <body>
  7.  
  8. <ul>
  9. <li>
  10. <div>{BLOK1}</div>
  11. <div>{BLOK2}</div>
  12. <div>{BLOK3}</div>
  13. </li>
  14. </ul>
  15.  
  16. <ul>
  17. <!--[test]-->
  18. <li>
  19. <p>{$d}</p>
  20. </li>
  21. <!--[/test]-->
  22. </ul>
  23.  
  24. <ul>
  25. <li>
  26. <div>{BLOK1}</div>
  27. <div>{BLOK2}</div>
  28. <div>{BLOK3}</div>
  29. </li>
  30. </ul>
  31.  
  32.  
  33. </body>
  34. </html>
erix
http://forum.php.pl/index.php?showtopic=117885&hl=

Kontynuuj dyskusję tam, gdzie zacząłeś.
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.