PHP: Chytré funkce - získání url
Potřeba stále psát a drobný nedostatek nápadů mě přivedl k myšlence otevření nového miniseriálu. Půjde vždy o takové chytré funkce, kterými si sám usnadňuji programování, které mi ušetří pár řádků kódu. V prvním dílu začnu něčím jednodušším, a to univerzálním zjištěním aktuální url adresy. Není to totiž tak triviální, jak by se mohlo na první pohled zdát.
Pro získání aktuální url (například v šabloně pro vypsání odkazu či v kontroleru pro zaslání headeru) je potřeba myslet na spoustu věcí. Kromě REQUEST_URI musíme znát rozdíl mezi proměnnými HTTP_HOST a SERVER_NAME, stejně tak, jako testovat https a případný port.
SERVER_NAME obsahuje aktuální doménu včetně subdomén. Pokud je adresa zadaná s www, v proměnné je najdeme, pokud ne, SERVER_NAME je obsahovat nebude. Oproti tomu HTTP_HOST www nikdy neobsahuje, ovšem pokud je v adrese definovaný port, v HTTP_HOST ho narozdíl od SERVER_NAME obsahovat bude. V naší funkci využijeme obou proměnných.
Dále funkci doplníme o nepovinný parametr, který rozliší, zda-li má být aktuální adresa vrácena ve formě pro HTML nebo ve formě pro header. Statickou proměnnou využijeme pro uložení hodnoty v rámci jedné instance a ošetření vícenásobného provádění akce.
function get_url($header = false) {
static $pure_url = null;
static $html_url = null;
if (!$pure_url) {
$url = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://');
$url .= $_SERVER['SERVER_NAME'];
$port = explode(':', $_SERVER['HTTP_HOST']);
if (!empty($port[1])) {
$url .= ':'.$port[1];
}
$url .= $_SERVER['REQUEST_URI'];
$pure_url = $url;
$html_url = str_replace('&', '&', $pure_url);
}
return $header ? $pure_url : $html_url;
}
Výše uvedená funkce slouží opravdu jen pro zjištění řetězce v adresním řádku. Jestliže potřebujeme dynamicky získávat aktuální umístění projektu, je nám to k ničemu... Vlastně to ani nelze. Pokud je totiž kořenový adresář rewritován, dostaneme jeho skutečné umístění, nikoli to změněné přes mod_rewrite. V takovém případě je nutné mít url projektu vždy uloženou v globální proměnné či v databázi.
Další akce, kterou provádím poměrně častěji je vypsání url spolu s přidaným parametrem. Tam je vždy nutné testovat, zda-li aktuální url již obsahuje ampersand nebo otazník a podle toho vypsat patřičný znak pro přidání nového parametru. Za tím účelem jsem si definoval malou funkci get_url_separator, která tento problém vyřeší za mě. V prvním nepovinném parametru mohu předat řetězec, který bude na výskyt otazníku respektive ampersandu testován, v druhém pak opět příznak, jenž rozliší, zda-li bude návratová hodnota použita pro výpis nebo pro přesměrování. Ve funkci využiji výše deklarované get_url.
function get_url_separator($url = null, $header = false) {
if (!$url) {
$url = get_url();
}
if (strpos($url, '?') !== false || strpos($url, '&') !== false) {
return $header ? '&' : '&';
} else {
return '?';
}
}
To by bylo zatím vše, v pokračování se budu věnovat rewritingu jediné proměnné, jejímu rozparsování a následnému využití při lokalizaci projektu.
Komentáře k článku:
return $header ? $pure_url : $html_url;
echo get_url(false); // get_url(0);navíc podmínkou to projde na jakýkoli nesmysl, takže klidně get_url('nesmysl'), get_url(new Objekt);
http://www.php.net/manual/en/functions.arguments.php
Přidat komentář