Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: nauka - własny system szablonów
Forum PHP.pl > Forum > PHP
mgebala8
Korzystając z chwili wolnego czasu robię sobię odwozorwanie różnych funkcjonalności frameworków - obiektowo i w php, np. routing, połączenia bazodanowe singleton vs proxy itp.
Wszystko głównie w celach edukacyjnych ale kto wie może z tego wyjdzie mi kiedyś jakaś namiastka frameworka lub microframework.

Wśród wielu różnych modułów stanąłem jednak przed problemem odwzorowania systemu szablonów i tu pojawia się problem jak coś takiego napisać ? ogólnie wpadłem na pomysł że za pomocą wyrażeń regularnych zamienie sobię kod np.

  1.  
  2. treść strony
  3.  
  4. @include('menu')
  5.  
  6. @for($i=0;$i<10;$i++)
  7. bla bla bla
  8. @endforeach
  9.  
  10. tutaj moja zmienna przekazana do widoku: {$zmienna}
  11.  


domyślnie maszynka ma mi zamienić coś takiego na poniższy ciąg i przypisać to do zmiennej $widok;

  1. <?php include('menu') ?>
  2.  
  3. <?php for($i=0;$i<10;$i++):?>
  4. bla bla bla
  5. <?php endforeach; ?>
  6.  
  7. tutaj moja zmienna przekazana do widoku: <?php echo $zmienna ?>
  8.  


i tu pojawia się mały problem a w zasadzie 2, czy na podobnej zasadzie działają silniki twig czy blade ? oraz jak mogę sparsować i wyświetlić treść strony trzymaną w zmiennej $widok ?
Pyton_000
Pseudokod jest zamieniany na zwykły kod php i wykonywany (dodatkowo w cache zapisana wersja PHP). Czyli tak jak pokazałeś.
mgebala8
Pyton_000 dzięki za odpowiedź, wcześniej nie myślałem o cache-owaniu danych a teraz poddałeś mi całkiem dobry pomysł na poszerzenie swojej wiedzy w ta stronę, w związku z tym 3 pytania:

- Gdzie powinno się zapisywać cache ? sesje, pliki czy baza danych ? Jest jeszcze pamięć ram ale ona odpada ze względu na dodatkową konfigurację a mi zależy na uniwersalności i prostocie.
- Jak wygląda nadpisywanie takich danych ? korzystając z laravela wszelkie zmiany są wprowadzane na bieżąco więc skąd on wie kiedy ma je nadpisać a kiedy zostawić i pobrać ?
- ponawiam pytanie dotyczące wyświetlenia zawartości strony w zmiennej $widok - trzymam tam for include itp. więc zwykłe polecenie echo odpada


Pozdrawiam i dziękuję za wskazówki - są one bezcenne ! wink.gif
nospor
Wydaje mi się, że bez sensu jest pisać własny system szablonow. Kilka powodow:
1) Jest to bezsensu wink.gif
2) Jak ktos kiedys bedzie chcial/musial pisac z tobą lub po tobie poprawiac, to zachlasta się na kolejnym systemie szablonow
3) Nie będzie to mialo pelnej porządnej funkcjonalnosci
4) Lepiej już zrobic system widoku, gdzie bedziesz mieszal kod php z html. Kazdy bez problemu bedzie mogl pisac w takim "szablonie" i bedzie mogl robic co bedzie chcial/potrzebowal i nie bedzie ograniczony to prostego systemu szablonow.
Przyklad jak cos takiego napisac w 10 minut masz mojej stopce
mgebala8
^^ nospor, rozumiem Cię ale bardziej mi zależy na nauce i pobawieniu się kodem niż wymyślaniu koła na nowo…

w swojej zmiennej pobierasz content za pomocą constukcji:

  1.  
  2. $this->Run($params);
  3. $result = ob_get_contents();



a jest jakaś opcja żeby to odwrócić ? coś w stylu ob_set_contents() wink.gif
nospor
Po co?
Crozin
Pisanie własnych narzędzi "dla nauki" ma jakiś tam sens, ale nie w Twoim przypadku. Po pytaniach jakie zadajesz widać, że masz niedużą wiedzę w wielu dziedzinach, których znajomość jest niezbędna do napisania czegoś co miałoby ręce i nogi (nawet w kontekście "dla nauki"). IMO powinieneś wykorzystać ten czas na zaznajomienie się z jakimś istniejącym rozwiązaniem (np. wspomniany Twig) i jego dogłębnym poznaniem. Nie dość, że nauczysz się "jak zrobić to dobrze", przy okazji poznasz narzędzie, które będziesz mógł wykorzystać w prawdzinym projekcie.

PS. Wyrażenia regularne nie nadają się do parsowania tego typu rzeczy.
mgebala8
Crozin - dzięki za opinie, właśnie dlatego ten temat i próba skoczenia na głęboką wodę wink.gif

Co do twiga myślę że znam go dobrze, blade z laravela z nam bardzo dobrze i często go wykorzystuje w komercyjnych projektach. Tu raczej chodzi o to żeby zobaczyć co jest pod maską i spróbować napisać coś swojego, nawet jeśli miałby to być maluch w porównaniu do mercedesa jakim jest blade to myślę że warto wink.gif

dlaczego wyrażenia regularne nie nadają się do parsowania tego typu rzeczy ? i co w takim razie to parsuje ?
!*!
@ w kodzie to chybiony pomysł, kojarzą się z czymś innym wink.gif Jeśli chcesz odpalać zmienne tylko w widoku, zainteresuj się extract, zakładając że używasz tego w klasach, inaczej nadpiszesz zmienne globalnie. Do zmiany pseudo kodu, możesz użyć preg_repalce i stworzyć coś na wzór tokenizacji.
mgebala8
po prostu wykorzystałbym funkcje:



a co do @ blade z laravela wykorzystuje ją z powodzeniem
Crozin
@mgebala8: @!*!: @mgebala8: HTML-a nie da się parsować przy pomocy wyrażeń regularnych, podobnie jest z szablonami (ten sam poziom złożoności języka). Taka niemal standardowa lektura: http://stackoverflow.com/a/1732454/252591
!*!
@Crozin - w systemie szablonów nie chodzi o parsowanie HTML.
Crozin
@!*!: Napisałem, że podobnie jak przy próbie parsowania HTML-a, ponieważ "typowy system szablonów" (patrz wspomniany Twig) operuje na równie złożonym co HTML poziomie języka.
!*!
Cytat(Crozin @ 11.07.2014, 12:34:20 ) *
@!*!: Napisałem, że podobnie jak przy próbie parsowania HTML-a, ponieważ "typowy system szablonów" (patrz wspomniany Twig) operuje na równie złożonym co HTML poziomie języka.


Bez przesady, to tylko zamiana X na Y. Jakkolwiek by tego nie napisać, zawsze znajdzie się w tym jakiś brak i nic nie zastąpi czystego PHP.
Crozin
Nie, to nie tylko zamiana X -> Y, bo przykładowo taki zapis jest niepoprawny:
Kod
<abc>

@if (...)

  dsadas

@endfor
Nie może wystąpić tag @endfor bez uprzedniego wywołania @for.

Ponownie polecam lekturę pytania i kilku pierwszych odpowiedzi, które zawierają już dużo więcej merytorycznych argumentów: http://stackoverflow.com/questions/1732348...-contained-tags - szczególnie, fragment dot. hierarchii Chomsky'ego.
!*!
Jeśli ktoś czepia się takich "błędów" to równie dobrze możemy mieć pretensje dlaczego to nie działa w czystym PHP. Strata czasu na taki parser.
mgebala8
Crozin - wybacz ale za bardzo Cię nie rozumiem ? Jest gościu który chce się porwać z motyką na słońce i spróbować napisać coś swojego nawet niech będzie to gorsze i okrojone ale przecież nie oto chodzi by tworzyć następcę laravela, po prostu nauczę się czegoś nowego a ty za wszelką cenę chcesz mi uświadomić że nic nie wiem i nie powinienem się za to zabierać ehh już samo przygotowanie do napisania takiego systemu szablonów nauczyło mnie kilku nowych rzeczy a co dopiero pisanie go wink.gif

jeśli chodzi o :
Nie może wystąpić tag @endfor bez uprzedniego wywołania @for.

to kto powiedział że nie może ? powiem więcej może i wystąpi wtedy w kodzie będziemy mieli:

  1. <?php endfor; ?>


i parser php zwróci błąd ale przecież nie ma to związku z systemem szablonów

ogólnie zarys jest taki:

- zmiana zmiennych {zmienna} na <?php echo $zmienna; ?>
- możliwość odwzorowania kilku pętli ifów (if,for,foreach)
- dodanie opcji layout i wprowadzenie sekcji (w jednym pliku mamy kilka sekcji które parser zapisuje do tablicy i podmienia w drugim pliku template)
- odwzorowanie @include - i tu pojawia się mały problem bo inkludować pliki można by w nieskończoność a przecież każdy inkludowany plik musi być najpierw parsowany przez mój system szablonów

- wygenerowane szablony będziemy zapisywali do pamięci cache żeby odciążyć serwer php
Pyton_000
Pisz i nie patrz co Oni piszą smile.gif Celowo chcą Cię zniechęcić, a jak się Im uda to wygrają, a jak nie to pokażesz że jesteś zdeterminowanych w celu smile.gif

by_ikar
Moim zdaniem w php nie powinno się używać żadnych szablonów typu twig, blade, smarty etc bo to jest głupie. Uczysz się kolejnej składni, kolejnego szablonu, w tylko jednym języku tych składni jest kilka.. No a potem wyjdzie symfony 3, symfony 4 i znów będzie jakaś nowa "super duper" lepsza wersja, i wszyscy się tym będą jarać, bo to jest takie fajne.. PHP powstał jako język do szablonów i niech tym pozostanie, dorabianie do tego na siłę jakiejś dodatkowej logiki, bo tak jest "ładniej", jest bezsensu. A o syntaksie w edytorach nie wspomnę. Zaś musisz mieć edytor który ci to sensownie podświetla, ewentualnie monituje cię o literówkach, to trzeba jakieś wtyczki do edytorów ściągać.. To już przestaje być zabawne, a powody do używania jakiś systemów szablonów są kuriozalne. Np twig for designers (fuck yeah, bo w zwykłym php wygląda to brzydko). Albo jeszcze lepsze ze strony twiga:

  1. But even if PHP started its life as a template language, it did not evolve like one in the recent years. As a matter of fact, it doesn't support many features modern template engines should have nowadays


No tak, bo przecież twig jest napisany w innym języku, dlatego ma więcej możliwości..

Kiedyś też myślałem że tak się powinno robić, bo wszyscy tak robili, aż uświadomiłem sobie że to jest bezsensu. "Jedzmy gówno, milion much nie może się mylić".
mgebala8
Pyton_000 - dzięki za wsparcie, traktuję to jako zabawę więc nie tak łatwo mnie zniechęcić wink.gif

Cytat(nospor @ 11.07.2014, 11:42:16 ) *
Po co?


załóżmy że mam zmienną $widok = 'echo "test<hr>"; for($i=1;$i<10;$i++){echo "test<br>"}';

i teraz chciałbym ją wypisać i sparsować na ekranie a do tego potrzebuje czegoś w stylu ob_set_contents() bo echo mi tutaj nie zadziała...



Pyton_000
by_ikar systemy Template powstały po to aby kod szablonu był czytelniejszy.

Ja wiem że PHP to najlepszy system szablonów bo nie trzeba parsować ale czasami wolę mieć
  1. <p>{{zmienna}}</p>

niż
  1. <p><?=$zmienna?></p>

albo jeszcze gorzej (masakra)
  1. <p><?php echo $zmienna; ?></p>
nospor
Pyton do tego naprawde idzie sie przyzwyczaic. Tez kiedys sobie nie wyobrazal tak pisac, a teraz nie wyobrazam sobie ze musialbym znowu przebijac sie przez jakis durny, ograniczony i wkurzający system szablonow

Cytat
załóżmy że mam zmienną $widok = 'echo "test<hr>"; for($i=1;$i<10;$i++){echo "test<br>"}';

i teraz chciałbym ją wypisać i sparsować na ekranie a do tego potrzebuje czegoś w stylu ob_set_contents() bo echo mi tutaj nie zadziała...

Cos nie tak z logiką twojego systemu. Czemu masz miec taką zmienną? Szablony bedą w plikach i masz robic zwykle include() i po sprawie. Ty nie masz miec szablonow w zmiennych.
mgebala8
Cytat(nospor @ 11.07.2014, 14:08:02 ) *
Ty nie masz miec szablonow w zmiennych.


tylko że najpierw muszę przeparsować te pliki moim systemem szablonów żeby powstawiały tam gdzie chce kod php (pozamieniał @zmienna -> <?php echo $zmienna ?> itp.) więc efekt będzie taki że otrzymam zmienną z ostatecznym kodem php który będę musiał jakoś wyświetlić i tu pojawia się problem jak to zrobić ? wink.gif
nospor
Poraz kolejny raz ci powtarzam: sparsowany kod szablonu masz trzymac w pliku php. Dzieki temu bedziesz robil INCLUDE i po sprawie
!*!
@nospor - jemu chyba chodzi o tworzenie tych plików w locie, nie każdy od razu cały szablon zapisuje w cache jako PHP, dlatego jest np. {include:file.html} które działa jak rekurencja.
nospor
include:file.htm powinno normalnie includowac plik jak w czystym php, wiec za bardzo nie widze czzemu ten przyklad mial sluzyc wink.gif
Poza tym nie odnioslem wrazenia takiego jak ty
!*!
Cytat(nospor @ 11.07.2014, 15:19:54 ) *
include:file.htm powinno normalnie includowac plik jak w czystym php

I to robi z tą różnicą, że jeszcze raz jest odpalany parser, inaczej byś nie zamienił kolejnych zmiennych.
nospor
No ale dobrze, parser niech sie odpala teraz dla tego include, nikt mu nie broni. Ale to include znowu ma byc zapisane w pliku php, a pliku wyzej ma byc zamienione na zwykle include phpowe. Odpalanie tego ze zmiennej nie ma sensu. Owszem, na jakims tam etapie parsowania bedzie to zapisane w zmiennej ale tylko na chwile by za chwilke zapisac to docelowo w pliku php
Crozin
Cytat
Jeśli ktoś czepia się takich "błędów" to równie dobrze możemy mieć pretensje dlaczego to nie działa w czystym PHP. Strata czasu na taki parser.
Jeżeli błąd składni to "błąd" to co nie jest błędem w Twoim rozumowaniu? Ale masz rację, szkoda czasu na narzędzie, które nawet tak trywialnych błędów nie wyłapie na etapie "kompilacji". Dlatego albo stosuje się czyste PHP, albo stosuje gotowe, solidne rozwiązania, albo jeżeli ma się jakiś powód pisze własne - ale takie, które rozwiązuje jakiekolwiek problemy, a nie tylko stwarza nowe.
Cytat
Crozin - wybacz ale za bardzo Cię nie rozumiem ? Jest gościu który chce się porwać z motyką na słońce i spróbować napisać coś swojego nawet niech będzie to gorsze i okrojone ale przecież nie oto chodzi by tworzyć następcę laravela, po prostu nauczę się czegoś nowego a ty za wszelką cenę chcesz mi uświadomić że nic nie wiem i nie powinienem się za to zabierać ehh już samo przygotowanie do napisania takiego systemu szablonów nauczyło mnie kilku nowych rzeczy a co dopiero pisanie go wink.gif
Masz rację - częściowo próbuję Cię zniechęcić. Masz też rację w tym, że nauczysz się czegoś nowego pisząc takie coś, ale...
1. Nauczysz się zdecydowanie mniej, niż gdybyś czas ten poświęcił na rozwój w innym kierunku, tj. nauczenie się wykorzystywania istniejącego narzędzia, zbadanie i przeanalizowanie jak działa "pod maską", napisanie jakiś rozszerzeń do niego. Co więcej zamiast od razu uczyć się dobrych i przydatnych rzeczy siłą możesz wyrobić sobie wiele złych wawyków.
2. Niemal na pewno nie uda Ci się stworzyć czegoś wartego (dla Ciebie samego) wykorzystania w przyszłości, ponieważ po Twoich pytaniach widać, że brak Ci jeszcze nieco doświadczenia/wiedzy by napisać dosyć mocno rozbudowane narzędzie. Nie wiesz jakich problemów się spodziewać, domyślam się, że zapewne nawet nie wiesz jakich problemów chcesz się pozbyć przy pomocy tego narzędzia.
3. Będziesz miał sporo satysfakcji ze stworzenia czegoś własnego, ale nie będziesz miał znajomości/doświadczenia z wykorzystaniem czegoś faktycznie przydatnego.


Innymi słowy poświęcisz sporo czasu dla nauczenia się kilku rzeczy, zamiast poświęcenia sporej ilości czasu na nauczenie się sporej ilości rzeczy - możesz mi wierzyć, sam przerabiałem dokładnie to samo dobrych kilka lat temu (mam chyba nawet gdzieś zapisany projekt własnego systemu szablonów).


by_ikar
Cytat(Pyton_000 @ 11.07.2014, 13:57:31 ) *
by_ikar systemy Template powstały po to aby kod szablonu był czytelniejszy.

Ja wiem że PHP to najlepszy system szablonów bo nie trzeba parsować ale czasami wolę mieć
  1. <p>{{zmienna}}</p>

niż
  1. <p><?=$zmienna?></p>

albo jeszcze gorzej (masakra)
  1. <p><?php echo $zmienna; ?></p>


Też tak kiedyś myślałem, kiedy tworzyłem swój ambitny system szablonów, wydawało mi się że jest mi to potrzebne, że tak jest czytelniej! A prawda jest taka, że jest to zbędna logika do czegoś co mamy out of box. Rozumiem system szablonów w stylu tego co jest w symfony2 - tzn możliwość dziedziczenia, sloty etc. To akurat jest fajny pomysł. Ale same templatki powinny być IMO zawsze jako html + php. Też kiedyś stworzyłem swojego "potworka":

  1. <?php
  2.  
  3. class TemplateParser
  4. {
  5. protected $options;
  6. protected $parameters;
  7.  
  8. public function __construct(array $options = array())
  9. {
  10. $this->options = array_merge_recursive(array(
  11. 'pattern' => array('/(?<!@)@(?!@)/is', '/@@/is'),
  12. 'replecament' => array('echo ', '@'),
  13. 'pattern_variable' => '/(\$([\w\.\$]+))/is',
  14. 'replecament_variable' => array($this, 'replaceVariable'),
  15. 'replecament_ignore' => array($this, 'preReplace'),
  16. 'pattern_ignore' => '#(?:{ignore}.*?{/ignore}|({.*?}))#is',
  17. 'extension' => '.tpl',
  18. 'template_dir' => './',
  19. ), $options);
  20. }
  21.  
  22. /**
  23.   * @param array $parameters
  24.   * @return void
  25.   */
  26. public function add(array $parameters)
  27. {
  28. foreach($parameters as $key => $val)
  29. {
  30. if(!isset($this->parameters[$key]))
  31. {
  32. $this->parameters[$key] = $val;
  33. }
  34. }
  35. }
  36.  
  37. /**
  38.   * @param string $name
  39.   * @param string $value
  40.   * @return void
  41.   */
  42. public function set($name, $value)
  43. {
  44. $this->parameters[$name] = $value;
  45. }
  46.  
  47. /**
  48.   * @return array
  49.   */
  50. public function getAll()
  51. {
  52. return $this->parameters;
  53. }
  54.  
  55. /**
  56.   * @param string $name
  57.   * @return string
  58.   */
  59. public function exists($name)
  60. {
  61. $file = $name.$this->options['extension'];
  62.  
  63. foreach((array)$this->options['template_dir'] as $dir)
  64. {
  65. if(is_readable($dir.$file))
  66. {
  67. return $dir.$file;
  68. }
  69. }
  70.  
  71. return false;
  72. }
  73.  
  74. /**
  75.   * @param string $template
  76.   * @param array $parameters
  77.   * @param string $mode:
  78.   * string - eval
  79.   * file - include
  80.   * @return string|false
  81.   */
  82. protected function evaluate($template, array $parameters = array(), $mode = 'string')
  83. {
  84. if('file' === $mode)
  85. {
  86. extract($parameters);
  87. require $template;
  88.  
  89. return ob_get_clean();
  90. } else
  91. {
  92. extract($parameters);
  93. eval('; ?>'.$template.'<?php ;');
  94.  
  95. return ob_get_clean();
  96. }
  97.  
  98. return false;
  99. }
  100.  
  101. /**
  102.   * @param mixed $name
  103.   * @return string
  104.   * @throws InvalidArgumentException
  105.   */
  106. protected function load($name)
  107. {
  108. $file = $this->exists($name);
  109.  
  110. if(false === $file)
  111. {
  112. throw new InvalidArgumentException(sprintf('Template "%s" does not exist.', $name));
  113. }
  114.  
  115. $fileTemplate = file_get_contents($file);
  116.  
  117. return $this->parse($fileTemplate);
  118. }
  119.  
  120. /**
  121. * @param string $name
  122. * @return string
  123. * @throws InvalidArgumentException
  124. * @throws RuntimeException
  125. */
  126. public function render($name)
  127. {
  128. $storage = $this->load($name);
  129.  
  130. if (false === $content = $this->evaluate($storage, $this->parameters))
  131. {
  132. throw new RuntimeException(sprintf('Template "%s" can not be rendered.', $this->exists($name)));
  133. }
  134.  
  135. return $content;
  136. }
  137.  
  138. protected function parse($fileTemplate)
  139. {
  140. return preg_replace_callback($this->options['pattern_ignore'], $this->options['replecament_ignore'], $fileTemplate);
  141. }
  142.  
  143. protected function replaceVariable($varName)
  144. {
  145. return preg_replace(array('/\.(\$[\w-]+)/', '/\.([\w-]+)/is'), array('[$1]', '[\'$1\']'), $varName[1]);
  146. }
  147.  
  148. protected function preReplace($replace)
  149. {
  150. if(!empty($replace[1]))
  151. {
  152. $compile = preg_replace($this->options['pattern'], $this->options['replecament'], $replace[1]);
  153. $compile = preg_replace_callback($this->options['pattern_variable'], $this->options['replecament_variable'], $compile);
  154. $compile = preg_replace('/{(.*?)}/is', '<?php $1 ?>', $compile);
  155.  
  156. return $compile;
  157. } else
  158. {
  159. return preg_replace('/{(\/)?ignore}/is', '', $replace[0]);
  160. }
  161. }
  162. }


Gdzie uważałem że { something } jest czytelniejsze niż <?php something ?>. No ale wyrosłem z tego i jestem zdecydowanie za tym żeby nie używać szablonów.
!*!
Cytat(Crozin @ 11.07.2014, 17:37:21 ) *
Jeżeli błąd składni to "błąd" to co nie jest błędem w Twoim rozumowaniu? Ale masz rację, szkoda czasu na narzędzie, które nawet tak trywialnych błędów nie wyłapie na etapie "kompilacji". Dlatego albo stosuje się czyste PHP, albo stosuje gotowe, solidne rozwiązania, albo jeżeli ma się jakiś powód pisze własne - ale takie, które rozwiązuje jakiekolwiek problemy, a nie tylko stwarza nowe.

A jaki jest sens, aby system szablonów robił dodatkowy narzut na sprawdzanie czy składnia się zgadza, to zbędny bajer, ponieważ tym zajmuje się samo PHP. Max czym to się powinno zajmować to zamiana {foo} na <?php echo $foo;?> ... czy inne takie, aby skrócić czas pisania o całe 8 znaków wink.gif Po prostu jeszcze bardziej skrócona, alternatywna składnia jaką samo PHP również posiada.
Crozin
Hmmm... chociażby po to by dać mi znać w którym pliku i linii jest błąd składni szablonu, która nie musi być równoznaczna ze składnią PHP, a wygenerowany kod PHP wcale nie musi przekładać się linia-w-linię z szablonem? Już nawet nie komentuję reszty dotyczącej "maksymalnych zadań szablonu ograniczających się do zamiany <?php echo na {"...

Szablony nie służą zamianie składni, a wprowadzeniu nowych elementów bądź udoskonaleniu istniejących.
by_ikar
Cytat(!*! @ 11.07.2014, 19:34:12 ) *
Max czym to się powinno zajmować to zamiana {foo} na <?php echo $foo;?> ... czy inne takie, aby skrócić czas pisania o całe 8 znaków ;) Po prostu jeszcze bardziej skrócona, alternatywna składnia jaką samo PHP również posiada.


No właśnie to nie do końca tak zadziała. Bo parser będzie miał problemy ze wszystkim co jest pomiędzy klamrami. Wiem bo tworzyłem takiego potworka (kilka postów wyżej kod) i musiałem dodać blok ignore inaczej przy mieszaniu css/js poprostu potrafiły się trafić miejsca gdzie parser nie wyrabiał (nie pomyślałem wtedy o podwójnych klamrach..). Do tego echo nie może być wszędzie, np w takim przypadku:

  1. <?php echo if(true): ?>
  2.  
  3. something
  4.  
  5. <?php echo endif ?>


Dostaniesz parse error. Więc albo dodawać ręcznie echo:

Kod
{echo $zmienna}


Albo dodać jakiś "szybszy" sposób na dodanie tego echo. No i w moim przypadku była to małpa. No a jak wtedy użyć małpy? A no trzeba dodać kolejne wyrażenie dla podwójnej małpy @@. No i ten bezsens się ciągnie..
!*!
Wy to potraficie utrudniać sobie życie...

Cytat
Hmmm... chociażby po to by dać mi znać w którym pliku i linii jest błąd składni szablonu, która nie musi być równoznaczna ze składnią PHP, a wygenerowany kod PHP wcale nie musi przekładać się linia-w-linię z szablonem?


Nie wiem jak byś to napisał, ale linia w szablonie zawsze będzie równa linii w PHP i błąd składni będzie identyczny z tego pliku w jakim wystąpił. Patrz niżej.

@by_ikar - kwestia odpowiednich komend

Cytat
{$foo}
{if:isset($foo)}
{else}
{/if}

{foreach:$foo as $key}
{/foreach}


Chyba nie muszę tłumaczyć na co zostanie to zamienione, akceptowalne są tylko takie tagi, więc:

Cytat
{
if:isset(
$foo
)
}


Nie przejdzie, a skoro robimy include tego samego pliku PHP, to nie ma prawa wyskoczyć błąd w innym miejscu, tylko tam gdzie występuje.
Poważnie sprawdzacie błędy w plikach HTML/TPL? Ludzie...
marcus753
Dzięki panowie ! wink.gif jeszcze nie zacząłem pisać a już mam gotowe przykłady i jeszcze różne błędy z którymi będę miał do czynienia

rozumiem że nie ma innego sposobu wywołania kodu jak przez include ?

nospor zakłada że będę miał plik już przeparsowany który będę mógł zainncludować tylko że jeśli na początku nie będę chciał korzystać z cache nie będę miał takiego pliku i tu pojawia się problem jak taki kod wywołać ? druga sprawa co jeśli cache będę robił za pomocą bazy danych mysql albo sesji ? również takiego pliku miał nie będę

Jeśli chodzi o składnie języka założyłem sobie coś takiego:

  1. {{zmienna}}
  2.  
  3. @if($zmienna)
  4. @endif
  5.  
  6. @for($i;$i++;$<10)
  7. @endfor;
  8.  
  9. @foreach($array as $key)
  10. @endforeach


dodatkowo chciałbym aby mój szablon składał się z 2 plików 1 plik to będzie kontretny kontent na zasadzie:

  1. @content('mojartykul')
  2. artykuł bla bla bla
  3. @stop
  4.  
  5. @content('sonda')
  6. moja sonda
  7. @stop
  8.  
  9. @layout('layout_main.php')


a w pliku layout_main będę miał główny layout strony gdzie tylko zaznaczę w kodzie

  1. @content('mojartykul')
  2.  
  3. @content('sonda')

i w te miejsca ma się wstawić kod z zaznaczonych sekcji, dzięki temu mogę mieć jeden szablon dla kilku widoków i jedynie zmieniać content

na chwilę obecną mam problem z:

- jak wyświetlić zawartość strony (ze znacznikami php) znajdującą się w zmiennej czy jest to wykonalne ?
- kiedy tworzyć nowy cache widoku a usuwać stary ?


do tego chciałbym mieć jeszcze możliwość includowania innych plików np. w szablonie móc sobie wstawić @include('menu') i wszystko świetnie mój parser zamieni mi to na <?php include('menu.php') ?> ale już nie przeparsuje samego pliku menu.php zastanawiam się jak to robią inne silniki np. blade ?
czy jeśli tam będę includował coś z pliku który includuje inny plik to czy ten ostatni też zostanie sparsowany ?

Tutaj rozwiązaniem byłoby najpierw przeparsowanie całego kodu przez php (includujemy wszystkie pliki) potem przeparsowanie moim parserem i następnie znowu parsowanie standardowym phpem i zapisanie wszystkiego do cache ale wydajność takiego rozwiązania pewnie będzie marna...
Crozin
Nie, nie zawsze linia z szablonu odpowiada linii z wynikowego pliku. Wystarczy chociażby komentarz w szablonie (a'la Twig):
Kod
<p>Hello World!</p>
{# blah blah blah #}

{# blah blah blah
     blah blah blah
     blah blah blah #}
<p>Witaj świecie</p>
I już masz wygenerowany kod w formie:
  1. <p>hello World!</p>
  2.  
  3. <p>Witaj świecie</p>
Nie mówiąc już o tym, że szablon może być skompilowany przykładowo do klasy, nie "surowego" pliku.
by_ikar
Cytat(!*! @ 11.07.2014, 21:09:15 ) *
Wy to potraficie utrudniać sobie życie...



Nie wiem jak byś to napisał, ale linia w szablonie zawsze będzie równa linii w PHP i błąd składni będzie identyczny z tego pliku w jakim wystąpił. Patrz niżej.

@by_ikar - kwestia odpowiednich komend



Chyba nie muszę tłumaczyć na co zostanie to zamienione, akceptowalne są tylko takie tagi, więc:



Nie przejdzie, a skoro robimy include tego samego pliku PHP, to nie ma prawa wyskoczyć błąd w innym miejscu, tylko tam gdzie występuje.
Poważnie sprawdzacie błędy w plikach HTML/TPL? Ludzie...


Tak ale wtedy jest już zupełnie nowy syntax, kolejny do nauczenia się, poznania jego wszystkich słabości.. IMO systemy szablonów w php to trochę na wyrost. Taki twig to nic innego jak jinja z django, a tam systemy szablonów mają o tyle sens, że nie użyjesz sobie pythona razem z html, tak jak to ma miejsce w przypadku php+html. Ale w przypadku php ? Pamiętam kiedyś prelekcje z php, i tam koleś mówił że programiści php to "złodzieje". Większość rzeczy próbujemy na siłę implementować z innych języków kompensując sobie pewne braki. Tyle że to nie ma sensu, kiedy php jest dobry sam w sobie jako system szablonów out of box. Tzn nie zrozum mnie źle, bo ja już trochę się pogubiłem i nie wiem już sam kto jest za a kto jest przeciw. Jedynie chcę podkreślić że jakiekolwiek systemy szablonów w php to proteza, która zupełnie niepotrzebny generuje narzut oraz dodatkową składnie - głównie w imię "nie bądźmy gorsi od innych języków" ..

@marcus753 - popatrz na klasę którą wkleiłem, jest ona dość prosta (w tym zawiera wrednego evala) i powinna ci co nieco powiedzieć jak mniej więcej powinno to wyglądać (a właściwie nie wyglądać, bo szablony są zbędne).
Crozin
Cytat
Pamiętam kiedyś prelekcje z php, i tam koleś mówił że programiści php to "złodzieje".
Zapożyczenia z innych języków/platform to bardzo, bardzo dobra rzecz, a nie żadne "złodziejstwo".
Cytat
Tyle że to nie ma sensu, kiedy php jest dobry sam w sobie jako system szablonów out of box.
PHP w porównaniu do takiego chociażby Twiga wypada słabo, chociaż tak... można go używać bezpośrednio.
Cytat
[...] która zupełnie niepotrzebny generuje narzut oraz dodatkową składnie - głównie w imię "nie bądźmy gorsi od innych języków" ..
Nie, szablony w PHP to głównie idea: PHP bezpośrednio w szablonach jest niewygodne i nieefektywe, więc stworzono narzędzie, które rozwiązuje pewne problemy jakie czyste PHP powoduje.

Cytat
@marcus753 - popatrz na klasę którą wkleiłem, jest ona dość prosta (w tym zawiera wrednego evala) i powinna ci co nieco powiedzieć jak mniej więcej powinno to wyglądać (a właściwie nie wyglądać, bo szablony są zbędne).
To co tam zaprezentowałeś faktycznie pokazuje jak tego nie robić - ale nie ze względu na bezsensowność szablonów jako takich tylko prymitywną i pełną ograniczeń realizację.
by_ikar
Cytat(Crozin @ 11.07.2014, 22:47:26 ) *
Zapożyczenia z innych języków/platform to bardzo, bardzo dobra rzecz, a nie żadne "złodziejstwo".
PHP w porównaniu do takiego chociażby Twiga wypada słabo, chociaż tak... można go używać bezpośrednio.
Nie, szablony w PHP to głównie idea: PHP bezpośrednio w szablonach jest niewygodne i nieefektywe, więc stworzono narzędzie, które rozwiązuje pewne problemy jakie czyste PHP powoduje.

To co tam zaprezentowałeś faktycznie pokazuje jak tego nie robić - ale nie ze względu na bezsensowność szablonów jako takich tylko prymitywną i pełną ograniczeń realizację.


Nie twierdze że zapożyczenia są złe, mi chodziło (i temu gościowi również) o tworzenie odpowiedników czegoś, co się sprawdza w innych językach, a nie koniecznie w php.
A co takiego ma twig, czego nie ma php, albo w php nie można zrobić? Jest to jakiś moduł php? No nie bardzo. Aha, czyli do kilku pomocniczych funkcji dla widoku, dorobimy sobie zupełnie nową składnie - bądźmy innowacyjni.
Niewygodne to mogą być za małe buty. To jest kwestia przyzwyczajenia, tak samo jak się przyzwyczajasz do nowej składni, pierdyliardowej wersji super nowego, ulepszonego systemu szablonów.

Tak, ta realizacja "mojej" wersji szablonów jest prymitywna i ograniczona, bo już na etapie początkowym, zdałem sobie sprawę, że jest to bezsensu. Lepiej napisać jakąś klasę lub funkcję pomocniczą, niż dorabiać do tego nową składnie. No i robiłem to bardziej jak autor tematu - w celach naukowych, tyle że miałem ciut inną wiedzę.
nospor
Cytat
nospor zakłada że będę miał plik już przeparsowany który będę mógł zainncludować tylko że jeśli na początku nie będę chciał korzystać z cache nie będę miał takiego pliku i tu pojawia się problem jak taki kod wywołać ? druga sprawa co jeśli cache będę robił za pomocą bazy danych mysql albo sesji ? również takiego pliku miał nie będę
Powinienies sparsowany szablon trzymac w pliku php. W przeciwnym wypadku ten twoj system szablonow, ktory juz teraz nie ma racji bytu, nie bedzie mial juz w ogole racji bytu. Jesli bedzie lecial jakis blad, to w zyciu nie dowiesz sie skad on leci. Gdy kod bedzie w pliku php, to bedziesz wiedzial gdzie ten blad jest i bedzie mozna go poprawic.
Poza tym ciagle i ciagle parsowanie jest bez sensu. Predzej czy później musisz to zapisywac w plikach, wiec zacznij od razu a nie bedziesz dwukrotnie robil roboty "glupiego"
Crozin
Cytat
A co takiego ma twig, czego nie ma php, albo w php nie można zrobić?
Twig jest napisany w PHP więc z definicji nie ma w nim niczego czego nie dałoby się zrobić z poziomu PHP. Jednak oferuje on inne środowisko pracy:
- budowanie szablonu z dołu-do-góry, a nie od góry-do-dołu jak ma to miejsce przy "zwykłym, czystym" PHP,
- wbudowane automatyczne filtrowanie wyświetlanych danych, również dla kontekstów innych niż tekst w HTML-u,
- sandbox,
- expression language,
- prostszy i mniej podatny na błędy ekosystem dla osób nie znających PHP zbyt dobrze.

A szablony to nie tylko twory pokroju Twiga, możesz w końcu mieć chociażby XML-a z PHPTalem.
!*!
@Crozin - obaj mamy inne podejście do szablonów, dla mnie to nie jest nowy język z funkcjami np. tak jak wspomniałeś komentarze {# xxx#} ... Zupełnie zbędna rzecz, tak samo jak zamiana X na Y, ale niektórzy to lubią i czasami jest to czytelniejsze, bo nie każdy używa alternatywnej składni PHP, a jedzie na klamrach...

@by_ikar - Twój kawałek kodu byłby dobry gdybyś ograniczył tagi do określonych a nie brał wszytko z marszu... i ten eval...
by_ikar
Cytat(!*! @ 12.07.2014, 11:30:28 ) *
@by_ikar - Twój kawałek kodu byłby dobry gdybyś ograniczył tagi do określonych a nie brał wszytko z marszu... i ten eval...


Zdaje sobie z tego sprawę, to jest mój dość stary potworek który, którego pomysł został zarzucony niemal na starcie, poprostu idea szablonowania mi przeszła..

Cytat(Crozin @ 12.07.2014, 10:10:13 ) *
Twig jest napisany w PHP więc z definicji nie ma w nim niczego czego nie dałoby się zrobić z poziomu PHP.


Skoro tak, to może warto użyć samych helperów zamiast tworzyć kolejną abstrakcje? IMO całe szczęście symfony daje wybór co do szablonów i nie trzeba być przymuszanym do czegoś, czego się nie popiera ;)

PS. jak dobrze pamiętam @crozin to jest już n'ty temat w którym się o te szablony spieramy biggrin.gif ostatni raz było to jakieś ~2 lata temu, zanim za "chlebem" nie wyjechałem.
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.