Přesměrování z menu – No route for HTTP request
- jamos
- Člen | 6
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
- Musis davat bacha v jakem poradi routy davas, cim je routa vys tim driv ji system vyzkousi, jestli pasuje.
- 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>', ....);
- Zkus vyzkouset {plink ..} makro, jestli ti to bude fungovat, tak chyba bude v zapisu n:href makra..
- jamos
- Člen | 6
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)
- jamos
- Člen | 6
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
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
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
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
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
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
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.