Chůva index.php aneb jednoduché přepínání stránek v PHP

Hlavní základní kámen pro nás bude soubor index.php, ve kterém se bude měnit pouze hlavní obsahová část.

Narozdíl od řešení přes několik html souborů obsahujících stejný, přebytečný (tzv. redundantní) kód nám toto řešení umožní rychlejší úpravu. Ukažme si to na konkrétním příkladu:

Představte si, že v patičce ve 4 souborech (např. Úvod, Služby, O nás, Kontakt) máte uveden rok a starý e-mail.

<footer>
  <p>© 2013 | <a href="mailto:[email protected]">[email protected]</a></p>
</footer>

Chůva (index.php) v akci

Jakmile zjistíte, že chcete rok nebo e-mail upravit, budete muset udělat úpravu na 4 místech. Je to jako hlídat 4 děti najednou! :-) Proto si vytvoříme chůvu jménem index.php, která bude používat parametr page umístěný v URL.

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Chůva index.php v akci</title>
</head>
<body>

<nav> 
  <ul>
    <li><a href="./">Úvod</a></li>
    <li><a href="?page=sluzby">Služby</a></li>
    <li><a href="?page=onas">O nás</a></li>
    <li><a href="?page=kontakt">Kontakt</a></li>
  </ul>
</nav>

</body>
</html>

Tento kód nám však nedokáže zpracovat parametr page a proto musíme za navigaci přidat:

...
</nav>

<?php
$page = filter_input(INPUT_GET, "page");
echo $page;
?>

</body>
</html>

což nám vypíše parametr page z URL. Všimněte si, že po kliknutí na položku menu „Úvod“ se nic nevypíše. Je to proto, že tento parametr nepřeposíláme v URL.

Doplníme kód o podmínku:

...
</nav>

<?php
$page = filter_input(INPUT_GET, "page");
if (isset($page)) {
  echo $page;
} else {

  // parametr page není nastaven = výchozí stránka je úvod

  echo "uvod";
}
?>

</body>
</html>

Nyní si vytvoříme adresář includes na stejné úrovni jako je index.php a v něm pro obsahy jednotlivých podstránek 4 PHP soubory (uvod.php, sluzby.php, onas.php, kontakt.php), do kterých si vložíme libovolný obsah.

Pozměníme kód, aby načítal soubory pomocí funkce include_once

...
</nav>

<?php
$page = filter_input(INPUT_GET, "page");
if (isset($page)) {
  include_once "includes/$page.php";
} else {

  // parametr page není nastaven = výchozí stránka je úvod

  include_once "includes/uvod.php";
}
?>

</body>
</html>

což lze zjednodušit na

...
</nav>

<?php
$page = filter_input(INPUT_GET, "page");

// všimněte si doplněného vykřičníku v podmínce

if (!isset($page)) {
  $page = "uvod";
}

include_once "includes/uvod.php";

?>

</body>
</html>

Tento kód bohužel neřeší problém, když někdo změní ručně parametr v URL. Tedy např. ?page=nesmysl. Takže si vytvoříme v adresáři includes soubor error404.php, do kterého napíšeme:

<h1>Chyba 404 - Stránka nenalezena.</h1>

Kód doplníme o další podmínku

...
</nav>

<?php
$page = filter_input(INPUT_GET, "page");
if (!isset($page)) {
  $page = "uvod";
}

$file = 'includes/' . $page. '.php';
if (file_exists($file)) {
  include_once $file;
} else {
  include_once 'includes/error404.php';
}
?>

</body>
</html>