Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [porada]tpl Vs. php
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
Stron: 1, 2
Spirit86
Witam, pisze właśnie w wolnych chwilach nowy CMS(główne założenia: bezpieczne, szybkie, optymalne klasy, funkcje, łatwy do rozbudowy). Kiedyś wykorzystywałem system theme'ów podobny do tego z PHPNuke / Jportal(praktycznie cały wygląd pobierany z jednego pliku). Jednakże uważam to za łatwe, szybkie, ale jakoś strasznie "prymitywne" winksmiley.jpg w związku z czym mam zamiar napisać parser templates. Coś a'la PHPBB. Wygląd by się składał z plików: header, footer - które były by stałe na wszystkich stronach, oraz plików środka zależnych od strony (np. newsy - main.tpl). Zastanawiam się co jest lepszym rozwiązaniem, mile widziane argumenty winksmiley.jpg.
Pozdrawiam

@moders / admins: nie wiedziałem, w które forum to wcisnąć, to wydało mi się najbardziej odpowiednim. Mam nadzieję, że prosota(?) problemu nie będzie przeszkadzała w tym dziele.
Speedy
Dlaczego definiowanie całego theme'a w jednym pliku jest prymitywne blink.gif ?
Liczy się efekt , nie sposób tongue.gif . Chociaż właściwie im lepszy sposób , tym lepszy efekt rolleyes.gif . W sumie tworząc szablony takie , że np. każdy składa się z trzech plików (header, content, footer), tworzy się większą możliwość rozbudowy i manipulacji ów szablonami. Hm... właściwie to napisanie tego w omawiany przez Ciebie sposób, jest innym sposobem osiągnięcia celu, który można osiągnąć metodą "prymitywną".

Moja opinia jest mało konstruktywna - przepraszam tongue.gif . Cóż... mam małe doświadczenie w tym temacie...

Pozdrawiam.
CzarnyKot
Ja bym wykorzystal do tego FastTemplate ...
daje nieograniczano możliwości rozbijania szablonów na "mnijesze kawałki"...
W wersji od 1.1.5 posiada wiele ciekawych funkcji.
Ale chyba Ci nie spasuje bo jest wręcz "prymitywna" biggrin.gif
... ale i tak polecam.
Albert Einstein powiedzial kiedys ze wszystko nalezy upraszczac tak, jak jest to tylko mozliwe, ale nie bardziej... Zaufaj mu ... biggrin.gif w programowaniu to chyba tez niezla zasada


wiecej informacji na http://www.grafxsoftware.com

No i to tesh przeczytaj jak masz chwilke - ladnie wyjasnione dlaczego FT jest ok winksmiley.jpg
http://www.onlamp.com/pub/a/php/2003/10/02...php.html?page=1
bigZbig
Kiedys uzywalem systemu templatow z phpBB. Fajne ale maja pewne ograniczenia. Potem "odkrylem" smarty. To naprawde potezny mechanizm i stosunkowo prosty w uzyciu. W tej chwili mam opracowany (jeszcze nie dokonca zrealizowany) taki schemat, ktory pozwala mi w prosty sposob kontrolowac i zmieniac zgodnie z potrzebami nie tylko zawartosc srodka strony ale takze marginesow (oraz to czy one maja sie w ogole pojawic) i w zaleznosci czy jest jeden margines czy dwa, wyboru innego naglowka lub stopki. Moge zmieniac zawartosci czesci head - dodawac javaskryptoy lub generowac zindywidualizowane dla kazdej podstrony metatagi np. z opisem zawartosci strony lub slowami kluczowymi. Dzieki smarty oddzielilem czesc logiczna od wizualnej. Budujac nowy temat (skórkę) moge calkowicie zmienic nie tylko kolorystykę, ale takze strukture strony.
bela
A ja polecam OPT. Możliwości zblizone do smaty, w wersji 0.3.0 będzie bić smaty na głowe winksmiley.jpg
NuLL
łe tam - to i tak wszystko takie same ciągle - zawsze trza pisać miliard tych assign'ów...

Może to co będzie portafił mój system - tzn. upomnieć się o dane samemu i jego niesamowite lenistwo pozwoli mu się wybić....

A co do poziału - zrób tak aby nie trzeba było definiować ile szablonow potrzebuje skorka tongue.gif - tak aby każda skorka portafiła sama o sieibie zadbać i załadować to co trzeba smile.gif
Spirit86
@NuLL: całkiem ciekawy pomysł, troche trudniejszy do rozwiązania, ale zawsze coś winksmiley.jpg.

"Prymitywna" rozumiałem przez fakt, że
1) Strony takie nie są do końca odseparowaniem kodu od php (pozostają funkcje z php, np. <? echo GLOBALS['costam']; ?> (początkujących przeraża taki widok winksmiley.jpg.
2) Niby wszystko jest super, można zmieniać prawie wszystko, jednakże nie wygląda to łatnie, gdy np. zaczniemy mieszać JS z php (apostrofy, cudzysłowie należy często poprzedzać poprzez \" , \', albo wychodzić z php (function jakas(){ ?> cos tam mi napisz <? } , co moim zdaniem wprowadza niepotrzebny chaos.

Zresztą sam nie jestem przekonany co lepsze, co czyni Smarki, Silnik Template z PHPBB lepszym o tegoż z choćby polskeigo JPortal?exclamation.gif Szczerze to nie znam Smarków, a silnik PHPBB zaczełem poznawać, jednakże nadal mam ten problem, co lepsze ....?

Chcę napisać coś, co pozwoli na zmiany nie znającym wogóle php, ani nie znającym się "super" na HTML / XHTML na modyfikację. Chcę dać także programistom ewentualne możliwości popisania się umiejętnościami, w dosyć łatwy sposób. Chcę, aby to było rozwiązanie nowoczesne, stabilne i przejrzyste. Dlatego proszę Was o komentowanie winksmiley.jpg. Może za dużo wytycznych?!
Pozdrawiam
CzarnyKot
trzeba zauważyć że takie produkty jak smarty zawierają już pewną logikę aplikacji... moim zdaniem to jest niewskazane bardzo. Takie templaty są mniej zrozumiałe dla webdesignerów, którzy biegając jedynie wokół swojej działki nie powinni zachaczać o nic co wykracza dalej poza html-a.
ebe
A czy istnieje jakiś system templatów (nie połączony z frameworkiem) który oferuje znaczniki xmlowe? Coś podobnego do wacta i prado, ale bez otoczki framework'owej...

np:

  1. <template:useobject name="member" method="getLogin" />


Może ktoś coś takiego pisał albo zastanawia się jak napisać? A jak jeszcze czegoś takiego nie ma to może warto by napisać?
bela
Cytat(CzarnyKot @ 2005-04-12 17:28:31)
trzeba zauważyć że takie produkty jak smarty zawierają już pewną logikę aplikacji... moim zdaniem to jest niewskazane bardzo. Takie templaty są mniej zrozumiałe dla webdesignerów, którzy biegając jedynie wokół swojej działki nie powinni zachaczać o nic co wykracza dalej poza html-a.

Ale grafik przecież może dostarczyć design, a "włożeniem" mogą zająć się juz programisci :]
Po za tym nalezy byc uniwersalnym winksmiley.jpg
CzarnyKot
Cytat(bela_666 @ 2005-04-12 16:52:42)
Ale grafik przecież może dostarczyć design, a "włożeniem" mogą zająć się juz programisci :]
Po za tym nalezy byc uniwersalnym winksmiley.jpg

wydaje mi się, że tacy co to znają się "na wszystkim" zazwyczaj nie znają się dobrze na niczym winksmiley.jpg ... ale troche w tym prawdy - takie czasu dry.gif
Ja jednak nie czuje sie sam na silach aby byc dobrym programista javy, c++, php, (...) przy tym swietnie znal flasha i jeszcze walil grafami jak z rekawa.
No ale pocieszam sie ze geniusze rodza sie rzadko smile.gif

Podsumowujac polecam jak wyzej rozwiazania proste i efektywne.
BTW: kiedy powstawaly pierwsze klasy do obslugi szablonów - założenie było bardzo proste i moim zdaniem wyjątkowo słuszne "oddzielić warstwę prezentacji (interfejsu graficznego) od aplikacji (w tym jej logiki exclamation.gif!)
Zdaje sie ze teraz programisci zapominaja o tym fakcie.
Zresztą powiedzcie sami do czego to prowadzi? zaniedlugo bedziemy pisac jakies Macra dla Smartow czy innych podobnych po to zeby programista php mogl dac upust swojej fantazji i napisac parser dla swojego wlasnego nowego "interpretowanego jezyka" ktory bedzie interpretowany przez interpreter php... zajebiscie winksmiley.jpg
bela
Cytat(CzarnyKot @ 2005-04-12 22:37:36)
Cytat(bela_666 @ 2005-04-12 16:52:42)
Ale grafik przecież może dostarczyć design, a "włożeniem" mogą zająć się juz programisci :]
Po za tym nalezy byc uniwersalnym winksmiley.jpg

wydaje mi się, że tacy co to znają się "na wszystkim" zazwyczaj nie znają się dobrze na niczym winksmiley.jpg ... ale troche w tym prawdy - takie czasu dry.gif

Przez uniwersalnosc rozumiem dostasowanie się do określonej sytuacji, użycie odpowiednich narzędzi do odpowiednich celów, a nie znanie się na wszystkim. No chyba, że mylę pojecia.
xarr
Nie zgadzam sie by grafik nie znajacy sie na smarty nie mogl dzialac, podobnie gosc kumajacy tylko htmla przez troszke kodu smarty przestal nagle wiedziec o co chodzi.
Wszystko zalezy od tego by czlowieka uswiadomic czego niech nie rusza i czym ma sie kompletnie nie przejmowac. To lezy w gestii programisty by chociaz w minimalnym stopniu wyjasnil jak dziala projekt i co nalezy do czego oraz za, co odpowiada dany element.

Grafike poza tym mozna wsadzac w css. W wiekszosci wypadkow sie to sprawdza i zalatwia sprawe grafika. Poza tym jesli rozmawiamy o poprawnie napisanych stronach zarowno pod katem (x)html`a jak i arkusza styli to nie wyobrazam sobie problemow z wspolgraniem czlonkow zespolu bedacych tylko i wylacznie specjalistami w swojej dzialce. Kod jest na tyle zoptymalizowany i ograniczony do minimum, ze trudno sie w nim nie polapac. W czyms takim znaczniki smarty az nad to daja po oczach biggrin.gif
Jesli zas ktos uskutecznia zagniezdzane tabelki i metody sprawdzajace sie przy pisaniu www w latach swietnosci IE3 do prezentacji tresci i innych materialow na www to sam sobie zawdziecza swoj los smile.gif

A wracajac do tematu to uzywam smarty i szczerze powiedziawszy chociaz mam pare 'ale' to jestem z tego szabloniku zadowolony.
@Bella: OPT jest ciekawe, a co nam dostarczy 0.3 to dopiero czas pokaze. Puki co smarty smile.gif
@CzarnyKot: Taka natura czlowieka by kombinowac. Gdyby nie to pewnie jedyny kod jaki moglbys napisac to hieroglify albo inne znaki na scianie jakiejs groty biggrin.gif
bigZbig
Cytat(Spirit86)
Zresztą sam nie jestem przekonany co lepsze, co czyni Smarki, Silnik Template z PHPBB lepszym o tegoż z choćby polskeigo JPortal?exclamation.gif Szczerze to nie znam Smarków, a silnik PHPBB zaczełem poznawać, jednakże nadal mam ten problem, co lepsze ....?


Template z phpBB jest prostsze, ale ma tez pewne ograniczenia.

Przyklad:
Powiedzmy, ze chcesz wylistowac placowki oswiatowe.
- Zespol Szkol nr 1
-- Szkola Podstawowa nr 1
-- Gimnazjum nr 1
-- I LO
-Zespol Szkol nr 2
-- Szkola Podstawowa nr 2
-- Gimnazjum nr 2
-Zespol Szkol Ogolnoksztalcacych nr 3
-- Gimnazjum nr 3
-- III LO
Wypisujesz poszczegolne placowki oswiatowe, a pod kazda z nich wypisujesz szkoly, ktore sie w danych zespolach znajduja. Wymaga to zagniezdzenia jednej listy w drugiej. Przy pomocy rozwazania rodem z phpBB tego nie zrobisz, a przy pomocy smarty tak.

Spirit86 dalej wyrazasz chec napisania czegos prostego i uniwersalnego. Ja Ci mowie, ze powinienes najpierw poznac pare systemow aby poznac ich mozliwosci, rozpoznac wady, zaczerpnac z nich to co najlepsze.

Cytat(CzarnyKot)
trzeba zauważyć że takie produkty jak smarty zawierają już pewną logikę aplikacji... moim zdaniem to jest niewskazane bardzo. Takie templaty są mniej zrozumiałe dla webdesignerów, którzy biegając jedynie wokół swojej działki nie powinni zachaczać o nic co wykracza dalej poza html-a.


Na dobra sprawe to grafik nie powinien nawet zagladac do htmla. Programista tworzy odpowiednia strukture dokumentu, opisuje go klasami z css - a, a designer tylko uscisla te definicje i dorabia grafiki. W praktyce takie dzialanie to tylko teoria.

Smarty nie sa moze banalnie proste, ale za to piszac newsy - uzywajac np. systemu szablonow z phpBB musialem stworzyc cztery szablony. Jeden dla widoku wylistowanych newsow, drugi dla widoku pojedynczego newsa oraz dwa ich odpowiedniki w wersji dla admina. Dzieki logice zawartej w smarty robie jeden widok i w cale nie jest on wielce skaplikowany. Parafrazujac samochod jest bardziej skaplikowany od roweru, ale dzieki temu mozesz zajechac dalej i szybciej. Oczywiscie jesli chcesz pojechac 100 metrow do sklepu po piwko to nie wsiadasz do helikoptera winksmiley.jpg
bregovic
Cytat(NuLL @ 2005-04-12 14:22:35)
Może to co będzie portafił mój system - tzn. upomnieć się o dane samemu i jego niesamowite lenistwo pozwoli mu się wybić....

HEHEHE tongue.gif
Od dwóch miesięcy mój malutki plugin do Smarty potrafi sam pobierać dane z DAO - i nie jest to nic trudnego - a ułatwia tworzenie logiki prezentacji jakieś milion razy.
bigZbig
@bregovic: Chetnie bym wyprobowal twoj maly plugin. Gdybys byl tak mily biggrin.gif Obiecuje nie rozpowszechniac bez Twojej zgody i nie podpisywac wlasnym nazwiskiem winksmiley.jpg
NuLL
@ebe - w czymś takim trzeba napisać jakiś procesor template'ow...
bela
Cytat(bregovic @ 2005-04-13 07:51:56)
Cytat(NuLL @ 2005-04-12 14:22:35)
Może to co będzie portafił mój system - tzn. upomnieć się o dane samemu i jego niesamowite lenistwo pozwoli mu się wybić....

HEHEHE tongue.gif
Od dwóch miesięcy mój malutki plugin do Smarty potrafi sam pobierać dane z DAO - i nie jest to nic trudnego - a ułatwia tworzenie logiki prezentacji jakieś milion razy.

Pokażesz to cudo ?
NuLL
Też bym ogldnął - zastanawiam się czy chodzi o to samo o czym ja myśle ale chyba raczej nie tongue.gif winksmiley.jpg
Ociu
Tu jest dość ciekawy system templatów, na początek powinien być ok.
ebe
Ale znaczniki mozna skompilować do php, pozatym php w templacie 'kusi' tworzeniem logiki.
Wave
emilio, masz rację. Dla niektórych, skrypty w których jest mniej niż 10 plików albo które można opanować bez manuala (min 100kb dokumentacji) - wydają się prymitywne.
W końcu do czego dążymy? Do pisania skryptów w skryptach? Do stworzenia nowego języka? Jak ktoś chce pętle to niech napisze kurde sobie while'a a nie coś takiego <petla razy='100'></petla>, przecież to śmieszne - każdy kto sięga po skrypty (php) jest raczej obeznany z tym tematem i nie pisze się ich dla ludzi na poziomie HTML'a. Jak chcą to się nauczą, a tak to jest skok na głęboką wodę. Uniwersalnego szablonu/silnika nie da się zrobić, więc prędzej czy później z czystym php się zetkną i za przeproszeniem wymsknie się im: 'o kurcze!', 'what the puck?!' smile.gif
Spirit86
ja o tym samym pomyślałem, dlatego postanowiłem stworzyc system, który będzie super ekstra prosty tongue.gif
będzie obsługa {jakas_zmienna}
[ php ] tutaj kod php [/ php ]
zxastanawiam się też nad czymś w rodziaju <!--IF LOGGED_IN--><!--ENDIF-->
ebe
Cytat
zxastanawiam się też nad czymś w rodziaju <!--IF LOGGED_IN--><!--ENDIF-->


Moim zdaniem decyzje o tym co wyswietlić w danym miejscu powinna podejmowac logika a nie template. Jesli masz miejsce na stronie do której jest ładowany albo panel użytkownika albo formularz logowania to powinna zadecydowa o tym logika assignując odpowiednie zmienne (np. z nazwą pliku danego templatu). Pozatym to niebezbiczne powiązanie templatu z klasą obsługującą logowanie, bo usztywnia templte do określonej klasy logowania, no niby mozna opracowac specjalny interfejs, ale imho to nie template powinien sprawdzać czy user jest zalogowany.
Spirit86
@emilio: tak, niby masz rację, co to za różnica? Ano przedewszystkim taka, że ładniej wydląda biggrin.gif, poza tym możesz przeglądać w przeglądarce szablon (gdy sprwdzisz przy używaniu <? ... ?> nie pojawi sie w miejscu php nic, a jak dasz {title} pojawi się tytuł, bedzie łatwiej edytować tongue.gif).
@ebe: to jest pomysł z PHPBB. Pozatym czasami chcesz dodać bajer w template, np. pokaż mi takie logo jak jestem zalogowany, a jak nie inne....
ebe
Cytat
to jest pomysł z PHPBB. Pozatym czasami chcesz dodać bajer w template, np. pokaż mi takie logo jak jestem zalogowany, a jak nie inne....


PhpBB nie jest doskonałe, a co do drugiego, niech decyduje o tym logika. Fakt takie coś może być przydatne, ale miesza warstwy...
dr_bonzo
Dokladnie, wystarczy w przypadku zalogowania przeslac do templata inna sciezke do grafiki.
Imperior
Widze, że muszę dorzucić swoje kilka groszy...

1. Nie uważacie, że grafikiem może nie być programista?
2. Nie uważacie, że jeśli grafik robi szablony, to nie chce mieć do czynienia z kodem php?
3. Nie uważacie, że programista będzie spał spokojniej, jeśli grafik będzie robił szablony dla Smarty, które zapewnia największe (lub jedno z czołowych, ale raczej naj-) bezpieczeństwo?
4. Nie widzicie w oferatch pracy czasem czegoś w stylu: "Mile widziana znajomość systemu szablonów SMARTY" ?
5. Nie mam zamiaru tutaj nikogo prowokować wychwalając Smarty, ale bądź co bądź jest to najlepiej dopracowany system szablonów w php. (Ale i tak XSLT rox)
6. Mnie tam nie podobają się pętle w Smartach, ale reszta składni jest w sumie wporządku i jest PROSTA, więc co mówicie, że trzeba się uczyć nowej składni? Toć ludzie podobno są istotami myślącymi?! Ludzie.....
Spirit86
@emilio: napiałem, że będzie pojawiał się {title}, a nie przypisany jej wartość

@Imperior: masz rację, ale jak tworzę CMS to nie tylko dla grafików. Jak ktoś się zna mniej na php, to po co ma się zagłębiać w "tajniki" kodu, jeśli wystarczy mu wpisanie w kodzie [php][/php]. Np. super początkujący będzie miał frajdę, gdy napisze licznik odwiedzin i umieści go w kodzie. A reszta będzie na : {zmienna}. Bo to wygląda przejrzyściej...
Djack
Cytat(bigZbig @ 2005-04-13 06:34:42)
Smarty nie sa moze banalnie proste, ale za to piszac newsy - uzywajac np. systemu szablonow z phpBB musialem stworzyc cztery szablony. Jeden dla widoku wylistowanych newsow, drugi dla widoku pojedynczego newsa oraz dwa ich odpowiedniki w wersji dla admina.

Jak dla mnie szablony maja sluzyc do 1-go ... oddzielenie warstwy aplikacji od warstwy prezentacji. Jezeli mam php zamieniac na jezyk Smarty to chyba nie o to chodzi.

Wlasnie to czego mi brakuje w Smarty to wybor. Jezeli chce stosowac jezyk Smarty to ok ale jezeli chce w 100% oddzielic obie warstwy od siebie powinienem miec wybor alternatywny np. bloki dynamiczne - znane z innych systemow.


Ostatnio moj kolega przedstawial Smarty na seminarium i nie tylko ja mialem do niego pytania wlasnie odnosnie tego - dynamicznego wyswietlania danych pobranych z bazy.


Obecnie poszukuje prostego acz skutecznego systemu szablonow. Testuje roznorakie systemy .... Moze ktos porownywal szybkosci roznych systemow byl bym zainteresowany smile.gif
bigZbig
Smarty sa pewnym kompromisem. Nie sa one moze faktycznie banalnie proste i dla kogos kto sie z nimi spotyka pierwszy raz napewno nie sa intuicyjne. Mozna jednak przy pomocy smarty wykonac o wiele wiecej niz przy pomocy innych szablonow. Ponad to, poza sama prezentacja danych, Smarty ma tez zaimplementowany swoisty system cachowania, ktory przyspiesza generowanie stron i zminiejsza obciazenie zasobow sytemowych.

Wskazcie mi system bardziej intuicyjny, prostszy w uzyciu i wydajniejszy a chetnie sie przesiade. Ja tez bym wolal aby na pierwszy rzut oka moje szablony niczym sie nie roznily od zwyklego htmla
Djack
Przed momentem znalazlem artykul na temat Szablonow, a pod koniec takie o to zakonczenie.

Cytat
In short, the point of template engines should be to separate your business logic from your presentation logic, not separate your php code from your HTML code.


To teraz to juz nic nie wiem smile.gif. Mam przez to kompletny metlik w glowie. Mimo wszystko jednak sie z ta sentencja nie za bardzo zgadzam i obstaje przy swoim. Narazie tez nie mam przekonania do Smarty .... Jak narazie za Smarty to jest to ze niektore firmy mile to widza i ma dobry system cachowania.
Do powyzszej sentencji Smarty tez nie pasuja, bo w sposob oczywisty narzuca wlasna logike

Coz, jeszcze sie nie zlalazl taki co by wszystkim dogodzil smile.gif

OT: Ma ktos jakies materialy na temat GTK-php tongue.gif oczywiscie procz oficjalnej strony
bregovic
Smarty ma jeden problem - nażuca użycie swojej logiki prezentacji. I za to ludzie go nie lubią. Użycie php jako systemu szablonów może byłoby dobre - tylko po co? Jeśli używasz php do templatów musisz sam zadbać o jakieś bezpieczeństwo (jak??), cache'owanie, izolację zmiennych itp. Smarty robi to wszystko za ciebie, przy niewielkiej cenie.

Jednocześnie używając prostego plugina można użyć Smarty jako widoku, i pozwolić mu ściągać dane bez potrzeby assign'owania:
  1. <?php
  2.  
  3. function smarty_function_getdao($arrParams, & $objSmarty)
  4. {
  5. if (empty ($arrParams['name']))
  6. {
  7. $smarty->trigger_error(&#092;"getdao: missing 'name' parameter\");
  8. return;
  9. }
  10. $strDaoName = strtolower($arrParams['name']);
  11. /* Pobieramy zmienną phppath - moją zmienną środowiskową, zawierającą miedzy innymi informacje o akcji, parame
  12. rach itp. */
  13. $arrPhppath = $objSmarty->get_template_vars('phppath');
  14. /* Chwilowo czyścimy tą zmienną ze zbioru zmiennych Smarty'ego */
  15. $objSmarty->clear_assign('phppath');
  16.  
  17. if (!array_key_exists($strDaoName, $arrPhppath['daos']))
  18. {
  19. /* BASEDIR to moja stała zawierająca ścierzkę do root'a aplikacji. */
  20. require_once BASEDIR.'dao/'.$strDaoName.'.dao.php';
  21. $strClassName = 'Dao'.ucfirst($strDaoName);
  22. if (!$objDao = new $strClassName)
  23. {
  24. return false;
  25. }
  26. $arrPhppath['daos'][$strDaoName] = & $objDao;
  27. }
  28.  
  29.  
  30. /* Przypisujemy zmienną na miejsce. */
  31. if (!$objSmarty->assign('phppath', $arrPhppath))
  32. {
  33. return false;
  34. }
  35. return true;
  36. }
  37.  
  38. ?>


Sposób użycia:

Kod
{getdao name="article"}
{assign var="article" value=$phppath.daos.article->getArticleByTitle('Strona gwłóna')}
{$article.content}


Lub trochę bardziej zaawansowany:

Kod
{getdao name="news"}
{getdao name="user"}
<div id="right_box">
    <div id="news_box">
        {foreach item=news from=$phppath.daos.news->getNews(false, 'time desc')}
            {assign var="user" value=$phppath.daos.user->getUserById($news.user_id)}
            <h3>{$news.title}</h3>
            <div class="date">{$news.time|date_format:" %d.%m.%Y %T"}</div>
            <p>{$news.content}</p>
            <div class="author"><a href="kontakt/{$user.pseudonim|strtolower}">{$user.pseudonim}</a></div>
        {/foreach}
    </div>
</div>


edit
Co do przyszłości template'ów, i w ogóle frameworków, to żućcie okiem na WACT'a - to będzie to, jak już wyjdą ze stadium aplha.
squid
Cytat(NuLL @ 2005-04-12 15:22:35)
łe tam - to i tak wszystko takie same ciągle - zawsze trza pisać miliard tych assign'ów...

Może to co będzie portafił mój system - tzn. upomnieć się o dane samemu i jego niesamowite lenistwo pozwoli mu się wybić....

nie trzeba uzywac miliona assignow, moim rozwiazniem jest automatyczne przypisanie danych przetworzonych przez system do template'u
bigZbig
Jeżeli używasz adodb to wyniki zapytania zwracane w postaci tablicy asocjacyjnej mozesz automatycznie asignowac do systemu szablonow smarty.

Przykladowo:
  1. <?php
  2.  
  3. //plik news.php
  4. $adodb->Execute($query);
  5. if ($result === false) die(&#092;"failed\");
  6. else {
  7. $news = $result->GetArray();
  8. $smarty->assign('news',$news);
  9. }
  10.  
  11. //plik news.tpl.php
  12. <table>
  13. {section name=mysec loop=$news}{strip}
  14. <tr><th>{$news[mysec].title}</th></tr>
  15. <tr><td>{$news[mysec].text}</td></tr>
  16. {/strip}{/section}
  17.  
  18. ?>
chmolu
Kolejna wojna o szablony winksmiley.jpg

Do autora tematu: nie ma nic złego w wykorzystywaniu php jako języka szablonów. Dopóki pracujesz sam, nie masz w zespole żadnego grafika, czy osoby zajmującej się layoutem, to uzywanie systemu szablonów nie ma najmniejszego sensu. Szablony oczywiście są użyteczne - systemy szablonów mniej.

Szablony mają być wygodne przede wszystkim dla designerów. Jak powinien wyglądac system przyjazny dla designera? Najprościej tak:
  1. <head><title>Tu będzie tytuł</title></head>
  2. <body>
  3. <h1 id="naglowek">Tu będzie nagłowek</h1>
  4. <div id="tresc">A tu będzie treść</div>
  5. </body>
  6. </html>


Dokument powinien być zgodny ze standardem xHTML. Można wtedy wykorzystać standardowe rozwiązania dostępne w php5 - DOM (nie wiem, czy działa - nie testowałem):

  1. <?php
  2.  
  3. $doc = DOMDocument::loadHTMLFile('file.html');
  4. $title = $doc->getElementByTagName('title');
  5. $title->textContent = &#092;"Tytuł strony\";
  6.  
  7. $naglowek = $doc->getElementById('naglowek');
  8. $naglowek->textContent = &#092;"Naglowek\";
  9. ?>

Oczywiście to najprostszy przykład. Wystarczy to ładnie opakowac w klasę i mamy cacy system. Wadą DOM'a jest to, że wysypuje się przy źle sformułowanym dokumencie, ale i to ma swoje dobre strony - narzuca nam pisanie poprawnego kodu xHTML. Taki system szablonów jest łatwy w rozbudowie, a dla designera bardzo przyjazny - żadnego nowego języka. Problem może stanowić szybkość. Trzeba bowiem za każdym razem odczytywać dokument od nowa. Wydawało mi się, że znalazłem na to sposób - serializacja obiektu DOMDocument, tyle, że nie da się tego zrobić :/ Kolejny bug w php5?

W tej chwili kończę dość dłuugi artykuł na ten temat, który mam nadzieję znajdzie się na php.pl, więc będziecie mogli sie zapoznać z wszystkimi poglądami, które wyrobiłem sobie na ten temat przez czytanie całej masy postów i artykułów. Nie chce mi się odpowiadać dlaczego Smarty jest złe, bo w zasadzie wszystko zawarłem w artykule. Jeśli ktoś jest ciekawy to już teraz zapraszam smile.gif Cierpliwości.

Jeszcze nasunęła mi się jedna myśl. Open Power Board zapowiada się świetnie, ale szkoda, że tracicie czas na pisanie rzeczy typu OPT i OPD zamiast zająć się forum. Jaki to ma cel? Jest Smarty, jest AdoDB i Creole. Szczególnie OPT nie ma dla mnie najmniejszego sensu. Bo co? Będzie szybsze? Mniej przeładowane? - Już jest na dobrej drodze by być w tej samej wadze co Smarty.

Ogólnie: CzarnyKot, emilio, Wave i ebe mają rację.
Cytat
proponuje się zabrać za coś bardziej pożytecznego (np. omawiany preprocesor, do tego jakiś analizator kodu)
Święte słowa. Ludzie, jeśli piszecie CMS to poświęćcie czas na projektowanie CMS'a a nie na system szablonów, który jest akurat najmniej istotną rzeczą. Jeśli już naprawdę potrzebujecie systemu szablonów to wykorzystajcie jeden z istniejących
Nievinny
@chmolu -> od czego jest Cache?
Przypomina mi się WACT? To jest dobre rozwiązanie, wydajne i optymalne.
bela
Cytat(chmolu @ 2005-05-01 17:56:21)
Jeszcze nasunęła mi się jedna myśl. Open Power Board zapowiada się świetnie, ale szkoda, że tracicie czas na pisanie rzeczy typu OPT i OPD zamiast zająć się forum. Jaki to ma cel? Jest Smarty, jest AdoDB i Creole. Szczególnie OPT nie ma dla mnie najmniejszego sensu. Bo co? Będzie szybsze? Mniej przeładowane?

Cytat(Zyx @ 2005.04.30; 18:06)
Deyv, myślę, że będziesz zachwycony wynikami dokonanej optymalizacji smile.gif. Szczegóły:

dodałem dodatkową metodę do_include, z której wywaliłem to, co jest niepotrzebne, a wstawiłem kod do buforowania wczytywanych plików. Dla potrzeb testów zrobiłem takie dwa szablony:

Kod
{* do_include.tpl *}
{for i; @i < 80; @i is @i + 1}
    {include="sample_inclusion.tpl"}
{/for}

Kod
{* sample_inclusion.tpl *}
ble ble ble ble ble ble ble ble
ble ble ble ble ble ble ble ble

tj. powtórz 80 razy instrukcję include dołączającą jakiś plik. Efekty:

Bez optymalizacji:
- średni czas wykonania sample_inclusion.tpl: 0.0009 s
- łączny czas przetwarzania do_include.tpl: 0.12863 s

Z optymalizacją:
- średni czas wykonania sample_inclusion.tpl: 0.0005 s
- łączny czas przetwarzania do_include.tpl: 0.06362 s

To jednak nie wszystko. Otóż do konfiguracji OPT dodałem kolejną dyrektywę: include_optimization. Włączona powoduje, że INCLUDE optymalizowane jest jeszcze bardziej, jednak już kosztem miejsca na HDD. Sztuczka polega na tym, że jeśli plik szablonu został w niej zdefiniowany statycznie, np. {include="sample_inclusion.tpl"}, w miejsce tej instrukcji wstawiany jest... kod tego szablonu, a nie polecenie przetworzenia go. Ma to kilka niedogodności:
1. trzeba mieć więcej miejsca na HDD
2. jeśli zmieni się coś w dołączanym szablonie, OPT tego nie dostrzeże

ale efekt jest jeszcze lepszy. Powyższy przykład uruchomiony z tą optymalizacją wykonał się w całości w... 0.00473 s.

Zastanawiam się jednak, czy jej włączania nie rozwiązać lepiej. Obecnie jest to w konfiguracji, więc optymalizacja będzie dotyczyła wszystkich include'ów, czy tego chcemy, czy nie. Opcjonalnie można jednak dać to jako trzeci parametr samej instrukcji.
*

Skopiowane z forum opb winksmiley.jpg
chmolu
@Nievinny - WACT rzeczywiście jest jak dla mnie najlepszym systemem szablonów jaki istnieje. Niestety ciężko jest go oddzielić od reszty frameworka. Szkoda, bo nie kazdy potrzebuje całej funkcjonalności WACTa

@bela: Być może i jest szybszy, ale dalej systemy, które oferują swój nowy rozbudowany język programowania 'kompilowany' do php dla mnie mijają się z celem.
ebe
@chmolu: Jak sobie poradzić z pętlami stosując DOM'a? Wydaje mi się że 'goły' DOM nie jest najlepszy ale coś na kształt WACT''owego systemu templatów już tak.
chmolu
WACT jest systemem z prawdziwego zdarzenia i ma większe możliwości, ale pętle i komponenty w DOM też da się wykonać. Nie zastanawiałem się jeszcze nad tym dokładniej, ale postaram się pokombinowac dzisiaj i zarzucić kodem.

Tymczasem poczytaj sobie artykuły Harrego Fuecksa na ten temat (php and DOM: The Way of the Widget, Data Access Object Pattern (+ more widgets))
Ociu
Cytat(chmolu @ 2005-05-01 17:56:21)
Problem może stanowić szybkość. Trzeba bowiem za każdym razem odczytywać dokument od nowa. Wydawało mi się, że znalazłem na to sposób - serializacja obiektu DOMDocument, tyle, że nie da się tego zrobić :/ Kolejny bug w php5?

Właśnie dlatego szablony są wyrzej stawiane niż php (DOM). Najczęściej właśnie rozchodzi się o szybkość ładowania się strony. Są ludzie, którzy jeszcze jadą na modemach i niestety szkoda im czasu, aż DOM odczyta dokument odnowa...
Nievinny
OK, testowałem kod @chmolu i po poprawkach jest taki:
  1. <?php
  2.  
  3. $A = 'To jest tytul tej strony';
  4. $B = 'To jest nowy naglowek strony';
  5. $C = 'To jest nowa zawartosc sciema';
  6.  
  7. try{
  8. highlight_file( 'pikus.tpl' );
  9. $DOM = new DOMDocument;
  10. $DOM->validateOnParse = true;
  11. $DOM->loadHTMLFile( 'pikus.tpl' );
  12. $DOM->encoding = 'iso-8859-2';
  13. $DOM->getElementsByTagName( 'title' )->item(0)->nodeValue = $A;
  14. $DOM->getElementById( 'naglowek' )->nodeValue = $B;
  15. $DOM->getElementById( 'tresc' )->nodeValue = $C;
  16. print $DOM->actualEncoding . '<br />';
  17. highlight_string( $DOM->saveHTML() );
  18. }
  19. catch( DOMException $E ) {
  20. print $E;
  21. }
  22.  
  23. ?>


A zawartość tplki:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  3. <meta http-equiv="Content-Type" content="text/html; encoding=utf-8">
  4. <title>{title}</title>
  5. </head>
  6. <div id="naglowek">{header}</div>
  7. <div id="tresc">{content}</div>
  8. </body>
  9. </html>

I działa ładnie, ale gdy w zmiennej A, B, C napiszę jaki kolwiek polski znak diagratyczny (np ą ę ł ó) to się wsypuje, jak to się rozwiąże to będzie dobrze.
bela
Cytat
I działa ładnie, ale gdy w zmiennej A, B, C napiszę jaki kolwiek polski znak diagratyczny (np ą ę ł ó) to się wsypuje, jak to się rozwiąże to będzie dobrze.

Skorzystaj z utf-8 winksmiley.jpg
chmolu
header('Content-Type: text/html;charset=ISO-8859-2'); pomaga (ale najpierw zmień znacznik meta z kodowaniem na ISO-8859-2
Ociu
Nivinny: nie wiem, czy to zależy od wersji php. Mi na php 5.0.3, apache 2.0.52 wypluwa kod html, a nie tresc zmiennych. (testuje Twój przykład)

Edit 15.05.2005, 21:26
IIS6, PHP5.0.4 wypluwa html, tyle, że zmienia wartości.
Slump
@chmolu odp Zyx'a na twoje ( i nie tylko twoje) stanowisko ad opt oraz kilka slow wyjasnienic co i po co smile.gif:
http://www.zyxist.com/pokaz.php?id=41
chmolu
Odpowiem Zyxowi tutaj.

Cieszę się, że dałeś odzew. OPT to porządny kawał kodu - to trzeba przyznać, ale mimo wszystko uważam, że podąża tą samą co Smarty. Nie chodzi o to, że {section} jest bardziej skomplikowane niż <block> - każdej składni można się nauczyć.

Nie chodzi też o to, że graficy to idioci i nie dadzą sobie rady z {if $user_logged eq 1}, czy {expr show ($blok1 + $blok2)}.

Pytanie tylko po co zawracać im tym głowę? Zmuszamy designerów do rozgryzania zasady działania aplikacji, a to nie powinno ich w ogóle obchodzić. Oni mają tylko za zadanie sprawić, żeby interferjs wyglądał ładnie.

W Smarty i OPT prezentacja jest oddzielana od kodu php, z tym, że cała logika prezentacji przenoszona jest do szablonów. Tak nie powinno być.

Kolejna sprawa to rzeczy typu {wordwrap($tekst, 75, "<br/>\n")}, {$user|upper}, {$title|capitalize} etc.
To wszystko można zrealizować za pomocą CSS.

Ta dyskusja nie ma na celu obrzucać błotem OPT i Smarty, lecz uświadomić nieustannie powtarzane błędy i spróbować znaleźć rozwiązanie wygodne dla programistów, ale przede wszystkim dla grafików.

Co do wyższości list WACT'a nad sekcjami OPT:

  1. <list:list id="Users">
  2. <ul>
  3. <list:item><li>{$Username} ($Email)</li></list:item>
  4. <list:default><li>No currently active users</li></list:default>
  5. </ul>
  6. </list:list>

może wydawać się niektórym bardziej czytelne, niż section,secion-else, ale to też sprawa bardzo indywidualna. Główna przewaga WACTa to wydajność. W Smarty najpierw trzeba pobrać tablicę rekordów z bazy, obrobić i przesłać do szablonu. W WACTcie dzięki iteratorom pobieranie danych i wysyłanie ich do szablonu odbywa się jednocześnie (bez tworzenia żadnych kopii):
  1. <?php
  2.  
  3. // Find the runtime component
  4. $UserList =& $Page->findChild('Users');
  5.  
  6. // Get the users record set
  7. $UserSet = & NewRecordSet('SELECT * FROM users')
  8.  
  9. // Register the record set as the data source for the runtime component
  10. $UserList->registerDataSet($UserSet);
  11. ?>


Cały system szablonów WACTa zajmuje bardzo dużo - to fakt, ale do skryptów włączamy tylko plik template.inc.php (ok 10KB).
Slump
Odp zyx'a:

Chmolu -> tak, jak pisałem: instrukcji kontrolnych pokroju if, for nie wywalę, gdyż na nie też jest popyt (i to spory!), a wysokopoziomowych instrukcji będzie znacznie więcej, tylko obecnie z powodu prac nad samym kompilatorem nie miałem na to czasu.

Funkcje wordwrap, capitalize, upper są wbrew pozorom przydatne, bo świat nie kończy się na XHTML+CSS2. Na mojej stronie używam OPT do generowania RSS'ów, a swego czasu wykorzystywałem Smarty'ego do tworzenia zwykłych plików tekstowych. Tylko taki sposób daje mi możliwość wyboru sposobu obróbki danych w zależności od szablonu.

Ad. pobierania bezpośrednio z bazy -> WACT jest tu w o tyle lepszej sytuacji, że jest częścią całego frameworka, m.in. ze sterownikiem bazy danych, z którym może się zintegrować. OPT ma działać docelowo także osobno i obecnie po prostu brakuje mi pomysłu, jak dobrze opracować choćby platformę, na której programista mógłby sobie to sam zintegrować do końca ze swym sterownikiem.
Nievinny
@Bela -> testy na wypadek pomyłek, przecież nikt nie będzie pisał w plikach językowych w utf-8 a w kodowaniu rodzimym.
@Ociu -> php5.0.4 i jeśli tylko skopiowałeś przykład to będzie działał poprawnie (zamiarem było wyrzucenie HTML, aby sprawdzić jak wygląda kod), ale wstaw tam znak niezgodny z kodowaniem.
@chmolu -> z nagłowkami nie działa, a meta musi zostać uniwersalna, ponieważ trzeba zmieniać kodowanie zależnie od ustawień programisty
@zyx -> nie mam nic do OPT i dla mnie jest to bardzo dobry skrypt, ale istnieją inne kierunki rozwoju i każdy wybierze taki jaki mu odpowiada.

Idę dalej się męczyć z kodowaniem... winksmiley.jpg
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-2024 Invision Power Services, Inc.