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:

layout.php<!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:

layout.php<!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:

view/page1.php<div>
  content 1
</div>

Toinen tiedosto on tällainen:

view/dir/page2.php<div>
  content 2
</div>

Kolmas tiedosto on tällainen:

view/dir/sub/page3.php<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:

.htaccessRewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !\.(js|css|ico|jpg|png|gif)$
RewriteRule .+ index.php

Sivulla index.php saadaan muuttujaan haettu URL:

index.php<?php
  $url = $_SERVER['REQUEST_URI'];
?>

Sen jälkeen saadaan mallipohjatiedoston teksti:

index.php<?php
  $layout = file_get_contents('layout.php');
?>

Nyt URL-osoitteen perusteella saadaan kansiosta view vastaava sisältötiedosto:

index.php<?php
  $content = file_get_contents('view' . $url . '.php');
?>

Korvataan mallipohjan tekstissä keksimämme komma saadulla sisällöllä:

index.php<?php
  $layout = str_replace('{{ content }}', $content, $layout);
?>

Tulostetaan selaimelle mallipohjatiedosto korvatulla sisällöllä:

index.php<?php
  echo $layout;
?>

Kootaan kaikki yhteen ja saadaan seuraava koodi:

index.php<?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;
?>
Задание 1

Toteuta kuvattu tiedostopohjainen moottori.