Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]eval do szablonów - czy dobry pomysł?
Evinek
post
Post #1





Grupa: Zarejestrowani
Postów: 280
Pomógł: 46
Dołączył: 23.03.2010

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


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ł.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Mephistofeles
post
Post #2





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Zły. Eval to zło samo w sobie.
Dlaczego nie użyjesz gotowego silnika, np. Twiga?
Go to the top of the page
+Quote Post
Evinek
post
Post #3





Grupa: Zarejestrowani
Postów: 280
Pomógł: 46
Dołączył: 23.03.2010

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


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





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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





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

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


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





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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





Grupa: Zarejestrowani
Postów: 280
Pomógł: 46
Dołączył: 23.03.2010

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


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.

Ten post edytował Evinek 24.06.2012, 16:54:48
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 03:32