Routovani na mobilni verzi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
stanley
Člen | 22
+
0
-

Ahoj, potreboval bych poradit s jednoduchym routovacim ukolem:

Mam fungujici web www.example.com, ke kteremu chci vyrobit mobilni verzi m.example.com.
Chtel bych, aby aktualne existujici routy fungovaly na obou subdomenach (tj. abych nemusel zdvojnasobovat pocet rout) a abych nemusel specifikovat na jake domene (example.com) to ma byt – jednou je to totiz domena na localhostu, jednou na vyvojovem serveru, jednou na produkcnim serveru a neni v mych silach to pokazde prepisovat.
Uplne by stacilo, kdyby se v pripade m.example.com nastavil nejaky parametr isMobile na true a v pripade www.example.com na false a pak se zacaly resit konkretni routy.

Teoreticky bych mohl soucasnou routu (napr.)

$router[] = new Route('<presenter>/<action>', array(
	'presenter' => 'Default',
	'action' => 'default',
))

prepsat na

$router[] = new Route('//<subdomain (www\.|m\.)><domain>/<presenter>/<action>', array(
	'presenter' => 'Default',
	'action' => 'default',
))

ale pripada mi dost nestastne ukladat domenu do parametru (a abych si nekomplikoval zivot, muselo by se jednat o persistentni parametr). Diky za rady.

Filip Procházka
Moderator | 4668
+
0
-

Proč by to mělo být nešťastné? Mně to příjde jako velice dobré řešení.

$router[] = new Route('//[!<subdomain (www|m)>].[!<domain>]/<presenter>/<action>', array(
	'subdomain' => 'www',
	'domain' => "example.com",
        'presenter' => 'Default',
        'action' => 'default',
));

+persistentní parametry

nebo :

class BasePresenter extends Nette\Application\Presenter
{
	/** @var bool */
	private $isMobile;

	protected function startup()
	{
		parent::startup();

		$host = Nette\Environment::getHttpRequest()->uri->host;
		$domainMap = (object)Nette\String::match($host, '~^(?:(?P<second>[^.]+)+\.)?(?P<domain>(?P<top>[^.]+)\.(?P<tld>[^.]+))$~i');

		$this->isMobile = $domainMap->second === 'm';
	}

	/**
	 * @return bool
	 */
	public function isMobile()
	{
		return $this->isMobile;
	}

	// ...
}

a nebo ještě čistěji, si můžeš upravit HttpRequestFactory a HttpRequest a přidat si do něj podporu pro identifikaci mobilních zařízení.

a nemusíš předělávat routy… :)

V každém případě by to chtělo nějak ve startup kontrolovat jestli je zařízení mobil (ideálně pomocí hlaviček) a následně přesměrovat na mobilní verzi.