Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]eval do szablonów - czy dobry pomysł?
Forum PHP.pl > Forum > Przedszkole
Evinek
Przeglądałem różne skrypty for w poszukiwaniu dobrych rozwiązań. Padło na eval() z MyBB.
Zrobiłem taki kod:

#template.php (proszę nie krytykować, że to nie nadaje się na OOP ponieważ później tą klasę będę rozwijał)
  1. <?php
  2. class template{
  3. function parse($file){
  4. return file_get_contents('./html/'.$file.'.php');
  5. }
  6. }
  7. ?>

#index.php
  1. <?php
  2. include('./template.php');
  3. $template = new template;
  4. eval("\$test = \"".$template->parse('index')."\";");
  5. echo $test;
  6. ?>


Czy takie rozwiązanie jest pod względem optymalności i bezpieczeństwa dobre?
Jeśli są jakieś zagrożenia to jakie?

Jak testowałem 51 szablonów w jednym skrypcie, szablony:
  1. Test: {$ttt}<br />
  2. <ul>
  3. {$linki}
  4. </ul>
Użyte jeden raz
  1. <li>$links</li>
Użyte 50 razy

, to czas na localhost (z pendrive) dawał: około 0.05s.
a na ugu: 0.0009s.

Przy większych plikach pewnie czas się zwiększy dlatego pytam was w tej sprawie.
Pewnie będę musiał też cachować te szablony, tylko pytanie jak?
Np. szablon header będzie posiadał zmienną {$login} więc tak czy siak będzie musiało przejść przez eval. Macie na to rady?


Z góry dziękuje i pozdrawiam, Paweł.
Mephistofeles
Zły. Eval to zło samo w sobie.
Dlaczego nie użyjesz gotowego silnika, np. Twiga?
Evinek
Po prostu nie chce następnego języka w CMSie. Chce prostote. Masz inne rady jak zrobić taki system szablonów?
Wystarczy mi aby były zmienne w szablonie. Potrzebuje właśnie coś ala MyBB.
Mephistofeles
Użyj Twiga. Skoro potrzebujesz tylko zmiennych, to nie ma problemu, nowej składni nie będzie zbyt wiele: {{ zmienna }}.
Można oczywiście bawić się np. z preg_replace, ale po co wynajdywać koło na nowo? Kiedyś stwierdzisz, że przyda się jeszcze np. pętla, i będzie trzeba znowu dopisywać, a w gotowym silniku masz to gotowe.
Pilsener
Cytat
Chce prostote. Masz inne rady jak zrobić taki system szablonów?


Ja mam. Używa się systemu znanego lub prostego - zamiast tworzyć własny pseudo-język lepiej użyć coś znanego (np. SMARTY), albo po prostu via PHP (prostota):
  1. <p>
  2. <?php echo $this->variable ?>
  3. </p>


Dla kogoś, kto babrze się w HTMLu nie ma większego znaczenia język szablonu, byle HTML był oddzielony.
by_ikar
@Mephistofeles - twig korzysta z evala, ale tylko w sytuacji kiedy nie korzysta się z cache: https://github.com/fabpot/Twig/blob/master/...onment.php#L327 fakt jest to złe, ale jego użycie, czasami jest uzasadnione, bo inaczej danego zadania nie da się zrealizować. Próbowałem kiedyś jakoś to obejść, i nie użyć evala, ale zwyczajnie się nie da, oczywiście mówię o sytuacji kiedy tego cache nie ma.

Cytat
Dla kogoś, kto babrze się w HTMLu nie ma większego znaczenia język szablonu, byle HTML był oddzielony.

Dokładnie tak! Niektórzy uważają że to jest dla frontendowca łatwiejsze do zapamiętania, zrozumienia ITP, a jest to tak na prawdę gówno prawda wink.gif
Mephistofeles
Wiem, że eval czasami jest nieunikniony, ale jednak zastosowanie evala w gotowych systemach jest nieco inne, niż proponuje to autor tematu. Tam jest wykorzystywany do wykonania skompilowanego kodu szablonu, więc niewiele się to różni od wykonania zapisanego pliku.
Evinek
No to już nie wiem jak to zrobić.
Chce robić coś takiego:
  1. <?php
  2. <?php
  3. $template = new template;
  4.  
  5. $template->load('link'); //ładowanie pliku do template
  6. $links = '';
  7. for($i = 0; $i < 10; $i++){
  8. $link['link'] = 'http://google.pl';
  9. $link['title'] = 'Poszukaj w google '.$i;
  10. $links .= $template->parse('link'); //Parsowanie szablonu który wcześniej został załadowany - dodatkowo przypisanie go do zmiennej
  11. /*
  12. #link <--szablon
  13. <li><a href="$link['link']">$link['title']</a></li>
  14. //Czyli stworzy po prostu link z szablonu
  15. */
  16. }
  17. $template->load('menu'); //ładowanie menu
  18. $menu = $template->parse('menu'); //parsowanie
  19. /*
  20. #menu <--szablon
  21. <ul>
  22. $links
  23. </ul>
  24. //Doda do menu linki
  25. */
  26.  
  27. $template->display('index');
  28. /*
  29. #index <--szablon
  30. Bla bla bla
  31. $menu
  32. Bla bla bla
  33. //Wyświetli stronę z dołączonym menu
  34. */
  35. ?>


Zależy mi na tym aby wszystkie zmienne mógłbym używać w szablonie. Czyli replace odpada bo jak będzie tablica to za dużo zabawy.
Wolałbym swój kod który mógłbym łatwo edytować. Chce własne klasy tylko do swoich projektów. Jeśli coś będę robił komercyjnego to nie będę się bawił w tworzenie własnego kodu tylko będę brał gotowce.
Ważne jest abym mógł właśnie z szablonu tworzyć takie linki po czym dodawać je do szablonu innego (połączyć to) po czym w końcu ten cały szablon dać do głównego szablonu (przykład powyżej). Chce ominąć rzeczy w stylu:
$links .= '<a href="...">...</a>';
ponieważ chce maksymalnie oddzielić HTML od PHP.

Co mi możecie polecić? Szukam na ten temat już z ponad dwa miesiące. Wiele stron przeszukałem i nadal nic.
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.