Přesměrování z menu – No route for HTTP request

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

Zdravím, už delší dobu se snažím vyřešit jeden, dost možná banální, problém a stále nemůžu přijít na řešení. Snažím se o to zprovoznit menu tak, aby při vstupu na stránky byla zobrazena úvodní stránka s určitým textem a při kliknutí na jednu z položek menu se mi prostřednictvím presenteru zobrazila tabulka s daty v DB. V nette teprve začínám, proto jsem svůj návrh přizpůsobil návrhu z quickstartu – vytvořil datový model se soubory xxxRepository a korespondující presentery. Menu jsem umístil do šablony @layout.latte a prostřednictvím položky menu, která má tvar

<a n:href="Zakazka: ">Zakázky</a>

se snažím přistoupit na korespondující presenter a vykreslit tabulku. Problém je v tom, že mi vždy vyskočí laděnka s hlášením Nette\Application\BadRequestException #404, No route for HTTP request.

Routy mám nastaveny takto:

$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

Zkoušel jsem s nimi laborovat a v případě, že mezi první a druhý rout vložím tento kód:

$container->router[] = new Route('<presenter>/<action>/<id>', array(
    'presenter' => 'Zakazka',
    'action' => 'default',
    'id' => NULL,
));

, je tabulka s daty zobrazena už rovnou na homepage, což není požadovaná funkčnost. Pokud kód výše vložím pod první dva routy, opět po kliknutí na položku menu vyskočí laděnka. Jde mi zkrátka o to, abych byl z homepage po kliknutí na odkaz přesměrován na stránku s tabulkou. Metody a presentery mám celkově nastaveny v pořádku, jsem přesvědčen, že je chyba právě v routování. Můžete mě prosím nasměrovat správným směrem? Za každou odpověď děkuji…

Felix
Nette Core | 1196
+
0
-
  1. Musis davat bacha v jakem poradi routy davas, cim je routa vys tim driv ji system vyzkousi, jestli pasuje.
  2. Nemuzes se divit, ze kdyz mas dve stejne routy tak ti druha nefunguje, viz:
$container->router[] = new Route('<presenter>/<action>/<id>', ....);
// ==
$container->router[] = new Route('<presenter>/<action>/<id>', ....);
  1. Zkus vyzkouset {plink ..} makro, jestli ti to bude fungovat, tak chyba bude v zapisu n:href makra..
jamos
Člen | 6
+
0
-

ad 1 – o tom samozřejmě vím…
ad 2 – aha, chápu… já myslel, že se vždy provádí všechny routy… díky za upozornění, nicméně to neřeší můj problém…
ad 3 – vyzkoušeno, konkrétně kód

<a href="{plink Zakazka:default}">Zakazka</a>

Výsledek stejný jako předtím, tj. laděnka s výpisem „No route for HTTP request“… Proč mám pocit, že bude problém v nějaké naprosté banalitě, jenom něco přehlížím? Nemůže být např. chyba v souboru htaccess? Celkově princip fungování je stejný jako v quickstart aplikaci a tam mi vše funguje jak má… ještě mě napadá, jak velký vliv na to může mít umístění projektu – quickstart vypracovávám v NetteFramework-2.0.6-PHP5.3\sandbox\app, svůj projekt pak v NetteFramework-2.0.6-PHP5.3\myproject\app… Může umístění způsobovat problémy?

Editoval jamos (23. 11. 2012 2:30)

hAssassin
Člen | 293
+
0
-

htaccess nebo mod_rewrite? co hlasi Requirements Checker?

jamos
Člen | 6
+
0
-

Mod_rewrite to nejspíš není, měl jsem s ním problémy už předtím, ale podle mě je to s ním vyřešeno… Jinak abych se přiznal, tak se v obsahu htaccess moc nevyznám, ale jeho obsah je stejný od začátku, tj:

Order Allow,Deny
Deny from all

Requirements checker hlásí neaktivní Memcache extension a Fileinfo extension or mime_content_type(). Může to mít nějakou souvislost s mým problémem?

hAssassin
Člen | 293
+
0
-

Počky, který .htaccess ted máš na mysli? Tebe zajímá jen ten ve složce www. A tam by to melo být zhruba to, co je v sandboxu. Otázka ovšem je, jak to máš nastavený v apachi. Teda přesněji, jsi na lokalhostu? Máš virtualhost?

EDIT: a ještě co ti to vlastně vygeneruje za odkaz?

Editoval hAssassin (23. 11. 2012 15:01)

jamos
Člen | 6
+
0
-

Aha, pardon, postnul jsem .htaccess ze složky app. O htaccess ve složce www jsem ani předtím nevěděl, abych pravdu řekl… jeho tvar je ale úplně stejný jako v sandboxu, nic jsem na něm neměnil… Jinak pracuji na localhostu a virtualhost nejspíš nepoužívám (adresy se mi zobrazují jako http://localhost/…project/www/), resp. nijak jsem si s nastavením Apache kromě mod_rewrite nehrál.
.
.
.
Chystal jsem se tu hodit generovaný odkaz a při té příležitosti jsem přišel na to, kde je problém. Homepage má odkaz: http://localhost/…project/www/, po kliknutí na položku menu jsem však přesměrován na http://localhost/…www/zakazka/, tj ty adresy se jakoby řetězí. Pokud zadám ručně http://localhost/…www/zakazka/, vše funguje. Takže teď už bych jen prosil o radu, proč se mi děje to, co se děje :)

hAssassin
Člen | 293
+
0
-

hm, tak sem si to myslel dobře. No buď ožel na localhostu hezký URL a spokoj se s takovýma typu http://localhost/.../myproject/www/index.php?presenter=zakazka&action=default což je samo blbost. Spíš si vytvoř vlastní virtualHost a pak ti to bude fungovat pekně (něco o tom třeba zde).

Každopádně na windows to nastavíš takto:

C:/Windows/System32/drivers/etc/hosts - přidej řádek 127.0.0.1       myproject.loc

Pak běž do konfigurace apache a najdi si ‚Virtual Hosts‘, kde jsou i příklady jak to nastavit. Nastav to nejak takto:

<VirtualHost *:80>
	DocumentRoot "C:/.../myproject/www/"
	ServerName myproject.loc
</VirtualHost>

S tím že do DocumentRoot nastav absolutní cestu ke složce www z toho tvýho projektu. A pak by to mělo fungovat tak že do URL zadáš: http://myproject.loc – načte se HomepagePresenter, http://myproject.loc/zakazka/ – načte se ZakazkaPresenter.

jamos
Člen | 6
+
0
-

Díky moc, to co jsi popsal, už mi funguje. Pokud do menu vložím přímo odkaz „http://myproject.loc/zakazka/“, jsem opravdu přesměrován na presenter, který potřebuji. Takhle by to teda mohlo zůstat, ale ještě bych rád věděl, proč mi tedy nefunguje přesměrování pomocí plink:

<a href="{plink Zakazka:}">Zakazka</a>

Po kliknutí se dostávám na adresu „http://myproject.loc/%EF%BB%BF/zakazka/“, což způsobuje již zmíněnou chybu 404… kde se v adrese bere řetězec %EF%BB%BF, který tam nemá co dělat?

Editoval jamos (23. 11. 2012 20:36)

hAssassin
Člen | 293
+
0
-

Tak to netuším, ani netuším co to znamená. Mohl bys to zazipovat a někam nahrát?

EDIT: tak je to skutečně BOM, což jsem tak trochu předpokládal. Jak se ho zbavit ti však už neporadím. Nikdy jsem to nepotřeboval :-( Více info zde. Ale tak mě napadá, zkus to otevřím a uložit v normálním IDE (btw jaký editor používáš?), možná by to mohlo pomoc.

Editoval hAssassin (23. 11. 2012 21:27)

jamos
Člen | 6
+
0
-

Tyjo, tak vyřešeno. Fakt to byl ten BOM, i když jsem o tom nikdy předtím v životě neslyšel a doufám, že už ani neuslyším… Používám Notepad++ a ten má přímo volbu Konvertovat do UTF-8 (bez BOM). Tu jsem použil na všechny soubory a najednou to jde bez problémů. Moc děkuju za pomoc, sám bych na tohle přicházel asi hodně dlouho.