PHP: Chytré funkce - získání url

Sun, 28 Feb 2010 15:20:05 +1100

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('&', '&amp;', $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 ? '&' : '&amp;';
	} 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.