Další nekonečný cyklus – canonicalize()
- Honza Kuchař
- Člen | 1662
Ahoj, tak už jsem zase narazil na nekonečný cyklus. Debugováním jsem došel na následující.
Aktuální adresa je
http://localhost/01Vyvoj/TabControl2/document_root/?grid-by=addressLine1&grid-order=addressLine1%3Da&do=grid-order
a canocicalize mě přesměruje na
http://localhost/01Vyvoj/TabControl2/document_root/?do=grid-order&grid-by=addressLine1&grid-order=addressLine1%3Da
Což je ta stejná url akorát má přeházené parametry. Tzn. problém
je ve fci Teď je jenom otázka, proč
Firefox 3.5 toto přesměrování neprovedl.Uri::isEqual($uri)
.
Takže prozatimní řešení je si v presenteru nastavit
$autoCanonicalize = FALSE;
.
PHP 5.2.9; Nette rev. 476
Editoval honzakuchar (9. 8. 2009 9:13)
- Honza Kuchař
- Člen | 1662
Ahoj, tak už se mi KONEČNĚ podařilo přijít na to, kde je chyba. V objektu HttpRequest jsou 2 uri.
// Tato uri odpovídá tomu co jsem mi poslal prohlížeč v GET xxx
$this->getHttpRequest()->getOriginalUri()->absoluteUri;
// Tato uri odpovídá nejspíš kanonickému ekvivalentu url
$this->getHttpRequest()->getUri()->absoluteUri
Proto prosím o vylepšení PHPDoc u těchto 2 metod. Protože vlastně
ani nevím jaký je v nich přesně rozdíl. Ví někdo co přesně dělá
metoda Uri::isEqual($url);
?
Nekonečný cyklus jsem opravil následující opravou:
v Presenter.php:753
if ($uri !== NULL and $uri != $this->getHttpRequest()->getOriginalUri()->absoluteUri)
místo:
if ($uri !== NULL && !$this->getHttpRequest()->getUri()->isEqual($uri))
Žádné vedlejší účiny jsem nezaznamenal. Proto prosím někoho kdo má přístup do repozitáře Nette, aby to přidal do další revize. Pokud chcete aplikaci, kde to dělá (protože mi tohle Nette udělalo asi na 1 z 10 aplikací), tak velice rád poskytnu zdrojáky.
Ale popravdě řečeno dost dobře nechápu proč se tenhle vyskytuje jen v některých app s některými komponentami a jen v některých stavech. Například mám jen prázdnou stránku s DataGridem. Seřadím položky ASC. Vše je OK. Seřadím DESC. Nekonečný cyklus. Vypnu kanonizaci a je to ok (nebo nahradím výše zmíněný kód). Nevíte někdo čím by to mohlo být?
- PetrP
- Člen | 587
Neodesílejte kód, kterému nerozumíte
Nikdy neodesílejte opravy jen proto, že „vám fungují“. Opravujte chyby jen tehdy, pokud jejich příčině přesně rozumíte a jste si kódem opravy zcela jisti.
honzakuchar napsal(a):
…
Protože vlastně ani nevím jaký je v nich přesně rozdíl. Ví někdo co přesně dělá metoda
Uri::isEqual($url);
?…
Žádné vedlejší účiny jsem nezaznamenal. Proto prosím někoho kdo má přístup do repozitáře Nette, aby to přidal do další revize. Pokud chcete aplikaci, kde to dělá (protože mi tohle Nette udělalo asi na 1 z 10 aplikací)
…
Ale popravdě řečeno dost dobře nechápu proč se tenhle vyskytuje jen v některých app s některými komponentami a jen v některých stavech.
;]
- Honza Kuchař
- Člen | 1662
Tak už se mi tato chyba projevila na dalším projektu. Prostudoval jsem si
metodu HttpRequest::detectUri()
podle mě by se opravdu v
canonicalize
měla url porovnávat s getOriginalUri
.
Protože přece nemá smymsl srovnávat novou canonickou url s auktuální url
v canonickém tvaru. ;) Je potřeba srovnávat s AKTUÁLNÍ url (bez úprav),
kterou je možno získat pomocí getOriginalUri. Nebo se snad pletu?