Vložení souboru

Následující příkazy umožňují vložit do zdroje stránky celé soubory, to se využívá například pro vložení scriptů, funkcí, knihoven nebo bloků stránek.


Příkazy Require a Include

Pro vložení souboru existují v PHP příkazy require a include. Liší se ve zpracování chyb, ale hlavně v tom, že require se například v příkazech cyklu provede jen jednou, zatímco include se může provádět opakovaně, proto se zaměříme hlavně na include.
Syntaxe těchto příkazů je jednoduchá:
include "soubor"; , například: include "tvorba/informat/hodnoceni/index.php"; načtení stránky s hodnocením na naší školní stránce
Název může samozřejmě obsahovat i cestu (od souboru, který obsahuje script s příkazem include), musí být také uvedena i přípona. Přípona souboru může být libovolná, někteří autoři používají například příponu .inc (zkratka příkazu include, aby bylo jasné, že jde o vkládané soubory), takové soubory je ale možné otevřít a prohlédnout, použijeme spíše naši obvyklou příponu .php.

Každý, kdo někdy tvořil trochu rozsáhlejší web, určitě narazil na problém údržby spousty stránek, které mají řadu shodných prvků (typicky záhlaví, patičku a navigaci) a liší se pouze v samotném obsahu. Práci s údržbou takovéhoto webu nám v PHP výrazně ušetří právě příkaz include. První možností je pomocí příkazu include načítat stejné části (hlavičku, menu, patičku) do každé stránky, druhá možnost je do jedné stránky (často indexu.php) načítat různé obsahy. Pro výklad použijeme onu druhou možnost, využívá ji například i náš školní web, vytvořený vašimi předchůdci v roce 2004/5.

Užití příkazu Include

Naše situace je následující - máme stránku index.php rozdělenou na několik částí pomocí divů, případně tabulky. Jedna část obsahuje menu (odkazy na ostatní stránky), v jiné části se má po výběru odkazu zobrazovat příslušný obsah. Na naší školní stránce jsou například vlevo a vpravo sloupce s odkazy a uprostřed je část, do které se načítá vybraný obsah.
Odkazy vypadají tentokrát jinak, předávají našemu php scriptu hodnotu proměnné, podle které poznáme jaký obsah načíst. Jde o metodu předání hodnoty proměnné pomocí adresového řádku (viz také metoda get pro odeslání formuláře v lekci 3.), kterou jsme ještě nepoužili.
Pokud naše stránka pokus.php využívá proměnné $a a $b, je možné otevřít stránku tak, že k adrese připíšeme hodnoty proměnných, například:
http://localhost/pokus.php?a=3&b=5
Za názvem stránky a otazníkem je vždy název proměnné a její hodnota, je-li proměnných víc, jsou oddělené ampersandem (&).
Hodnoty těchto proměnných jsou uložené v poli $_GET (tudíž i v poli $_REQUEST) a z něj je můžeme ve skriptech získat. Pozor! Pro PHP verze 5 je nutno použít příkaz extract($_GET); (případně i extract($_REQUEST), ale to nemusí vždy vyhovovat) jinak k předání hodnot nedojde (v nižších verzích to potřeba nebylo).

Odkazy na našem novém index.php by tedy mohly vypadat takto:
<a href="index.php?odkaz=mesta">Zeměpisný test</a>
Tento odkaz otvírá stránku index.php s tím, že do proměnné $odkaz vkládá hodnotu mesta.

V té části (divu, buňce tabulky), kde chceme zobrazovat obsah, bude script php, který načte příslušný soubor právě podle hodnoty proměnné $odkaz, například:
<?php
extract($_GET);
if (empty($_GET)) {include "uvod.php";}
elseif ($odkaz=="mesta") include "mesta.php";
elseif ($odkaz=="partner") include "partner.php";
?>
Nejprve je potřeba příkazem extract($_GET); "extrahovat" hodnoty proměnných pole $_GET, tedy proměnných zadaných z adresového řádku (z odkazu). Znovu připomínám, že by v PHP5 jinak script nefungoval. Na dalším řádku se zjistí, zda je pole $_GET prázdné, pokud ano (čili nebyl vybraný žádný odkaz), načte se nějaká úvodní stránka. Pokud pole $_GET není prázdné, načte se příslušný soubor podle hodnoty proměnné $odkaz.

Nejpřesnější by bylo kontrolovat existenci proměnné $odkaz příkazem isset($odkaz)), někteří autoři (vesměs ve starších verzích PHP) využívají také neviditelné pole formuláře.

Pamatujte i na to, že se do příslušného místa načte celý soubor, proto byste neměli načítat celou stránku vytvořenou v minulých lekcích, ale jen jádro, vlastní obsah bez těch částí, které už jsou na indexu (hlavička stránky, doctype, metatagy apod.), i přesto, že prohlížeče by nejspíš vše zobrazily podle vašich představ, vzniklý soubor by ale byl zbytečně větší a nepřehlednější.

(Pozn.: Nyní bychom mohli narazit na problémy se scripty, ve kterých by se využívalo pole $_REQUEST ke kontrole, zda byl odeslaný formulář (if (!empty($_REQUEST)) ). Jak jsme si už říkali, v tomto poli jsou hodnoty proměnných předaných skriptu metodou GET (z adresového řádku) i metodou POST (z formuláře). Pokud jsme klikli na odkaz, není už pole $_REQUEST prázdné, protože jeho podpole $_GET už obsahuje parametry předané odkazem!)

Můžete narazit ještě na další drobnost u skriptů, které obsahují v jednom souboru formulář i skript (např. vyhodnocení). V hlavičce formuláře je lepší nechat parametr action prázdný (zatím nám to bylo jedno, takže jsme mohli psát název skriptu), potom se i vyhodnocení odeslaného formuláře otevře do stejného místa jako samotný formulář: <form name="konfigurace" action="" method="post">


Úkoly:

Úkol (4 body, prémie podle počtu částí stránky nebo designu)

(Před začátkem práce si nejprve do nějakého adresáře, např. zaloha, zkopíruj všechny doposud vytvořené stránky protože je budeš všechny měnit - umazávat hlavičku apod.) Vytvoř nový index.php podle textu lekce. Má být rozdělený alespoň na dvě části s odkazy a obsahem, stylově upravený. V odkazech by měly být zahrnuty všechny vytvořené stránky alespoň od 4. lekce - Kalkulačka (případně převody km/h na m/s, °K na °C), Zeměpisný test, Partnerský test, BMI, Konfigurátor PC sestav. Další prémie můžeš získat, pokud se v příslušném prostoru zobrazí i vyhodnocení, které je v jiném souboru (měli jsme například u kalkulačky a testu) nebo správně fungující odkazy zpět z těchto vyhodnocení.

Název školy:Základní škola, Hradec Králové, M. Horákové 258
Název projektu:EU peníze školám
Číslo projektu:CZ.1.07/1.4.00/21.2575
Téma:Programování v PHP
Název:VY_32_INOVACE_10_10A_PHP10
Autor:Pavel Petr
Použité zdroje: Není-li uvedeno jinak, jsou všechny ilustrační obrázky dílem autora.