Failinis variklis PHP

Įgyvendinsime svetainės variklį, kuris leis mums sukurti šablono failą, į kurį, priklausomai nuo URL, bus prijungiamas skirtingas turinys.

Tegul mūsų puslapio struktūra atrodo taip:

layout.php<!DOCTYPE html>
<html>
  <head>
    <title>title</title>
  </head>
  <body>
    <header>
      header
    </header>
    <main>
      content
    </main>
    <header>
      footer
    </header>
  </body>
</html>

Įterpkime į vietą, kur turi būti įstatytas turinys, kokią nors mūsų sugalvotą komandą įterpimui, pavyzdžiui, šią: {{ content }}. Pakeiskime mūsų svetainės šabloną:

layout.php<!DOCTYPE html>
<html>
  <head>
    <title>title</title>
  </head>
  <body>
    <header>
      header
    </header>
    <main>
      {{ content }}
    </main>
    <header>
      footer
    </header>
  </body>
</html>

Dabar sukurkime aplanką view, į kurį įdėsime turinio failus. Tiesiogiai šiame aplanke arba poaplankiuose.

Pirmasis failas bus toks:

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

Antrasis failas bus toks:

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

Trečiasis failas bus toks:

view/dir/sub/page3.php<div>
  content 3
</div>

Dabar padarykime taip, kad pagal URL iš adreso eilutės būtų traukiamas atitinkamas failas. Mūsų atveju pagal URL /page1 bus pirmasis failas, pagal URL /dir/page2 - antrasis, ir pagal URL /dir/sub/page3 - trečiasis.

Pradėkime įgyvendinimą. Pirmiausia faile .htaccess padarykime taip, kad visi užklausti adresai, išskyrus resursų failus, būtų nukreipiami į puslapį index.php:

.htaccessRewriteEngine On
RewriteBase /

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

Puslapyje index.php gausime į kintamąjį užklaustą URL:

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

Tada gausime šablono failo tekstą:

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

Dabar pagal URL gausime iš aplanko view atitinkamą turinio failą:

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

Pakeisime šablono tekste mūsų sugalvotą komandą į gautą iš failo turinį:

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

Atvaizduokime naršyklėje šablono failą su pakeistu šablonu:

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

Sujunkime viską kartu ir gausime tokį kodą:

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

Įgyvendinkite aprašytą failinį variklį.