Some of posts from this blog has been moved to dywicki.pl. You will be automatically redirected to new blog if you would submit comment.
New posts are published on dywicki.pl, this blog contains old content and it is not continued.

Niektóre posty z tego bloga zostały przeniesione do dywicki.pl. Zostaniesz automatycznie przekierowany jeśli bedzięsz chciał dodać komentarz.
Nowe posty sa publikowane na dywicki.pl, ten blog zawiera stare treści i nie jest kontynuowany.

Parser szablonów

Filed under PHP by

Wczoraj, bądź przedwczoraj wpadłem na pomysł wykorzystania DOM XML i XSL przy tworzeniu szablonów. Zainspirował mnie PHP TAL (Template Attribute Language).

Z początku szablon miał być stylem XSL, jednak pomysł ten szybko odpadł ze względu na to, że uniemożliwia to tworzenie własnych komponentów, a przynajmniej ja nie wiem jak to zrobić. W tym układzie w pamięci przechowywany byłby obiekt DomDocument z odpowiednią struktórą – odwzorowaniem dodanych zmiennych.
Drugi pomysł wyklucza użycie XSL. Szablon jest parsowany DOM XMLem a następnie rekurencyjnie przeglądany. Na podstawie nazw tagów i zarejestrowanych na początku szablonu rozszeżeń parser tworzy odpowiednie obiekty odpowiadające za komponenty. Ogólnie idea tworzenia własnych rozszeżeń jest rodem z JSP.
Nie wiem co z tego wyjdzie i wogóle czy coś z tego będzie.. ;)

Jedno jest pewne – odpada problem z gromadą wyrażeń regularnych, pozbywam się kompilatora. Zostaje parser i być może cache. Sam jestem ciekaw czy to rozwiązanie będzie szybsze niż np. Smarty.
Poniżej bardzo abstrakcyjne przykłady.

<?xml version="1.0" ?>
<x xmlns:i18n="http://template.splatch.pl/i18n"
   xmlns:pst="http://template.splatch.pl/pst"
   xmlns:attr="http://template.splatch.pl/attr"
   xmlns="http://template.splatch.pl/" >
  <i18n:message select="Hello">
  <pst:test equals="true" assigned:variable="AssignedVar" assigned:value="OtherVar">
  	Test 1
  </pst:test>
  <pst:test identical="true" assigned:variable="AssignedVar" value="TestVar">
  	Test 2
  </pst:test>
</x>
<?php

$tpl = new PST;
$i18 = ConfigParserFactory::get('i18n-test/pl.ini');
$tpl->setI18nDatasource($i18); // ConfigParser

$tpl->assign('AssignedVar',true);
$tpl->assign('OtherVar',false);

$tpl->display('test.xml');

?>

6 responses so far

6 Responses to “Parser szablonów”

  1. chmolu says:

    Moim zdaniem tracisz swój czas. Spróbuj spojrzeć na ten szablon okiem kogoś, kto zajmuje się grafiką i nie zna php. Zjarzy bezproblemowo? – Nie sądzę.

    PHP to naprawdę dobry język szablonów ;) Dlaczego ciągle zawracacie sobie głowę pisaniem tego typu krów, które niczego nie ułatwiają? Nie przyczepiłbym się, gdybyś użył XSLT, bo to standard (i gotowe rozwiązanie). Kwestia sensowności jego zastosowania w php to już osobny temat ;)

  2. splatch says:

    Spojrzenie z perspektywy osoby nie znającej PHP na szablony zawsze jest problemem, niezależnie od tego jakiego parsera sie używa i od tego czy jest to przeplatany PHP czy nie. Dlaczego? Ponieważ wielu mało rozgarniętych grafików gubi się przy pierwszej pętli foreach.
    PHP nie jest najlepszym językiem szablonów. Ciągłe wskakiwanie interpretera z kodu HTML do kodu PHP znacznie go zpowialnia.
    PHP jako język szablonów jest też ciężko rozszeżalny – tzn. nie ma w nim żadnej dynamiki. Jeśli na przykład chcę dorzucić jakąś funkcję muszę ją zdefiniować i zadbać o to, by była wczytana.
    XSLT fakt, jest dobre, ale z pewnością mniej czytelne niż normalny kod XML/HMTL. Procesor dostarcza odpowiednich funkcji, jednak żaden grafik nie będzie w stanie ich użyć, bo najnormalniej w świecie ich nie zna.
    Co do czasu – jeśli ktoś się uczy, nigdy nie traci czasu. :)

  3. chmolu says:

    To prawda, php nie jest najlepszym językiem szablonów. Dla grafików jest tak samo niezrozumiały, co Smarty, czy np. phpTal. Jednak większość systemów szablonów zazwyczaj i tak kompiluje swój kod do php, więc twoje stwierdzenie, że ciągłe wyskakiwanie z HTMLa spowalnia kod jest trochę dziwne.

    Dla mnie pisanie czegoś takiego to utrudnianie sobie życia. PHP nie jest rozszerzalny? Nie żartuj. Nie sądzę, żeby nie dało się rozwiązać w nim jakiegokolwiek problemu z szablonami w miarę elegancki sposób.

    Nie każdy tez potrafi sensownie używac php w szablonach. Tutaj bardzo łatwo o burdel, dlatego staram się nie unkać używania funkcji, czy klas, które nie są w ogóle związane z prezentacją.

  4. splatch says:

    Smarty i pochodne dlatego kompiluje szablon do PHP ponieważ odpalenie takiego szablonu jest szybsze niż jego ponowne parsowanie i szatkowanie regexpami. Co do wskakiwania – nie pamiętam dokładnie gdzie to czytałem, ale wiele osób może to potwierdzić…
    PHP Savant nie kompiluje szablonu ponieważ piszesz "zkompilowany" szablon..

  5. krowa says:

    Proponuje poczekać na OPT light.
    pozdrawiam

  6. eXtreme says:

    krowa >> OPT ma sprytny konfigurator dzięki któremu można z kodu pousuwać różniaste niepotrzebne nam elementy, przyspieszając go tym. Można usuwać: "Autoloading plugins support", "Custom resources", "Debug console", "disableCompileCache", "GZip compression support", "Output caching", "Component support", "Predefined components", "registerXXX() methods", "Objective I18n", "httpHeaders() methods" więc całkiem tego sporo można wyrzucić.

Leave a Reply

You must be logged in to post a comment.