środa,
PHP: Udoskonalony system szablonów
Ten materiał to rozwinięcie projektu „PHP: Prosty system szablonów” o obsługę pętli i tablic. Nowe funkcjonalności znacznie poszerzają możliwości prezentowanego prostego systemu szablonów. Nazwy plików i ich rozmieszczenie nie uległy zmianie w stosunku do poprzedniego materiału.
Modyfikacja systemu szablonów
Zmiany w klasie Template
Aby dodać obsługę pętli i tablic do prostego systemu szablonów w PHP, musisz rozszerzyć klasę Template
o dodatkową funkcjonalność. To zadanie wymaga bardziej zaawansowanego używania wyrażeń regularnych i zrozumienia, jak manipulować ciągami znaków w PHP. Poniżej znajdziesz przykładową implementację:
class Template {
// poprzedni kod
protected $template;
protected $variables = array();
public function __construct($template) {
$this->template = $template;
}
public function set($key, $value) {
$this->variables[$key] = $value;
}
// end poprzedni kod
// modyfikacja metody render
public function render() {
if(file_exists($this->template)) {
$content = file_get_contents($this->template);
// Obsługa zmiennych
foreach($this->variables as $key => $value) {
if(is_array($value)) {
// Obsługa pętli
$content = $this->handleLoops($content, $key, $value);
} else {
// Zastąpienie zmiennych
$content = preg_replace('/{' . $key . '}/', $value, $content);
}
}
return $content;
}
return "";
}
// end modyfikacja metody render
// nowy kod
private function handleLoops($content, $key, $array) {
// Wyszukiwanie wzorca pętli dla określonej zmiennej
$pattern = "/{% for $key %}(.*?){% endfor %}/s";
if(preg_match($pattern, $content, $matches)) {
$loopContent = '';
foreach($array as $item) {
// Wypełnianie treści pętli
$itemContent = $matches[1];
foreach($item as $itemKey => $itemValue) {
$itemContent = preg_replace('/{' . $itemKey . '}/', $itemValue, $itemContent);
}
$loopContent .= $itemContent;
}
// Zastąpienie całego bloku pętli wygenerowaną treścią
$content = preg_replace($pattern, $loopContent, $content);
}
return $content;
}
// end nowy kod
}
Przykładowy szablon z pętlą
Teraz w szablonie możesz użyć specjalnej składni do obsługi pętli.
Plik template.php:
<html>
<head>
<title>{title}</title>
</head>
<body>
<h1>{headline}</h1>
<p>{content}</p>
{% for users %}
<p>Name: {name}, Age: {age}</p>
{% endfor %}
</body>
</html>
Przykład zastosowania zmodyfikowanego systemu szablonów
Możesz teraz przekazać tablicę z danymi do szablonu, pętla będzie przetwarzana automatycznie.
Plik index.php:
include 'class/Template.php';
$users = [
['name' => 'Jan', 'age' => 30],
['name' => 'Anna', 'age' => 25],
// Więcej użytkowników...
];
$template = new Template('templates/template.php');
$template->set('title', 'Moja Strona');
$template->set('headline', 'Witaj na Mojej Stronie');
$template->set('content', 'To jest przykładowa zawartość strony.');
$template->set('users', $users);
echo $template->render();
Jak to działa?
- Obsługa pętli – metoda
handleLoops
przeszukuje treść szablonu w poszukiwaniu wzorców pętli i wypełnia je danymi z tablicy. - Dynamiczne zastępowanie – wewnątrz pętli, każdy element tablicy jest przetwarzany oddzielnie, pozwalając na dynamiczne zastępowanie zmiennych wewnątrz pętli.
- Składnia pętli – w szablonie używa się specjalnej składni
{% for variable %} ... {% endfor %}
do określenia pętli.
Ta prosta implementacja pozwala na stosowanie pętli w szablonach, co jest znacznym krokiem w kierunku bardziej dynamicznego i elastycznego systemu. Oczywiście bardziej zaawansowane są istniejące popularne systemy szablonów, które oferują szerszą gamę funkcjonalności, lepsze zarządzanie błędami itd., jednak własna implementacja pozwala zrozumieć zasadę działania takich rozwiązań.