Programátorská sociální síť a materiálová základna pro C#, Java, PHP, HTML, CSS, JavaScript a další.


Přihlásit se Registrace  

4. díl - Dynamické skládání stránek

Zpět do sekce Jednoduchý dynamický web v PHP

V minulém dílu seriálu o PHP jsme si vytvořili formulář k odesílání emailů. Nyní si povíme něco o tom, jak číst soubory a vkládat jeden do druhého.

Problém statických stránek

Většina internetových stránek obsahuje kromě hlavní části s "užitečným nákladem" i různé pomocné navigační lišty, menu, loga, hlavičky, patičky a podobně. Zatímco obsah je téměř vždy na každé stránce jiný, navigační menu bývá obvykle všude stejné. Ruční kopírování stejného kusu kódu do spousty HTML souborů je otrava, navíc jestli se v něm někdy něco změní, museli bychom to dělat znovu. Proto je výhodné napsat tento kód jenom jednou, odděleně od ostatních stránek, a pak ho s nimi jenom nějak propojit.

Možná řešení

U čistě statických stránek máme jedinou možnost: rámy (tagy frameset nebo iframe), kdy v jednom rámu je zobrazena stránka s navigační lištou a ve druhém stránka s obsahem (rámů může být samozřejmě i víc). Výhodou je celková jednoduchost tvorby, vzájemná nezávislost stránek v jednotlivých rámech a možnost zobrazit nebo vytisknout si kteroukoli stránku bez rušivých lišt a hlaviček. Nevýhodou je horší přehlednost při přístupu přes vyhledávače (pomocné odkazy pro zobrazení chybějících rámů to sice řeší, ale dají skoro stejně práce jako kopírování celého navigačního menu) a taky právě ta zmíněná nezávislost stránek, kvůli které musí být v každé znovu a znovu obsažen všechen HTML balast jako jsou hlavičky, definice stylů a tak.

Mezistupněm mezi statickou a dynamickou stránkou je menu vkládané Javascriptem (nebo obecně jakýmkoli skriptem na straně prohlížeče), ale o tom to tady není, takže zpátky k PHP. Tam máme možností mnohem víc, hlavně ve větším výběru možných způsobů vkládání textů a kódu. Než se pustíme do technických záležitostí, položme si nejdříve jednu otázku spíše filosofického rázu: chceme do stránek vkládat menu, nebo obsah?

Vkládání menu

Máme php soubor se vším všudy včetně užitečného obsahu, ale v místě, kde chceme mít navigační lištu (případně i všechny hlavičky, patičky, styly a jiná metadata), bude jenom nějaký krátký příkaz, který ji tam vloží odjinud.

Tento systém je vhodný pro ručně psané stránky a sólové projekty, kde si chceme jenom ušetřit práci s vkládáním opakujícího se kódu. Výhoda je také v možné variabilitě: pokud skriptem vkládáme pouze navigaci, můžeme si klidně udělat každou stránku v úplně jiném stylu (i když se to v praxi většinou nedělá ani nedoporučuje).

Vkládání obsahu

na to jde opačně. Užitečný obsah stránky máme uložený zvlášť, bez jakýchkoli metadat. O ta se postará hlavní stránka, která si do sebe soubor s obsahem natáhne. Hlavní stránce se říká šablona.

Tento způsob je vhodný pro redakční systémy a týmové projekty, kde mají všechny stránky jednotný vzhled a obsah se má vytvářet třeba i jinými cestami než jenom nahráváním jednotlivých stránek na server - to je jeho největší výhoda. Poněkud omezující může být nutnost používat jednotný styl, se kterým se obvykle z jednotlivých obsahových stránek nedá hnout.

Zásadní rozdíl mezi těmito dvěma přístupy je v tom, že zatímco při vkládání menu máme pro každou stránku samostatný, přímo adresovatelný php soubor, při vkládání obsahu máme takový soubor pouze jeden a stránky si vybíráme pomocí parametrů, obvykle předávaných metodou GET (tj. přes adresní řádek).

Pozn.: úvodní povídání o metodách předávání dat mezi skripty najdete v prvním díle. Metoda GET ve zkratce: parametry se připíší k adrese stránky, první se oddělí otazníkem, případné další &em:
stranka.php?jme­no1=hodnota1&jme­no2=hodnota2
Stranka.php potom k těmto parametrům přistupuje přes pole $_GET, např. v tomhle příkladě dostaneme proměnné $_GET['jmeno1'] s hodnotou 'hodnota1' a $_GET['jmeno2'] s hodnotou 'hodnota2'. Počet parametrů je libovolný.

Vložení souboru do stránky

První a nejjednodušší možnost jsou příkazy include a require, které přímo do stránky vloží celý soubor (stejně jako u echa můžeme parametr uzavřít do závorky, ale není to povinné):

include 'soubor.txt';
require 'adresar/skript.php';

Rozdíl mezi nimi je v tom, co se stane, když daný soubor nenajdou: include místo vložení souboru vypíše chybovou hlášku (případně neudělá nic, pokud jsou hlášky zakázané - viz minulý díl) a zbytek skriptu se normálně provede. Require v takovém případě způsobí, že se skript vůbec nespustí, podobně jako při syntaktické chybě.

Je třeba počítat s tím, že vložený soubor bude v režimu HTML, de facto jako kdyby se include po vyhodnocení změnil na tohle (ono to tak nějak nejspíš opravdu je):

?> ...obsah souboru... <?php

To znamená, že pokud je ve vkládaném souboru nějaký PHPčkový kód, musí být uzavřen do <?php ... ?>.

Vkládat obsah z jiných serverů se dá jenom když je v konfiguraci PHP nastaveno allow_url_inclu­de=1, což obvykle z bezpečnostních důvodů nebývá.

Samozřejmě pozor na nekonečné smyčky. Pokud se dva soubory includují navzájem, server se zacyklí a nakonec to vzdá, protože mu dojde paměť.

Vkládání menu

Dejme tomu, že chceme vložit hlavičku HTML, navigační lištu a patičku s podpisem. Vezmeme to od konce - soubor s patičkou paticka.htm by mohl vypadat třeba takhle:

<hr />
<p class="paticka">Stránku spravuje <a href="mailto:mrakoplas@nu.am">MgDr. Mrakoplaš</a>.</p>
<p class="reklama">Sponzoruje Kolík ASP, uzeniny všeho druhu!</p>
<p><a href="index.php">Zpět na hlavní stránku</a></p>
</body>
</html>

Protože patička bude nejspíš pro všechny stránky stejná, postačí pro její vložení jednoduchý include, který by vypadal takto:

<?php include 'paticka.htm'; ?>

Kód je jen ukázka a zatím ho nikam nepište. Require radši ne, protože kdyby se náhodou soubor s patičkou ztratil, je lepší potkat chybovou hlášku na konci stránky než místo stránky.

S hlavičkou bychom to mohli udělat podobně, ale je tu jeden háček: titulek stránky v tagu <title>, který pravděpodobně chceme mít na každé stránce jiný. Tím pádem statický soubor nestačí, musíme ho sestavit dynamicky podle požadavků v okamžiku vložení. Protože si chceme práci ušetřit a ne přidělat, napíšeme si na to funkci, která dostane titulek v parametru a pomocí echa vytvoří kompletní hlavičku. Vytvoříme soubor hlavicka.php s následujícím obsahem:

<?php
function pis_hlavicku($titulek)
{
//hlavička:
echo '<html><head>';
echo '<meta http-equiv="content-type" content="text/html;charset=windows-1250">';
echo '<title>'.$titulek.'</title>';
echo '<link rel="stylesheet" type="text/css" href="styly.css">';
echo '</head><body>';
//navigace:
echo '<p><a href="motyli.php">sbírka motýlů</a>, <a href="zaby.php">sbírka žab</a></p><hr>';
}
?>

Řádek s titulkem by šel zapsat i jinak, s využitím rozbalování proměnných v řetězcích ohraničených uvozovkami:

echo "<title>$titulek</title>";

To je ovšem věc osobního vkusu každého programátora. Já radši pro veškeré HTML používám apostrofy, abych nemusel dělat tohle:

echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"styly.css\">";

Echa nezalamují řádky, takže jestli chcete, aby se na výsledný HTML kód dalo koukat, připište si na konec každého řádku zalamovací znak \n. Ale z hlediska prohlížečů je to jedno.

Jo, abych to nezamluvil: objevila se nám tu definice funkce. Ta vždycky začíná klíčovým slovem function. Za ním je povinně závorka, která je buď prázdná nebo obsahuje jména formálních parametrů (pokud jich je víc než jeden, oddělují se čárkami). Parametry začínají na $ jako každá jiná proměnná a stejně tak se u nich neuvádějí žádné datové typy. Volají se hodnotou, ne odkazem (to sice taky jde, ale zatím to nepotřebujeme). Tělo funkce je uzavřeno ve složených závorkách. Případná návratová hodnota se předá příkazem return, např.:

function cislo_slovy($cislo)
{
if ($cislo==1) return 'Jedna';
          else return 'Něco jiného';
}

echo cislo_slovy(20); //vypíše "Něco jiného"

Pozn.: funkce je úsek kódu, který si jednou napíšeme a pak ho můžeme odkudkoli zavolat a nechat proběhnout. Hlavní účel je, abychom nemuseli opakovaně psát ty samé věci.

Zpátky k původnímu příkladu. Funkci na vypsání hlavičky máme v souboru hlavicka.php. Před jejím zavoláním ovšem musíme soubor do stránky vložit, aby interpret věděl, jak funkce vypadá (definice funkcí sice můžou být až za místem jejich prvního použití, ale to platí jen když jsou v tom samém skriptu). Na to můžeme použít starý známý require (nebo include, v případě problémů by skript spadnul tak jako tak).

Nyní si konečně vytvoříme stránku motyli.php, ta může vypadat třeba takhle:

<?php
require 'hlavicka.php';
pis_hlavicku('Sbírka motýlů');
?>

<h1>Moje sbírka motýlů</h1>
<p>Babočky, otakárci, bělásci, moli...</p>
<p>(fotky budou, až najdu foťák)</p>

<?php include 'paticka.htm'; ?>

Přejdeme na ní v prohlížeči. Výsledek:

Dynamické vkládání menu do HTML stránky v PHP

V praxi by byl obsah stránky samozřejmě mnohem delší a hlavička s patičkou by tedy představovaly jenom mizivé procento. Jakákoli změna v nich by se samozřejmě okamžitě promítla do všech stránek, které je používají.

Vkládání obsahu

Tady si nejdřív musíme vymyslet způsob výběru stránky. Dejme tomu, že použijeme metodu GET a přes adresní řádek budeme předávat přímo jména souborů i titulek stránky, třeba:

http://mrakoplas­.nu.am/index.php?stran­ka=motyli.htm&ti­tulek=Sbírka motýlů

Kód hlavní stránky index.php by pak mohl vypadat takto:

<html><head>
<meta http-equiv="content-type" content="text/html;charset=windows-1250">
<title>
<?php echo $_GET['titulek'] ?>
</title>
<link rel="stylesheet" type="text/css" href="styly.css">
</head><body>
<p><a href="index.php?stranka=motyli.htm&titulek=Sbírka motýlů">sbírka motýlů</a>,
   <a href="index.php?stranka=zaby.htm&titulek=Sbírka žab">sbírka žab</a></p><hr>

<?php include $_GET['stranka'] ?>

<hr />
<p class="paticka">Stránku spravuje <a href="mailto:mrakoplas@nu.am">MgDr. Mrakoplaš</a>.</p>
<p class="reklama">Sponzoruje Kolík ASP, uzeniny všeho druhu!</p>
<p><a href="index.php">Zpět na hlavní stránku</a></p>
</body>
</html>

A soubor motyli.htm by bylo holé HTML bez hlaviček:

<h1>Moje sbírka motýlů</h1>
<p>Babočky, otakárci, bělásci, moli...</p>
<p>(fotky budou, až najdu foťák)</p>

A výsledek:

Dynamické vkládání obsahu do HTML stránky v PHP

No jo, ale má to nejméně tři háčky. První jsou česká písmena s diakritikou a mezery v titulku, které by v adresním řádku dělaly neplechu. To by se dalo vyřešit buď ručním nahrazením problematických znaků ASCII kódem v šestnáctkovém tvaru (např. mezera je %20) nebo funkcí urlencode(), která to udělá za nás. Navigační lišta by se tedy mohla změnit třeba na tohle:

<p><a href="index.php?stranka=motyli.htm&titulek=
<?php echo urlencode('Sbírka motýlů') ?>
">sbírka motýlů</a>, <a href="index.php?stranka=zaby.htm&titulek=
<?php echo urlencode('Sbírka žab') ?>
">sbírka žab</a></p><hr>

Nic jiného než odkazy se nezmění. Pole $_GET se rozkódovává automaticky, takže funkci urldecode() vůbec nebudete potřebovat.

Samozřejmě je vhodné používat nějakou přehlednou úpravu (odsazování a tak), abychom se v napsaném kódu později vyznali - výše uvedený příklad berte spíš jako odstrašující :-).

Pokud přejdeme jen na index.php, dostaneme vyhubováno, protože jsme nezadali parametry. Proto doplníme již nám známou podmínku s isset a přidáme nějakou výchozí html stránku, která se zobrazí v případě, že parametry nezadáme. Pasáž s vložením titulku bude nyní vypadat takto:

<?php
        $titulek = 'Mrakoplašův osobní web';
        if (isset($_GET['titulek']))
                $titulek = $_GET['titulek'];
        echo $titulek;
?>

a s vložením obsahu:

<?php
        $stranka = 'uvod.htm';
        if (isset($_GET['stranka']))
                $stranka = $_GET['stranka'];
        include $stranka;
?>

Kompletní zdrojový kód je připojen na konci článku. Vidíme, že vše funguje:

Dynamické vkládání obsahu do HTML stránky v PHP

Další háček je v tom, že si do adresního řádku může kdokoli cokoli ručně napsat. O tom, co by z toho mohlo vzejít a jak tomu zabránit, se dozvíte o dvě kapitoly dál, ale nejdřív se naučíme používat cykly a několik dalších způsobů čtení ze souborů.


 

Stáhnout

4. díl - Dynamické skládání stránek 212x (2.97 kB)

Program je včetně zdrojových kódů v jazyce php

 

Autor: Mircosoft
Autor se věnuje amatérskému tvoření v Turbo Pascalu, Assembleru a PHP a profesionálnímu šťourání v jiném Assembleru, Rexxu, Cobolu a podobných obskurnostech.

Jak se vám líbí článek?
Celkem (2 hlasů):
4.5 4.5 4.5 4.5 4.5


 


Předchozí článek
Tvorba formuláře na odesílání e-mailů
Tutoriál vás provede tvorbou formuláře na odesílání e-mailů (mailformu) v jazyce PHP.
Všechny články v sekci
Jednoduchý dynamický web v PHP
V seriálu nejprve v PHP vytvoříme jednoduché doplňky jako webové formuláře, počítadla, ankety a knihy návštev. Nakonec si vytvoříme redakční systém.
Další článek
Další způsoby načítání souborů
Druhá půlka tutoriálu o dynamickém skládání stránek: načítání souborů do proměnných a jejich následné zpracování.


 

 

Vaše komentáře:

 

Zatím nikdo nevložil komentář - buď první!


Přidat novou zprávu

Avatar
Neregistrovaný

Pro výhody se přihlaš. Pokud ještě nemáš účet, zaregistruj se.

Jméno:
E-mail:
Web:

Šťastný Smutný S vyplazeným jazykem Mrkající Smějící se Plačící Cool Nemocný Naštvaný S brýlemi Stydící se On to nebyl Překvapený Hodně překvapený Šokovaný Srdce sdraco
Vložení obrázků Obrázky mohou nahrávat pouze registrovaní uživatelé
Vložení dlouhého zdrojáku Pouze pro registrované

 

Pro ověření prosím zaškrtněte pravdivá tvrzení:
Registrovaní uživatelé se tímto zdržovat nemusí. Zaregistrovat se

Píši proto, že zpráva má užitečnou hodnotu
Budu respektovat pravidla
Nehodlám dodržovat pravidla
Jsem robot