Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa szablonów, dodanie include.
modywzm
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 16.02.2009

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


Mam prostą klasę szablonów. Chciałem do niej dodać możliwość includownia dodatkowych szablonów (funckcja change) wstawiając w główny szablon <!--INCLUDE szablon.tpl-->.
Mniej więcej udało mi się uzyskać zamierzony efekt lecz nie działa to poprawnie. Zamiast wstawić szablon w miejsce <!--INCLUDE szablon.tpl--> wstawia go w inne zdefiniowane pola {zmienna}.
Prosiłbym o pomoc, jest to moje pierwsze podejście do klas w php.

Pozdrawiam

  1. <?php
  2. class template {
  3.    private $fields = array();
  4.    private $template;
  5.    private $error = false;
  6.    
  7.    public function __construct($template = false) {
  8.        $this->template = $template;
  9.        if(!$this->template || strlen($this->template) < 5) {
  10.            $this->error = 'Błąd podczas próby załadowania szablonu!';
  11.        }
  12.    }
  13.  
  14.    public function define($name,$value) {
  15.        $this->fields[$name] = $value;
  16.    }
  17.  
  18.    private function change() {
  19.        $template = $this->template;
  20.        foreach($this->fields as $name => $value ) {
  21.            if (preg_match_all("/<!--INCLUDE (.*?)-->/i", $template, $tpl, PREG_PATTERN_ORDER) > 0) {
  22.                for( $i = 0; $i < count($tpl[1]); $i++ ) {
  23.                    $file = file_get_contents($tpl[1][$i]);
  24.                    $value = $file;
  25.                }
  26.            }
  27.            else {
  28.                $name = '{'.$name.'}';
  29.            }
  30.            
  31.            $template = str_replace($name,$value,$template);
  32.        }
  33.        return $template;
  34.    }
  35.    
  36.    public function show() {
  37.        if(!$this->error) {
  38.            echo $this->change();
  39.        }
  40.        else {
  41.            echo $this->error;  
  42.        }
  43.    }
  44.  
  45.    public function __call($name,$value) {
  46.        if(count($value) == 1) {
  47.            $this->define($name,$value[0]);
  48.        }
  49.    }
  50. }
  51. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A ja bym zrobił inaczej - uaktywnił SSI (Server-Side Includes) i niech Apache się męczy. winksmiley.jpg Tylko ciężko mi powiedzieć, czy można zdefiniować dwa handlery dla jednego pliku (tzn. żeby najpierw obrabiał PHP, potem SSI).

Cytat
Zamiast wstawić szablon w miejsce <!--INCLUDE szablon.tpl--> wstawia go w inne zdefiniowane pola {zmienna}.

preg_replace" title="Zobacz w manualu PHP" target="_manual sobie zrób w tej pętli.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
modywzm
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 16.02.2009

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


Poczyniłem drobne zmiany w funkcji change i już praktycznie działa dobrze i includuje dodatkowe szablony.
Tylko przed <!--INCLUDE szablon.tpl--> nie zamienia dobrze zmiennych tylko pozostawia nawiasy i wygląda to tak {zmienna}.

  1. <?php    
  2. private function change() {
  3.        $template = $this->template;
  4.        foreach($this->fields as $name => $value ) {
  5.            if(preg_match_all("/<!--INCLUDE (.*?)-->/i", $template, $tpl, PREG_PATTERN_ORDER) > 0) {
  6.                for( $i = 0; $i < count($tpl[1]); $i++ ) {
  7.                    $file = file_get_contents($tpl[1][$i]);
  8.                    $template = preg_replace('/<!--INCLUDE (.*?)-->/e', '$file', $template);
  9.                }
  10.            }
  11.            else {
  12.                $name = '{'.$name.'}';
  13.            }
  14.            $template = str_replace($name,$value,$template);
  15.        }
  16.        return $template;
  17.    }
  18. ?>
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Bo zanim podstawisz dołączany szablon, to musisz go najpierw przeparsować.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
modywzm
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 16.02.2009

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


Już działa prawie dobrze tylko gdy chce includować więcej szablonów to w miejscach pozostałych pokazuje się treść pierwszego includowanego szablonu.

  1. <?php
  2. private function change() {
  3.        $template = $this->template;
  4.        foreach($this->fields as $name => $value ) {
  5.            if(preg_match_all("/<!--INCLUDE (.*?)-->/i", $template, $tpl, PREG_PATTERN_ORDER) > 0) {
  6.                for( $i = 0; $i < count($tpl[1]); $i++ ) {
  7.                    $file = file_get_contents($tpl[1][$i]);
  8.                    $template = preg_replace('/<!--INCLUDE (.*?)-->/e', '$file', $template);
  9.                }
  10.            }
  11.            $name = '{'.$name.'}';
  12.            $template = str_replace($name,$value,$template);
  13.        }
  14.        return $template;
  15.    }
  16. ?>
Go to the top of the page
+Quote Post
erix
post
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Kod
<!--INCLUDE (.*?)-->

Tu (pod wzorzec) podstawiasz to, co masz w file_get_contents" title="Zobacz w manualu PHP" target="_manual.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
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: 21.08.2025 - 14:20