Kvůli dlouhému obsahu jsem stránku Další možnosti rozdělila na samostatné části:
Běžná praxe u menších webů: používá se .htaccess pro pěkné URL, stránka je skládaná z kousků. Podle parametru z URL se includuje skript pro obsahovou část, hlavička a patička jsou společné, (viz třeba příklad na DJPW).
Předpokládejme, že máme takovouhle strukturu adresářů:
includes + chyba.php + dalsi-stranka.php + hlavicka.php + paticka.php + uvod.php libs + Route.php + Router.php + RouterForIncludes.php + SimpleRoute.php index.php .htaccess
Soubor index pak může vypadat takto:
require 'libs/Route.php'; require 'libs/SimpleRoute.php'; // pokud ji používáte, viz část "Adresy složené z parametrů" require 'libs/Router.php'; require 'libs/RouterForIncludes.php'; // výchozí stránka/skript $defaultPage = array('page' => 'uvod'); $router = new RouterForIncludes($defaultPage); $router->addRoute('/:page<[a-z0-9_-]+>', array('page' => 'uvod'), Route::CI); $cesta = dirname(__FILE__).'/includes'; $router->setCallbackMask("$cesta/hlavicka.php, $cesta/<page>.php, $cesta/paticka.php"); $router->setErrorCallback("$cesta/hlavicka.php, $cesta/chyba.php, $cesta/paticka.php"); $router->parseUrl($_GET['route']); try { $router->delegate(); } catch (Exception $e) { echo 'Chyba nastavení: některý z požadovaných souborů neexistuje a/nebo není definovaný errorCallback.'; echo '<br>Chybová zpráva: ' . $e->getMessage(); }
NB: Pokud kterýkoli z požadovaných souborů neexistuje, router vyhodí výjimku.
Soubory se includují uvnitř funkce, tedy v uzavřeném kontextu. Kromě superglobálních polí ($_POST, $_GET apod.) mají k dispozici ještě proměnnou $router, odkazující na aktuální instanci routeru. Pokud chcete skriptům umožnit přístup ke globálním proměnným, anebo předávat data mezi skripty, využijete metodu addToContext():
Nastavení routeru (index.php)// hodnota proměnné $x bude v incl. souborech přístupná jako proměnná $var $x = 'Ahoj světe'; $router->addToContext('var', $x); $router->setCallbackMask('prvniSkript.php, druhySkript.php'); $router->delegate();prvniSkript.php
echo 'Prvni skript. Globalni promenna $x tu je: ', $var, "\n"; // všechny následující skripty dostanou proměnnou $foo s hodnotou "bar" $router->addToContext('foo', 'bar');druhySkript.php
echo 'Druhy skript. Globalni promenna $x tu je: ', $var; echo ' a promenna $foo taky: ', $foo;Výsledek
Prvni skript. Globalni promenna $x tu je: Ahoj světe Druhy skript. Globalni promenna $x tu je: Ahoj světe a promenna $foo taky: bar
Metodu addToContext je možné volat i pouze s jedním parametrem - v tom případě očekává asociativní pole. Takže jestli už máte připravená nějaká data jako pole, nemusíte je do kontextu složitě přidávat po jednom prvku.
Poslední aktualizace: 24. 6. 2012 15:54