Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] własne smarty - instrukcje warunkowe if else
Forum PHP.pl > Forum > PHP
kacpero1094
Robię sobie własny skrypt typu Smarty.
Chciałem zrobić coś takiego, żeby można było wstawić do klasy obsługującej to zmienne typu boolean, a później na podstawie tych zmiennych skrypt wstawiałby kod wg. tego schematu:
  1. {IF zmienna [kod_true] ELSE [kod_false]}

Napisałem do funkcji zamieniającej taki kod:
  1. preg_match_all('#\{IF ([a-zA-Z0-9_]+) \[(.*)\] ELSE \[(.*)\]\}#',$this->code,$ifelse);
  2. $i=0;
  3. while (count($ifelse[0])<$i) {
  4. if ($this->ifelse[$ifelse[1][$i]]==true) {
  5. $this->code=str_replace($ifelse[0][$i],$ifelse[2][$i],$this->code);
  6. } else {
  7. $this->code=str_replace($ifelse[0][$i],$ifelse[3][$i],$this->code);
  8. }
  9. $i++;
  10. }

I nie działa. Tzn. nie zamienia nic. Pozostawia tak jak wpisałem.
Ale jak zrobiłem taką funkcję:
  1. public function test() {
  2. preg_match_all('#\{IF ([a-zA-Z0-9_]+) \[(.*)\] ELSE \[(.*)\]\}#',$this->code,$array);
  3. print '<pre>' . htmlspecialchars(print_r($array,1)) . '</pre>';
  4. }

To wyświetliło wszystko pięknie na dole. Czyli znajduje, ale... ?
Proszę o pomoc sadsmiley02.gif
ramol
Linia 4: $this->ifelse
kacpero1094
Cytat(ramol @ 27.06.2010, 19:10:36 ) *
Linia 4: $this->ifelse

Jest takie zdefiniowane, tylko tutaj nie dałem tego fragmentu.
  1. public $ifelse=array();
ramol
Pętla while ma zły warunek smile.gif
kacpero1094
Poprawiłem na:
  1. while ($i<count($ifelse[0])) {

roztargnienie sciana.gif
Ale teraz wywala taki błąd:

Parse error: syntax error, unexpected '[', expecting '(' in /media/UbuPart/Kacper/projekt/3/template.class.php(59) : regexp code on line 1

Fatal error: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Failed evaluating code: (Array['logged']) ? '<form action=\"/logowanie\" method=\"post\"><input type=\"text\" class=\"field\" name=\"nick\" /><br /><input type=\"password\" class=\"field\" name=\"haslo\" /><br /><input type=\"submit\" value=\"zaloguj\" class=\"button\" /><p><a href=\"/odzyskaj-haslo\">odzyskaj hasło</a> | <a href=\"/rejestracja\">rejestracja</a></p></form>' : 'Witaj' in /media/UbuPart/Kacper/projekt/3/template.class.php on line 59
ramol
No to już nie jest z tego kodu, który przesłałeś na forum bo nie ma tam preg_replace a to Ci właśnie leży winksmiley.jpg
kacpero1094
  1. $this->code=preg_replace('#\{if warunek="(.*)"\}(.+?)\{else\}(.+?)\{/if\}#sie',"eval(" . ($this->ifelse['$1'] == true) ? ('$2') : ('$3') . ")",$this->code);

Zapomniałem. Teraz jest tak. Cała część dotycząca warunków tak wygląda.
erix
A czemu pierniczysz się z eval zamiast skorzystać z preg_replace_callback?

kacpero1094
Dzięki za pomoc wszystkim!
  1. $this->code=preg_replace_callback('#\{if condition="(.*)"\}(.+?)\{else\}(.+?)\{/if\}#',function ($match) { if ($ifelse[$match[1]]==true) return $match[2]; else return $match[3];},$this->code);

Trochę się z tym pomęczyłem, ale się udało!
REP+ dla wszystkich!
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.