Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Prosta klasa styli, templates - oddzielenie wyglądu od logiki
Jifer
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 1.04.2009

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


Jako początkujący programista-pasjonat PHP prosiłbym bardziej doświadczonych użytkowników o skrytykowanie mojej pracy, pokazanie mi błędów lub wyjaśnienie jak poprawić poniższy skrypt (inne metody robienia tego samego, szybkosć i funkcjonalność)

Co chciałem osiągnąć:
-całkowicie oddzielić PHP od (X)HTML.
-by uzupełniane były fragmenty pomiędzy {}
  1. Nick: {MY_NICK}

-by sekcje kodu mogły się powtarzać na podstawie elementów tablicy ( również zagnieżdżone )
  1. <!--BEGIN REPEAT_SECTION-->
  2. {REPEAT_ELEMENT}
  3. <!--END REPEAT_SECTION-->

-by w zależnosci od parametru można było włączać/wyłączać pewne sekcje (np. w zależności od tego czy zalogowany jest admin)
  1. <!--ON BLOCK-->
  2. Jakiś fragment strony.
  3. <!--OFF BLOCK-->


Dlaczego nie użyłem 'gotowych' rozwiązań:
-nie chciałem mieć w plikach stylów żadnych dodatkowych form sterujących (nie licząc 2 wymienionych) jak to np. jest w smartach i większości podobnych klas
-chciałem żeby kod mógł być zaimplementowany na serverach w których nie mam dostępu do plików konfiguracyjnych

Założenia:
-klasa wykorzystywana przez jedną osobę, nie stosowana w wielkich projektach, w których uczestniczą zespoły.
-łatwa w obsłudze
-w miarę szybka
-do obsługi raczej małych stron

Klasa:
  1. <?php
  2. class temp{
  3.    private $t_name;
  4.    private $temp_name;
  5.    private $temp_array;
  6.    //$t_name - nazwa pliku ze stylem lub gotowy styl (string)
  7.    //$t_array - tablica z danymi
  8.    //$t_type - 0=plik 1=string
  9.    public function __construct($t_name,$t_array,$t_type){        
  10.        if($t_type == 0){
  11.            $this->t_name = $t_name;
  12.            $this->temp_name = $this->GetFile();
  13.        } else {
  14.            $this->temp_name = $t_name;
  15.        }        
  16.        $this->temp_array = $t_array;    
  17.    }
  18.    //pobieranie pliku (domyœlnie zakładam 'templates/*.tpl'
  19.    public function GetFile(){
  20.        $fr = fopen('templates/'.$this->t_name.'.tpl', "r");
  21.            if(!$fr){
  22.                $content = "Nie wczytano pliku";
  23.            } else {
  24.                $content = fread($fr, filesize('templates/'.$this->t_name.'.tpl'));
  25.            }
  26.            @fclose($fr);
  27.        return $content;
  28.    }
  29.    
  30.    private function repl($str){    
  31.        $output = preg_replace_callback("/({)([A-Z_]*)(})/",array($this,'check_key'),$str);
  32.        return $output;
  33.    }
  34.    private function repl_ar($str){
  35.        $output = preg_replace_callback('/<!--BEGIN ([A-Z_]*)-->([dDs]*)<!--END [A-Z_]*-->/',array($this,'check_key_array'),$str);
  36.        return $output;
  37.    }
  38.    private function repl_on_off($str){    
  39.        $output = preg_replace_callback('/<!--ON ([A-Z_]*)-->([dDs]*)<!--OFF [A-Z_]*-->/',array($this,'check_key_on_off'),$str);
  40.        return $output;
  41.    }    
  42.    
  43.    private function check_key_on_off($param){
  44.        //TRUE - włšcza
  45.        //FALSE lub brak - Wyłšcza
  46.        if(isset($this->temp_array[$param[1]]) && $this->temp_array[$param[1]]) $send = $param[2];
  47.        else $send = '';
  48.        return $send;
  49.    }
  50.    private function check_key($param){
  51.        if(isset($this->temp_array[$param[2]])) $send = $this->temp_array[$param[2]];
  52.        else $send = '';
  53.        return $send;
  54.    }
  55.    private function check_key_array($param){
  56.        if(isset($this->temp_array[$param[1]])){            
  57.            foreach($this->temp_array[$param[1]] as $lp=>$v_arr){
  58.                $repe = new temp($param[2],$v_arr,1);
  59.                $send = $send.$repe->ret();
  60.            }
  61.            return $send;
  62.        }
  63.    }
  64.    
  65.    private function change(){
  66.        $first = $this->temp_name;
  67.        while(preg_match('/<!--ON ([A-Z_]*)-->([dDs]*)<!--OFF [A-Z_]*-->/',$first)){
  68.            $first = $this->repl_on_off($first);
  69.        }        
  70.        while(preg_match('/<!--BEGIN ([A-Z_]*)-->([dDs]*)<!--END [A-Z_]*-->/',$first)){
  71.            $first = $this->repl_ar($first);
  72.        }        
  73.        while(preg_match("/({)([A-Z_]*)(})/",$first)){
  74.            $first = $this->repl($first);
  75.        }
  76.        return $first;
  77.    }
  78.    //zwracanie zamienionego stylu
  79.    public function ret(){
  80.        $out = $this->change();
  81.        return $out;        
  82.    }    
  83. }
  84. ?>


Kod wykonujący:
  1. <?php
  2. include("class/mytpl.php");
  3. $y_repeat_tpl[1] = array(
  4.    'OPT' => 'test_1'
  5.    );
  6. $y_repeat_tpl[2] = array(
  7.    'OPT' => 'test_2'
  8.    );
  9. $z_repeat_tpl[1] = array(
  10.    'OPT' => 'Test_01'
  11.    );
  12. $z_repeat_tpl[2] = array(
  13.    'OPT' => 'Test_02'
  14.    );
  15. $z_repeat_tpl[3] = array(
  16.    'OPT' => 'Test_03'
  17.    );
  18.        
  19. $x_repeat_tpl[2] = array(
  20.    'CL' => 'Pierwszy',
  21.    'OPTION' => $z_repeat_tpl
  22.    );
  23. $x_repeat_tpl[3] = array(
  24.    'CL' => 'Drugi',
  25.    'OPTION' => $y_repeat_tpl
  26.    );
  27.  
  28. $ar['SECTION'] = 'Sekcja';    
  29. $ar['START_REPEAT'] = $x_repeat_tpl;
  30. $ar['ALLOW'] = TRUE; //FALSE wylacza
  31.  
  32. //Utworzenie klasy
  33. $test = new temp('test_template',$ar,0);
  34. //wyświetlenie wygenerowanego kodu
  35. echo $test->ret();
  36. ?>


Plik 'test_template.tpl'
  1. <?php
  2. Poczatek<br><br>
  3. <!--ON ALLOW-->
  4.    {SECTION} on/off<br><br>
  5. <!--OFF ALLOW-->
  6.  
  7. <!--BEGIN START_REPEAT-->
  8. Nazwa testu: {CL}<br>    
  9.    <!--BEGIN OPTION-->
  10.        -{OPT}<br>
  11.    <!--END OPTION-->    
  12. <!--END START_REPEAT-->
  13. <br>
  14. Koniec
  15. ?>


Tekst wyświetlany:
  1. Poczatek
  2.  
  3. Sekcja on/off
  4.  
  5. Nazwa testu: Pierwszy
  6. -Test_01
  7. -Test_02
  8. -Test_03
  9. Nazwa testu: Drugi
  10. -Test_1
  11. -Test_2
  12.  
  13. Koniec


Cierpliwym, którzy przeczytali całość i są gotowi ocenić moją pracę i pomóc w poprawieniu ewentualnych niedociągnięć lub udoskonalić tę klasę,
bardzo dziękuję.
Go to the top of the page
+Quote Post

Posty w temacie


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 - 19:14