Open Power Template

download Open Power Template

If you can't read please download the document

Transcript of Open Power Template

  1. 1. Open Power Template 2 Tomasz Jdrzejewski Grupa Invenzzia PHPCon Polska 21 maja 2010
  2. 2. Czym s systemy szablonw?
    • System szablonw biblioteka zajmujca si generowaniem kodu HTML w aplikacji WWW.
    • 3. Dane dostarcza aplikacja.
    • 4. Struktura kodu zawarta jest w tzw.szablonach .
    • 5. Szablon mwi, gdzie i jak w kodzie HTML wywietli dane.
  3. 6. Elementy systemu szablonw
    • Interfejs programisty zbir klas oraz interfejsw do wsppracy z aplikacj.
    • 7. Jzyk szablonw narzdzie do pisania szablonw HTML.
  4. 8. Dwa podejcia do problemu jzyka szablonw PHP jako jzyk szablonw Szablony pisane s w tym samym jzyku, co aplikacja, wzbogaconym o dodatkowe klasy i funkcje do generowania HTML. Przykady: Savant, Zend_View Dedykowany jzyk szablonw Wprowadzamy nowy jzyk, w zaoeniu o prostszej skadni, lepiej dopasowanej do wsppracy z HTML-em. Przykady: Smarty, Dwoo, PHPTAL
  5. 9. Dedykowany jzyk szablonw czy warto? Dlaczego ludzie tworz nowe jzyki szablonw, zamiast uy PHP? Dlaczego wynaleli PHP, zamiast pisa aplikacje WWW w C? Niektre odpowiedzi: Zoono jzyka Ograniczenia jzyka Skomplikowana skadnia
  6. 10. Wady PHP w szablonach
    • Jzyk imperatywny dostosowany bardziej do budowy aplikacji oraz zapisu algorytmw.
    • 11. Musimy krok po kroku informowa komputer, jak wykona nawet najprostsze operacje.
    • 12. Kod staje siwyjtkowonieczytelny, gdy osadzimy go w HTML-u.
    • 13. PHP nie rozumie struktury HTML-a.
    • 14. Brak uytecznych funkcji pomocniczych do generowania kodu HTML (chyba e sami je napiszemy).
  7. 15. Mity o systemach szablonw Po co mi kolejna warstwa abstrakcji, skoro PHP ju jest systemem szablonw? System szablonw jest pewn bibliotek. PHP jestjzykiem , ktry poza ptlami i instrukcjami warunkowymi nie udostpnianic , co nawet przypominaoby API systemw szablonw. Wynika std, e i tak bdzie trzeba tak warstw abstrakcji napisa. Frameworki nie uywaj systemw szablonw, po co nimi zawraca gow? C jest takiego wyjtkowego w warstwach widoku frameworkw, e nie zasuguj one na to miano? Jeli ma skrzyda i kwacze jak kaczka, to jest to kaczka bez wzgldu na to, jak sobie na ni bdzie woa gospodyni.
  8. 16. Mity o jzykach szablonw PHP by pierwotnie opracowywany jako jzyk szablonw. By , a niejest . PHP ju dawno obra zupenie inny kierunek rozwoju. Brak pomocniczych funkcji, brak uproszcze skadniowych do generowania kodu HTML bez porzdnego obudowania autorskim zestawem dodatkw jest on ekstremalnie ciki w uyciu w roli jzyka szablonw. PHP nie trzeba si uczy, dedykowanego jzyka tak. A co ze wszystkimi helperami i funkcjami pomocniczymi? Zoono niektrych spotykanych rozwiza jest bardzo dua. Gdy dana osoba zna podstawy programowania, nauka kadego nowego jzyka jest atwiejsza. Tak samo mogli powiedzie programici, gdy pojawia si Java. Nie zrobili tego.
  9. 17. Mity o jzykach szablonw Dodatkowy jzyk to spadek wydajnoci Nieprawda 99% systemw szablonw posiada kompilatory, ktre raz kompiluj szablon do kodu PHP, a pniej tylko wykonuj prekompilowan wersj. Co wicej, PHP musi wszystko rozwizywa w trakcie wykonywania. Kompilator moe cz rzeczy przeliczy ju na etapie kompilacji. Kompilator nie musi przejmowa si czytelnoci kodu wynikowego, moe wic automatycznie wdroy szereg optymalizacji. Po co w takim razie dodatkowy jzyk, skoro i tak zamieniamy to na PHP? Tworzc nowy jzyk, ogranicza nas jedynie wyobrania i zasoby komputera. Po co korzysta z jzykw programowania, skoro moemy pisa w kodzie maszynowym? To proste ich skadnia i rozwizania sprawiaj, e programy pisze siszybciej, prociej i taniej .
  10. 18. Przykadowa lista w szablonie PHP Tak prosty problem, a tymczasem dostajemy klasyczny przykad kodu napisz i zapomnij Skomplikowane warunki do sprawdzania czy lista jest pusta. Rcznie zakodowane algorytmy znajdujce pierwszy element . Opcjonalny atrybut to kopoty PHP nie rozumie kodu HTML. Musimy zajmowa si escape'owaniem danych, co jeszcze bardziej wydua kod. Oraz wiedzie ju na tym etapie, co bdzie obiektem, co tablic itd.
    Nasza lista
    1. >
  11. 19. Smarty i wikszo systemw nie wnosi nic nowego Przykad jzyka, ktry powtarza bdy PHP i produkuje nowe.Wci musimy rcznie opracowywa kady moliwy algorytm. Nieuzasadnione wprowadzanie nowej, ezoterycznej skadni do zwyczajnych rzeczy (wywoanie funkcji). I dalej musimy sami pamita o escape'owaniu. Smarty te nie rozumie HTML-a Dalej musimy zna szczegy implementacyjne aplikacji. {if$items }
    Nasza lista
    1. {assign var= 'first'value= 0 }{foreach from= $itemsitem= $item }
    2. { $item [ title ]|escape} {/foreach}
    {/if}
  12. 20. Alternatywa: Open Power Template 2
    • OPT rozumie struktur HTML-a i robi z tego uytek.
    • 21. Programowanie deklaratywne powiedz,cochcesz uzyska, a niejakto ma dziaa.
    • 22. Jzyk zorientowany na rozwizywanie typowych problemw szablonw (wywietlanie list, formularze itd.)
    • 23. Nowoczesny, obiektowy interfejs programistyczny.
    • 24. Jzyk przenony nic nie stoi na przeszkodzie, aby przeportowa go na Rubiego, Pythona itd.
  13. 25. Fakty: Open Power Template 2
    • Za projekt odpowiadaj ludzie z 7-letnim dowiadczeniem w tematyce systemw szablonw.
    • 26. Rozwijany od 5 lat; pierwsza stabilna wersja sierpie 2006.
    • 27. Obszerna dokumentacja oraz tutoriale.
    • 28. Wielokrotnie sprawdzi si w praktyce.
    • 29. Wci nowe pomysy na rozwj.
    • 30. Projekt open-source.
  14. 31. Ten sam przykad w Open Power Template Sekcje, inteligentne ptle, ukrywaj wszystkie zbdne szczegy implementacyjne i techniczne. Parser robi uytek ze znajomoci HTML-a. Nie musimy wiedzie, jak rozpozna pierwszy element list. OPT zrobi to za nas. Dane s automatycznie escape'owane . A my nie musimy wiedzie czy to jest tablica, obiekt czy co innego . < opt:show name = items > < div > < h1 > Nasza lista h1 > < ol > < liopt:section = items > < opt:attribute str:name = class str:value = first opt:if = $system.section.items.first /> { $items.title } li > ol > div > opt:show >
  15. 32. Krtki przewodnik po jzyku szablonw
  16. 33. Sekcje inteligentne ptle
    • Koniec z rcznym iterowaniem niezalene od reprezentacji danych i szczegw implementacyjnych.
    • 34. Cztery rodzaje: zwyke listy, selektory, drzewa i widok kolumnowy.
    • 35. Intuicyjne tworzenie zagniedonych list oraz relacji midzy nimi.
    • 36. Deklaratywna budowa skup si na wygldzie.
    • 37. Szczegy implementacyjne mog by zmieniane przez skrypt bez przepisywania szablonw.
  17. 38. Szablon bloga na sekcjach < opt:section name = entries > < div class= entry > < h1 > { $entries.title } h1 > { u : $entries.body } < span class= tags > < opt:section name = tags str:separator = , > < aparse:href = url( '/show/tag?tag=' ~ $tags.slug ) > { $tags.title } a > opt:section > span > div > opt:section > < div id= pagination > < opt:selector name = paginator > < opt:page > < aparse:href = $paginator.url > { $paginator.number } a > opt:page > < opt:active > < span class= active > { $paginator.number } span > opt:active > < opt:gap > ... opt:gap > opt:selector > div >
  18. 39. Dziedziczenie szablonw
    • Sposb modularyzacji i ponownego wykorzystania wsplnego kodu.
    • 40. Zawdrowao do wiata PHP z systemw dla Pythona i Perla.
    • 41. Podobiestwa do programowania obiektowego:
      • Zamiast klas, rozszerzamy szablony.
      • 42. Zamiast metod mamy snippety (rodzaj makr OPT).
      • 43. Moliwo przesaniania snippetw w szablonach potomnych.
  19. 44. Dziedziczenie szablonw szablon bazowy < opt:root > < html > < head > < title >< opt:insert snippet = title /> title > head > < body > < div id= header > < opt:insert snippet = header > < h1 > Moja strona h1 > opt:insert > div> < div id= content > < opt:insert snippet = content /> div > body > html > opt:root >
  20. 45. Dziedziczenie szablonw szablon potomny < opt:extend file = base.tpl > < opt:snippet name = title > Mj tytu opt:snippet > < opt:snippet name = header > < opt:parent />< h2 > Strona gwna h2 > opt:snippet > < opt:snippet name = content > < p > Tutaj troch treci... p > opt:snippet > opt:root >
  21. 46. Wywietlanie formularzy ciki orzech do zgryzienia
    • Jak przechowywa definicj formularza oraz reguy sprawdzania?
    • 47. Jak nie przenosi elementw wygldu do modelu i kontrolera?
    • 48. Jak zapanowa nad wygldem formularzy, by wykorzysta go wielokrotnie?
    • 49. Jak zachowa wolno dawan przez prac z czystym HTML-em?
  22. 50. Wywietlanie formularzy komponenty OPT
    • Prawdopodobnie pierwszy tak elastyczny mechanizm wywietlania elementw formularzy.
    • 51. Kontrolki podzielone na dwie warstwy:
      • Logika kontrolki (klasa w PHP) obiekty komponentu
      • 52. Wygld kontrolki (kod HTML) porty komponentu
    • System formularzy oddzielony od spraw wygldu.
    • 53. Bogaty interfejs komunikacyjny midzy obiema warstwami.
  23. 54. Przykadowy formularz cz 1 < form:input name = str: title template = standardLayout > < opt:set name = str: label value = str: Tytu /> form:input > < form:input name = str: age label = str: Wiek > < divopt:component-attributes = default > < label for= parse: $system.component.id > { $system.component.label } label > < opt:display /> < opt:on-event name = error > < p class= error > { $system.component.errorMessage } p > opt:on-event > div > form:input >
  24. 55. Przykadowy formularz cz 2 < opt:snippetname= standardLayout > < divopt:component-attributes = default > < label for= parse: $system.component.id > { $system.component.label } label > < opt:display /> < opt:on-event name = error > < p class= error > { $system.component.errorMessage } p > opt:on-event > div > opt:snippet > < o pt:section name = widgets > < opt:component from = $widgets.component template = standardLayout > < opt:set name = str: specificParam value = str: Foo /> opt:component > opt:section >
  25. 56. System wyrae
    • Identycznie jak w PHP, moemy tworzy zoone wyraenia obliczajce jak warto:
    • 57. Dostosowany do uycia w kodzie HTML bez potrzeby stosowania encji.
    • 58. Nie zastpuje dobrze znanych elementw (np. funkcji) przez jakie egzotyczne struktury.
    • 59. Eliminuje niekonsekwencje PHP w zakresie stylu nazewnictwa i kolejnoci argumentw funkcji.
    < p > { $foo + ( $bar * 7 )} p > < p > { funkcja ( $a ,$b ,$c ) } p > { $a is 'foo' ~ $zmienna }
  26. 60. System wyrae - kontenery
    • Abstrakcja zbudowana nad zoonymi typami danych: obiektami, tablicami itd.
    • 61. W momencie pisania szablonu nie musimy zna wewntrznej reprezentacji danych.
    • 62. Mona wielokrotnie wykorzystywa te same szablony w rnych projektach bez zmiany kodu wystarczy odpowiednio skonfigurowa skrypt.
    • 63. Kontenery mog reprezentowa take zoon logik, np. helpery:
    < h1 > { $article.title } h1 > < p > { $article.body } p > < title > { $helpers.title } title >
  27. 64. System wyrae osadzanie w kodzie XML/HTML
    • W obrbie tekstu przy pomocy zapisu klamerkowego:
    • 65. W atrybutach specjalna przestrze nazwparse:a w OPT 2.1 prefiks wartoci.
    • 66. W atrybutach instrukcji automatyczne rozpoznanie:
    • 67. OPT automatycznie dba o escaping, jednoczenie pozostawiajc nam kontrol:
    < p > { $foo + ( $bar * 7 )} p > < divparse:class= $foo > OPT 2.0 < div class= parse: $foo > OPT 2.1 < opt:iftest= $foo eq 7 > < h1 > {e: $title } h1 > < p > {u: $body } p >
  28. 68. API biblioteki
  29. 69. Wiele systemw szablonw jest obiektowych tylko z nazwy
    • API zredukowane do klasy do wszystkiego:
      • Smarty, Dwoo, Savant, PHP-Sugar i wiele innych
    • Mog odkrywa koo na nowo:
      • Smarty izasobykontra strumienie PHP
    • Lub dostarcza dodatkow, zakodowan na sztywno funkcjonalno, ktra z szablonami ma niewiele wsplnego:
      • Smarty i mechanizm cache
  30. 70. Ale nie Open Power Template! Opl_Loader :: setDirectory ( './libs/Opl' ) ; Opl_Loader :: register () ; try { $opt= new Opt_Class ; $opt->sourceDir= './templates/' ; $opt->compileDir= './templates_c/' ; $opt->setup(); $view= new Opt_View ( 'template.tpl' ) ; $view->var1= 'Foo' ; $view->var2=array ( 'foo'=>'abc' ,'bar'=>'def' ) ; $view->var3=newMyObject ; $view->setFormat ( 'var3' ,'Objective' ) ; $output= new Opt_Output_Http ; $output->setContentType ( Opt_Output_Http ::XHTML,'utf-8' ) ; $output->render ( $view ) ; } catch ( Opt_Exception$exception ) ... Wsplne jdro dla bibliotek z serii OPL Klasa do zarzdzania konfiguracj. Widok:: dane + szablon. Formaty danych: okrel szczegy implementacyjne.System wyjcia: co zrobi z przetworzonym szablonem. Wyjtki.
  31. 71. Formaty danych
    • To one odpowiadaj za t wielokrotnie wspominan niezaleno od szczegw implementacyjnych.
    • 72. Wsppracuj z instrukcjami XML, dostarczajc konkretnych kawakw kodu PHP do obsugi danej funkcjonalnoci.
    • 73. Obsuguj dekorowanie.
    • 74. Formaty danych wybiera skrypt, zalenie od potrzeb:
    $view->setFormat ( 'foo' ,'Objective' ) ; $view->setFormat ( 'sekcja' ,'RuntimeGenerator/Array' ) ;
  32. 75. Wydajno
    • OPT nieco wolniejszy od konkurencji dla najmniejszych i najprostszych szablonw, gdzie znaczenie ma czas adowania biblioteki.
    • 76. OPT przyspiesza przy wikszych szablonach dziki wydajnemu kodowi wynikowemu.
    • 77. OPT jest szybszy ni Smarty (2 i 3), a nawetczyste PHPw Zend_View przy niektrych zoonych testach.
    • 78. Moliwo podpicia OPT pod dowolny system cache dziki interfejsowiOpt_Caching_Interface .
  33. 79. Przyszo projektu
  34. 80. Open Power Template 2.1: super-switch < opt:switchtest=" $warunek " > < opt:equalsvalue= "wartosc1" > Tre... opt:equals > < opt:equalsvalue= "wartosc2" > Tre... opt:equals > < opt:equalsvalue= "wartosc3" > Tre... opt:equals > < opt:equalsvalue= "wartosc4" > Troch treci... < opt:equalsvalue= "wartosc5" > tre... opt:equals > Jeszcze troch treci. opt:equals > < opt:default > ... opt:default > opt:switch > < opt:switchtest=" $pojemnik " > < opt:containsvalue= "foo" > tre... opt:contains > < opt:containsvalue= "bar" > tre... opt:contains > < opt:containsvalue= "joe" > tre... opt:contains > opt:switch >
  35. 81. Open Power Template 2.1: procedury i argumenty snippetw < opt:procedurename= fooargument= required > < p > Hi, universe! p > < p > { @argument } p > opt:procedure > < opt:snippetname= fooargument= required > < p > Hello, world! p > < p > { $argument } p > opt:snippet > < opt:useprocedure= $procName argument= str :warto /> < opt:usesnippet= fooargument= str :warto />
  36. 82. Open Power Template 2.1: dugie ify < opt:if > < opt:conditiontest= $warunek1 > < p > Warunek 1 p > opt:condition > < p >Tre midzy warunkami. p > < opt:conditiontest= $warunek2 > < p > Warunek 2 p > opt:condition > < opt:conditiontest= $warunek3 > < p > Warunek 3 p > opt:condition > > < p >Jeszcze troch treci. p > < opt:else > < p > Pozostae p > opt:else > opt:if >
  37. 83. Open Power Template 2.1: nowy parser wyrae
    • Konstruktory kontenerw:
    • 84. Dynamiczne indeksy kontenerw:
    • 85. Funkcje z nazywanymi argumentami:
    • 86. Niektre nowe operatory:
    { $foo is [ 'idx1' :'warto 1' , 'idx2' :'warto 2' ] } { $foo.bar. ( $joe ) } {url ( 'controller' :'index' , 'action' :'index' ) } < opt:iftest= $foo contains 'abc' >... opt:if > < opt:iftest= $foo contains both 'abc' and 'def' > ... opt:if > < opt:iftest= $foo is between 7 and 13 >... opt:if > < opt:iftest= $foo is either 5 or 9 > ... opt:if >
  38. 87. Powizane projekty
    • Open Power Libs niewielkie jdro z podstawowymi usugami: autoloader, obsuga pluginw, obsuga bdw, rejestr obiektw, konsola debugowa.
    • 88. Open Power Forms biblioteka obsugi formularzy zintegrowana z OPT o niespotykanej skalowalnoci: od prostego formularza logowania do arkusza kalkulacyjnego.
    • 89. Open Power Classes zbir dodatkowych niewielkich bibliotek, w tym take do OPT (stronicowanie, cache, system tumacze itd.)
    • 90. Porty dla Zend Framework, Kohana, CakePHP.
  39. 91. Chwila dla reportera ... czyli czas na pytania od suchaczy, prob o dopowiedzenie / wytumaczenie / wrcenie do czego itd.
  40. 92. KONIEC Wicej informacji na www.invenzzia.org