Souborový engine v PHP
Implementujeme engine webu, který nám umožní vytvořit soubor šablony, ke kterému bude v závislosti na URL připojen různý obsah.
Nechť struktura naší stránky vypadá následovně:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<header>
header
</header>
<main>
content
</main>
<header>
footer
</header>
</body>
</html>
Pojďme na místo, kde má dojít k vložení obsahu,
vložit nějaký námi vymyšlený příkaz pro vložení,
například takovýto:
{{ content }}. Upravme šablonu našeho webu:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<header>
header
</header>
<main>
{{ content }}
</main>
<header>
footer
</header>
</body>
</html>
Vytvořme nyní složku view, do které
budeme umisťovat soubory s obsahem. Přímo do této
složky nebo do podsložek.
První soubor bude takový:
<div>
content 1
</div>
Druhý soubor bude takový:
<div>
content 2
</div>
Třetí soubor bude takový:
<div>
content 3
</div>
Pojďme nyní zařídit, aby se podle URL
z adresního řádku načetl příslušný
soubor. V našem případě na URL /page1
bude první soubor, na URL /dir/page2
- druhý, a na URL /dir/sub/page3
- třetí.
Pusťme se do implementace. Nejprve v souboru
.htaccess zaříďme, aby všechny požadované
adresy, kromě souborů zdrojů, byly přesměrovány
na stránku index.php:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !\.(js|css|ico|jpg|png|gif)$
RewriteRule .+ index.php
Na stránce index.php získáme do proměnné
požadované URL:
<?php
$url = $_SERVER['REQUEST_URI'];
?>
Poté získáme text souboru se šablonou:
<?php
$layout = file_get_contents('layout.php');
?>
Nyní podle URL získáme ze složky view
příslušný soubor s obsahem:
<?php
$content = file_get_contents('view' . $url . '.php');
?>
Nahradíme v textu šablony námi vymyšlený příkaz na získaný obsah ze souboru:
<?php
$layout = str_replace('{{ content }}', $content, $layout);
?>
Vypíšeme do prohlížeče soubor šablony s dosazeným obsahem:
<?php
echo $layout;
?>
Spojíme vše dohromady a získáme následující kód:
<?php
$url = $_SERVER['REQUEST_URI'];
$layout = file_get_contents('layout.php');
$content = file_get_contents('view' . $url . '.php');
$layout = str_replace('{{ content }}', $content, $layout);
echo $layout;
?>
Implementujte popsaný souborový engine.