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

 |  PHP: Základy  |  8 972x
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.

Facebook Twitter Google+

Komentáře k článku "PHP: Chytré funkce - získání url"

Gravatar
Petr Kramář 20. 3 2010, 12:59
1/7 Sobota 20. Března 2010, 12:59  |  Chrome, Windows 7

Ahoj, fajn žes zase napsal nějaký článek :-) ta druhá funkce, pokud správně rozumím slouží při tvorbě query stringu v URL, není jednodušší použít http_build_query? (http://cz.php.net/manual/en/function.http-build-query.php)

Gravatar
Mike 20. 3 2010, 16:15
2/7 Sobota 20. Března 2010, 16:15  |  Opera, Windows XP

Petr Kramář : v prvé řadě jsem tuhle funkci do nedávna neznal :) a v té druhé řadě je aplikace trochu jiná - je to navázané na get_url(), takže se předpokládá, že už tam nějaké parametry jsou. to bych pak ještě musel přidávat parse_url() a funkce by byla spíš složitější, než jednodušší.

a navíc, jak jsem se díval, http_build_query nevrací ten první separator, což je primární účel této funkce.

Gravatar
Petr Kramář 21. 3 2010, 09:19
3/7 Neděle 21. Března 2010, 09:19  |  Chrome, Windows 7

Mike: Aaa...jasný málo sem se předtím nadtím zamyslel, příjmi omluvu :-)

Gravatar
Ondra 24. 6 2010, 21:28
4/7 Čtvrtek 24. Června 2010, 21:28  |  Chrome, Windows 7

já nechápu jednu věc, je to prkotina, ale jak se v té 1. fci může do $header dostat true?
return $header ? $pure_url : $html_url;

Gravatar
Mike 25. 6 2010, 13:45
5/7 Pátek 25. Června 2010, 13:45  |  Opera, Windows Vista

@: proměnnou $header předáváš v argumentu:

echo get_url(true); // get_url(1); nebo
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);

Gravatar
Ondra 25. 6 2010, 15:19
6/7 Pátek 25. Června 2010, 15:19  |  Chrome, Windows 7

@: to je asi nad moje smyslový chápání :-D stejně nechápu kdy se do $header dostane true :-D ale to je jedno, jen mě to zajímalo

Gravatar
Mike 25. 6 2010, 15:25
7/7 Pátek 25. Června 2010, 15:25  |  Opera, Windows Vista

@: jak jsem psal, když funkci zavoláš jako get_url(true), $header bude true. když ji zavoláš get_url(false), $header bude false. Možná to lépe pochopíš z toho zápisu: echo get_url($header = true);

Na funkce mrkni do manuálu:
http://www.php.net/manual/en/functions.arguments.php

Přidat komentář







Nevím, kolik to je
Parak simati, Muballit mitte, Nergal allatu mellamu mesaru, La tapallah Annuaki, Kettu Puluthu qillatua