Náhodné fungování routování

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

V aplikaci mi z ničeho nic přestanou fungovat routy (v odkazech je pouze # nebo error: No route for… po zapnutí debug módu), ale po chvíli už samy bez jakéhokoliv zásahu fungují. Chybu hlásí i jiní uživatelé aplikace.

Mám takovéto routy:

$container->router[] = new Route('index.php', 'Teams:default', Route::ONE_WAY);
$container->router[] = new Route('<lang ([a-z]{2})>/export.csv', 'Teams:export');
$container->router[] = new Route('<lang ([a-z]{2})>/seep[/<action>]', 'Seep:default');
$container->router[] = new Route('[!<lang ([a-z]{2})>[/<action>]]', 'Teams:default');

A na úvodní stránce jsou odkazy na Teams:register, Teams:list, Teams:edit, login a změnu parametru lang.

Aplikace běží tady: http://mcr2012.rogaining.cz

Mám minifikovanou verzi 2.0.3 released on 2012–04–04, konstanta NETTE_VERSION_ID je 20003. V logu nic není.

Zkoušel jsem hledat, ale možná jsem něco přehlédl.

Editoval prebijak (21. 5. 2012 18:39)

Lopo
Člen | 277
+
0
-

len tipujem, ale skus dat index.php routu jako poslednu a obecne davat ich v poradi od presnejsich po obecnejsie

prebijak
Člen | 21
+
0
-

Vyzkoušeno, ale nepomohlo. Zrovna teď to nefunguje.

prebijak
Člen | 21
+
0
-

Zapnul jsem si debug bar a routy v něm vidím, ačkoliv odkazy hlásí, že routy neexistují: http://mcr2012.rogaining.cz/default.png
Také když zadám adresu stránky manuálně, tak se zobrazí: http://mcr2012.rogaining.cz/list.png

BigCharlie
Člen | 283
+
0
-

nemůže být problém v parametru lang? Na tom prvním screenshotu máš lang NULL, přitom by asi měl být určen pro vytvoření odkazu.

Odhadoval bych, že ho nemáš persistentní. V té první routě by pak mělo být určení default jazyka. Nebo bys měl pro každý odkaz uvádět i jazyk, ne?

EDIT: ještě doplnění – to manuální zobrazení stránky funguje podle mě právě proto, že v adrese ten lang máš…

Editoval BigCharlie (28. 5. 2012 11:37)

prebijak
Člen | 21
+
0
-

Právě, že to persistentní mám – viz BasePresenter:

<?php
	const DEFAULT_LANG = 'en';

	/** @persistent */
	public $lang;

	protected function startup() {
		parent::startup();
		if(!isset($this->request->parameters['lang'])) {
			$this->lang = $this->template->lang = $this->getHttpRequest()->detectLanguage(array('cs','en'))?:self::DEFAULT_LANG;
			$this->canonicalize();
		}
		$this->context->translator->setLang($this->lang);
		$this->template->setTranslator($this->context->translator);
	}
?>

Zarážející na tom je, že to někdy funguje a někdy ne.

BigCharlie
Člen | 283
+
0
-

Proč je ve čtvrté routě ten vykřičník? Vyhoď čtvrtou routu a druhou zkopíruj tak, aby bylo možné využívat všechny akce. Pomůže?

prebijak
Člen | 21
+
0
-

Vykřičník způsobí, že se v případě, kdy není zadán lang a doplní se pomocí skriptu v base presenteru zobrazí lang v url. Když to smažu, tak se vůbec nezobrazí úvodní stránka.

Editoval prebijak (4. 6. 2012 13:52)

BigCharlie
Člen | 283
+
0
-

Pořád se to točí okolo problému, že může nastat situace, kdy nemáš stanovený $lang. Tak ho, jak jsem už psal, definuj v routě defaultně. Ty routy by mohly vypadat takhle:

$container->router[] = new Route('index.php', array(
	'presenter' => 'Teams',
	'action' => 'default',
	'lang' => 'cs',
), Route::ONE_WAY);
$container->router[] = new Route('<lang ([a-z]{2})>/export.csv', 'Teams:export');
$container->router[] = new Route('<lang ([a-z]{2})>/seep[/<action>]', 'Seep:default');
$container->router[] = new Route('<lang ([a-z]{2})>/<action>', 'Teams:default');

Změnilo se něco?

Ot@s
Backer | 476
+
0
-

BigCharlie napsal(a):
Změnilo se něco?

Myslím, že v tom problém nebude. Mám totiž podobný problém, tj. easy router:

$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

Refrešováním neměnné URL ve tvaru a001/v001 stránka 7× naskočí a 1× ne (hláška ‚no route‘). Ty počty jsou samozřejmě náhodné. Obešel jsem to tak, že nepoužívám čísla v názvech presenterů a akcí. Až se budu nudit, tak se na to kouknu.

PHP 5.4.0
Apache/2.2.15 (CentOS)
Nette Framework 2.0.3 (revision eb558ae released on 2012–04–04)

Editoval Ot@s (5. 6. 2012 10:31)

prebijak
Člen | 21
+
0
-

@BigCharlie Právě že když není lang nastaven tak ho BasePresenter (viz #6) nastaví a pomocí kanonizace se upraví url tak aby tam byl (viz následující routu)

$container->router[] = new Route('[!<lang ([a-z]{2})>[/<action>]]', 'Teams:default');

Teda alespoň takhle to chápu.

Editoval prebijak (5. 6. 2012 21:42)