Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> nauka - własny system szablonów
mgebala8
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 9.07.2014

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował mgebala8 11.07.2014, 09:13:27
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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>
Go to the top of the page
+Quote Post
by_ikar
post
Post #3





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Posty w temacie
- mgebala8   nauka - własny system szablonów   11.07.2014, 09:12:54
- - Pyton_000   Pseudokod jest zamieniany na zwykły kod php i wyko...   11.07.2014, 09:21:55
- - mgebala8   Pyton_000 dzięki za odpowiedź, wcześniej nie myśla...   11.07.2014, 10:10:26
- - nospor   Wydaje mi się, że bez sensu jest pisać własny syst...   11.07.2014, 10:14:08
- - mgebala8   ^^ nospor, rozumiem Cię ale bardziej mi zależy na ...   11.07.2014, 10:32:53
- - nospor   Po co?   11.07.2014, 10:42:16
|- - mgebala8   Pyton_000 - dzięki za wsparcie, traktuję to jako z...   11.07.2014, 12:53:30
- - Crozin   Pisanie własnych narzędzi "dla nauki" ma...   11.07.2014, 10:51:37
- - mgebala8   Crozin - dzięki za opinie, właśnie dlatego ten tem...   11.07.2014, 10:57:38
- - !*!   @ w kodzie to chybiony pomysł, kojarzą się z czymś...   11.07.2014, 11:00:25
- - mgebala8   po prostu wykorzystałbym funkcje: [PHP] pobierz, ...   11.07.2014, 11:06:06
- - Crozin   @mgebala8: @!*!: @mgebala8: HTML-a nie da ...   11.07.2014, 11:29:52
- - !*!   @Crozin - w systemie szablonów nie chodzi o parsow...   11.07.2014, 11:33:00
- - Crozin   @!*!: Napisałem, że podobnie jak przy prób...   11.07.2014, 11:34:20
|- - !*!   Cytat(Crozin @ 11.07.2014, 12:34:20 )...   11.07.2014, 11:38:12
- - Crozin   Nie, to nie tylko zamiana X -> Y, bo przykładow...   11.07.2014, 11:41:54
- - !*!   Jeśli ktoś czepia się takich "błędów" to...   11.07.2014, 11:47:30
- - mgebala8   Crozin - wybacz ale za bardzo Cię nie rozumiem ? ...   11.07.2014, 11:57:16
- - Pyton_000   Pisz i nie patrz co Oni piszą Celowo chcą Cię zni...   11.07.2014, 12:09:06
- - by_ikar   Moim zdaniem w php nie powinno się używać żadnych ...   11.07.2014, 12:53:11
- - Pyton_000   by_ikar systemy Template powstały po to aby kod sz...   11.07.2014, 12:57:31
|- - by_ikar   Cytat(Pyton_000 @ 11.07.2014, 13:57:3...   11.07.2014, 18:01:24
- - nospor   Pyton do tego naprawde idzie sie przyzwyczaic. Tez...   11.07.2014, 13:08:02
|- - mgebala8   Cytat(nospor @ 11.07.2014, 14:08:02 )...   11.07.2014, 13:16:41
- - nospor   Poraz kolejny raz ci powtarzam: sparsowany kod sza...   11.07.2014, 13:17:54
- - !*!   @nospor - jemu chyba chodzi o tworzenie tych plikó...   11.07.2014, 13:45:46
- - nospor   include:file.htm powinno normalnie includowac plik...   11.07.2014, 14:19:54
|- - !*!   Cytat(nospor @ 11.07.2014, 15:19:54 )...   11.07.2014, 14:37:56
- - nospor   No ale dobrze, parser niech sie odpala teraz dla t...   11.07.2014, 14:40:33
- - Crozin   CytatJeśli ktoś czepia się takich "błędów...   11.07.2014, 16:37:21
|- - !*!   Cytat(Crozin @ 11.07.2014, 17:37:21 )...   11.07.2014, 18:34:12
|- - by_ikar   Cytat(!*! @ 11.07.2014, 19:34...   11.07.2014, 19:08:38
- - Crozin   Hmmm... chociażby po to by dać mi znać w którym pl...   11.07.2014, 19:00:03
- - !*!   Wy to potraficie utrudniać sobie życie... CytatHm...   11.07.2014, 20:09:15
|- - by_ikar   Cytat(!*! @ 11.07.2014, 21:09...   11.07.2014, 21:34:17
- - marcus753   Dzięki panowie ! jeszcze nie zacząłem pisać a...   11.07.2014, 20:35:57
- - Crozin   Nie, nie zawsze linia z szablonu odpowiada linii z...   11.07.2014, 20:42:04
- - Crozin   CytatPamiętam kiedyś prelekcje z php, i tam koleś ...   11.07.2014, 21:47:26
|- - by_ikar   Cytat(Crozin @ 11.07.2014, 22:47:26 )...   11.07.2014, 21:59:10
- - nospor   Cytatnospor zakłada że będę miał plik już przepars...   12.07.2014, 08:54:20
- - Crozin   CytatA co takiego ma twig, czego nie ma php, albo ...   12.07.2014, 09:10:13
- - !*!   @Crozin - obaj mamy inne podejście do szablonów, d...   12.07.2014, 10:30:28
- - by_ikar   Cytat(!*! @ 12.07.2014, 11:30...   12.07.2014, 12:37:26


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 21:33