Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa szablonów, dodanie include.
Forum PHP.pl > Forum > PHP
modywzm
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. ?>
erix
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.
modywzm
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. ?>
erix
Bo zanim podstawisz dołączany szablon, to musisz go najpierw przeparsować.
modywzm
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. ?>
erix
Kod
<!--INCLUDE (.*?)-->

Tu (pod wzorzec) podstawiasz to, co masz w file_get_contents" title="Zobacz w manualu PHP" target="_manual.
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.