Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Własny parser szablonów - jak zrobić pętle?
Forum PHP.pl > Forum > PHP > Object-oriented programming
pawel_
Witam.
Zacząłem dzisiaj pisać własny parser szablonów... Wszystko chodzi spoko, oprócz obsługi pętli sad.gif Nie mam pojęcia jak to zaimplementować.... Chciałbym w szablonie zrobić
  1. {loop {zmienna}} #KOD JAKIS# {/loop}

w jednej lini, ponieważ nie potrzebuję wieloliniowych bloków z pętlami.
Ma ktoś jakiś pomysł jak to poprawić :?: smile.gif
Pozdrawiam, Paweł

btw, klasa rozszerza abstrakcyjną klasę w której są zmienne i metody (będę robił więcej widoków aaevil.gif )
konstruktor jest prywatny, ponieważ chcę mieć tylko jedną instancję tej klasy!
  1. <?php
  2.  
  3. require_once('abstract.view.php');
  4.  
  5. class html extends ab_view {
  6. private function __construct() {
  7.  
  8. }
  9.  
  10. public function assign($name, $value) {
  11. $this->_res[$name] = $value;
  12. return true;
  13. }
  14.  
  15. public function setDir($dir) {
  16. $this->_dir = $dir;
  17. }
  18. public function setFile($name) {
  19. $this->_file = $name;
  20. }
  21.  
  22. public function parse($show_errors = false) {
  23. $this->_show_errors=$show_errors;
  24. $this->_parsed = $this->_parse($this->_getFileContent());
  25. $this->_is_parsed = true;
  26. return true;
  27. }
  28.  
  29. private function _getDir() {
  30. return $this->_dir.'/';
  31. }
  32.  
  33. private function _getFile() {
  34. return $this->_file;
  35. }
  36.  
  37. private function _getPath() {
  38. return $this->_getDir().$this->_getFile();
  39. }
  40.  
  41. private function _parse($what, $show_errors = false) {
  42. /* PETLE */
  43. $foreach_patt = '/{loop \({(.*)}\)}(.*){\/loop}/e';
  44. $what = preg_replace($foreach_patt, '$this->petle("$0", "$1", "$2")',$what);
  45.  
  46. /* RESZTA ZMIENNYCH */
  47. $pattern = '/{[a-zA-Z\_]+}/e';
  48. $this->_parsed = preg_replace($pattern, '$this->replace("$0")', $what);
  49. return $this->_parsed;
  50. }
  51.  
  52. private function petle($a1, $a2, $a3) {
  53. $tab = substr($a2, 2, -2);
  54. preg_match_all('/#(.*)#/', $a1, $tablica);
  55. preg_match_all('/{([a-zA-Z0-9\_]+)}/', $tablica[1][0], $tabl);
  56. foreach($tabl[1] as $key => $value) {
  57. echo str_replace($key, $this->_res[$key], $tablica[1][0]);
  58. }
  59. return $a;
  60. }
  61.  
  62. private function replace($txt) {
  63. $show_errors = $this->_show_errors;
  64. $txt = substr($txt, 1, -1);
  65. if(!empty($this->_res[$txt])) {
  66. return $this->_res[$txt];
  67. } else {
  68. if($show_errors) 
  69. return 'Nie przypisane <b> '.$txt.' </b>!';
  70. }
  71. }
  72.  
  73. private function _getFileContent() {
  74. return file_get_contents ( $this->_getPath());
  75. }
  76.  
  77. public function show($show_errors=false) {
  78. if(!$this->_is_parsed)
  79. $this->parse($show_errors);
  80. echo $this->_parsed;
  81. }
  82.  
  83. public static function initialize() {
  84. global $_this_is_html_view;
  85. if(is_a($_this_is_html_view, 'html')) 
  86. return $_this_is_html_view;
  87. else
  88. return new html();
  89. }
  90.  
  91.  
  92. }
  93.  
  94. ?>


------------------------------
Nikt nie ma pomyslu :?: sad.gif
A moze zrobic to jako
Kod
{section={zmianna}} KOD {/section}
(a odwolania do tabeli to {zmienna.klucz}....
bede bardzo wdzieczny za pomoc smile.gif
ayeo
dołączam się do pytania winksmiley.jpg
deirathe
szukałem rozwiązania na całym forum i puszczałem już kilka razy posta i nic, czasem ktoś się odezwał czasem nikt. Ogólnie niktórzy poprostu podmieniają powiedzmy {loop} na <?php for(...){ ?>
{/loop} <?php } ?>

ale to taka kicha wg mnie;/, ciagle mecze sie jak dam rade to zamieszcze opis. Narazie proboje z wyrazeniami regulranymi ale sprawa zaczyna sie komplikowac kiedy np masz jedna petle w drugiej albo dwie rownorzedne i jeszcze jedna w ktorejsc z tych :/ jednym slowem zagmatwanie ciezka sparawa
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.