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 {}
Nick: {MY_NICK}
-by sekcje kodu mogły się powtarzać na podstawie elementów tablicy ( również zagnieżdżone )
<!--BEGIN REPEAT_SECTION-->
{REPEAT_ELEMENT}
<!--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)
<!--ON BLOCK-->
Jakiś fragment strony.
<!--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:<?php
class temp{
private $t_name;
private $temp_name;
private $temp_array;
//$t_name - nazwa pliku ze stylem lub gotowy styl (string)
//$t_array - tablica z danymi
//$t_type - 0=plik 1=string
public function __construct($t_name,$t_array,$t_type){
if($t_type == 0){
$this->t_name = $t_name;
$this->temp_name = $this->GetFile();
} else {
$this->temp_name = $t_name;
}
$this->temp_array = $t_array;
}
//pobieranie pliku (domyœlnie zakładam 'templates/*.tpl'
public function GetFile(){
$fr = fopen('templates/'.$this->t_name.'.tpl', "r"); if(!$fr){
$content = "Nie wczytano pliku";
} else {
$content = fread($fr, filesize('templates/'.$this->t_name.'.tpl')); }
return $content;
}
private function repl($str){
return $output;
}
private function repl_ar($str){
return $output;
}
private function repl_on_off($str){
return $output;
}
private function check_key_on_off($param){
//TRUE - włšcza
//FALSE lub brak - Wyłšcza
if(isset($this->temp_array[$param[1
]]) && $this->temp_array[$param[1
]]) $send = $param[2
]; else $send = '';
return $send;
}
private function check_key($param){
if(isset($this->temp_array[$param[2
]])) $send = $this->temp_array[$param[2
]]; else $send = '';
return $send;
}
private function check_key_array($param){
if(isset($this->temp_array[$param[1
]])){ foreach($this->temp_array[$param[1]] as $lp=>$v_arr){
$repe = new temp($param[2],$v_arr,1);
$send = $send.$repe->ret();
}
return $send;
}
}
private function change(){
$first = $this->temp_name;
while(preg_match('/<!--ON ([A-Z_]*)-->([dDs]*)<!--OFF [A-Z_]*-->/',$first)){ $first = $this->repl_on_off($first);
}
while(preg_match('/<!--BEGIN ([A-Z_]*)-->([dDs]*)<!--END [A-Z_]*-->/',$first)){ $first = $this->repl_ar($first);
}
$first = $this->repl($first);
}
return $first;
}
//zwracanie zamienionego stylu
public function ret(){
$out = $this->change();
return $out;
}
}
?>
Kod wykonujący:<?php
include("class/mytpl.php");
$y_repeat_tpl[1
] = array( 'OPT' => 'test_1'
);
$y_repeat_tpl[2
] = array( 'OPT' => 'test_2'
);
$z_repeat_tpl[1
] = array( 'OPT' => 'Test_01'
);
$z_repeat_tpl[2
] = array( 'OPT' => 'Test_02'
);
$z_repeat_tpl[3
] = array( 'OPT' => 'Test_03'
);
$x_repeat_tpl[2
] = array( 'CL' => 'Pierwszy',
'OPTION' => $z_repeat_tpl
);
$x_repeat_tpl[3
] = array( 'CL' => 'Drugi',
'OPTION' => $y_repeat_tpl
);
$ar['SECTION'] = 'Sekcja';
$ar['START_REPEAT'] = $x_repeat_tpl;
$ar['ALLOW'] = TRUE; //FALSE wylacza
//Utworzenie klasy
$test = new temp('test_template',$ar,0);
//wyświetlenie wygenerowanego kodu
?>
Plik 'test_template.tpl'<?php
Poczatek<br><br>
<!--ON ALLOW-->
{SECTION} on/off<br><br>
<!--OFF ALLOW-->
<!--BEGIN START_REPEAT-->
Nazwa testu: {CL}<br>
<!--BEGIN OPTION-->
-{OPT}<br>
<br>
Koniec
?>
Tekst wyświetlany:Poczatek
Sekcja on/off
Nazwa testu: Pierwszy
-Test_01
-Test_02
-Test_03
Nazwa testu: Drugi
-Test_1
-Test_2
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ę.