Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa szablonów i include
Forum PHP.pl > Forum > PHP
Brand
Witam. Mam problem z moim skryptem. W szablonie nie widać zmiennych zadeklarowanych w klasie Index. Szablon jest wczytywany przez klasę Theme. Próbowałem ze zmiennymi globalnymi, ale to niestety nie pomaga. Czy jest jakieś rozwiązanie? Załączam uproszczoną wersję mojego skryptu. Pozdrawiam. smile.gif

  1. <?php
  2. # index.php
  3. class Index
  4. {
  5. public function __construct()
  6. {
  7. $var = 'It works!';
  8. include('templates.class.php');
  9. $theme = new Theme;
  10. $theme -> load();
  11. }
  12. }
  13. new Index;
  14. ?>

  1. <?php
  2. # templates.class.php
  3. class Theme
  4. {
  5. public function load()
  6. {
  7. return include('szablon.php');
  8. }
  9. }
  10. ?>

  1. <?php
  2. # szablon.php
  3. echo 'theme included';
  4. echo '<br />';
  5. echo $var;
  6. ?>
wookieb
http://php.net/manual/pl/language.variables.scope.php
Czytasz aż do skutku
slightyboy
Jeśli przeniesiesz deklarację zmiennej do metody Theme::load() wszystko będzie działało, zmienne muszą być deklarowane w tej samej metodzie/funkcji w której załączany jest plik z szablonem. Jeśli więc chcesz pozostawić taki układ klas, do metody Theme::load dorzuć jako parametr tablicę (lub obiekt) ze zmiennymi, np. Theme::load($vars), następnie z wykorzystaniem pętli przypisz zmienne (z tablicy lub obiektu) do ich odpowiedników ($vars->zmienna => $zmienna etc.). smile.gif
Brand
Cytat
zmienne muszą być deklarowane w tej samej metodzie/funkcji w której załączany jest plik z szablonem

Właśnie wiem, ale myślałem że return include będzie traktowany tak, jakby ten plik był dołączany w klasie Index. Widocznie się myliłem. Pozostaje mi więc twoje rozwiązanie. Wielkie dzięki za szybką i trafną odpowiedź. Pozdrawiam. winksmiley.jpg

Edit: Jest może w PHP jakaś funkcja, która zwracałaby tablicę ze zmiennymi lokalnymi?
slightyboy
Cytat(Brand @ 23.07.2010, 12:53:37 ) *
Edit: Jest może w PHP jakaś funkcja, która zwracałaby tablicę ze zmiennymi lokalnymi?
get_defined_vars
Brand
Super, tego właśnie potrzebowałem. Podaję moje rozwiązanie. Do Theme::load() dodałem parametr $vars, i potem przed include:
  1. foreach($vars as $name => $value)
  2. {
  3. $var_name = $name;
  4. $$var_name = $value;
  5. }

W efekcie przenosi to zmienne lokalne do Theme::load() w miejscu wywołania tej metody, przez co widoczne są w includowanym pliku. Jeszcze raz wielkie dzięki. winksmiley.jpg
Crozin
To samo robić extract.
Cysiaczek
Problem dotyczyt składni, a nie paradygmatu -> PHP
Brand
Mówisz o kodzie z pierwszego postu?
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.