Tiedostopohjainen moottori PHP:ssä
Toteutamme sivustomoottorin, jonka avulla voimme luoda mallitiedoston, johon URL-osoitteesta riippuen liitetään erilaista sisältöä.
Oletetaan, että sivumme rakenne on seuraava:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<header>
header
</header>
<main>
content
</main>
<header>
footer
</header>
</body>
</html>
Laitaamme paikkaan, johon sisällön pitäisi tulla,
keksimämme komennon sisällön lisäämiseksi, esimerkiksi näin:
{{ content }}. Muutetaan sivustomme mallipohjaa:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<header>
header
</header>
<main>
{{ content }}
</main>
<header>
footer
</header>
</body>
</html>
Luodaan nyt kansio view, johon
aiomme sijoittaa sisältötiedostoja. Suoraan tähän
kansioon tai alikansioihin.
Ensimmäinen tiedosto on tällainen:
<div>
content 1
</div>
Toinen tiedosto on tällainen:
<div>
content 2
</div>
Kolmas tiedosto on tällainen:
<div>
content 3
</div>
Tehdään nyt niin, että URL-osoitteen
perusteella haetaan vastaava
tiedosto. Meidän tapauksessamme URL-osoitteella /page1
tulee ensimmäinen tiedosto, URL-osoitteella /dir/page2
- toinen, ja URL-osoitteella /dir/sub/page3
- kolmas.
Ryhdytään toteuttamaan. Aluksi tiedostossa
.htaccess tehdään niin, että kaikki haetut
osoitteet, paitsi resurssitiedostot, ohjataan
sivulle index.php:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !\.(js|css|ico|jpg|png|gif)$
RewriteRule .+ index.php
Sivulla index.php saadaan muuttujaan
haettu URL:
<?php
$url = $_SERVER['REQUEST_URI'];
?>
Sen jälkeen saadaan mallipohjatiedoston teksti:
<?php
$layout = file_get_contents('layout.php');
?>
Nyt URL-osoitteen perusteella saadaan kansiosta view
vastaava sisältötiedosto:
<?php
$content = file_get_contents('view' . $url . '.php');
?>
Korvataan mallipohjan tekstissä keksimämme komma saadulla sisällöllä:
<?php
$layout = str_replace('{{ content }}', $content, $layout);
?>
Tulostetaan selaimelle mallipohjatiedosto korvatulla sisällöllä:
<?php
echo $layout;
?>
Kootaan kaikki yhteen ja saadaan seuraava koodi:
<?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;
?>
Toteuta kuvattu tiedostopohjainen moottori.